diff options
Diffstat (limited to 'src/lib/libcrypto/ec/ec_asn1.c')
-rw-r--r-- | src/lib/libcrypto/ec/ec_asn1.c | 194 |
1 files changed, 4 insertions, 190 deletions
diff --git a/src/lib/libcrypto/ec/ec_asn1.c b/src/lib/libcrypto/ec/ec_asn1.c index fb6a8e84c1..c62ba226f0 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.41 2023/03/08 05:45:31 jsing Exp $ */ | 1 | /* $OpenBSD: ec_asn1.c,v 1.42 2023/04/25 19:53:30 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Written by Nils Larsch for the OpenSSL project. | 3 | * Written by Nils Larsch for the OpenSSL project. |
4 | */ | 4 | */ |
@@ -89,49 +89,6 @@ EC_GROUP_get_basis_type(const EC_GROUP *group) | |||
89 | return 0; | 89 | return 0; |
90 | } | 90 | } |
91 | 91 | ||
92 | #ifndef OPENSSL_NO_EC2M | ||
93 | int | ||
94 | EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) | ||
95 | { | ||
96 | if (group == NULL) | ||
97 | return 0; | ||
98 | |||
99 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != | ||
100 | NID_X9_62_characteristic_two_field | ||
101 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) { | ||
102 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
103 | return 0; | ||
104 | } | ||
105 | if (k) | ||
106 | *k = group->poly[1]; | ||
107 | |||
108 | return 1; | ||
109 | } | ||
110 | |||
111 | int | ||
112 | EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, | ||
113 | unsigned int *k2, unsigned int *k3) | ||
114 | { | ||
115 | if (group == NULL) | ||
116 | return 0; | ||
117 | |||
118 | if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != | ||
119 | NID_X9_62_characteristic_two_field | ||
120 | || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) { | ||
121 | ECerror(ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); | ||
122 | return 0; | ||
123 | } | ||
124 | if (k1) | ||
125 | *k1 = group->poly[3]; | ||
126 | if (k2) | ||
127 | *k2 = group->poly[2]; | ||
128 | if (k3) | ||
129 | *k3 = group->poly[1]; | ||
130 | |||
131 | return 1; | ||
132 | } | ||
133 | #endif | ||
134 | |||
135 | /* some structures needed for the asn1 encoding */ | 92 | /* some structures needed for the asn1 encoding */ |
136 | typedef struct x9_62_pentanomial_st { | 93 | typedef struct x9_62_pentanomial_st { |
137 | long k1; | 94 | long k1; |
@@ -719,77 +676,10 @@ ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field) | |||
719 | ECerror(ERR_R_ASN1_LIB); | 676 | ECerror(ERR_R_ASN1_LIB); |
720 | goto err; | 677 | goto err; |
721 | } | 678 | } |
722 | } else /* nid == NID_X9_62_characteristic_two_field */ | 679 | } else { |
723 | #ifdef OPENSSL_NO_EC2M | ||
724 | { | ||
725 | ECerror(EC_R_GF2M_NOT_SUPPORTED); | 680 | ECerror(EC_R_GF2M_NOT_SUPPORTED); |
726 | goto err; | 681 | goto err; |
727 | } | 682 | } |
728 | #else | ||
729 | { | ||
730 | int field_type; | ||
731 | X9_62_CHARACTERISTIC_TWO *char_two; | ||
732 | |||
733 | field->p.char_two = X9_62_CHARACTERISTIC_TWO_new(); | ||
734 | char_two = field->p.char_two; | ||
735 | |||
736 | if (char_two == NULL) { | ||
737 | ECerror(ERR_R_MALLOC_FAILURE); | ||
738 | goto err; | ||
739 | } | ||
740 | char_two->m = (long) EC_GROUP_get_degree(group); | ||
741 | |||
742 | field_type = EC_GROUP_get_basis_type(group); | ||
743 | |||
744 | if (field_type == 0) { | ||
745 | ECerror(ERR_R_EC_LIB); | ||
746 | goto err; | ||
747 | } | ||
748 | /* set base type OID */ | ||
749 | if ((char_two->type = OBJ_nid2obj(field_type)) == NULL) { | ||
750 | ECerror(ERR_R_OBJ_LIB); | ||
751 | goto err; | ||
752 | } | ||
753 | if (field_type == NID_X9_62_tpBasis) { | ||
754 | unsigned int k; | ||
755 | |||
756 | if (!EC_GROUP_get_trinomial_basis(group, &k)) | ||
757 | goto err; | ||
758 | |||
759 | char_two->p.tpBasis = ASN1_INTEGER_new(); | ||
760 | if (!char_two->p.tpBasis) { | ||
761 | ECerror(ERR_R_MALLOC_FAILURE); | ||
762 | goto err; | ||
763 | } | ||
764 | if (!ASN1_INTEGER_set(char_two->p.tpBasis, (long) k)) { | ||
765 | ECerror(ERR_R_ASN1_LIB); | ||
766 | goto err; | ||
767 | } | ||
768 | } else if (field_type == NID_X9_62_ppBasis) { | ||
769 | unsigned int k1, k2, k3; | ||
770 | |||
771 | if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) | ||
772 | goto err; | ||
773 | |||
774 | char_two->p.ppBasis = X9_62_PENTANOMIAL_new(); | ||
775 | if (!char_two->p.ppBasis) { | ||
776 | ECerror(ERR_R_MALLOC_FAILURE); | ||
777 | goto err; | ||
778 | } | ||
779 | /* set k? values */ | ||
780 | char_two->p.ppBasis->k1 = (long) k1; | ||
781 | char_two->p.ppBasis->k2 = (long) k2; | ||
782 | char_two->p.ppBasis->k3 = (long) k3; | ||
783 | } else { /* field_type == NID_X9_62_onBasis */ | ||
784 | /* for ONB the parameters are (asn1) NULL */ | ||
785 | char_two->p.onBasis = ASN1_NULL_new(); | ||
786 | if (!char_two->p.onBasis) { | ||
787 | ECerror(ERR_R_MALLOC_FAILURE); | ||
788 | goto err; | ||
789 | } | ||
790 | } | ||
791 | } | ||
792 | #endif | ||
793 | 683 | ||
794 | ok = 1; | 684 | ok = 1; |
795 | 685 | ||
@@ -1067,86 +957,10 @@ ec_asn1_parameters2group(const ECPARAMETERS *params) | |||
1067 | } | 957 | } |
1068 | /* get the field parameters */ | 958 | /* get the field parameters */ |
1069 | tmp = OBJ_obj2nid(params->fieldID->fieldType); | 959 | tmp = OBJ_obj2nid(params->fieldID->fieldType); |
1070 | if (tmp == NID_X9_62_characteristic_two_field) | 960 | if (tmp == NID_X9_62_characteristic_two_field) { |
1071 | #ifdef OPENSSL_NO_EC2M | ||
1072 | { | ||
1073 | ECerror(EC_R_GF2M_NOT_SUPPORTED); | 961 | ECerror(EC_R_GF2M_NOT_SUPPORTED); |
1074 | goto err; | 962 | goto err; |
1075 | } | 963 | } else if (tmp == NID_X9_62_prime_field) { |
1076 | #else | ||
1077 | { | ||
1078 | X9_62_CHARACTERISTIC_TWO *char_two; | ||
1079 | |||
1080 | char_two = params->fieldID->p.char_two; | ||
1081 | |||
1082 | field_bits = char_two->m; | ||
1083 | if (field_bits > OPENSSL_ECC_MAX_FIELD_BITS) { | ||
1084 | ECerror(EC_R_FIELD_TOO_LARGE); | ||
1085 | goto err; | ||
1086 | } | ||
1087 | if ((p = BN_new()) == NULL) { | ||
1088 | ECerror(ERR_R_MALLOC_FAILURE); | ||
1089 | goto err; | ||
1090 | } | ||
1091 | /* get the base type */ | ||
1092 | tmp = OBJ_obj2nid(char_two->type); | ||
1093 | |||
1094 | if (tmp == NID_X9_62_tpBasis) { | ||
1095 | long tmp_long; | ||
1096 | |||
1097 | if (!char_two->p.tpBasis) { | ||
1098 | ECerror(EC_R_ASN1_ERROR); | ||
1099 | goto err; | ||
1100 | } | ||
1101 | tmp_long = ASN1_INTEGER_get(char_two->p.tpBasis); | ||
1102 | |||
1103 | if (!(char_two->m > tmp_long && tmp_long > 0)) { | ||
1104 | ECerror(EC_R_INVALID_TRINOMIAL_BASIS); | ||
1105 | goto err; | ||
1106 | } | ||
1107 | /* create the polynomial */ | ||
1108 | if (!BN_set_bit(p, (int) char_two->m)) | ||
1109 | goto err; | ||
1110 | if (!BN_set_bit(p, (int) tmp_long)) | ||
1111 | goto err; | ||
1112 | if (!BN_set_bit(p, 0)) | ||
1113 | goto err; | ||
1114 | } else if (tmp == NID_X9_62_ppBasis) { | ||
1115 | X9_62_PENTANOMIAL *penta; | ||
1116 | |||
1117 | penta = char_two->p.ppBasis; | ||
1118 | if (!penta) { | ||
1119 | ECerror(EC_R_ASN1_ERROR); | ||
1120 | goto err; | ||
1121 | } | ||
1122 | if (!(char_two->m > penta->k3 && penta->k3 > penta->k2 && penta->k2 > penta->k1 && penta->k1 > 0)) { | ||
1123 | ECerror(EC_R_INVALID_PENTANOMIAL_BASIS); | ||
1124 | goto err; | ||
1125 | } | ||
1126 | /* create the polynomial */ | ||
1127 | if (!BN_set_bit(p, (int) char_two->m)) | ||
1128 | goto err; | ||
1129 | if (!BN_set_bit(p, (int) penta->k1)) | ||
1130 | goto err; | ||
1131 | if (!BN_set_bit(p, (int) penta->k2)) | ||
1132 | goto err; | ||
1133 | if (!BN_set_bit(p, (int) penta->k3)) | ||
1134 | goto err; | ||
1135 | if (!BN_set_bit(p, 0)) | ||
1136 | goto err; | ||
1137 | } else if (tmp == NID_X9_62_onBasis) { | ||
1138 | ECerror(EC_R_NOT_IMPLEMENTED); | ||
1139 | goto err; | ||
1140 | } else { /* error */ | ||
1141 | ECerror(EC_R_ASN1_ERROR); | ||
1142 | goto err; | ||
1143 | } | ||
1144 | |||
1145 | /* create the EC_GROUP structure */ | ||
1146 | ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); | ||
1147 | } | ||
1148 | #endif | ||
1149 | else if (tmp == NID_X9_62_prime_field) { | ||
1150 | /* we have a curve over a prime field */ | 964 | /* we have a curve over a prime field */ |
1151 | /* extract the prime number */ | 965 | /* extract the prime number */ |
1152 | if (!params->fieldID->p.prime) { | 966 | if (!params->fieldID->p.prime) { |