mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-29 10:58:21 +00:00
implement bip39 cache
This commit is contained in:
parent
3556c74740
commit
9a8e982153
47
bip39.c
47
bip39.c
@ -22,6 +22,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
#include "bip39.h"
|
#include "bip39.h"
|
||||||
#include "hmac.h"
|
#include "hmac.h"
|
||||||
@ -29,6 +30,20 @@
|
|||||||
#include "sha2.h"
|
#include "sha2.h"
|
||||||
#include "pbkdf2.h"
|
#include "pbkdf2.h"
|
||||||
#include "bip39_english.h"
|
#include "bip39_english.h"
|
||||||
|
#include "options.h"
|
||||||
|
|
||||||
|
#if USE_BIP39_CACHE
|
||||||
|
|
||||||
|
static int bip39_cache_index = 0;
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
bool set;
|
||||||
|
char mnemonic[256];
|
||||||
|
char passphrase[64];
|
||||||
|
uint8_t seed[512 / 8];
|
||||||
|
} bip39_cache[BIP39_CACHE_SIZE];
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
const char *mnemonic_generate(int strength)
|
const char *mnemonic_generate(int strength)
|
||||||
{
|
{
|
||||||
@ -148,12 +163,36 @@ int mnemonic_check(const char *mnemonic)
|
|||||||
// passphrase must be at most 256 characters or code may crash
|
// passphrase must be at most 256 characters or code may crash
|
||||||
void mnemonic_to_seed(const char *mnemonic, const char *passphrase, uint8_t seed[512 / 8], void (*progress_callback)(uint32_t current, uint32_t total))
|
void mnemonic_to_seed(const char *mnemonic, const char *passphrase, uint8_t seed[512 / 8], void (*progress_callback)(uint32_t current, uint32_t total))
|
||||||
{
|
{
|
||||||
|
int passphraselen = strlen(passphrase);
|
||||||
|
#if USE_BIP39_CACHE
|
||||||
|
int mnemoniclen = strlen(mnemonic);
|
||||||
|
// check cache
|
||||||
|
if (mnemoniclen < 256 && passphraselen < 64) {
|
||||||
|
int i;
|
||||||
|
for (i = 0; i < BIP39_CACHE_SIZE; i++) {
|
||||||
|
if (!bip39_cache[i].set) continue;
|
||||||
|
if (strcmp(bip39_cache[i].mnemonic, mnemonic) != 0) continue;
|
||||||
|
if (strcmp(bip39_cache[i].passphrase, passphrase) != 0) continue;
|
||||||
|
// found the correct entry
|
||||||
|
memcpy(seed, bip39_cache[i].seed, 512 / 8);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
uint8_t salt[8 + 256 + 4];
|
uint8_t salt[8 + 256 + 4];
|
||||||
int saltlen = strlen(passphrase);
|
|
||||||
memcpy(salt, "mnemonic", 8);
|
memcpy(salt, "mnemonic", 8);
|
||||||
memcpy(salt + 8, passphrase, saltlen);
|
memcpy(salt + 8, passphrase, passphraselen);
|
||||||
saltlen += 8;
|
pbkdf2_hmac_sha512((const uint8_t *)mnemonic, strlen(mnemonic), salt, passphraselen + 8, BIP39_PBKDF2_ROUNDS, seed, 512 / 8, progress_callback);
|
||||||
pbkdf2_hmac_sha512((const uint8_t *)mnemonic, strlen(mnemonic), salt, saltlen, BIP39_PBKDF2_ROUNDS, seed, 512 / 8, progress_callback);
|
#if USE_BIP39_CACHE
|
||||||
|
// store to cache
|
||||||
|
if (mnemoniclen < 256 && passphraselen < 64) {
|
||||||
|
bip39_cache[bip39_cache_index].set = true;
|
||||||
|
strcpy(bip39_cache[bip39_cache_index].mnemonic, mnemonic);
|
||||||
|
strcpy(bip39_cache[bip39_cache_index].passphrase, passphrase);
|
||||||
|
memcpy(bip39_cache[bip39_cache_index].seed, seed, 512 / 8);
|
||||||
|
bip39_cache_index = (bip39_cache_index + 1) % BIP39_CACHE_SIZE;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * const *mnemonic_wordlist(void)
|
const char * const *mnemonic_wordlist(void)
|
||||||
|
@ -50,4 +50,10 @@
|
|||||||
#define BIP32_CACHE_MAXDEPTH 8
|
#define BIP32_CACHE_MAXDEPTH 8
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// implement BIP39 caching
|
||||||
|
#ifndef USE_BIP39_CACHE
|
||||||
|
#define USE_BIP39_CACHE 1
|
||||||
|
#define BIP39_CACHE_SIZE 4
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
5
tests.c
5
tests.c
@ -880,6 +880,11 @@ START_TEST(test_mnemonic)
|
|||||||
ck_assert_str_eq(m, *b);
|
ck_assert_str_eq(m, *b);
|
||||||
mnemonic_to_seed(m, "TREZOR", seed, 0);
|
mnemonic_to_seed(m, "TREZOR", seed, 0);
|
||||||
ck_assert_mem_eq(seed, fromhex(*c), strlen(*c) / 2);
|
ck_assert_mem_eq(seed, fromhex(*c), strlen(*c) / 2);
|
||||||
|
#if USE_BIP39_CACHE
|
||||||
|
// try second time to check whether caching results work
|
||||||
|
mnemonic_to_seed(m, "TREZOR", seed, 0);
|
||||||
|
ck_assert_mem_eq(seed, fromhex(*c), strlen(*c) / 2);
|
||||||
|
#endif
|
||||||
a += 3; b += 3; c += 3;
|
a += 3; b += 3; c += 3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user