From 34f1f2a81cd15ed15007506a3d50c1ce73986c10 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Bodo=20M=C3=B6ller?= Date: Mon, 26 Aug 2002 18:08:53 +0000 Subject: [PATCH] less specific interface for EC_GROUP_get_basis_type Submitted by: Nils Larsch, Bodo Moeller --- crypto/asn1/t_pkey.c | 3 +- crypto/ec/ec.h | 11 +++++-- crypto/ec/ec2_smpl.c | 6 +++- crypto/ec/ec_asn1.c | 78 +++++++++++++++++++++++++++++++------------- crypto/ec/ec_err.c | 4 +++ util/libeay.num | 2 ++ 6 files changed, 75 insertions(+), 29 deletions(-) diff --git a/crypto/asn1/t_pkey.c b/crypto/asn1/t_pkey.c index 0a20311c56..0112f7cced 100644 --- a/crypto/asn1/t_pkey.c +++ b/crypto/asn1/t_pkey.c @@ -420,8 +420,7 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off) if (is_char_two) { /* print the 'short name' of the base type OID */ - int basis_type = EC_GROUP_get_basis_type(x, NULL, - NULL, NULL); + int basis_type = EC_GROUP_get_basis_type(x); if (basis_type == 0) goto err; diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index e401eb739c..faca04aab9 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -257,9 +257,10 @@ int EC_GROUP_precompute_mult(EC_GROUP *, BN_CTX *); /* ASN1 stuff */ /* EC_GROUP_get_basis_type() returns the NID of the basis type - * used to represent the field elements (in case of a pentanomial or trinomial - * basis the coefficient are returned in the k? arguments) */ -int EC_GROUP_get_basis_type(const EC_GROUP *, unsigned int *k1, + * used to represent the field elements */ +int EC_GROUP_get_basis_type(const EC_GROUP *); +int EC_GROUP_get_trinomial_basis(const EC_GROUP *, unsigned int *k); +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *, unsigned int *k1, unsigned int *k2, unsigned int *k3); #define OPENSSL_EC_NAMED_CURVE 0x001 @@ -372,6 +373,7 @@ void ERR_load_EC_strings(void); #define EC_F_EC_ASN1_PARAMETERS2GROUP 157 #define EC_F_EC_ASN1_PKPARAMETERS2GROUP 158 #define EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT 159 +#define EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE 195 #define EC_F_EC_GF2M_SIMPLE_OCT2POINT 160 #define EC_F_EC_GF2M_SIMPLE_POINT2OCT 161 #define EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES 162 @@ -405,6 +407,8 @@ void ERR_load_EC_strings(void); #define EC_F_EC_GROUP_GET_DEGREE 173 #define EC_F_EC_GROUP_GET_EXTRA_DATA 107 #define EC_F_EC_GROUP_GET_ORDER 141 +#define EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS 193 +#define EC_F_EC_GROUP_GET_TRINOMIAL_BASIS 194 #define EC_F_EC_GROUP_GROUP2NID 147 #define EC_F_EC_GROUP_NEW 108 #define EC_F_EC_GROUP_NEW_BY_NID 174 @@ -481,6 +485,7 @@ void ERR_load_EC_strings(void); #define EC_R_UNDEFINED_ORDER 128 #define EC_R_UNKNOWN_GROUP 129 #define EC_R_UNKNOWN_ORDER 114 +#define EC_R_UNSUPPORTED_FIELD 131 #define EC_R_WRONG_ORDER 130 #ifdef __cplusplus diff --git a/crypto/ec/ec2_smpl.c b/crypto/ec/ec2_smpl.c index 980d396c81..ece8abb8f6 100644 --- a/crypto/ec/ec2_smpl.c +++ b/crypto/ec/ec2_smpl.c @@ -200,7 +200,11 @@ int ec_GF2m_simple_group_set_curve(EC_GROUP *group, /* group->field */ if (!BN_copy(&group->field, p)) goto err; i = BN_GF2m_poly2arr(&group->field, group->poly, 5); - if ((i != 5) && (i != 3)) goto err; + if ((i != 5) && (i != 3)) + { + ECerr(EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE, EC_R_UNSUPPORTED_FIELD); + goto err; + } /* group->a */ if (!BN_GF2m_mod_arr(&group->a, a, group->poly)) goto err; diff --git a/crypto/ec/ec_asn1.c b/crypto/ec/ec_asn1.c index 8b0167bd60..63d33a5f56 100644 --- a/crypto/ec/ec_asn1.c +++ b/crypto/ec/ec_asn1.c @@ -63,13 +63,9 @@ #include -int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, - unsigned int *k2, unsigned int *k3) +int EC_GROUP_get_basis_type(const EC_GROUP *group) { - int i = 0; - - if (group == NULL) - return 0; + int i=0; if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) != NID_X9_62_characteristic_two_field) @@ -80,28 +76,55 @@ int EC_GROUP_get_basis_type(const EC_GROUP *group, unsigned int *k1, i++; if (i == 4) - { - if (k1) - *k1 = group->poly[3]; - if (k2) - *k2 = group->poly[2]; - if (k3) - *k3 = group->poly[1]; - return NID_X9_62_ppBasis; - } else if (i == 2) - { - if (k1) - *k1 = group->poly[1]; - return NID_X9_62_tpBasis; - } else /* everything else is currently not supported */ return 0; } +int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) + { + if (group == NULL) + return 0; + + if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve + || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] == 0))) + { + ECerr(EC_F_EC_GROUP_GET_TRINOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + return 0; + } + + if (k) + *k = group->poly[1]; + + return 1; + } + +int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, + unsigned int *k2, unsigned int *k3) + { + if (group == NULL) + return 0; + + if (EC_GROUP_method_of(group)->group_set_curve != ec_GF2m_simple_group_set_curve + || !((group->poly[0] != 0) && (group->poly[1] != 0) && (group->poly[2] != 0) && (group->poly[3] != 0) && (group->poly[4] == 0))) + { + ECerr(EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED); + return 0; + } + + if (k1) + *k1 = group->poly[3]; + if (k2) + *k2 = group->poly[2]; + if (k3) + *k3 = group->poly[1]; + + return 1; + } + /* some structures needed for the asn1 encoding */ @@ -323,7 +346,6 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, else /* nid == NID_X9_62_characteristic_two_field */ { int field_type; - unsigned int k1, k2, k3; char_two = X9_62_CHARACTERISTIC_TWO_new(); if (char_two == NULL) @@ -334,7 +356,7 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, char_two->m = (long)EC_GROUP_get_degree(group); - field_type = EC_GROUP_get_basis_type(group, &k1, &k2, &k3); + field_type = EC_GROUP_get_basis_type(group); if (field_type == 0) { @@ -350,6 +372,11 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, if (field_type == NID_X9_62_tpBasis) { + unsigned int k; + + if (!EC_GROUP_get_trinomial_basis(group, &k)) + goto err; + char_two->parameters->type = V_ASN1_INTEGER; char_two->parameters->value.integer = ASN1_INTEGER_new(); @@ -359,7 +386,7 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, ERR_R_ASN1_LIB); goto err; } - if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k1)) + if (!ASN1_INTEGER_set(char_two->parameters->value.integer, (long)k)) { ECerr(EC_F_EC_ASN1_GROUP2PARAMETERS, ERR_R_ASN1_LIB); @@ -368,6 +395,11 @@ static X9_62_FIELDID *ec_asn1_group2field(const EC_GROUP *group, } else if (field_type == NID_X9_62_ppBasis) { + unsigned int k1, k2, k3; + + if (!EC_GROUP_get_pentanomial_basis(group, &k1, &k2, &k3)) + goto err; + penta = X9_62_PENTANOMIAL_new(); /* set k? values */ penta->k1 = (long)k1; diff --git a/crypto/ec/ec_err.c b/crypto/ec/ec_err.c index 3a0f3f10e8..8ae2c00e32 100644 --- a/crypto/ec/ec_err.c +++ b/crypto/ec/ec_err.c @@ -83,6 +83,7 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_ASN1_PARAMETERS2GROUP,0), "EC_ASN1_PARAMETERS2GROUP"}, {ERR_PACK(0,EC_F_EC_ASN1_PKPARAMETERS2GROUP,0), "EC_ASN1_PKPARAMETERS2GROUP"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_GROUP_CHECK_DISCRIMINANT,0), "ec_GF2m_simple_group_check_discriminant"}, +{ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_GROUP_SET_CURVE,0), "ec_GF2m_simple_group_set_curve"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_OCT2POINT,0), "ec_GF2m_simple_oct2point"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_POINT2OCT,0), "ec_GF2m_simple_point2oct"}, {ERR_PACK(0,EC_F_EC_GF2M_SIMPLE_POINT_GET_AFFINE_COORDINATES,0), "ec_GF2m_simple_point_get_affine_coordinates"}, @@ -116,6 +117,8 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_GROUP_GET_DEGREE,0), "EC_GROUP_get_degree"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_EXTRA_DATA,0), "EC_GROUP_get_extra_data"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_ORDER,0), "EC_GROUP_get_order"}, +{ERR_PACK(0,EC_F_EC_GROUP_GET_PENTANOMIAL_BASIS,0), "EC_GROUP_get_pentanomial_basis"}, +{ERR_PACK(0,EC_F_EC_GROUP_GET_TRINOMIAL_BASIS,0), "EC_GROUP_get_trinomial_basis"}, {ERR_PACK(0,EC_F_EC_GROUP_GROUP2NID,0), "EC_GROUP_GROUP2NID"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW,0), "EC_GROUP_new"}, {ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NID,0), "EC_GROUP_new_by_nid"}, @@ -195,6 +198,7 @@ static ERR_STRING_DATA EC_str_reasons[]= {EC_R_UNDEFINED_ORDER ,"undefined order"}, {EC_R_UNKNOWN_GROUP ,"unknown group"}, {EC_R_UNKNOWN_ORDER ,"unknown order"}, +{EC_R_UNSUPPORTED_FIELD ,"unsupported field"}, {EC_R_WRONG_ORDER ,"wrong order"}, {0,NULL} }; diff --git a/util/libeay.num b/util/libeay.num index 5a28ed1303..7f86dbc01b 100755 --- a/util/libeay.num +++ b/util/libeay.num @@ -3007,3 +3007,5 @@ EC_GROUP_get0_comment 3440 EXIST::FUNCTION:EC ec_group_index2nid 3441 EXIST::FUNCTION:EC EC_GROUP_get_basis_type 3442 EXIST::FUNCTION:EC X509_REQ_print_ex 3443 EXIST::FUNCTION:BIO +EC_GROUP_get_pentanomial_basis 3444 EXIST::FUNCTION:EC +EC_GROUP_get_trinomial_basis 3445 EXIST::FUNCTION:EC -- 2.25.1