diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/x509/x509_asid.c | 134 |
1 files changed, 96 insertions, 38 deletions
diff --git a/src/lib/libcrypto/x509/x509_asid.c b/src/lib/libcrypto/x509/x509_asid.c index 95b1acb1e4..ecd35b1f1d 100644 --- a/src/lib/libcrypto/x509/x509_asid.c +++ b/src/lib/libcrypto/x509/x509_asid.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: x509_asid.c,v 1.40 2023/04/19 12:30:09 jsg Exp $ */ | 1 | /* $OpenBSD: x509_asid.c,v 1.41 2023/11/11 09:35:21 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Contributed to the OpenSSL Project by the American Registry for | 3 | * Contributed to the OpenSSL Project by the American Registry for |
| 4 | * Internet Numbers ("ARIN"). | 4 | * Internet Numbers ("ARIN"). |
| @@ -406,8 +406,12 @@ int | |||
| 406 | X509v3_asid_add_inherit(ASIdentifiers *asid, int which) | 406 | X509v3_asid_add_inherit(ASIdentifiers *asid, int which) |
| 407 | { | 407 | { |
| 408 | ASIdentifierChoice **choice; | 408 | ASIdentifierChoice **choice; |
| 409 | ASIdentifierChoice *aic = NULL; | ||
| 410 | int ret = 0; | ||
| 411 | |||
| 409 | if (asid == NULL) | 412 | if (asid == NULL) |
| 410 | return 0; | 413 | goto err; |
| 414 | |||
| 411 | switch (which) { | 415 | switch (which) { |
| 412 | case V3_ASID_ASNUM: | 416 | case V3_ASID_ASNUM: |
| 413 | choice = &asid->asnum; | 417 | choice = &asid->asnum; |
| @@ -416,19 +420,76 @@ X509v3_asid_add_inherit(ASIdentifiers *asid, int which) | |||
| 416 | choice = &asid->rdi; | 420 | choice = &asid->rdi; |
| 417 | break; | 421 | break; |
| 418 | default: | 422 | default: |
| 419 | return 0; | 423 | goto err; |
| 420 | } | 424 | } |
| 421 | if (*choice == NULL) { | 425 | |
| 422 | if ((*choice = ASIdentifierChoice_new()) == NULL) | 426 | if (*choice != NULL) { |
| 423 | return 0; | 427 | if ((*choice)->type != ASIdentifierChoice_inherit) |
| 424 | if (((*choice)->u.inherit = ASN1_NULL_new()) == NULL) | 428 | goto err; |
| 425 | return 0; | 429 | } else { |
| 426 | (*choice)->type = ASIdentifierChoice_inherit; | 430 | if ((aic = ASIdentifierChoice_new()) == NULL) |
| 431 | goto err; | ||
| 432 | if ((aic->u.inherit = ASN1_NULL_new()) == NULL) | ||
| 433 | goto err; | ||
| 434 | aic->type = ASIdentifierChoice_inherit; | ||
| 435 | |||
| 436 | *choice = aic; | ||
| 437 | aic = NULL; | ||
| 427 | } | 438 | } |
| 428 | return (*choice)->type == ASIdentifierChoice_inherit; | 439 | |
| 440 | ret = 1; | ||
| 441 | |||
| 442 | err: | ||
| 443 | ASIdentifierChoice_free(aic); | ||
| 444 | |||
| 445 | return ret; | ||
| 429 | } | 446 | } |
| 430 | LCRYPTO_ALIAS(X509v3_asid_add_inherit); | 447 | LCRYPTO_ALIAS(X509v3_asid_add_inherit); |
| 431 | 448 | ||
| 449 | static int | ||
| 450 | ASIdOrRanges_add_id_or_range(ASIdOrRanges *aors, ASN1_INTEGER *min, | ||
| 451 | ASN1_INTEGER *max) | ||
| 452 | { | ||
| 453 | ASIdOrRange *aor = NULL; | ||
| 454 | ASRange *asr = NULL; | ||
| 455 | int ret = 0; | ||
| 456 | |||
| 457 | /* Preallocate since we must not fail after sk_ASIdOrRange_push(). */ | ||
| 458 | if (max != NULL) { | ||
| 459 | if ((asr = ASRange_new()) == NULL) | ||
| 460 | goto err; | ||
| 461 | } | ||
| 462 | |||
| 463 | if ((aor = ASIdOrRange_new()) == NULL) | ||
| 464 | goto err; | ||
| 465 | if (sk_ASIdOrRange_push(aors, aor) <= 0) | ||
| 466 | goto err; | ||
| 467 | |||
| 468 | if (max == NULL) { | ||
| 469 | aor->type = ASIdOrRange_id; | ||
| 470 | aor->u.id = min; | ||
| 471 | } else { | ||
| 472 | ASN1_INTEGER_free(asr->min); | ||
| 473 | asr->min = min; | ||
| 474 | ASN1_INTEGER_free(asr->max); | ||
| 475 | asr->max = max; | ||
| 476 | |||
| 477 | aor->type = ASIdOrRange_range; | ||
| 478 | aor->u.range = asr; | ||
| 479 | asr = NULL; | ||
| 480 | } | ||
| 481 | |||
| 482 | aor = NULL; | ||
| 483 | |||
| 484 | ret = 1; | ||
| 485 | |||
| 486 | err: | ||
| 487 | ASIdOrRange_free(aor); | ||
| 488 | ASRange_free(asr); | ||
| 489 | |||
| 490 | return ret; | ||
| 491 | } | ||
| 492 | |||
| 432 | /* | 493 | /* |
| 433 | * Add an ID or range to an ASIdentifierChoice. | 494 | * Add an ID or range to an ASIdentifierChoice. |
| 434 | */ | 495 | */ |
| @@ -437,9 +498,12 @@ X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, ASN1_INTEGER *min, | |||
| 437 | ASN1_INTEGER *max) | 498 | ASN1_INTEGER *max) |
| 438 | { | 499 | { |
| 439 | ASIdentifierChoice **choice; | 500 | ASIdentifierChoice **choice; |
| 440 | ASIdOrRange *aor; | 501 | ASIdentifierChoice *aic = NULL, *new_aic = NULL; |
| 502 | int ret = 0; | ||
| 503 | |||
| 441 | if (asid == NULL) | 504 | if (asid == NULL) |
| 442 | return 0; | 505 | goto err; |
| 506 | |||
| 443 | switch (which) { | 507 | switch (which) { |
| 444 | case V3_ASID_ASNUM: | 508 | case V3_ASID_ASNUM: |
| 445 | choice = &asid->asnum; | 509 | choice = &asid->asnum; |
| @@ -448,39 +512,33 @@ X509v3_asid_add_id_or_range(ASIdentifiers *asid, int which, ASN1_INTEGER *min, | |||
| 448 | choice = &asid->rdi; | 512 | choice = &asid->rdi; |
| 449 | break; | 513 | break; |
| 450 | default: | 514 | default: |
| 451 | return 0; | 515 | goto err; |
| 452 | } | ||
| 453 | if (*choice != NULL && (*choice)->type == ASIdentifierChoice_inherit) | ||
| 454 | return 0; | ||
| 455 | if (*choice == NULL) { | ||
| 456 | if ((*choice = ASIdentifierChoice_new()) == NULL) | ||
| 457 | return 0; | ||
| 458 | (*choice)->u.asIdsOrRanges = sk_ASIdOrRange_new(ASIdOrRange_cmp); | ||
| 459 | if ((*choice)->u.asIdsOrRanges == NULL) | ||
| 460 | return 0; | ||
| 461 | (*choice)->type = ASIdentifierChoice_asIdsOrRanges; | ||
| 462 | } | 516 | } |
| 463 | if ((aor = ASIdOrRange_new()) == NULL) | 517 | |
| 464 | return 0; | 518 | if ((aic = *choice) != NULL) { |
| 465 | if (max == NULL) { | 519 | if (aic->type != ASIdentifierChoice_asIdsOrRanges) |
| 466 | aor->type = ASIdOrRange_id; | 520 | goto err; |
| 467 | aor->u.id = min; | ||
| 468 | } else { | 521 | } else { |
| 469 | aor->type = ASIdOrRange_range; | 522 | if ((aic = new_aic = ASIdentifierChoice_new()) == NULL) |
| 470 | if ((aor->u.range = ASRange_new()) == NULL) | 523 | goto err; |
| 524 | aic->u.asIdsOrRanges = sk_ASIdOrRange_new(ASIdOrRange_cmp); | ||
| 525 | if (aic->u.asIdsOrRanges == NULL) | ||
| 471 | goto err; | 526 | goto err; |
| 472 | ASN1_INTEGER_free(aor->u.range->min); | 527 | aic->type = ASIdentifierChoice_asIdsOrRanges; |
| 473 | aor->u.range->min = min; | ||
| 474 | ASN1_INTEGER_free(aor->u.range->max); | ||
| 475 | aor->u.range->max = max; | ||
| 476 | } | 528 | } |
| 477 | if (!(sk_ASIdOrRange_push((*choice)->u.asIdsOrRanges, aor))) | 529 | |
| 530 | if (!ASIdOrRanges_add_id_or_range(aic->u.asIdsOrRanges, min, max)) | ||
| 478 | goto err; | 531 | goto err; |
| 479 | return 1; | 532 | |
| 533 | *choice = aic; | ||
| 534 | aic = new_aic = NULL; | ||
| 535 | |||
| 536 | ret = 1; | ||
| 480 | 537 | ||
| 481 | err: | 538 | err: |
| 482 | ASIdOrRange_free(aor); | 539 | ASIdentifierChoice_free(new_aic); |
| 483 | return 0; | 540 | |
| 541 | return ret; | ||
| 484 | } | 542 | } |
| 485 | LCRYPTO_ALIAS(X509v3_asid_add_id_or_range); | 543 | LCRYPTO_ALIAS(X509v3_asid_add_id_or_range); |
| 486 | 544 | ||
