Refactored compute_public_key, created native version.

This commit is contained in:
Richard Moore
2015-05-20 21:04:27 -04:00
parent d360398681
commit 9bbd41962a
+37 -21
View File
@@ -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;
}