summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/x509v3/v3_alt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_alt.c')
-rw-r--r--src/lib/libcrypto/x509v3/v3_alt.c140
1 files changed, 54 insertions, 86 deletions
diff --git a/src/lib/libcrypto/x509v3/v3_alt.c b/src/lib/libcrypto/x509v3/v3_alt.c
index d29d94338e..75fda7f268 100644
--- a/src/lib/libcrypto/x509v3/v3_alt.c
+++ b/src/lib/libcrypto/x509v3/v3_alt.c
@@ -82,12 +82,6 @@ NULL, NULL, NULL},
82(X509V3_EXT_I2V)i2v_GENERAL_NAMES, 82(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
83(X509V3_EXT_V2I)v2i_issuer_alt, 83(X509V3_EXT_V2I)v2i_issuer_alt,
84NULL, NULL, NULL}, 84NULL, NULL, NULL},
85
86{ NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES),
870,0,0,0,
880,0,
89(X509V3_EXT_I2V)i2v_GENERAL_NAMES,
90NULL, NULL, NULL, NULL},
91}; 85};
92 86
93STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, 87STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method,
@@ -153,9 +147,9 @@ STACK_OF(CONF_VALUE) *i2v_GENERAL_NAME(X509V3_EXT_METHOD *method,
153 BIO_snprintf(htmp, sizeof htmp, 147 BIO_snprintf(htmp, sizeof htmp,
154 "%X", p[0] << 8 | p[1]); 148 "%X", p[0] << 8 | p[1]);
155 p += 2; 149 p += 2;
156 strcat(oline, htmp); 150 strlcat(oline, htmp, sizeof oline);
157 if (i != 7) 151 if (i != 7)
158 strcat(oline, ":"); 152 strlcat(oline, ":", sizeof oline);
159 } 153 }
160 } 154 }
161 else 155 else
@@ -366,7 +360,6 @@ static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
366 if (move_p) 360 if (move_p)
367 { 361 {
368 X509_NAME_delete_entry(nm, i); 362 X509_NAME_delete_entry(nm, i);
369 X509_NAME_ENTRY_free(ne);
370 i--; 363 i--;
371 } 364 }
372 if(!email || !(gen = GENERAL_NAME_new())) { 365 if(!email || !(gen = GENERAL_NAME_new())) {
@@ -393,8 +386,8 @@ static int copy_email(X509V3_CTX *ctx, GENERAL_NAMES *gens, int move_p)
393 386
394} 387}
395 388
396GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, 389GENERAL_NAMES *v2i_GENERAL_NAMES(X509V3_EXT_METHOD *method,
397 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval) 390 X509V3_CTX *ctx, STACK_OF(CONF_VALUE) *nval)
398{ 391{
399 GENERAL_NAME *gen; 392 GENERAL_NAME *gen;
400 GENERAL_NAMES *gens = NULL; 393 GENERAL_NAMES *gens = NULL;
@@ -415,22 +408,28 @@ GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method,
415 return NULL; 408 return NULL;
416} 409}
417 410
418GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, 411GENERAL_NAME *v2i_GENERAL_NAME(X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
419 CONF_VALUE *cnf) 412 CONF_VALUE *cnf)
420 { 413 {
421 return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0); 414 return v2i_GENERAL_NAME_ex(NULL, method, ctx, cnf, 0);
422 } 415 }
423 416
424GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, 417GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
425 const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, 418 X509V3_EXT_METHOD *method, X509V3_CTX *ctx,
426 int gen_type, char *value, int is_nc) 419 CONF_VALUE *cnf, int is_nc)
427 { 420 {
428 char is_string = 0; 421 char is_string = 0;
422 int type;
429 GENERAL_NAME *gen = NULL; 423 GENERAL_NAME *gen = NULL;
430 424
425 char *name, *value;
426
427 name = cnf->name;
428 value = cnf->value;
429
431 if(!value) 430 if(!value)
432 { 431 {
433 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_MISSING_VALUE); 432 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_MISSING_VALUE);
434 return NULL; 433 return NULL;
435 } 434 }
436 435
@@ -441,62 +440,74 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
441 gen = GENERAL_NAME_new(); 440 gen = GENERAL_NAME_new();
442 if(gen == NULL) 441 if(gen == NULL)
443 { 442 {
444 X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); 443 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,ERR_R_MALLOC_FAILURE);
445 return NULL; 444 return NULL;
446 } 445 }
447 } 446 }
448 447
449 switch (gen_type) 448 if(!name_cmp(name, "email"))
450 { 449 {
451 case GEN_URI:
452 case GEN_EMAIL:
453 case GEN_DNS:
454 is_string = 1; 450 is_string = 1;
455 break; 451 type = GEN_EMAIL;
456 452 }
457 case GEN_RID: 453 else if(!name_cmp(name, "URI"))
454 {
455 is_string = 1;
456 type = GEN_URI;
457 }
458 else if(!name_cmp(name, "DNS"))
459 {
460 is_string = 1;
461 type = GEN_DNS;
462 }
463 else if(!name_cmp(name, "RID"))
458 { 464 {
459 ASN1_OBJECT *obj; 465 ASN1_OBJECT *obj;
460 if(!(obj = OBJ_txt2obj(value,0))) 466 if(!(obj = OBJ_txt2obj(value,0)))
461 { 467 {
462 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_OBJECT); 468 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_BAD_OBJECT);
463 ERR_add_error_data(2, "value=", value); 469 ERR_add_error_data(2, "value=", value);
464 goto err; 470 goto err;
465 } 471 }
466 gen->d.rid = obj; 472 gen->d.rid = obj;
473 type = GEN_RID;
467 } 474 }
468 break; 475 else if(!name_cmp(name, "IP"))
469 476 {
470 case GEN_IPADD:
471 if (is_nc) 477 if (is_nc)
472 gen->d.ip = a2i_IPADDRESS_NC(value); 478 gen->d.ip = a2i_IPADDRESS_NC(value);
473 else 479 else
474 gen->d.ip = a2i_IPADDRESS(value); 480 gen->d.ip = a2i_IPADDRESS(value);
475 if(gen->d.ip == NULL) 481 if(gen->d.ip == NULL)
476 { 482 {
477 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_BAD_IP_ADDRESS); 483 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_BAD_IP_ADDRESS);
478 ERR_add_error_data(2, "value=", value); 484 ERR_add_error_data(2, "value=", value);
479 goto err; 485 goto err;
480 } 486 }
481 break; 487 type = GEN_IPADD;
482 488 }
483 case GEN_DIRNAME: 489 else if(!name_cmp(name, "dirName"))
490 {
491 type = GEN_DIRNAME;
484 if (!do_dirname(gen, value, ctx)) 492 if (!do_dirname(gen, value, ctx))
485 { 493 {
486 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_DIRNAME_ERROR); 494 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_DIRNAME_ERROR);
487 goto err; 495 goto err;
488 } 496 }
489 break; 497 }
490 498 else if(!name_cmp(name, "otherName"))
491 case GEN_OTHERNAME: 499 {
492 if (!do_othername(gen, value, ctx)) 500 if (!do_othername(gen, value, ctx))
493 { 501 {
494 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_OTHERNAME_ERROR); 502 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_OTHERNAME_ERROR);
495 goto err; 503 goto err;
496 } 504 }
497 break; 505 type = GEN_OTHERNAME;
498 default: 506 }
499 X509V3err(X509V3_F_A2I_GENERAL_NAME,X509V3_R_UNSUPPORTED_TYPE); 507 else
508 {
509 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_UNSUPPORTED_OPTION);
510 ERR_add_error_data(2, "name=", name);
500 goto err; 511 goto err;
501 } 512 }
502 513
@@ -506,12 +517,12 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
506 !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value, 517 !ASN1_STRING_set(gen->d.ia5, (unsigned char*)value,
507 strlen(value))) 518 strlen(value)))
508 { 519 {
509 X509V3err(X509V3_F_A2I_GENERAL_NAME,ERR_R_MALLOC_FAILURE); 520 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,ERR_R_MALLOC_FAILURE);
510 goto err; 521 goto err;
511 } 522 }
512 } 523 }
513 524
514 gen->type = gen_type; 525 gen->type = type;
515 526
516 return gen; 527 return gen;
517 528
@@ -521,48 +532,6 @@ GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out,
521 return NULL; 532 return NULL;
522 } 533 }
523 534
524GENERAL_NAME *v2i_GENERAL_NAME_ex(GENERAL_NAME *out,
525 const X509V3_EXT_METHOD *method,
526 X509V3_CTX *ctx, CONF_VALUE *cnf, int is_nc)
527 {
528 int type;
529
530 char *name, *value;
531
532 name = cnf->name;
533 value = cnf->value;
534
535 if(!value)
536 {
537 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_MISSING_VALUE);
538 return NULL;
539 }
540
541 if(!name_cmp(name, "email"))
542 type = GEN_EMAIL;
543 else if(!name_cmp(name, "URI"))
544 type = GEN_URI;
545 else if(!name_cmp(name, "DNS"))
546 type = GEN_DNS;
547 else if(!name_cmp(name, "RID"))
548 type = GEN_RID;
549 else if(!name_cmp(name, "IP"))
550 type = GEN_IPADD;
551 else if(!name_cmp(name, "dirName"))
552 type = GEN_DIRNAME;
553 else if(!name_cmp(name, "otherName"))
554 type = GEN_OTHERNAME;
555 else
556 {
557 X509V3err(X509V3_F_V2I_GENERAL_NAME_EX,X509V3_R_UNSUPPORTED_OPTION);
558 ERR_add_error_data(2, "name=", name);
559 return NULL;
560 }
561
562 return a2i_GENERAL_NAME(out, method, ctx, type, value, is_nc);
563
564 }
565
566static int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx) 535static int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
567 { 536 {
568 char *objtmp = NULL, *p; 537 char *objtmp = NULL, *p;
@@ -608,7 +577,6 @@ static int do_dirname(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx)
608 if (!ret) 577 if (!ret)
609 X509_NAME_free(nm); 578 X509_NAME_free(nm);
610 gen->d.dirn = nm; 579 gen->d.dirn = nm;
611 X509V3_section_free(ctx, sk);
612 580
613 return ret; 581 return ret;
614 } 582 }