v3_crld.c revision 296465
1/* v3_crld.c */ 2/* 3 * Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project 4 * 1999. 5 */ 6/* ==================================================================== 7 * Copyright (c) 1999 The OpenSSL Project. All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in 18 * the documentation and/or other materials provided with the 19 * distribution. 20 * 21 * 3. All advertising materials mentioning features or use of this 22 * software must display the following acknowledgment: 23 * "This product includes software developed by the OpenSSL Project 24 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)" 25 * 26 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 27 * endorse or promote products derived from this software without 28 * prior written permission. For written permission, please contact 29 * licensing@OpenSSL.org. 30 * 31 * 5. Products derived from this software may not be called "OpenSSL" 32 * nor may "OpenSSL" appear in their names without prior written 33 * permission of the OpenSSL Project. 34 * 35 * 6. Redistributions of any form whatsoever must retain the following 36 * acknowledgment: 37 * "This product includes software developed by the OpenSSL Project 38 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)" 39 * 40 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 41 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 43 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 44 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 45 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 46 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 47 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 49 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 51 * OF THE POSSIBILITY OF SUCH DAMAGE. 52 * ==================================================================== 53 * 54 * This product includes cryptographic software written by Eric Young 55 * (eay@cryptsoft.com). This product includes software written by Tim 56 * Hudson (tjh@cryptsoft.com). 57 * 58 */ 59 60#include <stdio.h> 61#include "cryptlib.h" 62#include <openssl/conf.h> 63#include <openssl/asn1.h> 64#include <openssl/asn1t.h> 65#include <openssl/x509v3.h> 66 67static STACK_OF(CONF_VALUE) *i2v_crld(X509V3_EXT_METHOD *method, 68 STACK_OF(DIST_POINT) *crld, 69 STACK_OF(CONF_VALUE) *extlist); 70static STACK_OF(DIST_POINT) *v2i_crld(X509V3_EXT_METHOD *method, 71 X509V3_CTX *ctx, 72 STACK_OF(CONF_VALUE) *nval); 73 74const X509V3_EXT_METHOD v3_crld = { 75 NID_crl_distribution_points, X509V3_EXT_MULTILINE, 76 ASN1_ITEM_ref(CRL_DIST_POINTS), 77 0, 0, 0, 0, 78 0, 0, 79 (X509V3_EXT_I2V) i2v_crld, 80 (X509V3_EXT_V2I)v2i_crld, 81 0, 0, 82 NULL 83}; 84 85static STACK_OF(CONF_VALUE) *i2v_crld(X509V3_EXT_METHOD *method, 86 STACK_OF(DIST_POINT) *crld, 87 STACK_OF(CONF_VALUE) *exts) 88{ 89 DIST_POINT *point; 90 int i; 91 for (i = 0; i < sk_DIST_POINT_num(crld); i++) { 92 point = sk_DIST_POINT_value(crld, i); 93 if (point->distpoint) { 94 if (point->distpoint->type == 0) 95 exts = i2v_GENERAL_NAMES(NULL, 96 point->distpoint->name.fullname, 97 exts); 98 else 99 X509V3_add_value("RelativeName", "<UNSUPPORTED>", &exts); 100 } 101 if (point->reasons) 102 X509V3_add_value("reasons", "<UNSUPPORTED>", &exts); 103 if (point->CRLissuer) 104 X509V3_add_value("CRLissuer", "<UNSUPPORTED>", &exts); 105 } 106 return exts; 107} 108 109static STACK_OF(DIST_POINT) *v2i_crld(X509V3_EXT_METHOD *method, 110 X509V3_CTX *ctx, 111 STACK_OF(CONF_VALUE) *nval) 112{ 113 STACK_OF(DIST_POINT) *crld = NULL; 114 GENERAL_NAMES *gens = NULL; 115 GENERAL_NAME *gen = NULL; 116 CONF_VALUE *cnf; 117 int i; 118 if (!(crld = sk_DIST_POINT_new_null())) 119 goto merr; 120 for (i = 0; i < sk_CONF_VALUE_num(nval); i++) { 121 DIST_POINT *point; 122 cnf = sk_CONF_VALUE_value(nval, i); 123 if (!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) 124 goto err; 125 if (!(gens = GENERAL_NAMES_new())) 126 goto merr; 127 if (!sk_GENERAL_NAME_push(gens, gen)) 128 goto merr; 129 gen = NULL; 130 if (!(point = DIST_POINT_new())) 131 goto merr; 132 if (!sk_DIST_POINT_push(crld, point)) { 133 DIST_POINT_free(point); 134 goto merr; 135 } 136 if (!(point->distpoint = DIST_POINT_NAME_new())) 137 goto merr; 138 point->distpoint->name.fullname = gens; 139 point->distpoint->type = 0; 140 gens = NULL; 141 } 142 return crld; 143 144 merr: 145 X509V3err(X509V3_F_V2I_CRLD, ERR_R_MALLOC_FAILURE); 146 err: 147 GENERAL_NAME_free(gen); 148 GENERAL_NAMES_free(gens); 149 sk_DIST_POINT_pop_free(crld, DIST_POINT_free); 150 return NULL; 151} 152 153IMPLEMENT_STACK_OF(DIST_POINT) 154 155IMPLEMENT_ASN1_SET_OF(DIST_POINT) 156 157 158ASN1_CHOICE(DIST_POINT_NAME) = { 159 ASN1_IMP_SEQUENCE_OF(DIST_POINT_NAME, name.fullname, GENERAL_NAME, 0), 160 ASN1_IMP_SET_OF(DIST_POINT_NAME, name.relativename, X509_NAME_ENTRY, 1) 161} ASN1_CHOICE_END(DIST_POINT_NAME) 162 163IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT_NAME) 164 165ASN1_SEQUENCE(DIST_POINT) = { 166 ASN1_EXP_OPT(DIST_POINT, distpoint, DIST_POINT_NAME, 0), 167 ASN1_IMP_OPT(DIST_POINT, reasons, ASN1_BIT_STRING, 1), 168 ASN1_IMP_SEQUENCE_OF_OPT(DIST_POINT, CRLissuer, GENERAL_NAME, 2) 169} ASN1_SEQUENCE_END(DIST_POINT) 170 171IMPLEMENT_ASN1_FUNCTIONS(DIST_POINT) 172 173ASN1_ITEM_TEMPLATE(CRL_DIST_POINTS) = 174 ASN1_EX_TEMPLATE_TYPE(ASN1_TFLG_SEQUENCE_OF, 0, CRLDistributionPoints, DIST_POINT) 175ASN1_ITEM_TEMPLATE_END(CRL_DIST_POINTS) 176 177IMPLEMENT_ASN1_FUNCTIONS(CRL_DIST_POINTS) 178