Credits / Found by Jean-Philippe Aumasson: https://github.com/veorq
KeyID::generatePrivateKey() relies on random_buffer(), which uses tinyMT32 as its PRNG. The PRNG is initialized only once using a 32-bit seed derived from micros().
This is not a cryptographically secure RNG, and the 32-bit timer seed makes the generated private keys predictable and brute-forceable. All keys produced by the current implementation are vulnerable. A hardware CSPRNG or proper DRBG must be used instead.
Links:
|
void KeyID::generatePrivateKey(Web3* web3) |
|
{ |
|
random_buffer(privateKeyBytes, ETHERS_PRIVATEKEY_LENGTH); |
|
static int initialized = 0; |
|
if (!initialized) { |
|
tinymt32_init(&tinymt, (uint32_t)micros()); |