diff options
Diffstat (limited to 'src/lib/libcrypto/x509v3/v3_alt.c')
| -rw-r--r-- | src/lib/libcrypto/x509v3/v3_alt.c | 140 |
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, |
| 84 | NULL, NULL, NULL}, | 84 | NULL, NULL, NULL}, |
| 85 | |||
| 86 | { NID_certificate_issuer, 0, ASN1_ITEM_ref(GENERAL_NAMES), | ||
| 87 | 0,0,0,0, | ||
| 88 | 0,0, | ||
| 89 | (X509V3_EXT_I2V)i2v_GENERAL_NAMES, | ||
| 90 | NULL, NULL, NULL, NULL}, | ||
| 91 | }; | 85 | }; |
| 92 | 86 | ||
| 93 | STACK_OF(CONF_VALUE) *i2v_GENERAL_NAMES(X509V3_EXT_METHOD *method, | 87 | STACK_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 | ||
| 396 | GENERAL_NAMES *v2i_GENERAL_NAMES(const X509V3_EXT_METHOD *method, | 389 | GENERAL_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 | ||
| 418 | GENERAL_NAME *v2i_GENERAL_NAME(const X509V3_EXT_METHOD *method, X509V3_CTX *ctx, | 411 | GENERAL_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 | ||
| 424 | GENERAL_NAME *a2i_GENERAL_NAME(GENERAL_NAME *out, | 417 | GENERAL_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 | ||
| 524 | GENERAL_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 | |||
| 566 | static int do_othername(GENERAL_NAME *gen, char *value, X509V3_CTX *ctx) | 535 | static 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 | } |
