Allow the RNG to fail occasionally without immediately returning an error.

This commit is contained in:
Ken MacKay
2015-06-14 15:22:04 -07:00
parent c13e915870
commit 9abcb90061
+16 -22
View File
@@ -1719,22 +1719,18 @@ static void vli_bytesToNative(uint64_t *native, const uint8_t *bytes) {
int uECC_make_key(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[uECC_BYTES]) { int uECC_make_key(uint8_t public_key[uECC_BYTES*2], uint8_t private_key[uECC_BYTES]) {
uECC_word_t private[uECC_WORDS]; uECC_word_t private[uECC_WORDS];
uECC_word_t tries = 0;
EccPoint public; EccPoint public;
uECC_word_t tries;
while (1) { for (tries = 0; tries < MAX_TRIES; ++tries) {
if (!g_rng_function((uint8_t *)private, sizeof(private)) || (tries++ >= MAX_TRIES)) { if (g_rng_function((uint8_t *)private, sizeof(private)) &&
return 0; EccPoint_compute_public_key(&public, private)) {
} vli_nativeToBytes(private_key, private);
if (EccPoint_compute_public_key(&public, private)) { vli_nativeToBytes(public_key, public.x);
break; vli_nativeToBytes(public_key + uECC_BYTES, public.y);
return 1;
} }
} }
return 0;
vli_nativeToBytes(private_key, private);
vli_nativeToBytes(public_key, public.x);
vli_nativeToBytes(public_key + uECC_BYTES, public.y);
return 1;
} }
int uECC_shared_secret(const uint8_t public_key[uECC_BYTES*2], int uECC_shared_secret(const uint8_t public_key[uECC_BYTES*2],
@@ -2220,15 +2216,13 @@ int uECC_sign(const uint8_t private_key[uECC_BYTES],
uECC_word_t tries; uECC_word_t tries;
for (tries = 0; tries < MAX_TRIES; ++tries) { for (tries = 0; tries < MAX_TRIES; ++tries) {
if(!g_rng_function((uint8_t *)k, sizeof(k))) { if(g_rng_function((uint8_t *)k, sizeof(k))) {
return 0; #if (uECC_CURVE == uECC_secp160r1)
} k[uECC_WORDS] &= 0x01;
#if (uECC_CURVE == uECC_secp160r1) #endif
k[uECC_WORDS] &= 0x01; if (uECC_sign_with_k(private_key, message_hash, k, signature)) {
#endif return 1;
}
if (uECC_sign_with_k(private_key, message_hash, k, signature)) {
return 1;
} }
} }
return 0; return 0;