New 64-bit optimized implementation EC_GFp_nistp224_method().
This will only be compiled in if explicitly requested (#ifdef EC_NISTP224_64_GCC_128). Submitted by: Emilia Kasper (Google)
This commit is contained in:
parent
d3bb63fc68
commit
04daec862c
12
CHANGES
12
CHANGES
@ -107,6 +107,18 @@
|
||||
|
||||
Changes between 1.0.0a and 1.0.1 [xx XXX xxxx]
|
||||
|
||||
*) Add EC_GFp_nistp224_method(), a 64-bit optimized implementation for
|
||||
elliptic curve NIST-P224 with constant-time single point multiplication on
|
||||
typical inputs. EC_GROUP_new_by_curve_name() will automatically use this
|
||||
(while EC_GROUP_new_curve_GFp() currently won't and prefers the more
|
||||
flexible implementations).
|
||||
|
||||
The implementation requires support for the nonstandard type __uint128_t,
|
||||
and so is disabled by default. To include this in your build of OpenSSL,
|
||||
use -DEC_NISTP224_64_GCC_128 on the Configure (or config) command line,
|
||||
and run "make depend" (or "make update").
|
||||
[Emilia Käsper <emilia.kasper@esat.kuleuven.be> (Google)]
|
||||
|
||||
*) Permit abbreviated handshakes when renegotiating using the function
|
||||
SSL_renegotiate_abbreviated().
|
||||
[Robin Seggelmann <seggelmann@fh-muenster.de>]
|
||||
|
@ -19,11 +19,11 @@ APPS=
|
||||
LIB=$(TOP)/libcrypto.a
|
||||
LIBSRC= ec_lib.c ecp_smpl.c ecp_mont.c ecp_nist.c ec_cvt.c ec_mult.c\
|
||||
ec_err.c ec_curve.c ec_check.c ec_print.c ec_asn1.c ec_key.c\
|
||||
ec2_smpl.c ec2_mult.c ec_ameth.c ec_pmeth.c eck_prn.c
|
||||
ec2_smpl.c ec2_mult.c ec_ameth.c ec_pmeth.c eck_prn.c ecp_nistp224.c
|
||||
|
||||
LIBOBJ= ec_lib.o ecp_smpl.o ecp_mont.o ecp_nist.o ec_cvt.o ec_mult.o\
|
||||
ec_err.o ec_curve.o ec_check.o ec_print.o ec_asn1.o ec_key.o\
|
||||
ec2_smpl.o ec2_mult.o ec_ameth.o ec_pmeth.o eck_prn.o
|
||||
ec2_smpl.o ec2_mult.o ec_ameth.o ec_pmeth.o eck_prn.o ecp_nistp224.o
|
||||
|
||||
SRC= $(LIBSRC)
|
||||
|
||||
@ -221,6 +221,7 @@ ecp_nist.o: ../../include/openssl/obj_mac.h ../../include/openssl/opensslconf.h
|
||||
ecp_nist.o: ../../include/openssl/opensslv.h ../../include/openssl/ossl_typ.h
|
||||
ecp_nist.o: ../../include/openssl/safestack.h ../../include/openssl/stack.h
|
||||
ecp_nist.o: ../../include/openssl/symhacks.h ec_lcl.h ecp_nist.c
|
||||
ecp_nistp224.o: ecp_nistp224.c
|
||||
ecp_smpl.o: ../../include/openssl/asn1.h ../../include/openssl/bio.h
|
||||
ecp_smpl.o: ../../include/openssl/bn.h ../../include/openssl/crypto.h
|
||||
ecp_smpl.o: ../../include/openssl/e_os2.h ../../include/openssl/ec.h
|
||||
|
@ -151,6 +151,12 @@ const EC_METHOD *EC_GFp_mont_method(void);
|
||||
*/
|
||||
const EC_METHOD *EC_GFp_nist_method(void);
|
||||
|
||||
#ifdef EC_NISTP224_64_GCC_128
|
||||
/** Returns 64-bit optimized methods for nistp224
|
||||
* \return EC_METHOD object
|
||||
*/
|
||||
const EC_METHOD *EC_GFp_nistp224_method(void);
|
||||
#endif
|
||||
|
||||
/********************************************************************/
|
||||
/* EC_METHOD for curves over GF(2^m) */
|
||||
@ -926,6 +932,7 @@ void ERR_load_EC_strings(void);
|
||||
/* Error codes for the EC functions. */
|
||||
|
||||
/* Function codes. */
|
||||
#define EC_F_BN_TO_FELEM 224
|
||||
#define EC_F_COMPUTE_WNAF 143
|
||||
#define EC_F_D2I_ECPARAMETERS 144
|
||||
#define EC_F_D2I_ECPKPARAMETERS 145
|
||||
@ -968,6 +975,9 @@ void ERR_load_EC_strings(void);
|
||||
#define EC_F_EC_GFP_MONT_FIELD_SQR 132
|
||||
#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE 189
|
||||
#define EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP 135
|
||||
#define EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE 225
|
||||
#define EC_F_EC_GFP_NISTP224_POINTS_MUL 228
|
||||
#define EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES 226
|
||||
#define EC_F_EC_GFP_NIST_FIELD_MUL 200
|
||||
#define EC_F_EC_GFP_NIST_FIELD_SQR 201
|
||||
#define EC_F_EC_GFP_NIST_GROUP_SET_CURVE 202
|
||||
@ -1040,6 +1050,7 @@ void ERR_load_EC_strings(void);
|
||||
#define EC_F_I2D_ECPKPARAMETERS 191
|
||||
#define EC_F_I2D_ECPRIVATEKEY 192
|
||||
#define EC_F_I2O_ECPUBLICKEY 151
|
||||
#define EC_F_NISTP224_PRE_COMP_NEW 227
|
||||
#define EC_F_O2I_ECPUBLICKEY 152
|
||||
#define EC_F_OLD_EC_PRIV_DECODE 222
|
||||
#define EC_F_PKEY_EC_CTRL 197
|
||||
@ -1052,6 +1063,7 @@ void ERR_load_EC_strings(void);
|
||||
/* Reason codes. */
|
||||
#define EC_R_ASN1_ERROR 115
|
||||
#define EC_R_ASN1_UNKNOWN_FIELD 116
|
||||
#define EC_R_BIGNUM_OUT_OF_RANGE 144
|
||||
#define EC_R_BUFFER_TOO_SMALL 100
|
||||
#define EC_R_D2I_ECPKPARAMETERS_FAILURE 117
|
||||
#define EC_R_DECODE_ERROR 142
|
||||
@ -1092,6 +1104,7 @@ void ERR_load_EC_strings(void);
|
||||
#define EC_R_UNKNOWN_GROUP 129
|
||||
#define EC_R_UNKNOWN_ORDER 114
|
||||
#define EC_R_UNSUPPORTED_FIELD 131
|
||||
#define EC_R_WRONG_CURVE_PARAMETERS 145
|
||||
#define EC_R_WRONG_ORDER 130
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Written by Nils Larsch for the OpenSSL project.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2004 The OpenSSL Project. All rights reserved.
|
||||
* Copyright (c) 1998-2010 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -1300,7 +1300,7 @@ static const struct { EC_CURVE_DATA h; unsigned char data[20+21*6]; }
|
||||
{ 0x53,0x81,0x4C,0x05,0x0D,0x44,0xD6,0x96,0xE6,0x76, /* seed */
|
||||
0x87,0x56,0x15,0x17,0x58,0x0C,0xA4,0xE2,0x9F,0xFD,
|
||||
|
||||
0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p */
|
||||
0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, /* p */
|
||||
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
|
||||
0x07,
|
||||
0x01,0x08,0xB3,0x9E,0x77,0xC4,0xB1,0x08,0xBE,0xD9, /* a */
|
||||
@ -1820,100 +1820,110 @@ static const struct { EC_CURVE_DATA h; unsigned char data[0+24*6]; }
|
||||
typedef struct _ec_list_element_st {
|
||||
int nid;
|
||||
const EC_CURVE_DATA *data;
|
||||
const EC_METHOD *(*meth)(void);
|
||||
const char *comment;
|
||||
} ec_list_element;
|
||||
|
||||
static const ec_list_element curve_list[] = {
|
||||
/* prime field curves */
|
||||
/* prime field curves */
|
||||
/* secg curves */
|
||||
{ NID_secp112r1, &_EC_SECG_PRIME_112R1.h, "SECG/WTLS curve over a 112 bit prime field"},
|
||||
{ NID_secp112r2, &_EC_SECG_PRIME_112R2.h, "SECG curve over a 112 bit prime field"},
|
||||
{ NID_secp128r1, &_EC_SECG_PRIME_128R1.h, "SECG curve over a 128 bit prime field"},
|
||||
{ NID_secp128r2, &_EC_SECG_PRIME_128R2.h, "SECG curve over a 128 bit prime field"},
|
||||
{ NID_secp160k1, &_EC_SECG_PRIME_160K1.h, "SECG curve over a 160 bit prime field"},
|
||||
{ NID_secp160r1, &_EC_SECG_PRIME_160R1.h, "SECG curve over a 160 bit prime field"},
|
||||
{ NID_secp160r2, &_EC_SECG_PRIME_160R2.h, "SECG/WTLS curve over a 160 bit prime field"},
|
||||
{ NID_secp112r1, &_EC_SECG_PRIME_112R1.h, 0, "SECG/WTLS curve over a 112 bit prime field" },
|
||||
{ NID_secp112r2, &_EC_SECG_PRIME_112R2.h, 0, "SECG curve over a 112 bit prime field" },
|
||||
{ NID_secp128r1, &_EC_SECG_PRIME_128R1.h, 0, "SECG curve over a 128 bit prime field" },
|
||||
{ NID_secp128r2, &_EC_SECG_PRIME_128R2.h, 0, "SECG curve over a 128 bit prime field" },
|
||||
{ NID_secp160k1, &_EC_SECG_PRIME_160K1.h, 0, "SECG curve over a 160 bit prime field" },
|
||||
{ NID_secp160r1, &_EC_SECG_PRIME_160R1.h, 0, "SECG curve over a 160 bit prime field" },
|
||||
{ NID_secp160r2, &_EC_SECG_PRIME_160R2.h, 0, "SECG/WTLS curve over a 160 bit prime field" },
|
||||
/* SECG secp192r1 is the same as X9.62 prime192v1 and hence omitted */
|
||||
{ NID_secp192k1, &_EC_SECG_PRIME_192K1.h, "SECG curve over a 192 bit prime field"},
|
||||
{ NID_secp224k1, &_EC_SECG_PRIME_224K1.h, "SECG curve over a 224 bit prime field"},
|
||||
{ NID_secp224r1, &_EC_NIST_PRIME_224.h, "NIST/SECG curve over a 224 bit prime field"},
|
||||
{ NID_secp256k1, &_EC_SECG_PRIME_256K1.h, "SECG curve over a 256 bit prime field"},
|
||||
{ NID_secp192k1, &_EC_SECG_PRIME_192K1.h, 0, "SECG curve over a 192 bit prime field" },
|
||||
{ NID_secp224k1, &_EC_SECG_PRIME_224K1.h, 0, "SECG curve over a 224 bit prime field" },
|
||||
#ifdef EC_NISTP224_64_GCC_128
|
||||
{ NID_secp224r1, &_EC_NIST_PRIME_224.h, EC_GFp_nistp224_method, "NIST/SECG curve over a 224 bit prime field,\n"
|
||||
"\t\t64-bit optimized implementation." },
|
||||
#else
|
||||
{ NID_secp224r1, &_EC_NIST_PRIME_224.h, 0, "NIST/SECG curve over a 224 bit prime field" },
|
||||
#endif
|
||||
{ NID_secp256k1, &_EC_SECG_PRIME_256K1.h, 0, "SECG curve over a 256 bit prime field" },
|
||||
/* SECG secp256r1 is the same as X9.62 prime256v1 and hence omitted */
|
||||
{ NID_secp384r1, &_EC_NIST_PRIME_384.h, "NIST/SECG curve over a 384 bit prime field"},
|
||||
{ NID_secp521r1, &_EC_NIST_PRIME_521.h, "NIST/SECG curve over a 521 bit prime field"},
|
||||
{ NID_secp384r1, &_EC_NIST_PRIME_384.h, 0, "NIST/SECG curve over a 384 bit prime field" },
|
||||
{ NID_secp521r1, &_EC_NIST_PRIME_521.h, 0, "NIST/SECG curve over a 521 bit prime field" },
|
||||
/* X9.62 curves */
|
||||
{ NID_X9_62_prime192v1, &_EC_NIST_PRIME_192.h, "NIST/X9.62/SECG curve over a 192 bit prime field"},
|
||||
{ NID_X9_62_prime192v2, &_EC_X9_62_PRIME_192V2.h, "X9.62 curve over a 192 bit prime field"},
|
||||
{ NID_X9_62_prime192v3, &_EC_X9_62_PRIME_192V3.h, "X9.62 curve over a 192 bit prime field"},
|
||||
{ NID_X9_62_prime239v1, &_EC_X9_62_PRIME_239V1.h, "X9.62 curve over a 239 bit prime field"},
|
||||
{ NID_X9_62_prime239v2, &_EC_X9_62_PRIME_239V2.h, "X9.62 curve over a 239 bit prime field"},
|
||||
{ NID_X9_62_prime239v3, &_EC_X9_62_PRIME_239V3.h, "X9.62 curve over a 239 bit prime field"},
|
||||
{ NID_X9_62_prime256v1, &_EC_X9_62_PRIME_256V1.h, "X9.62/SECG curve over a 256 bit prime field"},
|
||||
{ NID_X9_62_prime192v1, &_EC_NIST_PRIME_192.h, 0, "NIST/X9.62/SECG curve over a 192 bit prime field" },
|
||||
{ NID_X9_62_prime192v2, &_EC_X9_62_PRIME_192V2.h, 0, "X9.62 curve over a 192 bit prime field" },
|
||||
{ NID_X9_62_prime192v3, &_EC_X9_62_PRIME_192V3.h, 0, "X9.62 curve over a 192 bit prime field" },
|
||||
{ NID_X9_62_prime239v1, &_EC_X9_62_PRIME_239V1.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_prime256v1, &_EC_X9_62_PRIME_256V1.h, 0, "X9.62/SECG curve over a 256 bit prime field" },
|
||||
/* characteristic two field curves */
|
||||
/* NIST/SECG curves */
|
||||
{ NID_sect113r1, &_EC_SECG_CHAR2_113R1.h, "SECG curve over a 113 bit binary field"},
|
||||
{ NID_sect113r2, &_EC_SECG_CHAR2_113R2.h, "SECG curve over a 113 bit binary field"},
|
||||
{ NID_sect131r1, &_EC_SECG_CHAR2_131R1.h, "SECG/WTLS curve over a 131 bit binary field"},
|
||||
{ NID_sect131r2, &_EC_SECG_CHAR2_131R2.h, "SECG curve over a 131 bit binary field"},
|
||||
{ NID_sect163k1, &_EC_NIST_CHAR2_163K.h, "NIST/SECG/WTLS curve over a 163 bit binary field" },
|
||||
{ NID_sect163r1, &_EC_SECG_CHAR2_163R1.h, "SECG curve over a 163 bit binary field"},
|
||||
{ NID_sect163r2, &_EC_NIST_CHAR2_163B.h, "NIST/SECG curve over a 163 bit binary field" },
|
||||
{ NID_sect193r1, &_EC_SECG_CHAR2_193R1.h, "SECG curve over a 193 bit binary field"},
|
||||
{ NID_sect193r2, &_EC_SECG_CHAR2_193R2.h, "SECG curve over a 193 bit binary field"},
|
||||
{ NID_sect233k1, &_EC_NIST_CHAR2_233K.h, "NIST/SECG/WTLS curve over a 233 bit binary field" },
|
||||
{ NID_sect233r1, &_EC_NIST_CHAR2_233B.h, "NIST/SECG/WTLS curve over a 233 bit binary field" },
|
||||
{ NID_sect239k1, &_EC_SECG_CHAR2_239K1.h, "SECG curve over a 239 bit binary field"},
|
||||
{ NID_sect283k1, &_EC_NIST_CHAR2_283K.h, "NIST/SECG curve over a 283 bit binary field" },
|
||||
{ NID_sect283r1, &_EC_NIST_CHAR2_283B.h, "NIST/SECG curve over a 283 bit binary field" },
|
||||
{ NID_sect409k1, &_EC_NIST_CHAR2_409K.h, "NIST/SECG curve over a 409 bit binary field" },
|
||||
{ NID_sect409r1, &_EC_NIST_CHAR2_409B.h, "NIST/SECG curve over a 409 bit binary field" },
|
||||
{ NID_sect571k1, &_EC_NIST_CHAR2_571K.h, "NIST/SECG curve over a 571 bit binary field" },
|
||||
{ NID_sect571r1, &_EC_NIST_CHAR2_571B.h, "NIST/SECG curve over a 571 bit binary field" },
|
||||
{ NID_sect113r1, &_EC_SECG_CHAR2_113R1.h, 0, "SECG curve over a 113 bit binary field" },
|
||||
{ NID_sect113r2, &_EC_SECG_CHAR2_113R2.h, 0, "SECG curve over a 113 bit binary field" },
|
||||
{ NID_sect131r1, &_EC_SECG_CHAR2_131R1.h, 0, "SECG/WTLS curve over a 131 bit binary field" },
|
||||
{ NID_sect131r2, &_EC_SECG_CHAR2_131R2.h, 0, "SECG curve over a 131 bit binary field" },
|
||||
{ NID_sect163k1, &_EC_NIST_CHAR2_163K.h, 0, "NIST/SECG/WTLS curve over a 163 bit binary field" },
|
||||
{ NID_sect163r1, &_EC_SECG_CHAR2_163R1.h, 0, "SECG curve over a 163 bit binary field" },
|
||||
{ NID_sect163r2, &_EC_NIST_CHAR2_163B.h, 0, "NIST/SECG curve over a 163 bit binary field" },
|
||||
{ NID_sect193r1, &_EC_SECG_CHAR2_193R1.h, 0, "SECG curve over a 193 bit binary field" },
|
||||
{ NID_sect193r2, &_EC_SECG_CHAR2_193R2.h, 0, "SECG curve over a 193 bit binary field" },
|
||||
{ NID_sect233k1, &_EC_NIST_CHAR2_233K.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" },
|
||||
{ NID_sect233r1, &_EC_NIST_CHAR2_233B.h, 0, "NIST/SECG/WTLS curve over a 233 bit binary field" },
|
||||
{ NID_sect239k1, &_EC_SECG_CHAR2_239K1.h, 0, "SECG curve over a 239 bit binary field" },
|
||||
{ NID_sect283k1, &_EC_NIST_CHAR2_283K.h, 0, "NIST/SECG curve over a 283 bit binary field" },
|
||||
{ NID_sect283r1, &_EC_NIST_CHAR2_283B.h, 0, "NIST/SECG curve over a 283 bit binary field" },
|
||||
{ NID_sect409k1, &_EC_NIST_CHAR2_409K.h, 0, "NIST/SECG curve over a 409 bit binary field" },
|
||||
{ NID_sect409r1, &_EC_NIST_CHAR2_409B.h, 0, "NIST/SECG curve over a 409 bit binary field" },
|
||||
{ NID_sect571k1, &_EC_NIST_CHAR2_571K.h, 0, "NIST/SECG curve over a 571 bit binary field" },
|
||||
{ NID_sect571r1, &_EC_NIST_CHAR2_571B.h, 0, "NIST/SECG curve over a 571 bit binary field" },
|
||||
/* X9.62 curves */
|
||||
{ NID_X9_62_c2pnb163v1, &_EC_X9_62_CHAR2_163V1.h, "X9.62 curve over a 163 bit binary field"},
|
||||
{ NID_X9_62_c2pnb163v2, &_EC_X9_62_CHAR2_163V2.h, "X9.62 curve over a 163 bit binary field"},
|
||||
{ NID_X9_62_c2pnb163v3, &_EC_X9_62_CHAR2_163V3.h, "X9.62 curve over a 163 bit binary field"},
|
||||
{ NID_X9_62_c2pnb176v1, &_EC_X9_62_CHAR2_176V1.h, "X9.62 curve over a 176 bit binary field"},
|
||||
{ NID_X9_62_c2tnb191v1, &_EC_X9_62_CHAR2_191V1.h, "X9.62 curve over a 191 bit binary field"},
|
||||
{ NID_X9_62_c2tnb191v2, &_EC_X9_62_CHAR2_191V2.h, "X9.62 curve over a 191 bit binary field"},
|
||||
{ NID_X9_62_c2tnb191v3, &_EC_X9_62_CHAR2_191V3.h, "X9.62 curve over a 191 bit binary field"},
|
||||
{ NID_X9_62_c2pnb208w1, &_EC_X9_62_CHAR2_208W1.h, "X9.62 curve over a 208 bit binary field"},
|
||||
{ NID_X9_62_c2tnb239v1, &_EC_X9_62_CHAR2_239V1.h, "X9.62 curve over a 239 bit binary field"},
|
||||
{ NID_X9_62_c2tnb239v2, &_EC_X9_62_CHAR2_239V2.h, "X9.62 curve over a 239 bit binary field"},
|
||||
{ NID_X9_62_c2tnb239v3, &_EC_X9_62_CHAR2_239V3.h, "X9.62 curve over a 239 bit binary field"},
|
||||
{ NID_X9_62_c2pnb272w1, &_EC_X9_62_CHAR2_272W1.h, "X9.62 curve over a 272 bit binary field"},
|
||||
{ NID_X9_62_c2pnb304w1, &_EC_X9_62_CHAR2_304W1.h, "X9.62 curve over a 304 bit binary field"},
|
||||
{ NID_X9_62_c2tnb359v1, &_EC_X9_62_CHAR2_359V1.h, "X9.62 curve over a 359 bit binary field"},
|
||||
{ NID_X9_62_c2pnb368w1, &_EC_X9_62_CHAR2_368W1.h, "X9.62 curve over a 368 bit binary field"},
|
||||
{ NID_X9_62_c2tnb431r1, &_EC_X9_62_CHAR2_431R1.h, "X9.62 curve over a 431 bit binary field"},
|
||||
{ NID_X9_62_c2pnb163v1, &_EC_X9_62_CHAR2_163V1.h, 0, "X9.62 curve over a 163 bit binary field" },
|
||||
{ NID_X9_62_c2pnb163v2, &_EC_X9_62_CHAR2_163V2.h, 0, "X9.62 curve over a 163 bit binary field" },
|
||||
{ NID_X9_62_c2pnb163v3, &_EC_X9_62_CHAR2_163V3.h, 0, "X9.62 curve over a 163 bit binary field" },
|
||||
{ NID_X9_62_c2pnb176v1, &_EC_X9_62_CHAR2_176V1.h, 0, "X9.62 curve over a 176 bit binary field" },
|
||||
{ NID_X9_62_c2tnb191v1, &_EC_X9_62_CHAR2_191V1.h, 0, "X9.62 curve over a 191 bit binary field" },
|
||||
{ NID_X9_62_c2tnb191v2, &_EC_X9_62_CHAR2_191V2.h, 0, "X9.62 curve over a 191 bit binary field" },
|
||||
{ NID_X9_62_c2tnb191v3, &_EC_X9_62_CHAR2_191V3.h, 0, "X9.62 curve over a 191 bit binary field" },
|
||||
{ NID_X9_62_c2pnb208w1, &_EC_X9_62_CHAR2_208W1.h, 0, "X9.62 curve over a 208 bit binary field" },
|
||||
{ NID_X9_62_c2tnb239v1, &_EC_X9_62_CHAR2_239V1.h, 0, "X9.62 curve over a 239 bit binary field" },
|
||||
{ NID_X9_62_c2tnb239v2, &_EC_X9_62_CHAR2_239V2.h, 0, "X9.62 curve over a 239 bit binary field" },
|
||||
{ NID_X9_62_c2tnb239v3, &_EC_X9_62_CHAR2_239V3.h, 0, "X9.62 curve over a 239 bit binary field" },
|
||||
{ NID_X9_62_c2pnb272w1, &_EC_X9_62_CHAR2_272W1.h, 0, "X9.62 curve over a 272 bit binary field" },
|
||||
{ NID_X9_62_c2pnb304w1, &_EC_X9_62_CHAR2_304W1.h, 0, "X9.62 curve over a 304 bit binary field" },
|
||||
{ NID_X9_62_c2tnb359v1, &_EC_X9_62_CHAR2_359V1.h, 0, "X9.62 curve over a 359 bit binary field" },
|
||||
{ NID_X9_62_c2pnb368w1, &_EC_X9_62_CHAR2_368W1.h, 0, "X9.62 curve over a 368 bit binary field" },
|
||||
{ NID_X9_62_c2tnb431r1, &_EC_X9_62_CHAR2_431R1.h, 0, "X9.62 curve over a 431 bit binary field" },
|
||||
/* the WAP/WTLS curves
|
||||
* [unlike SECG, spec has its own OIDs for curves from X9.62] */
|
||||
{ NID_wap_wsg_idm_ecid_wtls1, &_EC_WTLS_1.h, "WTLS curve over a 113 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls3, &_EC_NIST_CHAR2_163K.h, "NIST/SECG/WTLS curve over a 163 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls4, &_EC_SECG_CHAR2_113R1.h, "SECG curve over a 113 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls5, &_EC_X9_62_CHAR2_163V1.h, "X9.62 curve over a 163 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls6, &_EC_SECG_PRIME_112R1.h, "SECG/WTLS curve over a 112 bit prime field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls7, &_EC_SECG_PRIME_160R2.h, "SECG/WTLS curve over a 160 bit prime field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls8, &_EC_WTLS_8.h, "WTLS curve over a 112 bit prime field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls9, &_EC_WTLS_9.h, "WTLS curve over a 160 bit prime field" },
|
||||
{ NID_wap_wsg_idm_ecid_wtls10, &_EC_NIST_CHAR2_233K.h, "NIST/SECG/WTLS curve over a 233 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls11, &_EC_NIST_CHAR2_233B.h, "NIST/SECG/WTLS curve over a 233 bit binary field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls12, &_EC_WTLS_12.h, "WTLS curvs over a 224 bit prime field"},
|
||||
{ NID_wap_wsg_idm_ecid_wtls1, &_EC_WTLS_1.h, 0, "WTLS curve over a 113 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_wtls5, &_EC_X9_62_CHAR2_163V1.h, 0, "X9.62 curve over a 163 bit binary 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_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_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_wtls12, &_EC_WTLS_12.h, 0, "WTLS curvs over a 224 bit prime field" },
|
||||
/* IPSec curves */
|
||||
{ NID_ipsec3, &_EC_IPSEC_155_ID3.h, "\n\tIPSec/IKE/Oakley curve #3 over a 155 bit binary field.\n""\tNot suitable for ECDSA.\n\tQuestionable extension field!"},
|
||||
{ NID_ipsec4, &_EC_IPSEC_185_ID4.h, "\n\tIPSec/IKE/Oakley curve #4 over a 185 bit binary field.\n""\tNot suitable for ECDSA.\n\tQuestionable extension field!"},
|
||||
{ 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!" },
|
||||
{ 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!" },
|
||||
};
|
||||
|
||||
#define curve_list_length (sizeof(curve_list)/sizeof(ec_list_element))
|
||||
|
||||
static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
|
||||
static EC_GROUP *ec_group_new_from_data(const ec_list_element curve)
|
||||
{
|
||||
EC_GROUP *group=NULL;
|
||||
EC_POINT *P=NULL;
|
||||
BN_CTX *ctx=NULL;
|
||||
BIGNUM *p=NULL, *a=NULL, *b=NULL, *x=NULL, *y=NULL, *order=NULL;
|
||||
BIGNUM *p=NULL, *a=NULL, *b=NULL, *x=NULL, *y=NULL, *order=NULL;
|
||||
int ok=0;
|
||||
int seed_len,param_len;
|
||||
const EC_METHOD *meth;
|
||||
const EC_CURVE_DATA *data;
|
||||
const unsigned char *params;
|
||||
|
||||
if ((ctx = BN_CTX_new()) == NULL)
|
||||
@ -1922,10 +1932,11 @@ static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
|
||||
goto err;
|
||||
}
|
||||
|
||||
data = curve.data;
|
||||
seed_len = data->seed_len;
|
||||
param_len = data->param_len;
|
||||
params = (const unsigned char *)(data+1); /* skip header */
|
||||
params += seed_len; /* skip seed */
|
||||
params = (const unsigned char *)(data+1); /* skip header */
|
||||
params += seed_len; /* skip seed */
|
||||
|
||||
if (!(p = BN_bin2bn(params+0*param_len, param_len, NULL))
|
||||
|| !(a = BN_bin2bn(params+1*param_len, param_len, NULL))
|
||||
@ -1935,7 +1946,17 @@ static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (data->field_type == NID_X9_62_prime_field)
|
||||
if (curve.meth != 0)
|
||||
{
|
||||
meth = curve.meth();
|
||||
if (((group = EC_GROUP_new(meth)) == NULL) ||
|
||||
(!(group->meth->group_set_curve(group, p, a, b, ctx))))
|
||||
{
|
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else if (data->field_type == NID_X9_62_prime_field)
|
||||
{
|
||||
if ((group = EC_GROUP_new_curve_GFp(p, a, b, ctx)) == NULL)
|
||||
{
|
||||
@ -1957,7 +1978,7 @@ static EC_GROUP *ec_group_new_from_data(const EC_CURVE_DATA *data)
|
||||
ECerr(EC_F_EC_GROUP_NEW_FROM_DATA, ERR_R_EC_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
||||
if (!(x = BN_bin2bn(params+3*param_len, param_len, NULL))
|
||||
|| !(y = BN_bin2bn(params+4*param_len, param_len, NULL)))
|
||||
{
|
||||
@ -2025,7 +2046,7 @@ EC_GROUP *EC_GROUP_new_by_curve_name(int nid)
|
||||
for (i=0; i<curve_list_length; i++)
|
||||
if (curve_list[i].nid == nid)
|
||||
{
|
||||
ret = ec_group_new_from_data(curve_list[i].data);
|
||||
ret = ec_group_new_from_data(curve_list[i]);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
/* crypto/ec/ec_err.c */
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1999-2007 The OpenSSL Project. All rights reserved.
|
||||
* Copyright (c) 1999-2010 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -70,6 +70,7 @@
|
||||
|
||||
static ERR_STRING_DATA EC_str_functs[]=
|
||||
{
|
||||
{ERR_FUNC(EC_F_BN_TO_FELEM), "BN_TO_FELEM"},
|
||||
{ERR_FUNC(EC_F_COMPUTE_WNAF), "COMPUTE_WNAF"},
|
||||
{ERR_FUNC(EC_F_D2I_ECPARAMETERS), "d2i_ECParameters"},
|
||||
{ERR_FUNC(EC_F_D2I_ECPKPARAMETERS), "d2i_ECPKParameters"},
|
||||
@ -112,6 +113,9 @@ static ERR_STRING_DATA EC_str_functs[]=
|
||||
{ERR_FUNC(EC_F_EC_GFP_MONT_FIELD_SQR), "ec_GFp_mont_field_sqr"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_MONT_GROUP_SET_CURVE), "ec_GFp_mont_group_set_curve"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_MONT_GROUP_SET_CURVE_GFP), "EC_GFP_MONT_GROUP_SET_CURVE_GFP"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NISTP224_GROUP_SET_CURVE), "ec_GFp_nistp224_group_set_curve"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NISTP224_POINTS_MUL), "ec_GFp_nistp224_points_mul"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NISTP224_POINT_GET_AFFINE_COORDINATES), "ec_GFp_nistp224_point_get_affine_coordinates"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NIST_FIELD_MUL), "ec_GFp_nist_field_mul"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NIST_FIELD_SQR), "ec_GFp_nist_field_sqr"},
|
||||
{ERR_FUNC(EC_F_EC_GFP_NIST_GROUP_SET_CURVE), "ec_GFp_nist_group_set_curve"},
|
||||
@ -184,6 +188,7 @@ static ERR_STRING_DATA EC_str_functs[]=
|
||||
{ERR_FUNC(EC_F_I2D_ECPKPARAMETERS), "i2d_ECPKParameters"},
|
||||
{ERR_FUNC(EC_F_I2D_ECPRIVATEKEY), "i2d_ECPrivateKey"},
|
||||
{ERR_FUNC(EC_F_I2O_ECPUBLICKEY), "i2o_ECPublicKey"},
|
||||
{ERR_FUNC(EC_F_NISTP224_PRE_COMP_NEW), "NISTP224_PRE_COMP_NEW"},
|
||||
{ERR_FUNC(EC_F_O2I_ECPUBLICKEY), "o2i_ECPublicKey"},
|
||||
{ERR_FUNC(EC_F_OLD_EC_PRIV_DECODE), "OLD_EC_PRIV_DECODE"},
|
||||
{ERR_FUNC(EC_F_PKEY_EC_CTRL), "PKEY_EC_CTRL"},
|
||||
@ -199,6 +204,7 @@ static ERR_STRING_DATA EC_str_reasons[]=
|
||||
{
|
||||
{ERR_REASON(EC_R_ASN1_ERROR) ,"asn1 error"},
|
||||
{ERR_REASON(EC_R_ASN1_UNKNOWN_FIELD) ,"asn1 unknown field"},
|
||||
{ERR_REASON(EC_R_BIGNUM_OUT_OF_RANGE) ,"bignum out of range"},
|
||||
{ERR_REASON(EC_R_BUFFER_TOO_SMALL) ,"buffer too small"},
|
||||
{ERR_REASON(EC_R_D2I_ECPKPARAMETERS_FAILURE),"d2i ecpkparameters failure"},
|
||||
{ERR_REASON(EC_R_DECODE_ERROR) ,"decode error"},
|
||||
@ -239,6 +245,7 @@ static ERR_STRING_DATA EC_str_reasons[]=
|
||||
{ERR_REASON(EC_R_UNKNOWN_GROUP) ,"unknown group"},
|
||||
{ERR_REASON(EC_R_UNKNOWN_ORDER) ,"unknown order"},
|
||||
{ERR_REASON(EC_R_UNSUPPORTED_FIELD) ,"unsupported field"},
|
||||
{ERR_REASON(EC_R_WRONG_CURVE_PARAMETERS) ,"wrong curve parameters"},
|
||||
{ERR_REASON(EC_R_WRONG_ORDER) ,"wrong order"},
|
||||
{0,NULL}
|
||||
};
|
||||
|
@ -3,7 +3,7 @@
|
||||
* Originally written by Bodo Moeller for the OpenSSL project.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2003 The OpenSSL Project. All rights reserved.
|
||||
* Copyright (c) 1998-2010 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
@ -391,3 +391,16 @@ int ec_GF2m_simple_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
|
||||
size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
|
||||
int ec_GF2m_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
|
||||
int ec_GF2m_have_precompute_mult(const EC_GROUP *group);
|
||||
|
||||
#ifdef EC_NISTP224_64_GCC_128
|
||||
/* method functions in ecp_nistp224.c */
|
||||
int ec_GFp_nistp224_group_init(EC_GROUP *group);
|
||||
int ec_GFp_nistp224_group_set_curve(EC_GROUP *group, const BIGNUM *p,
|
||||
const BIGNUM *a, const BIGNUM *n, BN_CTX *);
|
||||
int ec_GFp_nistp224_point_get_affine_coordinates(const EC_GROUP *group,
|
||||
const EC_POINT *point, BIGNUM *x, BIGNUM *y, BN_CTX *ctx);
|
||||
int ec_GFp_nistp224_points_mul(const EC_GROUP *group, EC_POINT *r, const BIGNUM *scalar,
|
||||
size_t num, const EC_POINT *points[], const BIGNUM *scalars[], BN_CTX *);
|
||||
int ec_GFp_nistp224_precompute_mult(EC_GROUP *group, BN_CTX *ctx);
|
||||
int ec_GFp_nistp224_have_precompute_mult(const EC_GROUP *group);
|
||||
#endif
|
||||
|
1471
crypto/ec/ecp_nistp224.c
Normal file
1471
crypto/ec/ecp_nistp224.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -107,10 +107,6 @@ int main(int argc, char * argv[]) { puts("Elliptic curves are disabled."); retur
|
||||
EXIT(1); \
|
||||
} while (0)
|
||||
|
||||
void prime_field_tests(void);
|
||||
void char2_field_tests(void);
|
||||
void internal_curve_test(void);
|
||||
|
||||
#define TIMING_BASE_PT 0
|
||||
#define TIMING_RAND_PT 1
|
||||
#define TIMING_SIMUL 2
|
||||
@ -195,6 +191,48 @@ static void timings(EC_GROUP *group, int type, BN_CTX *ctx)
|
||||
}
|
||||
#endif
|
||||
|
||||
/* test multiplication with group order, long and negative scalars */
|
||||
static void group_order_tests(EC_GROUP *group)
|
||||
{
|
||||
BIGNUM *n1, *n2, *order;
|
||||
EC_POINT *P = EC_POINT_new(group);
|
||||
EC_POINT *Q = EC_POINT_new(group);
|
||||
n1 = BN_new(); n2 = BN_new(); order = BN_new();
|
||||
BN_CTX *ctx = BN_CTX_new();
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, order, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, order, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, order, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
fprintf(stdout, "long/negative scalar tests ... ");
|
||||
if (!BN_one(n1)) ABORT;
|
||||
/* n1 = 1 - order */
|
||||
if (!BN_sub(n1, n1, order)) ABORT;
|
||||
if(!EC_POINT_mul(group, Q, NULL, P, n1, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) ABORT;
|
||||
/* n2 = 1 + order */
|
||||
if (!BN_add(n2, order, BN_value_one())) ABORT;
|
||||
if(!EC_POINT_mul(group, Q, NULL, P, n2, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) ABORT;
|
||||
/* n2 = (1 - order) * (1 + order) */
|
||||
if (!BN_mul(n2, n1, n2, ctx)) ABORT;
|
||||
if(!EC_POINT_mul(group, Q, NULL, P, n2, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, Q, P, ctx)) ABORT;
|
||||
fprintf(stdout, "ok\n");
|
||||
EC_POINT_free(P);
|
||||
EC_POINT_free(Q);
|
||||
BN_free(n1);
|
||||
BN_free(n2);
|
||||
BN_free(order);
|
||||
BN_CTX_free(ctx);
|
||||
}
|
||||
|
||||
void prime_field_tests()
|
||||
{
|
||||
BN_CTX *ctx = NULL;
|
||||
@ -321,21 +359,21 @@ void prime_field_tests()
|
||||
if (len == 0) ABORT;
|
||||
if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;
|
||||
fprintf(stdout, "Generator as octect string, compressed form:\n ");
|
||||
fprintf(stdout, "Generator as octet string, compressed form:\n ");
|
||||
for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);
|
||||
|
||||
len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_UNCOMPRESSED, buf, sizeof buf, ctx);
|
||||
if (len == 0) ABORT;
|
||||
if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;
|
||||
fprintf(stdout, "\nGenerator as octect string, uncompressed form:\n ");
|
||||
fprintf(stdout, "\nGenerator as octet string, uncompressed form:\n ");
|
||||
for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);
|
||||
|
||||
len = EC_POINT_point2oct(group, Q, POINT_CONVERSION_HYBRID, buf, sizeof buf, ctx);
|
||||
if (len == 0) ABORT;
|
||||
if (!EC_POINT_oct2point(group, P, buf, len, ctx)) ABORT;
|
||||
if (0 != EC_POINT_cmp(group, P, Q, ctx)) ABORT;
|
||||
fprintf(stdout, "\nGenerator as octect string, hybrid form:\n ");
|
||||
fprintf(stdout, "\nGenerator as octet string, hybrid form:\n ");
|
||||
for (i = 0; i < len; i++) fprintf(stdout, "%02X", buf[i]);
|
||||
|
||||
if (!EC_POINT_get_Jprojective_coordinates_GFp(group, R, x, y, z, ctx)) ABORT;
|
||||
@ -381,17 +419,7 @@ void prime_field_tests()
|
||||
if (EC_GROUP_get_degree(group) != 160) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_160 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_160, group)) ABORT;
|
||||
@ -425,17 +453,7 @@ void prime_field_tests()
|
||||
if (EC_GROUP_get_degree(group) != 192) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_192 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_192, group)) ABORT;
|
||||
@ -469,17 +487,7 @@ void prime_field_tests()
|
||||
if (EC_GROUP_get_degree(group) != 224) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_224 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_224, group)) ABORT;
|
||||
@ -514,17 +522,7 @@ void prime_field_tests()
|
||||
if (EC_GROUP_get_degree(group) != 256) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_256 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_256, group)) ABORT;
|
||||
@ -563,18 +561,8 @@ void prime_field_tests()
|
||||
fprintf(stdout, "verify degree ...");
|
||||
if (EC_GROUP_get_degree(group) != 384) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_384 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_384, group)) ABORT;
|
||||
@ -619,18 +607,8 @@ void prime_field_tests()
|
||||
fprintf(stdout, "verify degree ...");
|
||||
if (EC_GROUP_get_degree(group) != 521) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
fprintf(stdout, "verify group order ...");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, ".");
|
||||
fflush(stdout);
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT;
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT;
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT;
|
||||
fprintf(stdout, " ok\n");
|
||||
|
||||
group_order_tests(group);
|
||||
|
||||
if (!(P_521 = EC_GROUP_new(EC_GROUP_method_of(group)))) ABORT;
|
||||
if (!EC_GROUP_copy(P_521, group)) ABORT;
|
||||
@ -659,6 +637,7 @@ void prime_field_tests()
|
||||
points[2] = Q;
|
||||
points[3] = Q;
|
||||
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT;
|
||||
if (!BN_add(y, z, BN_value_one())) ABORT;
|
||||
if (BN_is_odd(y)) ABORT;
|
||||
if (!BN_rshift1(y, y)) ABORT;
|
||||
@ -792,19 +771,10 @@ void prime_field_tests()
|
||||
fprintf(stdout, "verify degree ..."); \
|
||||
if (EC_GROUP_get_degree(group) != _degree) ABORT; \
|
||||
fprintf(stdout, " ok\n"); \
|
||||
fprintf(stdout, "verify group order ..."); \
|
||||
fflush(stdout); \
|
||||
if (!EC_GROUP_get_order(group, z, ctx)) ABORT; \
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT; \
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT; \
|
||||
fprintf(stdout, "."); \
|
||||
fflush(stdout); \
|
||||
if (!EC_GROUP_precompute_mult(group, ctx)) ABORT; \
|
||||
if (!EC_POINT_mul(group, Q, z, NULL, NULL, ctx)) ABORT; \
|
||||
if (!EC_POINT_is_at_infinity(group, Q)) ABORT; \
|
||||
fprintf(stdout, " ok\n"); \
|
||||
group_order_tests(group); \
|
||||
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; \
|
||||
|
||||
|
||||
void char2_field_tests()
|
||||
{
|
||||
@ -1287,13 +1257,114 @@ void internal_curve_test(void)
|
||||
EC_GROUP_free(group);
|
||||
}
|
||||
if (ok)
|
||||
fprintf(stdout, " ok\n");
|
||||
fprintf(stdout, " ok\n\n");
|
||||
else
|
||||
fprintf(stdout, " failed\n");
|
||||
fprintf(stdout, " failed\n\n");
|
||||
OPENSSL_free(curves);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef EC_NISTP224_64_GCC_128
|
||||
void nistp224_test()
|
||||
{
|
||||
fprintf(stdout, "\nNIST curve P-224 (optimised implementation):\n");
|
||||
BIGNUM *p, *a, *b, *x, *y, *n, *m, *order;
|
||||
p = BN_new();
|
||||
a = BN_new();
|
||||
b = BN_new();
|
||||
x = BN_new(); y = BN_new();
|
||||
m = BN_new(); n = BN_new(); order = BN_new();
|
||||
BN_CTX *ctx = BN_CTX_new();
|
||||
EC_GROUP *NISTP224 = NULL;
|
||||
NISTP224 = EC_GROUP_new(EC_GFp_nistp224_method());
|
||||
if(!NISTP224) ABORT;
|
||||
if (!BN_hex2bn(&p, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001")) ABORT;
|
||||
if (1 != BN_is_prime_ex(p, BN_prime_checks, ctx, NULL)) ABORT;
|
||||
if (!BN_hex2bn(&a, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE")) ABORT;
|
||||
if (!BN_hex2bn(&b, "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4")) ABORT;
|
||||
if (!EC_GROUP_set_curve_GFp(NISTP224, p, a, b, ctx)) ABORT;
|
||||
EC_POINT *G = EC_POINT_new(NISTP224);
|
||||
EC_POINT *P = EC_POINT_new(NISTP224);
|
||||
EC_POINT *Q = EC_POINT_new(NISTP224);
|
||||
EC_POINT *Q_CHECK = EC_POINT_new(NISTP224);
|
||||
if(!BN_hex2bn(&x, "E84FB0B8E7000CB657D7973CF6B42ED78B301674276DF744AF130B3E")) ABORT;
|
||||
if(!BN_hex2bn(&y, "4376675C6FC5612C21A0FF2D2A89D2987DF7A2BC52183B5982298555")) ABORT;
|
||||
if(!EC_POINT_set_affine_coordinates_GFp(NISTP224, Q_CHECK, x, y, ctx)) ABORT;
|
||||
if (!BN_hex2bn(&x, "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21")) ABORT;
|
||||
if (!BN_hex2bn(&y, "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34")) ABORT;
|
||||
if (!EC_POINT_set_affine_coordinates_GFp(NISTP224, G, x, y, ctx)) ABORT;
|
||||
if (!BN_hex2bn(&order, "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D")) ABORT;
|
||||
if (!EC_GROUP_set_generator(NISTP224, G, order, BN_value_one())) ABORT;
|
||||
|
||||
fprintf(stdout, "verify degree ... ");
|
||||
if (EC_GROUP_get_degree(NISTP224) != 224) ABORT;
|
||||
fprintf(stdout, "ok\n");
|
||||
|
||||
fprintf(stdout, "NIST test vectors ... ");
|
||||
if (!BN_hex2bn(&n, "3F0C488E987C80BE0FEE521F8D90BE6034EC69AE11CA72AA777481E8")) ABORT;
|
||||
/* fixed point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, n, NULL, NULL, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
/* random point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, NULL, G, n, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
|
||||
/* set generator to P = 2*G, where G is the standard generator */
|
||||
if (!EC_POINT_dbl(NISTP224, P, G, ctx)) ABORT;
|
||||
if (!EC_GROUP_set_generator(NISTP224, P, order, BN_value_one())) ABORT;
|
||||
/* set the scalar to m=n/2, where n is the NIST test scalar */
|
||||
if (!BN_rshift(m, n, 1)) ABORT;
|
||||
|
||||
/* test the non-standard generator */
|
||||
/* fixed point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, m, NULL, NULL, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
/* random point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, NULL, P, m, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
|
||||
/* now repeat all tests with precomputation */
|
||||
if (!EC_GROUP_precompute_mult(NISTP224, ctx)) ABORT;
|
||||
|
||||
/* fixed point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, m, NULL, NULL, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
/* random point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, NULL, P, m, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
|
||||
/* reset generator */
|
||||
if (!EC_GROUP_set_generator(NISTP224, G, order, BN_value_one())) ABORT;
|
||||
/* fixed point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, n, NULL, NULL, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
/* random point multiplication */
|
||||
EC_POINT_mul(NISTP224, Q, NULL, G, n, ctx);
|
||||
if (0 != EC_POINT_cmp(NISTP224, Q, Q_CHECK, ctx)) ABORT;
|
||||
|
||||
fprintf(stdout, "ok\n");
|
||||
group_order_tests(NISTP224);
|
||||
#if 0
|
||||
timings(NISTP224, TIMING_BASE_PT, ctx);
|
||||
timings(NISTP224, TIMING_RAND_PT, ctx);
|
||||
#endif
|
||||
EC_GROUP_free(NISTP224);
|
||||
EC_POINT_free(G);
|
||||
EC_POINT_free(P);
|
||||
EC_POINT_free(Q);
|
||||
EC_POINT_free(Q_CHECK);
|
||||
BN_free(n);
|
||||
BN_free(m);
|
||||
BN_free(p);
|
||||
BN_free(a);
|
||||
BN_free(b);
|
||||
BN_free(x);
|
||||
BN_free(y);
|
||||
BN_free(order);
|
||||
BN_CTX_free(ctx);
|
||||
}
|
||||
#endif
|
||||
|
||||
static const char rnd_seed[] = "string to make the random number generator think it has entropy";
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
@ -1318,6 +1389,9 @@ int main(int argc, char *argv[])
|
||||
prime_field_tests();
|
||||
puts("");
|
||||
char2_field_tests();
|
||||
#ifdef EC_NISTP224_64_GCC_128
|
||||
nistp224_test();
|
||||
#endif
|
||||
/* test the internal curves */
|
||||
internal_curve_test();
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user