diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_alt.c')
| -rw-r--r-- | src/lib/libcrypto/x509v3/v3_alt.c | 129 | 
1 files changed, 92 insertions, 37 deletions
| diff --git a/src/lib/libcrypto/x509v3/v3_alt.c b/src/lib/libcrypto/x509v3/v3_alt.c index b5e1f8af96..0e9e7dcb4f 100644 --- a/src/lib/libcrypto/x509v3/v3_alt.c +++ b/src/lib/libcrypto/x509v3/v3_alt.c | |||
| @@ -61,34 +61,28 @@ | |||
| 61 | #include <openssl/conf.h> | 61 | #include <openssl/conf.h> | 
| 62 | #include <openssl/x509v3.h> | 62 | #include <openssl/x509v3.h> | 
| 63 | 63 | ||
| 64 | static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 64 | static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 
| 65 | static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 65 | static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval); | 
| 66 | static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens); | 66 | static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p); | 
| 67 | static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens); | 67 | static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens); | 
| 68 | X509V3_EXT_METHOD v3_alt[] = { | 68 | X509V3_EXT_METHOD v3_alt[] = { | 
| 69 | { NID_subject_alt_name, 0, | 69 | { NID_subject_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), | 
| 70 | (X509V3_EXT_NEW)GENERAL_NAMES_new, | 70 | 0,0,0,0, | 
| 71 | (X509V3_EXT_FREE)GENERAL_NAMES_free, | 71 | 0,0, | 
| 72 | (X509V3_EXT_D2I)d2i_GENERAL_NAMES, | ||
| 73 | (X509V3_EXT_I2D)i2d_GENERAL_NAMES, | ||
| 74 | NULL, NULL, | ||
| 75 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 72 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 
| 76 | (X509V3_EXT_V2I)v2i_subject_alt, | 73 | (X509V3_EXT_V2I)v2i_subject_alt, | 
| 77 | NULL, NULL, NULL}, | 74 | NULL, NULL, NULL}, | 
| 78 | { NID_issuer_alt_name, 0, | 75 | |
| 79 | (X509V3_EXT_NEW)GENERAL_NAMES_new, | 76 | { NID_issuer_alt_name, 0, ASN1_ITEM_ref(GENERAL_NAMES), | 
| 80 | (X509V3_EXT_FREE)GENERAL_NAMES_free, | 77 | 0,0,0,0, | 
| 81 | (X509V3_EXT_D2I)d2i_GENERAL_NAMES, | 78 | 0,0, | 
| 82 | (X509V3_EXT_I2D)i2d_GENERAL_NAMES, | ||
| 83 | NULL, NULL, | ||
| 84 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 79 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | 
| 85 | (X509V3_EXT_V2I)v2i_issuer_alt, | 80 | (X509V3_EXT_V2I)v2i_issuer_alt, | 
| 86 | NULL, NULL, NULL}, | 81 | NULL, NULL, NULL}, | 
| 87 | EXT_END | ||
| 88 | }; | 82 | }; | 
| 89 | 83 | ||
| 90 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 84 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 
| 91 | STACK_OF(GENERAL_NAME) *gens, STACK_OF(CONF_VALUE) *ret) | 85 | GENERAL_NAMES *gens, STACK_OF(CONF_VALUE) *ret) | 
| 92 | { | 86 | { | 
| 93 | int i; | 87 | int i; | 
| 94 | GENERAL_NAME *gen; | 88 | GENERAL_NAME *gen; | 
| @@ -103,8 +97,8 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | |||
| 103 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, | 97 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, | 
| 104 | GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret) | 98 | GENERAL_NAME *gen, STACK_OF(CONF_VALUE) *ret) | 
| 105 | { | 99 | { | 
| 106 | char oline[256]; | ||
| 107 | unsigned char *p; | 100 | unsigned char *p; | 
| 101 | char oline[256]; | ||
| 108 | switch (gen->type) | 102 | switch (gen->type) | 
| 109 | { | 103 | { | 
| 110 | case GEN_OTHERNAME: | 104 | case GEN_OTHERNAME: | 
| @@ -155,13 +149,66 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method, | |||
| 155 | return ret; | 149 | return ret; | 
| 156 | } | 150 | } | 
| 157 | 151 | ||
| 158 | static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, | 152 | int GENERAL_NAME_print(BIO *out, GENERAL_NAME *gen) | 
| 153 | { | ||
| 154 | unsigned char *p; | ||
| 155 | switch (gen->type) | ||
| 156 | { | ||
| 157 | case GEN_OTHERNAME: | ||
| 158 | BIO_printf(out, "othername:<unsupported>"); | ||
| 159 | break; | ||
| 160 | |||
| 161 | case GEN_X400: | ||
| 162 | BIO_printf(out, "X400Name:<unsupported>"); | ||
| 163 | break; | ||
| 164 | |||
| 165 | case GEN_EDIPARTY: | ||
| 166 | /* Maybe fix this: it is supported now */ | ||
| 167 | BIO_printf(out, "EdiPartyName:<unsupported>"); | ||
| 168 | break; | ||
| 169 | |||
| 170 | case GEN_EMAIL: | ||
| 171 | BIO_printf(out, "email:%s",gen->d.ia5->data); | ||
| 172 | break; | ||
| 173 | |||
| 174 | case GEN_DNS: | ||
| 175 | BIO_printf(out, "DNS:%s",gen->d.ia5->data); | ||
| 176 | break; | ||
| 177 | |||
| 178 | case GEN_URI: | ||
| 179 | BIO_printf(out, "URI:%s",gen->d.ia5->data); | ||
| 180 | break; | ||
| 181 | |||
| 182 | case GEN_DIRNAME: | ||
| 183 | BIO_printf(out, "DirName: "); | ||
| 184 | X509_NAME_print_ex(out, gen->d.dirn, 0, XN_FLAG_ONELINE); | ||
| 185 | break; | ||
| 186 | |||
| 187 | case GEN_IPADD: | ||
| 188 | p = gen->d.ip->data; | ||
| 189 | /* BUG: doesn't support IPV6 */ | ||
| 190 | if(gen->d.ip->length != 4) { | ||
| 191 | BIO_printf(out,"IP Address:<invalid>"); | ||
| 192 | break; | ||
| 193 | } | ||
| 194 | BIO_printf(out, "IP Address:%d.%d.%d.%d", p[0], p[1], p[2], p[3]); | ||
| 195 | break; | ||
| 196 | |||
| 197 | case GEN_RID: | ||
| 198 | BIO_printf(out, "Registered ID"); | ||
| 199 | i2a_ASN1_OBJECT(out, gen->d.rid); | ||
| 200 | break; | ||
| 201 | } | ||
| 202 | return 1; | ||
| 203 | } | ||
| 204 | |||
| 205 | static GENERAL_NAMES *v2i_issuer_alt(X509V3_EXT_METHOD *method, | ||
| 159 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 206 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 
| 160 | { | 207 | { | 
| 161 | STACK_OF(GENERAL_NAME) *gens = NULL; | 208 | GENERAL_NAMES *gens = NULL; | 
| 162 | CONF_VALUE *cnf; | 209 | CONF_VALUE *cnf; | 
| 163 | int i; | 210 | int i; | 
| 164 | if(!(gens = sk_GENERAL_NAME_new(NULL))) { | 211 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 
| 165 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 212 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 
| 166 | return NULL; | 213 | return NULL; | 
| 167 | } | 214 | } | 
| @@ -185,9 +232,9 @@ static STACK_OF(GENERAL_NAME) *v2i_issuer_alt(X509V3_EXT_METHOD *method, | |||
| 185 | 232 | ||
| 186 | /* Append subject altname of issuer to issuer alt name of subject */ | 233 | /* Append subject altname of issuer to issuer alt name of subject */ | 
| 187 | 234 | ||
| 188 | static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | 235 | static int copy_issuer(X509V3_CTX *ctx, GENERAL_NAMES *gens) | 
| 189 | { | 236 | { | 
| 190 | STACK_OF(GENERAL_NAME) *ialt; | 237 | GENERAL_NAMES *ialt; | 
| 191 | GENERAL_NAME *gen; | 238 | GENERAL_NAME *gen; | 
| 192 | X509_EXTENSION *ext; | 239 | X509_EXTENSION *ext; | 
| 193 | int i; | 240 | int i; | 
| @@ -220,13 +267,13 @@ static int copy_issuer(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
| 220 | 267 | ||
| 221 | } | 268 | } | 
| 222 | 269 | ||
| 223 | static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | 270 | static GENERAL_NAMES *v2i_subject_alt(X509V3_EXT_METHOD *method, | 
| 224 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 271 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 
| 225 | { | 272 | { | 
| 226 | STACK_OF(GENERAL_NAME) *gens = NULL; | 273 | GENERAL_NAMES *gens = NULL; | 
| 227 | CONF_VALUE *cnf; | 274 | CONF_VALUE *cnf; | 
| 228 | int i; | 275 | int i; | 
| 229 | if(!(gens = sk_GENERAL_NAME_new(NULL))) { | 276 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 
| 230 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 277 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 
| 231 | return NULL; | 278 | return NULL; | 
| 232 | } | 279 | } | 
| @@ -234,7 +281,10 @@ static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | |||
| 234 | cnf = sk_CONF_VALUE_value(nval, i); | 281 | cnf = sk_CONF_VALUE_value(nval, i); | 
| 235 | if(!name_cmp(cnf->name, "email") && cnf->value && | 282 | if(!name_cmp(cnf->name, "email") && cnf->value && | 
| 236 | !strcmp(cnf->value, "copy")) { | 283 | !strcmp(cnf->value, "copy")) { | 
| 237 | if(!copy_email(ctx, gens)) goto err; | 284 | if(!copy_email(ctx, gens, 0)) goto err; | 
| 285 | } else if(!name_cmp(cnf->name, "email") && cnf->value && | ||
| 286 | !strcmp(cnf->value, "move")) { | ||
| 287 | if(!copy_email(ctx, gens, 1)) goto err; | ||
| 238 | } else { | 288 | } else { | 
| 239 | GENERAL_NAME *gen; | 289 | GENERAL_NAME *gen; | 
| 240 | if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) | 290 | if(!(gen = v2i_GENERAL_NAME(method, ctx, cnf))) | 
| @@ -252,7 +302,7 @@ static STACK_OF(GENERAL_NAME) *v2i_subject_alt(X509V3_EXT_METHOD *method, | |||
| 252 | * GENERAL_NAMES | 302 | * GENERAL_NAMES | 
| 253 | */ | 303 | */ | 
| 254 | 304 | ||
| 255 | static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | 305 | static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p) | 
| 256 | { | 306 | { | 
| 257 | X509_NAME *nm; | 307 | X509_NAME *nm; | 
| 258 | ASN1_IA5STRING *email = NULL; | 308 | ASN1_IA5STRING *email = NULL; | 
| @@ -271,9 +321,14 @@ static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
| 271 | /* Now add any email address(es) to STACK */ | 321 | /* Now add any email address(es) to STACK */ | 
| 272 | i = -1; | 322 | i = -1; | 
| 273 | while((i = X509_NAME_get_index_by_NID(nm, | 323 | while((i = X509_NAME_get_index_by_NID(nm, | 
| 274 | NID_pkcs9_emailAddress, i)) > 0) { | 324 | NID_pkcs9_emailAddress, i)) >= 0) { | 
| 275 | ne = X509_NAME_get_entry(nm, i); | 325 | ne = X509_NAME_get_entry(nm, i); | 
| 276 | email = ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne)); | 326 | email = M_ASN1_IA5STRING_dup(X509_NAME_ENTRY_get_data(ne)); | 
| 327 | if (move_p) | ||
| 328 | { | ||
| 329 | X509_NAME_delete_entry(nm, i); | ||
| 330 | i--; | ||
| 331 | } | ||
| 277 | if(!email || !(gen = GENERAL_NAME_new())) { | 332 | if(!email || !(gen = GENERAL_NAME_new())) { | 
| 278 | X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE); | 333 | X509V3err(X509V3_F_COPY_EMAIL,ERR_R_MALLOC_FAILURE); | 
| 279 | goto err; | 334 | goto err; | 
| @@ -293,19 +348,19 @@ static int copy_email(X509V3_CTX *ctx, STACK_OF(GENERAL_NAME) *gens) | |||
| 293 | 348 | ||
| 294 | err: | 349 | err: | 
| 295 | GENERAL_NAME_free(gen); | 350 | GENERAL_NAME_free(gen); | 
| 296 | ASN1_IA5STRING_free(email); | 351 | M_ASN1_IA5STRING_free(email); | 
| 297 | return 0; | 352 | return 0; | 
| 298 | 353 | ||
| 299 | } | 354 | } | 
| 300 | 355 | ||
| 301 | STACK_OF(GENERAL_NAME) *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 356 | GENERAL_NAMES *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 
| 302 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 357 | X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) | 
| 303 | { | 358 | { | 
| 304 | GENERAL_NAME *gen; | 359 | GENERAL_NAME *gen; | 
| 305 | STACK_OF(GENERAL_NAME) *gens = NULL; | 360 | GENERAL_NAMES *gens = NULL; | 
| 306 | CONF_VALUE *cnf; | 361 | CONF_VALUE *cnf; | 
| 307 | int i; | 362 | int i; | 
| 308 | if(!(gens = sk_GENERAL_NAME_new(NULL))) { | 363 | if(!(gens = sk_GENERAL_NAME_new_null())) { | 
| 309 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 364 | X509V3err(X509V3_F_V2I_GENERAL_NAMES,ERR_R_MALLOC_FAILURE); | 
| 310 | return NULL; | 365 | return NULL; | 
| 311 | } | 366 | } | 
| @@ -371,7 +426,7 @@ if(!name_cmp(name, "email")) { | |||
| 371 | goto err; | 426 | goto err; | 
| 372 | } | 427 | } | 
| 373 | ip[0] = i1; ip[1] = i2 ; ip[2] = i3 ; ip[3] = i4; | 428 | ip[0] = i1; ip[1] = i2 ; ip[2] = i3 ; ip[3] = i4; | 
| 374 | if(!(gen->d.ip = ASN1_OCTET_STRING_new()) || | 429 | if(!(gen->d.ip = M_ASN1_OCTET_STRING_new()) || | 
| 375 | !ASN1_STRING_set(gen->d.ip, ip, 4)) { | 430 | !ASN1_STRING_set(gen->d.ip, ip, 4)) { | 
| 376 | X509V3err(X509V3_F_V2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); | 431 | X509V3err(X509V3_F_V2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); | 
| 377 | goto err; | 432 | goto err; | 
| @@ -384,7 +439,7 @@ if(!name_cmp(name, "email")) { | |||
| 384 | } | 439 | } | 
| 385 | 440 | ||
| 386 | if(is_string) { | 441 | if(is_string) { | 
| 387 | if(!(gen->d.ia5 = ASN1_IA5STRING_new()) || | 442 | if(!(gen->d.ia5 = M_ASN1_IA5STRING_new()) || | 
| 388 | !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value, | 443 | !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value, | 
| 389 | strlen(value))) { | 444 | strlen(value))) { | 
| 390 | X509V3err(X509V3_F_V2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); | 445 | X509V3err(X509V3_F_V2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); | 
