diff --git a/ChangeLog b/ChangeLog index cbe0c9e..0521a80 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2014-01-22 Niibe Yutaka + + * src/ec_p256.c (compute_kG): Simplify. + + * src/jpc.c (jpc_double): Support calling with A = infinity. + 2014-01-21 Niibe Yutaka * src/jpc.c (jpc_add_ac_signed): Bug fix for A check. diff --git a/src/ec_p256.c b/src/ec_p256.c index 6efc0a3..308a579 100644 --- a/src/ec_p256.c +++ b/src/ec_p256.c @@ -249,15 +249,14 @@ int compute_kG (ac *X, const bn256 *K) { int i; - int q_is_infinite = 1; jpc Q[1]; + memset (Q->z, 0, sizeof (bn256)); /* infinity */ for (i = 31; i >= 0; i--) { int k_i, k_i_e; - if (!q_is_infinite) - jpc_double (Q, Q); + jpc_double (Q, Q); k_i = (((K->word[6] >> i) & 1) << 3) | (((K->word[4] >> i) & 1) << 2) @@ -269,33 +268,9 @@ compute_kG (ac *X, const bn256 *K) | ((K->word[1] >> i) & 1); if (k_i) - { - if (q_is_infinite) - { - memcpy (Q->x, (&precomputed_KG[k_i - 1])->x, sizeof (bn256)); - memcpy (Q->y, (&precomputed_KG[k_i - 1])->y, sizeof (bn256)); - Q->z->word[0] = 1; - Q->z->word[1] = Q->z->word[2] = Q->z->word[3] - = Q->z->word[4] = Q->z->word[5] = Q->z->word[6] - = Q->z->word[7] = 0; - q_is_infinite = 0; - } - else - jpc_add_ac (Q, Q, &precomputed_KG[k_i - 1]); - } + jpc_add_ac (Q, Q, &precomputed_KG[k_i - 1]); if (k_i_e) - { - if (q_is_infinite) - { - memcpy (Q->x, (&precomputed_2E_KG[k_i_e - 1])->x, sizeof (bn256)); - memcpy (Q->y, (&precomputed_2E_KG[k_i_e - 1])->y, sizeof (bn256)); - memset (Q->z, 0, sizeof (bn256)); - Q->z->word[0] = 1; - q_is_infinite = 0; - } - else - jpc_add_ac (Q, Q, &precomputed_2E_KG[k_i_e - 1]); - } + jpc_add_ac (Q, Q, &precomputed_2E_KG[k_i_e - 1]); } return jpc_to_ac (X, Q); diff --git a/src/jpc.c b/src/jpc.c index 6d49be3..ed0e1e5 100644 --- a/src/jpc.c +++ b/src/jpc.c @@ -37,8 +37,12 @@ void jpc_double (jpc *X, const jpc *A) { bn256 a[1], b[1], c[1], tmp0[1]; - bn256 *d = X->x; + bn256 *d; + if (bn256_is_zero (A->z)) /* A is infinite */ + return; + + d = X->x; modp256_sqr (a, A->y); memcpy (b, a, sizeof (bn256)); modp256_mul (a, a, A->x);