New option to disable characteristic two fields in EC code.

This commit is contained in:
Dr. Stephen Henson 2011-02-12 17:23:32 +00:00
parent afb4191304
commit b331016124
19 changed files with 98 additions and 30 deletions

View File

@ -4,6 +4,9 @@
Changes between 1.0.1 and 1.1.0 [xx XXX xxxx] Changes between 1.0.1 and 1.1.0 [xx XXX xxxx]
*) New build option no-ec2m to disable characteristic 2 code.
[Steve Henson]
*) New build option "fipscanisteronly". This only builds fipscanister.o *) New build option "fipscanisteronly". This only builds fipscanister.o
and (currently) associated fips utilities. Uses the file Makefile.fips and (currently) associated fips utilities. Uses the file Makefile.fips
instead of Makefile.org as the prototype. instead of Makefile.org as the prototype.

View File

@ -94,6 +94,8 @@
#include "cryptlib.h" #include "cryptlib.h"
#include "bn_lcl.h" #include "bn_lcl.h"
#ifndef OPENSSL_NO_EC2M
/* Maximum number of iterations before BN_GF2m_mod_solve_quad_arr should fail. */ /* Maximum number of iterations before BN_GF2m_mod_solve_quad_arr should fail. */
#define MAX_ITERATIONS 50 #define MAX_ITERATIONS 50
@ -1032,3 +1034,4 @@ int BN_GF2m_arr2poly(const int p[], BIGNUM *a)
return 1; return 1;
} }
#endif

View File

@ -262,7 +262,7 @@ int main(int argc, char *argv[])
message(out,"BN_mod_sqrt"); message(out,"BN_mod_sqrt");
if (!test_sqrt(out,ctx)) goto err; if (!test_sqrt(out,ctx)) goto err;
(void)BIO_flush(out); (void)BIO_flush(out);
#ifndef OPENSSL_NO_EC2M
message(out,"BN_GF2m_add"); message(out,"BN_GF2m_add");
if (!test_gf2m_add(out)) goto err; if (!test_gf2m_add(out)) goto err;
(void)BIO_flush(out); (void)BIO_flush(out);
@ -298,7 +298,7 @@ int main(int argc, char *argv[])
message(out,"BN_GF2m_mod_solve_quad"); message(out,"BN_GF2m_mod_solve_quad");
if (!test_gf2m_mod_solve_quad(out,ctx)) goto err; if (!test_gf2m_mod_solve_quad(out,ctx)) goto err;
(void)BIO_flush(out); (void)BIO_flush(out);
#endif
BN_CTX_free(ctx); BN_CTX_free(ctx);
BIO_free(out); BIO_free(out);
@ -1061,7 +1061,7 @@ int test_exp(BIO *bp, BN_CTX *ctx)
BN_free(one); BN_free(one);
return(1); return(1);
} }
#ifndef OPENSSL_NO_EC2M
int test_gf2m_add(BIO *bp) int test_gf2m_add(BIO *bp)
{ {
BIGNUM a,b,c; BIGNUM a,b,c;
@ -1636,7 +1636,7 @@ int test_gf2m_mod_solve_quad(BIO *bp,BN_CTX *ctx)
BN_free(e); BN_free(e);
return ret; return ret;
} }
#endif
static int genprime_cb(int p, int n, BN_GENCB *arg) static int genprime_cb(int p, int n, BN_GENCB *arg)
{ {
char c='*'; char c='*';

View File

@ -160,7 +160,7 @@ const EC_METHOD *EC_GFp_nistp224_method(void);
#endif #endif
#endif #endif
#ifndef OPENSSL_NO_EC2M
/********************************************************************/ /********************************************************************/
/* EC_METHOD for curves over GF(2^m) */ /* EC_METHOD for curves over GF(2^m) */
/********************************************************************/ /********************************************************************/
@ -170,6 +170,8 @@ const EC_METHOD *EC_GFp_nistp224_method(void);
*/ */
const EC_METHOD *EC_GF2m_simple_method(void); const EC_METHOD *EC_GF2m_simple_method(void);
#endif
/********************************************************************/ /********************************************************************/
/* EC_GROUP functions */ /* EC_GROUP functions */
@ -291,6 +293,7 @@ int EC_GROUP_set_curve_GFp(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, co
*/ */
int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
#ifndef OPENSSL_NO_EC2M
/** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b /** Sets the parameter of a ec over GF2m defined by y^2 + x*y = x^3 + a*x^2 + b
* \param group EC_GROUP object * \param group EC_GROUP object
* \param p BIGNUM with the polynomial defining the underlying field * \param p BIGNUM with the polynomial defining the underlying field
@ -310,7 +313,7 @@ int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, c
* \return 1 on success and 0 if an error occured * \return 1 on success and 0 if an error occured
*/ */
int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx); int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *b, BN_CTX *ctx);
#endif
/** Returns the number of bits needed to represent a field element /** Returns the number of bits needed to represent a field element
* \param group EC_GROUP object * \param group EC_GROUP object
* \return number of bits needed to represent a field element * \return number of bits needed to represent a field element
@ -351,7 +354,7 @@ int EC_GROUP_cmp(const EC_GROUP *a, const EC_GROUP *b, BN_CTX *ctx);
* \return newly created EC_GROUP object with the specified parameters * \return newly created EC_GROUP object with the specified parameters
*/ */
EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
#ifndef OPENSSL_NO_EC2M
/** Creates a new EC_GROUP object with the specified parameters defined /** Creates a new EC_GROUP object with the specified parameters defined
* over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b) * over GF2m (defined by the equation y^2 + x*y = x^3 + a*x^2 + b)
* \param p BIGNUM with the polynomial defining the underlying field * \param p BIGNUM with the polynomial defining the underlying field
@ -361,7 +364,7 @@ EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM
* \return newly created EC_GROUP object with the specified parameters * \return newly created EC_GROUP object with the specified parameters
*/ */
EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx); EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
#endif
/** Creates a EC_GROUP object with a curve specified by a NID /** Creates a EC_GROUP object with a curve specified by a NID
* \param nid NID of the OID of the curve name * \param nid NID of the OID of the curve name
* \return newly created EC_GROUP object with specified curve or NULL * \return newly created EC_GROUP object with specified curve or NULL
@ -490,7 +493,7 @@ int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group,
*/ */
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p, int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
const BIGNUM *x, int y_bit, BN_CTX *ctx); const BIGNUM *x, int y_bit, BN_CTX *ctx);
#ifndef OPENSSL_NO_EC2M
/** Sets the affine coordinates of a EC_POINT over GF2m /** Sets the affine coordinates of a EC_POINT over GF2m
* \param group underlying EC_GROUP object * \param group underlying EC_GROUP object
* \param p EC_POINT object * \param p EC_POINT object
@ -523,7 +526,7 @@ int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group,
*/ */
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p, int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *p,
const BIGNUM *x, int y_bit, BN_CTX *ctx); const BIGNUM *x, int y_bit, BN_CTX *ctx);
#endif
/** Encodes a EC_POINT object to a octet string /** Encodes a EC_POINT object to a octet string
* \param group underlying EC_GROUP object * \param group underlying EC_GROUP object
* \param p EC_POINT object * \param p EC_POINT object
@ -1084,6 +1087,7 @@ void ERR_load_EC_strings(void);
#define EC_R_DISCRIMINANT_IS_ZERO 118 #define EC_R_DISCRIMINANT_IS_ZERO 118
#define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119 #define EC_R_EC_GROUP_NEW_BY_NAME_FAILURE 119
#define EC_R_FIELD_TOO_LARGE 143 #define EC_R_FIELD_TOO_LARGE 143
#define EC_R_GF2M_NOT_SUPPORTED 147
#define EC_R_GROUP2PKPARAMETERS_FAILURE 120 #define EC_R_GROUP2PKPARAMETERS_FAILURE 120
#define EC_R_I2D_ECPKPARAMETERS_FAILURE 121 #define EC_R_I2D_ECPKPARAMETERS_FAILURE 121
#define EC_R_INCOMPATIBLE_OBJECTS 101 #define EC_R_INCOMPATIBLE_OBJECTS 101

View File

@ -71,6 +71,8 @@
#include "ec_lcl.h" #include "ec_lcl.h"
#ifndef OPENSSL_NO_EC2M
/* Compute the x-coordinate x/z for the point 2*(x/z) in Montgomery projective /* Compute the x-coordinate x/z for the point 2*(x/z) in Montgomery projective
* coordinates. * coordinates.
@ -384,3 +386,5 @@ int ec_GF2m_have_precompute_mult(const EC_GROUP *group)
{ {
return ec_wNAF_have_precompute_mult(group); return ec_wNAF_have_precompute_mult(group);
} }
#endif

View File

@ -71,6 +71,8 @@
#include "ec_lcl.h" #include "ec_lcl.h"
#ifndef OPENSSL_NO_EC2M
const EC_METHOD *EC_GF2m_simple_method(void) const EC_METHOD *EC_GF2m_simple_method(void)
{ {
@ -1040,3 +1042,5 @@ int ec_GF2m_simple_field_div(const EC_GROUP *group, BIGNUM *r, const BIGNUM *a,
{ {
return BN_GF2m_mod_div(r, a, b, &group->field, ctx); return BN_GF2m_mod_div(r, a, b, &group->field, ctx);
} }
#endif

View File

@ -83,7 +83,7 @@ int EC_GROUP_get_basis_type(const EC_GROUP *group)
/* everything else is currently not supported */ /* everything else is currently not supported */
return 0; return 0;
} }
#ifndef OPENSSL_NO_EC2M
int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k) int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k)
{ {
if (group == NULL) if (group == NULL)
@ -101,7 +101,6 @@ int EC_GROUP_get_trinomial_basis(const EC_GROUP *group, unsigned int *k)
return 1; return 1;
} }
int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1, int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1,
unsigned int *k2, unsigned int *k3) unsigned int *k2, unsigned int *k3)
{ {
@ -124,7 +123,7 @@ int EC_GROUP_get_pentanomial_basis(const EC_GROUP *group, unsigned int *k1,
return 1; return 1;
} }
#endif
/* some structures needed for the asn1 encoding */ /* some structures needed for the asn1 encoding */
@ -340,6 +339,12 @@ static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field)
} }
} }
else /* nid == NID_X9_62_characteristic_two_field */ else /* nid == NID_X9_62_characteristic_two_field */
#ifdef OPENSSL_NO_EC2M
{
ECerr(EC_F_EC_ASN1_GROUP2FIELDID, EC_R_GF2M_NOT_SUPPORTED);
goto err;
}
#else
{ {
int field_type; int field_type;
X9_62_CHARACTERISTIC_TWO *char_two; X9_62_CHARACTERISTIC_TWO *char_two;
@ -419,6 +424,7 @@ static int ec_asn1_group2fieldid(const EC_GROUP *group, X9_62_FIELDID *field)
} }
} }
} }
#endif
ok = 1; ok = 1;
@ -456,6 +462,7 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
goto err; goto err;
} }
} }
#ifndef OPENSSL_NO_EC2M
else /* nid == NID_X9_62_characteristic_two_field */ else /* nid == NID_X9_62_characteristic_two_field */
{ {
if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL)) if (!EC_GROUP_get_curve_GF2m(group, NULL, tmp_1, tmp_2, NULL))
@ -464,7 +471,7 @@ static int ec_asn1_group2curve(const EC_GROUP *group, X9_62_CURVE *curve)
goto err; goto err;
} }
} }
#endif
len_1 = (size_t)BN_num_bytes(tmp_1); len_1 = (size_t)BN_num_bytes(tmp_1);
len_2 = (size_t)BN_num_bytes(tmp_2); len_2 = (size_t)BN_num_bytes(tmp_2);
@ -775,8 +782,13 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
/* get the field parameters */ /* get the field parameters */
tmp = OBJ_obj2nid(params->fieldID->fieldType); tmp = OBJ_obj2nid(params->fieldID->fieldType);
if (tmp == NID_X9_62_characteristic_two_field) if (tmp == NID_X9_62_characteristic_two_field)
#ifdef OPENSSL_NO_EC2M
{
ECerr(EC_F_EC_ASN1_PARAMETERS2GROUP, EC_R_GF2M_NOT_SUPPORTED);
goto err;
}
#else
{ {
X9_62_CHARACTERISTIC_TWO *char_two; X9_62_CHARACTERISTIC_TWO *char_two;
@ -862,6 +874,7 @@ static EC_GROUP *ec_asn1_parameters2group(const ECPARAMETERS *params)
/* create the EC_GROUP structure */ /* create the EC_GROUP structure */
ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL); ret = EC_GROUP_new_curve_GF2m(p, a, b, NULL);
} }
#endif
else if (tmp == NID_X9_62_prime_field) else if (tmp == NID_X9_62_prime_field)
{ {
/* we have a curve over a prime field */ /* we have a curve over a prime field */
@ -1065,6 +1078,7 @@ EC_GROUP *d2i_ECPKParameters(EC_GROUP **a, const unsigned char **in, long len)
if ((group = ec_asn1_pkparameters2group(params)) == NULL) if ((group = ec_asn1_pkparameters2group(params)) == NULL)
{ {
ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE); ECerr(EC_F_D2I_ECPKPARAMETERS, EC_R_PKPARAMETERS2GROUP_FAILURE);
ECPKPARAMETERS_free(params);
return NULL; return NULL;
} }

View File

@ -703,6 +703,8 @@ static const struct { EC_CURVE_DATA h; unsigned char data[0+28*6]; }
0x13,0xDD,0x29,0x45,0x5C,0x5C,0x2A,0x3D } 0x13,0xDD,0x29,0x45,0x5C,0x5C,0x2A,0x3D }
}; };
#ifndef OPENSSL_NO_EC2M
/* characteristic two curves */ /* characteristic two curves */
static const struct { EC_CURVE_DATA h; unsigned char data[20+15*6]; } static const struct { EC_CURVE_DATA h; unsigned char data[20+15*6]; }
_EC_SECG_CHAR2_113R1 = { _EC_SECG_CHAR2_113R1 = {
@ -1817,6 +1819,8 @@ static const struct { EC_CURVE_DATA h; unsigned char data[0+24*6]; }
0xBA,0xFC,0xA7,0x5E } 0xBA,0xFC,0xA7,0x5E }
}; };
#endif
typedef struct _ec_list_element_st { typedef struct _ec_list_element_st {
int nid; int nid;
const EC_CURVE_DATA *data; const EC_CURVE_DATA *data;
@ -1855,6 +1859,7 @@ static const ec_list_element curve_list[] = {
{ NID_X9_62_prime239v2, &_EC_X9_62_PRIME_239V2.h, 0, "X9.62 curve over a 239 bit prime field" }, { NID_X9_62_prime239v2, &_EC_X9_62_PRIME_239V2.h, 0, "X9.62 curve over a 239 bit prime field" },
{ NID_X9_62_prime239v3, &_EC_X9_62_PRIME_239V3.h, 0, "X9.62 curve over a 239 bit prime field" }, { NID_X9_62_prime239v3, &_EC_X9_62_PRIME_239V3.h, 0, "X9.62 curve over a 239 bit prime field" },
{ NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, 0, "X9.62/SECG curve over a 256 bit prime field" }, { NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, 0, "X9.62/SECG curve over a 256 bit prime field" },
#ifndef OPENSSL_NO_EC2M
/* characteristic two field curves */ /* characteristic two field curves */
/* NIST/SECG curves */ /* NIST/SECG curves */
{ NID_sect113r1, &_EC_SECG_CHAR2_113R1.h, 0, "SECG curve over a 113 bit binary field" }, { NID_sect113r1, &_EC_SECG_CHAR2_113R1.h, 0, "SECG curve over a 113 bit binary field" },
@ -1898,18 +1903,23 @@ static const ec_list_element curve_list[] = {
{ NID_wap_wsg_idm_ecid_wtls3, &_EC_NIST_CHAR2_163K.h, 0, "NIST/SECG/WTLS curve over a 163 bit binary field" }, { NID_wap_wsg_idm_ecid_wtls3, &_EC_NIST_CHAR2_163K.h, 0, "NIST/SECG/WTLS curve over a 163 bit binary field" },
{ NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1.h, 0, "SECG curve over a 113 bit binary field" }, { NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1.h, 0, "SECG curve over a 113 bit binary field" },
{ NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1.h, 0, "X9.62 curve over a 163 bit binary field" }, { NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1.h, 0, "X9.62 curve over a 163 bit binary field" },
#endif
{ NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1.h, 0, "SECG/WTLS curve over a 112 bit prime field" }, { NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1.h, 0, "SECG/WTLS curve over a 112 bit prime field" },
{ NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2.h, 0, "SECG/WTLS curve over a 160 bit prime field" }, { NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2.h, 0, "SECG/WTLS curve over a 160 bit prime field" },
{ NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8.h, 0, "WTLS curve over a 112 bit prime field" }, { NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8.h, 0, "WTLS curve over a 112 bit prime field" },
{ NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9.h, 0, "WTLS curve over a 160 bit prime field" }, { NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9.h, 0, "WTLS curve over a 160 bit prime field" },
#ifndef OPENSSL_NO_EC2M
{ NID_wap_wsg_idm_ecid_wtls10, &_EC_NIST_CHAR2_233K.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" }, { NID_wap_wsg_idm_ecid_wtls10, &_EC_NIST_CHAR2_233K.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" },
{ NID_wap_wsg_idm_ecid_wtls11, &_EC_NIST_CHAR2_233B.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" }, { NID_wap_wsg_idm_ecid_wtls11, &_EC_NIST_CHAR2_233B.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" },
#endif
{ NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12.h, 0, "WTLS curvs over a 224 bit prime field" }, { NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12.h, 0, "WTLS curvs over a 224 bit prime field" },
#ifndef OPENSSL_NO_EC2M
/* IPSec curves */ /* IPSec curves */
{ NID_ipsec3, &_EC_IPSEC_155_ID3.h, 0, "\n\tIPSec/IKE/Oakley curve #3 over a 155 bit binary field.\n" { NID_ipsec3, &_EC_IPSEC_155_ID3.h, 0, "\n\tIPSec/IKE/Oakley curve #3 over a 155 bit binary field.\n"
"\tNot suitable for ECDSA.\n\tQuestionable extension field!" }, "\tNot suitable for ECDSA.\n\tQuestionable extension field!" },
{ NID_ipsec4, &_EC_IPSEC_185_ID4.h, 0, "\n\tIPSec/IKE/Oakley curve #4 over a 185 bit binary field.\n" { NID_ipsec4, &_EC_IPSEC_185_ID4.h, 0, "\n\tIPSec/IKE/Oakley curve #4 over a 185 bit binary field.\n"
"\tNot suitable for ECDSA.\n\tQuestionable extension field!" }, "\tNot suitable for ECDSA.\n\tQuestionable extension field!" },
#endif
}; };
#define curve_list_length (sizeof(curve_list)/sizeof(ec_list_element)) #define curve_list_length (sizeof(curve_list)/sizeof(ec_list_element))
@ -1964,6 +1974,7 @@ static EC_GROUP *ec_group_new_from_data(const ec_list_element curve)
goto err; goto err;
} }
} }
#ifndef OPENSSL_NO_EC2M
else /* field_type == NID_X9_62_characteristic_two_field */ else /* field_type == NID_X9_62_characteristic_two_field */
{ {
if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL) if ((group = EC_GROUP_new_curve_GF2m(p, a, b, ctx)) == NULL)
@ -1972,6 +1983,7 @@ static EC_GROUP *ec_group_new_from_data(const ec_list_element curve)
goto err; goto err;
} }
} }
#endif
if ((P = EC_POINT_new(group)) == NULL) if ((P = EC_POINT_new(group)) == NULL)
{ {
@ -1985,7 +1997,7 @@ static EC_GROUP *ec_group_new_from_data(const ec_list_element curve)
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB); ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_BN_LIB);
goto err; goto err;
} }
if (!EC_POINT_set_affine_coordinates_GF2m(group, P, x, y, ctx)) if (!EC_POINT_set_affine_coordinates_GFp(group, P, x, y, ctx))
{ {
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB); ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
goto err; goto err;

View File

@ -122,7 +122,7 @@ EC_GROUP *EC_GROUP_new_curve_GFp(const BIGNUM *p, const BIGNUM *a, const BIGNUM
return ret; return ret;
} }
#ifndef OPENSSL_NO_EC2M
EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
{ {
const EC_METHOD *meth; const EC_METHOD *meth;
@ -142,3 +142,4 @@ EC_GROUP *EC_GROUP_new_curve_GF2m(const BIGNUM *p, const BIGNUM *a, const BIGNUM
return ret; return ret;
} }
#endif

View File

@ -213,6 +213,7 @@ static ERR_STRING_DATA EC_str_reasons[]=
{ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"}, {ERR_REASON(EC_R_DISCRIMINANT_IS_ZERO) ,"discriminant is zero"},
{ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name failure"}, {ERR_REASON(EC_R_EC_GROUP_NEW_BY_NAME_FAILURE),"ec group new by name failure"},
{ERR_REASON(EC_R_FIELD_TOO_LARGE) ,"field too large"}, {ERR_REASON(EC_R_FIELD_TOO_LARGE) ,"field too large"},
{ERR_REASON(EC_R_GF2M_NOT_SUPPORTED) ,"gf2m not supported"},
{ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"}, {ERR_REASON(EC_R_GROUP2PKPARAMETERS_FAILURE),"group2pkparameters failure"},
{ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"}, {ERR_REASON(EC_R_I2D_ECPKPARAMETERS_FAILURE),"i2d ecpkparameters failure"},
{ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"}, {ERR_REASON(EC_R_INCOMPATIBLE_OBJECTS) ,"incompatible objects"},

View File

@ -400,7 +400,7 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y)
tx = BN_CTX_get(ctx); tx = BN_CTX_get(ctx);
ty = BN_CTX_get(ctx); ty = BN_CTX_get(ctx);
#ifndef OPENSSL_NO_EC2M
if (is_char_two) if (is_char_two)
{ {
if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point, if (!EC_POINT_set_affine_coordinates_GF2m(key->group, point,
@ -411,6 +411,7 @@ int EC_KEY_set_public_key_affine_coordinates(EC_KEY *key, BIGNUM *x, BIGNUM *y)
goto err; goto err;
} }
else else
#endif
{ {
if (!EC_POINT_set_affine_coordinates_GFp(key->group, point, if (!EC_POINT_set_affine_coordinates_GFp(key->group, point,
x, y, ctx)) x, y, ctx))

View File

@ -425,7 +425,7 @@ int EC_GROUP_get_curve_GFp(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM *
return group->meth->group_get_curve(group, p, a, b, ctx); return group->meth->group_get_curve(group, p, a, b, ctx);
} }
#ifndef OPENSSL_NO_EC2M
int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx) int EC_GROUP_set_curve_GF2m(EC_GROUP *group, const BIGNUM *p, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx)
{ {
if (group->meth->group_set_curve == 0) if (group->meth->group_set_curve == 0)
@ -446,7 +446,7 @@ int EC_GROUP_get_curve_GF2m(const EC_GROUP *group, BIGNUM *p, BIGNUM *a, BIGNUM
} }
return group->meth->group_get_curve(group, p, a, b, ctx); return group->meth->group_get_curve(group, p, a, b, ctx);
} }
#endif
int EC_GROUP_get_degree(const EC_GROUP *group) int EC_GROUP_get_degree(const EC_GROUP *group)
{ {
@ -856,7 +856,7 @@ int EC_POINT_set_affine_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
return group->meth->point_set_affine_coordinates(group, point, x, y, ctx); return group->meth->point_set_affine_coordinates(group, point, x, y, ctx);
} }
#ifndef OPENSSL_NO_EC2M
int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point,
const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx) const BIGNUM *x, const BIGNUM *y, BN_CTX *ctx)
{ {
@ -872,7 +872,7 @@ int EC_POINT_set_affine_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point,
} }
return group->meth->point_set_affine_coordinates(group, point, x, y, ctx); return group->meth->point_set_affine_coordinates(group, point, x, y, ctx);
} }
#endif
int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point, int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *point,
BIGNUM *x, BIGNUM *y, BN_CTX *ctx) BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
@ -890,7 +890,7 @@ int EC_POINT_get_affine_coordinates_GFp(const EC_GROUP *group, const EC_POINT *p
return group->meth->point_get_affine_coordinates(group, point, x, y, ctx); return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
} }
#ifndef OPENSSL_NO_EC2M
int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, const EC_POINT *point, int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, const EC_POINT *point,
BIGNUM *x, BIGNUM *y, BN_CTX *ctx) BIGNUM *x, BIGNUM *y, BN_CTX *ctx)
{ {
@ -906,7 +906,7 @@ int EC_POINT_get_affine_coordinates_GF2m(const EC_GROUP *group, const EC_POINT *
} }
return group->meth->point_get_affine_coordinates(group, point, x, y, ctx); return group->meth->point_get_affine_coordinates(group, point, x, y, ctx);
} }
#endif
int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point, int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *point,
const BIGNUM *x, int y_bit, BN_CTX *ctx) const BIGNUM *x, int y_bit, BN_CTX *ctx)
@ -924,7 +924,7 @@ int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *poi
return group->meth->point_set_compressed_coordinates(group, point, x, y_bit, ctx); return group->meth->point_set_compressed_coordinates(group, point, x, y_bit, ctx);
} }
#ifndef OPENSSL_NO_EC2M
int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point, int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *point,
const BIGNUM *x, int y_bit, BN_CTX *ctx) const BIGNUM *x, int y_bit, BN_CTX *ctx)
{ {
@ -940,7 +940,7 @@ int EC_POINT_set_compressed_coordinates_GF2m(const EC_GROUP *group, EC_POINT *po
} }
return group->meth->point_set_compressed_coordinates(group, point, x, y_bit, ctx); return group->meth->point_set_compressed_coordinates(group, point, x, y_bit, ctx);
} }
#endif
size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form, size_t EC_POINT_point2oct(const EC_GROUP *group, const EC_POINT *point, point_conversion_form_t form,
unsigned char *buf, size_t len, BN_CTX *ctx) unsigned char *buf, size_t len, BN_CTX *ctx)

View File

@ -207,7 +207,7 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
reason = ERR_R_MALLOC_FAILURE; reason = ERR_R_MALLOC_FAILURE;
goto err; goto err;
} }
#ifndef OPENSSL_NO_EC2M
if (is_char_two) if (is_char_two)
{ {
if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx)) if (!EC_GROUP_get_curve_GF2m(x, p, a, b, ctx))
@ -217,6 +217,7 @@ int ECPKParameters_print(BIO *bp, const EC_GROUP *x, int off)
} }
} }
else /* prime field */ else /* prime field */
#endif
{ {
if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx)) if (!EC_GROUP_get_curve_GFp(x, p, a, b, ctx))
{ {

View File

@ -776,9 +776,10 @@ static void prime_field_tests(void)
if (!(_variable = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT; \ if (!(_variable = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT; \
if (!EC_GROUP_copy(_variable, group)) ABORT; \ if (!EC_GROUP_copy(_variable, group)) ABORT; \
#ifndef OPENSSL_NO_EC2M
static void char2_field_tests(void) static void char2_field_tests(void)
{ {
BN_CTX *ctx = NULL; BN_CTX *ctx = NULL;
BIGNUM *p, *a, *b; BIGNUM *p, *a, *b;
EC_GROUP *group; EC_GROUP *group;
@ -1210,6 +1211,7 @@ static void char2_field_tests(void)
if (C2_B571) EC_GROUP_free(C2_B571); if (C2_B571) EC_GROUP_free(C2_B571);
} }
#endif
static void internal_curve_test(void) static void internal_curve_test(void)
{ {
@ -1391,7 +1393,9 @@ int main(int argc, char *argv[])
prime_field_tests(); prime_field_tests();
puts(""); puts("");
#ifndef OPENSSL_NO_EC2M
char2_field_tests(); char2_field_tests();
#endif
#ifdef EC_NISTP224_64_GCC_128 #ifdef EC_NISTP224_64_GCC_128
nistp224_test(); nistp224_test();
#endif #endif

View File

@ -158,11 +158,13 @@ static int test_ecdh_curve(int nid, const char *text, BN_CTX *ctx, BIO *out)
if (!EC_POINT_get_affine_coordinates_GFp(group, if (!EC_POINT_get_affine_coordinates_GFp(group,
EC_KEY_get0_public_key(a), x_a, y_a, ctx)) goto err; EC_KEY_get0_public_key(a), x_a, y_a, ctx)) goto err;
} }
#ifndef OPENSSL_NO_EC2M
else else
{ {
if (!EC_POINT_get_affine_coordinates_GF2m(group, if (!EC_POINT_get_affine_coordinates_GF2m(group,
EC_KEY_get0_public_key(a), x_a, y_a, ctx)) goto err; EC_KEY_get0_public_key(a), x_a, y_a, ctx)) goto err;
} }
#endif
#ifdef NOISY #ifdef NOISY
BIO_puts(out," pri 1="); BIO_puts(out," pri 1=");
BN_print(out,a->priv_key); BN_print(out,a->priv_key);
@ -183,11 +185,13 @@ static int test_ecdh_curve(int nid, const char *text, BN_CTX *ctx, BIO *out)
if (!EC_POINT_get_affine_coordinates_GFp(group, if (!EC_POINT_get_affine_coordinates_GFp(group,
EC_KEY_get0_public_key(b), x_b, y_b, ctx)) goto err; EC_KEY_get0_public_key(b), x_b, y_b, ctx)) goto err;
} }
#ifndef OPENSSL_NO_EC2M
else else
{ {
if (!EC_POINT_get_affine_coordinates_GF2m(group, if (!EC_POINT_get_affine_coordinates_GF2m(group,
EC_KEY_get0_public_key(b), x_b, y_b, ctx)) goto err; EC_KEY_get0_public_key(b), x_b, y_b, ctx)) goto err;
} }
#endif
#ifdef NOISY #ifdef NOISY
BIO_puts(out," pri 2="); BIO_puts(out," pri 2=");
@ -324,6 +328,7 @@ int main(int argc, char *argv[])
if (!test_ecdh_curve(NID_X9_62_prime256v1, "NIST Prime-Curve P-256", ctx, out)) goto err; if (!test_ecdh_curve(NID_X9_62_prime256v1, "NIST Prime-Curve P-256", ctx, out)) goto err;
if (!test_ecdh_curve(NID_secp384r1, "NIST Prime-Curve P-384", ctx, out)) goto err; if (!test_ecdh_curve(NID_secp384r1, "NIST Prime-Curve P-384", ctx, out)) goto err;
if (!test_ecdh_curve(NID_secp521r1, "NIST Prime-Curve P-521", ctx, out)) goto err; if (!test_ecdh_curve(NID_secp521r1, "NIST Prime-Curve P-521", ctx, out)) goto err;
#ifndef OPENSSL_NO_EC2M
/* NIST BINARY CURVES TESTS */ /* NIST BINARY CURVES TESTS */
if (!test_ecdh_curve(NID_sect163k1, "NIST Binary-Curve K-163", ctx, out)) goto err; if (!test_ecdh_curve(NID_sect163k1, "NIST Binary-Curve K-163", ctx, out)) goto err;
if (!test_ecdh_curve(NID_sect163r2, "NIST Binary-Curve B-163", ctx, out)) goto err; if (!test_ecdh_curve(NID_sect163r2, "NIST Binary-Curve B-163", ctx, out)) goto err;
@ -335,6 +340,7 @@ int main(int argc, char *argv[])
if (!test_ecdh_curve(NID_sect409r1, "NIST Binary-Curve B-409", ctx, out)) goto err; if (!test_ecdh_curve(NID_sect409r1, "NIST Binary-Curve B-409", ctx, out)) goto err;
if (!test_ecdh_curve(NID_sect571k1, "NIST Binary-Curve K-571", ctx, out)) goto err; if (!test_ecdh_curve(NID_sect571k1, "NIST Binary-Curve K-571", ctx, out)) goto err;
if (!test_ecdh_curve(NID_sect571r1, "NIST Binary-Curve B-571", ctx, out)) goto err; if (!test_ecdh_curve(NID_sect571r1, "NIST Binary-Curve B-571", ctx, out)) goto err;
#endif
ret = 0; ret = 0;

View File

@ -157,6 +157,7 @@ static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
goto err; goto err;
} }
} }
#ifndef OPENSSL_NO_EC2M
else else
{ {
if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, y, ctx)) if (!EC_POINT_get_affine_coordinates_GF2m(group, tmp, x, y, ctx))
@ -165,6 +166,7 @@ static int ecdh_compute_key(void *out, size_t outlen, const EC_POINT *pub_key,
goto err; goto err;
} }
} }
#endif
buflen = (EC_GROUP_get_degree(group) + 7)/8; buflen = (EC_GROUP_get_degree(group) + 7)/8;
len = BN_num_bytes(x); len = BN_num_bytes(x);

View File

@ -263,6 +263,7 @@ int x9_62_tests(BIO *out)
"3238135532097973577080787768312505059318910517550078427819" "3238135532097973577080787768312505059318910517550078427819"
"78505179448783")) "78505179448783"))
goto x962_err; goto x962_err;
#ifndef OPENSSL_NO_EC2M
if (!x9_62_test_internal(out, NID_X9_62_c2tnb191v1, if (!x9_62_test_internal(out, NID_X9_62_c2tnb191v1,
"87194383164871543355722284926904419997237591535066528048", "87194383164871543355722284926904419997237591535066528048",
"308992691965804947361541664549085895292153777025772063598")) "308992691965804947361541664549085895292153777025772063598"))
@ -273,7 +274,7 @@ int x9_62_tests(BIO *out)
"1970303740007316867383349976549972270528498040721988191026" "1970303740007316867383349976549972270528498040721988191026"
"49413465737174")) "49413465737174"))
goto x962_err; goto x962_err;
#endif
ret = 1; ret = 1;
x962_err: x962_err:
if (!restore_rand()) if (!restore_rand())

View File

@ -159,6 +159,7 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
goto err; goto err;
} }
} }
#ifndef OPENSSL_NO_EC2M
else /* NID_X9_62_characteristic_two_field */ else /* NID_X9_62_characteristic_two_field */
{ {
if (!EC_POINT_get_affine_coordinates_GF2m(group, if (!EC_POINT_get_affine_coordinates_GF2m(group,
@ -168,6 +169,7 @@ static int ecdsa_sign_setup(EC_KEY *eckey, BN_CTX *ctx_in, BIGNUM **kinvp,
goto err; goto err;
} }
} }
#endif
if (!BN_nnmod(r, X, order, ctx)) if (!BN_nnmod(r, X, order, ctx))
{ {
ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB); ECDSAerr(ECDSA_F_ECDSA_SIGN_SETUP, ERR_R_BN_LIB);
@ -446,6 +448,7 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
goto err; goto err;
} }
} }
#ifndef OPENSSL_NO_EC2M
else /* NID_X9_62_characteristic_two_field */ else /* NID_X9_62_characteristic_two_field */
{ {
if (!EC_POINT_get_affine_coordinates_GF2m(group, if (!EC_POINT_get_affine_coordinates_GF2m(group,
@ -455,7 +458,7 @@ static int ecdsa_do_verify(const unsigned char *dgst, int dgst_len,
goto err; goto err;
} }
} }
#endif
if (!BN_nnmod(u1, X, order, ctx)) if (!BN_nnmod(u1, X, order, ctx))
{ {
ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB); ECDSAerr(ECDSA_F_ECDSA_DO_VERIFY, ERR_R_BN_LIB);

View File

@ -931,7 +931,11 @@ bad:
} }
} }
else else
#ifdef OPENSSL_NO_EC2M
nid = NID_X9_62_prime256v1;
#else
nid = NID_sect163r2; nid = NID_sect163r2;
#endif
ecdh = EC_KEY_new_by_curve_name(nid); ecdh = EC_KEY_new_by_curve_name(nid);
if (ecdh == NULL) if (ecdh == NULL)