diff --git a/ChangeLog b/ChangeLog index 9b8e3c6..d695d43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2014-02-21 Niibe Yutaka + * src/ecc.c (compute_kG): Compute higer index at first. + (point_is_on_the_curve): Don't use coefficient_a if it's zero. + + * src/jpc.c (jpc_double): Care coefficient A. + + * src/ec_p256r1.c (COEFFICIENT_A_IS_MINUS_3): New. + * src/ec_p256k1.c (COEFFICIENT_A_IS_ZERO): New. + * src/jpc_p256r1.c (COEFFICIENT_A_IS_MINUS_3): Likewise. + * src/jpc_p256k1.c (COEFFICIENT_A_IS_MINUS_3): Likewise. + * src/modp256k1.c (modp256k1_shift): Bug fix. 2014-02-20 Niibe Yutaka diff --git a/src/ec_p256k1.c b/src/ec_p256k1.c index a8b690d..dba5670 100644 --- a/src/ec_p256k1.c +++ b/src/ec_p256k1.c @@ -30,6 +30,7 @@ #include "ec_p256k1.h" #define FIELD p256k1 +#define COEFFICIENT_A_IS_ZERO 1 /* * a = 0, b = 7 diff --git a/src/ec_p256r1.c b/src/ec_p256r1.c index c77dcaf..46e37a2 100644 --- a/src/ec_p256r1.c +++ b/src/ec_p256r1.c @@ -30,6 +30,7 @@ #include "ec_p256r1.h" #define FIELD p256r1 +#define COEFFICIENT_A_IS_MINUS_3 1 /* * a = -3 mod p256r1 diff --git a/src/ecc.c b/src/ecc.c index f82e89a..55cce6b 100644 --- a/src/ecc.c +++ b/src/ecc.c @@ -140,11 +140,10 @@ FUNC(compute_kG) (ac *X, const bn256 *K) for (i = 31; i >= 0; i--) { FUNC(jpc_double) (Q, Q); - - FUNC(jpc_add_ac_signed) (Q, Q, &precomputed_KG[index[i]&0x0f], - index[i] >> 7); FUNC(jpc_add_ac_signed) (Q, Q, &precomputed_2E_KG[index[i+32]&0x0f], index[i+32] >> 7); + FUNC(jpc_add_ac_signed) (Q, Q, &precomputed_KG[index[i]&0x0f], + index[i] >> 7); } dst = k_is_even ? Q : tmp; @@ -170,8 +169,10 @@ point_is_on_the_curve (const ac *P) MFNC(sqr) (s, P->x); MFNC(mul) (s, s, P->x); +#ifdef COEFFICIENT_A_IS_ZERO MFNC(mul) (t, coefficient_a, P->x); MFNC(add) (s, s, t); +#endif MFNC(add) (s, s, coefficient_b); MFNC(sqr) (t, P->y); diff --git a/src/jpc.c b/src/jpc.c index 5a1093b..c4cf879 100644 --- a/src/jpc.c +++ b/src/jpc.c @@ -47,12 +47,20 @@ FUNC(jpc_double) (jpc *X, const jpc *A) MFNC(sqr) (b, b); MFNC(shift) (b, b, 3); +#if defined(COEFFICIENT_A_IS_MINUS_3) MFNC(sqr) (tmp0, A->z); MFNC(sub) (c, A->x, tmp0); MFNC(add) (tmp0, tmp0, A->x); MFNC(mul) (tmp0, tmp0, c); MFNC(shift) (c, tmp0, 1); MFNC(add) (c, c, tmp0); +#elif defined (COEFFICIENT_A_IS_ZERO) + MFNC(sqr) (tmp0, A->x); + MFNC(shift) (c, tmp0, 1); + MFNC(add) (c, c, tmp0); +#else +#error "not supported." +#endif MFNC(sqr) (d, c); MFNC(shift) (tmp0, a, 1); diff --git a/src/jpc_p256k1.c b/src/jpc_p256k1.c index 0b1915f..ed72c47 100644 --- a/src/jpc_p256k1.c +++ b/src/jpc_p256k1.c @@ -29,5 +29,6 @@ #define FIELD p256k1 #define CONST_P256 P256K1 +#define COEFFICIENT_A_IS_ZERO 1 #include "jpc.c" diff --git a/src/jpc_p256r1.c b/src/jpc_p256r1.c index 36ffb4b..656fe27 100644 --- a/src/jpc_p256r1.c +++ b/src/jpc_p256r1.c @@ -29,5 +29,6 @@ #define FIELD p256r1 #define CONST_P256 P256R1 +#define COEFFICIENT_A_IS_MINUS_3 1 #include "jpc.c"