summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/ec/ec_asn1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/ec/ec_asn1.c')
-rw-r--r--src/lib/libcrypto/ec/ec_asn1.c194
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
93int
94EC_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
111int
112EC_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 */
136typedef struct x9_62_pentanomial_st { 93typedef 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) {