diff options
| author | tb <> | 2024-10-30 06:11:50 +0000 |
|---|---|---|
| committer | tb <> | 2024-10-30 06:11:50 +0000 |
| commit | 39811d03692554850f931608c0c2a3e9536c85fb (patch) | |
| tree | f6f96d75cd62f437414b7aadc91870aa93bf824d /src | |
| parent | c200e5f13afe3d84e11b9e70000121dafc8040d6 (diff) | |
| download | openbsd-39811d03692554850f931608c0c2a3e9536c85fb.tar.gz openbsd-39811d03692554850f931608c0c2a3e9536c85fb.tar.bz2 openbsd-39811d03692554850f931608c0c2a3e9536c85fb.zip | |
Provide ec_point_to_asn1_octet_string()
This adds a specialized helper for creating an ASN.1 octet string
out of an elliptic curve point (the generator). Use this to simplify
ec_asn1_group2parameters().
ok jsing
Diffstat (limited to 'src')
| -rw-r--r-- | src/lib/libcrypto/ec/ec_asn1.c | 75 |
1 files changed, 49 insertions, 26 deletions
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c index 5f8a6c344e..09aa947b71 100644 --- a/src/lib/libcrypto/ec/ec_asn1.c +++ b/src/lib/libcrypto/ec/ec_asn1.c | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | /* $OpenBSD: ec_asn1.c,v 1.94 2024/10/29 04:57:33 tb Exp $ */ | 1 | /* $OpenBSD: ec_asn1.c,v 1.95 2024/10/30 06:11:50 tb Exp $ */ |
| 2 | /* | 2 | /* |
| 3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
| 4 | */ | 4 | */ |
| @@ -561,6 +561,50 @@ EC_PRIVATEKEY_free(EC_PRIVATEKEY *a) | |||
| 561 | } | 561 | } |
| 562 | 562 | ||
| 563 | static int | 563 | static int |
| 564 | ec_point_to_asn1_string_type(const EC_GROUP *group, const EC_POINT *point, | ||
| 565 | int form, int type, ASN1_STRING **out_astr) | ||
| 566 | { | ||
| 567 | ASN1_STRING *astr = NULL; | ||
| 568 | unsigned char *buf = NULL; | ||
| 569 | size_t len = 0; | ||
| 570 | int ret = 0; | ||
| 571 | |||
| 572 | if (*out_astr != NULL && ASN1_STRING_type(*out_astr) != type) | ||
| 573 | goto err; | ||
| 574 | |||
| 575 | if (!ec_point_to_octets(group, point, form, &buf, &len, NULL)) | ||
| 576 | goto err; | ||
| 577 | |||
| 578 | if ((astr = *out_astr) == NULL) | ||
| 579 | astr = ASN1_STRING_type_new(type); | ||
| 580 | if (astr == NULL) | ||
| 581 | goto err; | ||
| 582 | |||
| 583 | ASN1_STRING_set0(astr, buf, len); | ||
| 584 | buf = NULL; | ||
| 585 | len = 0; | ||
| 586 | |||
| 587 | *out_astr = astr; | ||
| 588 | astr = NULL; | ||
| 589 | |||
| 590 | ret = 1; | ||
| 591 | |||
| 592 | err: | ||
| 593 | ASN1_STRING_free(astr); | ||
| 594 | freezero(buf, len); | ||
| 595 | |||
| 596 | return ret; | ||
| 597 | } | ||
| 598 | |||
| 599 | static int | ||
| 600 | ec_point_to_asn1_octet_string(const EC_GROUP *group, const EC_POINT *point, | ||
| 601 | int form, ASN1_OCTET_STRING **out_aos) | ||
| 602 | { | ||
| 603 | return ec_point_to_asn1_string_type(group, point, form, | ||
| 604 | V_ASN1_OCTET_STRING, out_aos); | ||
| 605 | } | ||
| 606 | |||
| 607 | static int | ||
| 564 | ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) | 608 | ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) |
| 565 | { | 609 | { |
| 566 | BIGNUM *p = NULL; | 610 | BIGNUM *p = NULL; |
| @@ -719,12 +763,10 @@ static ECPARAMETERS * | |||
| 719 | ec_asn1_group2parameters(const EC_GROUP *group) | 763 | ec_asn1_group2parameters(const EC_GROUP *group) |
| 720 | { | 764 | { |
| 721 | int ok = 0; | 765 | int ok = 0; |
| 722 | size_t len = 0; | ||
| 723 | ECPARAMETERS *ret = NULL; | 766 | ECPARAMETERS *ret = NULL; |
| 724 | const BIGNUM *order, *cofactor; | 767 | const BIGNUM *order, *cofactor; |
| 725 | unsigned char *buffer = NULL; | ||
| 726 | const EC_POINT *point = NULL; | 768 | const EC_POINT *point = NULL; |
| 727 | point_conversion_form_t form; | 769 | uint8_t form; |
| 728 | 770 | ||
| 729 | if ((ret = ECPARAMETERS_new()) == NULL) { | 771 | if ((ret = ECPARAMETERS_new()) == NULL) { |
| 730 | ECerror(ERR_R_MALLOC_FAILURE); | 772 | ECerror(ERR_R_MALLOC_FAILURE); |
| @@ -749,29 +791,11 @@ ec_asn1_group2parameters(const EC_GROUP *group) | |||
| 749 | ECerror(EC_R_UNDEFINED_GENERATOR); | 791 | ECerror(EC_R_UNDEFINED_GENERATOR); |
| 750 | goto err; | 792 | goto err; |
| 751 | } | 793 | } |
| 752 | form = EC_GROUP_get_point_conversion_form(group); | ||
| 753 | 794 | ||
| 754 | len = EC_POINT_point2oct(group, point, form, NULL, len, NULL); | 795 | form = EC_GROUP_get_point_conversion_form(group); |
| 755 | if (len == 0) { | 796 | if (!ec_point_to_asn1_octet_string(group, point, form, &ret->base)) |
| 756 | ECerror(ERR_R_EC_LIB); | ||
| 757 | goto err; | ||
| 758 | } | ||
| 759 | if ((buffer = malloc(len)) == NULL) { | ||
| 760 | ECerror(ERR_R_MALLOC_FAILURE); | ||
| 761 | goto err; | ||
| 762 | } | ||
| 763 | if (!EC_POINT_point2oct(group, point, form, buffer, len, NULL)) { | ||
| 764 | ECerror(ERR_R_EC_LIB); | ||
| 765 | goto err; | ||
| 766 | } | ||
| 767 | if (ret->base == NULL && (ret->base = ASN1_OCTET_STRING_new()) == NULL) { | ||
| 768 | ECerror(ERR_R_MALLOC_FAILURE); | ||
| 769 | goto err; | ||
| 770 | } | ||
| 771 | if (!ASN1_OCTET_STRING_set(ret->base, buffer, len)) { | ||
| 772 | ECerror(ERR_R_ASN1_LIB); | ||
| 773 | goto err; | 797 | goto err; |
| 774 | } | 798 | |
| 775 | if ((order = EC_GROUP_get0_order(group)) == NULL) { | 799 | if ((order = EC_GROUP_get0_order(group)) == NULL) { |
| 776 | ECerror(ERR_R_EC_LIB); | 800 | ECerror(ERR_R_EC_LIB); |
| 777 | goto err; | 801 | goto err; |
| @@ -804,7 +828,6 @@ ec_asn1_group2parameters(const EC_GROUP *group) | |||
| 804 | ECPARAMETERS_free(ret); | 828 | ECPARAMETERS_free(ret); |
| 805 | ret = NULL; | 829 | ret = NULL; |
| 806 | } | 830 | } |
| 807 | free(buffer); | ||
| 808 | return (ret); | 831 | return (ret); |
| 809 | } | 832 | } |
| 810 | 833 | ||
