diff --git a/crypto/ec/ec.h b/crypto/ec/ec.h index 448bcd428f95f5a575235e75a6d1d326a5bb982d..1a4569311e61a9f3a915565ba4acf1cae74895c1 100644 --- a/crypto/ec/ec.h +++ b/crypto/ec/ec.h @@ -130,8 +130,12 @@ int EC_GROUP_get_cofactor(const EC_GROUP *, BIGNUM *cofactor, BN_CTX *); * after choosing an appropriate EC_METHOD */ EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *); -EC_GROUP *EC_GROUP_get_group_by_name(int name); -/* Valid arguments to EC_GROUP_get_group_by_name(): */ +/* EC_GROUP_new_by_nid() and EC_GROUP_new_by_name() also set + * generator and order */ +EC_GROUP *EC_GROUP_new_by_nid(const int nid); +EC_GROUP *EC_GROUP_new_by_name(int name); +/* Currently valid arguments to EC_GROUP_new_by_name() + * (unfortunately some curves have no OIDs [and no NIDs]): */ #define EC_GROUP_NO_CURVE 0 #define EC_GROUP_NIST_PRIME_192 1 #define EC_GROUP_NIST_PRIME_224 2 @@ -146,8 +150,6 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name); #define EC_GROUP_X9_62_PRIME_239V3 NID_X9_62_prime239v3 #define EC_GROUP_X9_62_PRIME_256V1 NID_X9_62_prime256v1 -EC_GROUP *EC_GROUP_nid2group(const int nid); -int EC_GROUP_group2nid(const EC_GROUP *group); EC_POINT *EC_POINT_new(const EC_GROUP *); @@ -220,16 +222,16 @@ void ERR_load_EC_strings(void); #define EC_F_EC_GROUP_GET_COFACTOR 140 #define EC_F_EC_GROUP_GET_CURVE_GFP 130 #define EC_F_EC_GROUP_GET_EXTRA_DATA 107 -#define EC_F_EC_GROUP_GET_GROUP_BY_NAME 144 #define EC_F_EC_GROUP_GET_ORDER 141 -#define EC_F_EC_GROUP_GROUP2NID 145 +#define EC_F_EC_GROUP_GROUP2NID 147 #define EC_F_EC_GROUP_NEW 108 -#define EC_F_EC_GROUP_NID2GROUP 146 +#define EC_F_EC_GROUP_NEW_BY_NAME 144 +#define EC_F_EC_GROUP_NEW_BY_NID 146 +#define EC_F_EC_GROUP_NEW_GFP_FROM_HEX 148 #define EC_F_EC_GROUP_PRECOMPUTE_MULT 142 #define EC_F_EC_GROUP_SET_CURVE_GFP 109 #define EC_F_EC_GROUP_SET_EXTRA_DATA 110 #define EC_F_EC_GROUP_SET_GENERATOR 111 -#define EC_F_EC_GROUP_SET_PRIME_GROUP 147 #define EC_F_EC_POINTS_MAKE_AFFINE 136 #define EC_F_EC_POINTS_MUL 138 #define EC_F_EC_POINT_ADD 112 diff --git a/crypto/ec/ec_curve.c b/crypto/ec/ec_curve.c index 4c3ac8430e2c467a266cb66eb780b49559c7abd1..a1388b472fa56cec1945099dbf2a479638a9efa3 100644 --- a/crypto/ec/ec_curve.c +++ b/crypto/ec/ec_curve.c @@ -59,62 +59,7 @@ #include #include -EC_GROUP *EC_GROUP_nid2group(const int nid) - { - switch(nid) - { - case NID_X9_62_prime192v1: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_192V1); - case NID_X9_62_prime192v2: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_192V2); - case NID_X9_62_prime192v3: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_192V3); - case NID_X9_62_prime239v1: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_239V1); - case NID_X9_62_prime239v2: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_239V2); - case NID_X9_62_prime239v3: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_239V3); - case NID_X9_62_prime256v1: - return EC_GROUP_get_group_by_name(EC_GROUP_X9_62_PRIME_256V1); - } - ECerr(EC_F_EC_GROUP_NID2GROUP, EC_R_UNKNOWN_NID); - return NULL; - } - -int EC_GROUP_group2nid(const EC_GROUP *group) - { - return EC_GROUP_get_nid(group); - -#if 0 -/* TODO: a real compare function for EC_GROUPs */ -#define EC_GROUP_cmp(a,b) ((a) != (b)) - - if (group == NULL) - { - ECerr(EC_F_EC_GROUP_GROUP2NID, EC_R_MISSING_PARAMETERS); - return 0; - } - if (!EC_GROUP_cmp(group, EC_GROUP_GET_X9_62_192V1_GROUP())) - return NID_X9_62_prime192v1; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_192v2_group())) - return NID_X9_62_prime192v2; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_192v3_group())) - return NID_X9_62_prime192v3; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v1_group())) - return NID_X9_62_prime239v1; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v2_group())) - return NID_X9_62_prime239v2; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v3_group())) - return NID_X9_62_prime239v3; - else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_256v1_group())) - return NID_X9_62_prime256v1; - ECerr(EC_F_EC_GROUP_GROUP2NID, EC_R_UNKNOWN_GROUP); - return 0; -#endif - } - -static EC_GROUP *ec_group_set_prime_group(const char *prime_in, +static EC_GROUP *ec_group_new_GFp_from_hex(const char *prime_in, const char *a_in, const char *b_in, const char *x_in, const int y_bit, const char *order_in) { @@ -142,7 +87,7 @@ static EC_GROUP *ec_group_set_prime_group(const char *prime_in, ok=1; bn_err: if (!ok) - ECerr(EC_F_EC_GROUP_SET_PRIME_GROUP, ERR_R_BN_LIB); + ECerr(EC_F_EC_GROUP_NEW_GFP_FROM_HEX, ERR_R_BN_LIB); err: if (!ok) { @@ -157,9 +102,9 @@ err: if (order) BN_free(order); if (x) BN_free(x); return(group); -} + } -EC_GROUP *EC_GROUP_get_group_by_name(int name) +EC_GROUP *EC_GROUP_new_by_name(int name) { EC_GROUP *ret = NULL; switch (name) @@ -168,7 +113,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return NULL; case EC_GROUP_NIST_PRIME_224: - return ec_group_set_prime_group( + return ec_group_new_GFp_from_hex( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", @@ -176,7 +121,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D"); case EC_GROUP_NIST_PRIME_384: - return ec_group_set_prime_group( + return ec_group_new_GFp_from_hex( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", @@ -184,7 +129,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973"); case EC_GROUP_NIST_PRIME_521: - return ec_group_set_prime_group( + return ec_group_new_GFp_from_hex( "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" @@ -198,7 +143,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) case EC_GROUP_NIST_PRIME_192: case EC_GROUP_X9_62_PRIME_192V1: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", @@ -208,7 +153,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return ret; case EC_GROUP_X9_62_PRIME_192V2: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953", @@ -218,7 +163,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return ret; case EC_GROUP_X9_62_PRIME_192V3: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "22123DC2395A05CAA7423DAECCC94760A7D462256BD56916", @@ -228,7 +173,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return ret; case EC_GROUP_X9_62_PRIME_239V1: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", "6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A", @@ -238,7 +183,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return ret; case EC_GROUP_X9_62_PRIME_239V2: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", "617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C", @@ -248,7 +193,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) return ret; case EC_GROUP_X9_62_PRIME_239V3: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF", "7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC", "255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E", @@ -259,7 +204,7 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) case EC_GROUP_NIST_PRIME_256: case EC_GROUP_X9_62_PRIME_256V1: - ret = ec_group_set_prime_group( + ret = ec_group_new_GFp_from_hex( "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", @@ -267,8 +212,67 @@ EC_GROUP *EC_GROUP_get_group_by_name(int name) "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551"); EC_GROUP_set_nid(ret, NID_X9_62_prime256v1); return ret; + } + + ECerr(EC_F_EC_GROUP_NEW_BY_NAME, EC_R_UNKNOWN_GROUP); + return NULL; } - ECerr(EC_F_EC_GROUP_GET_GROUP_BY_NAME, EC_R_UNKNOWN_GROUP); + +EC_GROUP *EC_GROUP_new_by_nid(const int nid) + { + switch(nid) + { + case NID_X9_62_prime192v1: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_192V1); + case NID_X9_62_prime192v2: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_192V2); + case NID_X9_62_prime192v3: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_192V3); + case NID_X9_62_prime239v1: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_239V1); + case NID_X9_62_prime239v2: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_239V2); + case NID_X9_62_prime239v3: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_239V3); + case NID_X9_62_prime256v1: + return EC_GROUP_new_by_name(EC_GROUP_X9_62_PRIME_256V1); + } + ECerr(EC_F_EC_GROUP_NEW_BY_NID, EC_R_UNKNOWN_NID); return NULL; -} + } + + +#if 0 +int EC_GROUP_group2nid(const EC_GROUP *group) + { + return EC_GROUP_get_nid(group); + +#if 0 +/* TODO: a real compare function for EC_GROUPs */ +#define EC_GROUP_cmp(a,b) ((a) != (b)) + + if (group == NULL) + { + ECerr(EC_F_EC_GROUP_GROUP2NID, EC_R_MISSING_PARAMETERS); + return 0; + } + if (!EC_GROUP_cmp(group, EC_GROUP_GET_X9_62_192V1_GROUP())) + return NID_X9_62_prime192v1; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_192v2_group())) + return NID_X9_62_prime192v2; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_192v3_group())) + return NID_X9_62_prime192v3; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v1_group())) + return NID_X9_62_prime239v1; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v2_group())) + return NID_X9_62_prime239v2; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_239v3_group())) + return NID_X9_62_prime239v3; + else if (!EC_GROUP_cmp(group, EC_GROUP_get_x9_62_256v1_group())) + return NID_X9_62_prime256v1; + ECerr(EC_F_EC_GROUP_GROUP2NID, EC_R_UNKNOWN_GROUP); + return 0; +#endif + } +#endif diff --git a/crypto/ec/ec_err.c b/crypto/ec/ec_err.c index 1b023d7099248f3ba215286b21046fbf99694354..986205088747d58b15d549bbfaf3e6542da8d108 100644 --- a/crypto/ec/ec_err.c +++ b/crypto/ec/ec_err.c @@ -85,16 +85,16 @@ static ERR_STRING_DATA EC_str_functs[]= {ERR_PACK(0,EC_F_EC_GROUP_GET_COFACTOR,0), "EC_GROUP_get_cofactor"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_CURVE_GFP,0), "EC_GROUP_get_curve_GFp"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_EXTRA_DATA,0), "EC_GROUP_get_extra_data"}, -{ERR_PACK(0,EC_F_EC_GROUP_GET_GROUP_BY_NAME,0), "EC_GROUP_get_group_by_name"}, {ERR_PACK(0,EC_F_EC_GROUP_GET_ORDER,0), "EC_GROUP_get_order"}, -{ERR_PACK(0,EC_F_EC_GROUP_GROUP2NID,0), "EC_GROUP_group2nid"}, +{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_NID2GROUP,0), "EC_GROUP_nid2group"}, +{ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NAME,0), "EC_GROUP_new_by_name"}, +{ERR_PACK(0,EC_F_EC_GROUP_NEW_BY_NID,0), "EC_GROUP_new_by_nid"}, +{ERR_PACK(0,EC_F_EC_GROUP_NEW_GFP_FROM_HEX,0), "EC_GROUP_NEW_GFP_FROM_HEX"}, {ERR_PACK(0,EC_F_EC_GROUP_PRECOMPUTE_MULT,0), "EC_GROUP_precompute_mult"}, {ERR_PACK(0,EC_F_EC_GROUP_SET_CURVE_GFP,0), "EC_GROUP_set_curve_GFp"}, {ERR_PACK(0,EC_F_EC_GROUP_SET_EXTRA_DATA,0), "EC_GROUP_set_extra_data"}, {ERR_PACK(0,EC_F_EC_GROUP_SET_GENERATOR,0), "EC_GROUP_set_generator"}, -{ERR_PACK(0,EC_F_EC_GROUP_SET_PRIME_GROUP,0), "EC_GROUP_SET_PRIME_GROUP"}, {ERR_PACK(0,EC_F_EC_POINTS_MAKE_AFFINE,0), "EC_POINTs_make_affine"}, {ERR_PACK(0,EC_F_EC_POINTS_MUL,0), "EC_POINTs_mul"}, {ERR_PACK(0,EC_F_EC_POINT_ADD,0), "EC_POINT_add"},