diff --git a/uECC.c b/uECC.c index 5aa7840..3f83a31 100644 --- a/uECC.c +++ b/uECC.c @@ -1696,6 +1696,32 @@ static void EccPoint_mult(EccPoint * RESTRICT p_result, const EccPoint * RESTRIC vli_set(p_result->y, Ry[0]); } +static int EccPoint_compute_public_key(EccPoint *p_result, const uECC_word_t *p_private) { + + /* Make sure the private key is in the range [1, n-1]. */ + if(vli_isZero(p_private)) + { + return 0; + } + +#if uECC_CURVE != uECC_secp160r1 + if(vli_cmp(curve_n, p_private) != 1) + { + return 0; + } +#endif + + /* Compute the public point */ + EccPoint_mult(p_result, &curve_G, p_private, 0, vli_numBits(p_private, uECC_WORDS)); + + if (EccPoint_isZero(p_result)) + { + return 0; + } + + return 1; +} + /* Compute a = sqrt(a) (mod curve_p). */ static void mod_sqrt(uECC_word_t *a) { @@ -1792,6 +1818,8 @@ int uECC_make_key(uint8_t p_publicKey[uECC_BYTES*2], uint8_t p_privateKey[uECC_B uECC_word_t l_private[uECC_WORDS]; uECC_word_t l_tries = 0; + EccPoint l_public; + while (1) { if(!g_rng((uint8_t *)l_private, sizeof(l_private)) || (l_tries++ >= MAX_TRIES)) @@ -1803,12 +1831,16 @@ int uECC_make_key(uint8_t p_publicKey[uECC_BYTES*2], uint8_t p_privateKey[uECC_B continue; } - vli_nativeToBytes(p_privateKey, l_private); - if (uECC_compute_public_key(p_privateKey, p_publicKey)) { + if (EccPoint_compute_public_key(&l_public, l_private)) { break; } } + vli_nativeToBytes(p_privateKey, l_private); + + vli_nativeToBytes(p_publicKey, l_public.x); + vli_nativeToBytes(p_publicKey + uECC_BYTES, l_public.y); + return 1; } @@ -2370,29 +2402,13 @@ int uECC_verify(const uint8_t p_publicKey[uECC_BYTES*2], const uint8_t p_hash[uE return vli_equal(rx, r); } -int uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]) { +int uECC_compute_public_key(const uint8_t p_privateKey[uECC_BYTES], uint8_t p_publicKey[uECC_BYTES * 2]) +{ uECC_word_t l_private[uECC_WORDS]; vli_bytesToNative(l_private, p_privateKey); - /* Make sure the private key is in the range [1, n-1]. */ - if(vli_isZero(l_private)) - { - return 0; - } - -#if uECC_CURVE != uECC_secp160r1 - if(vli_cmp(curve_n, l_private) != 1) - { - return 0; - } -#endif - - /* Compute the public point */ EccPoint l_public; - EccPoint_mult(&l_public, &curve_G, l_private, 0, vli_numBits(l_private, uECC_WORDS)); - - if (EccPoint_isZero(&l_public)) - { + if (!EccPoint_compute_public_key(&l_public, l_private)) { return 0; }