1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-06-05 07:38:46 +00:00

use PBKDF2 for BIP39, add unit tests

This commit is contained in:
Pavol Rusnak 2013-12-09 16:21:42 +01:00
parent 353606e2df
commit 352bc42be2
7 changed files with 138 additions and 68 deletions

View File

@ -1,6 +1,6 @@
CC = gcc CC = gcc
CFLAGS = -Wall -Os CFLAGS = -Wall -Os
OBJS = bignum.o ecdsa.o secp256k1.o sha2.o rand.o hmac.o bip32.o ripemd160.o bip39.o OBJS = bignum.o ecdsa.o secp256k1.o sha2.o rand.o hmac.o bip32.o ripemd160.o bip39.o pbkdf2.o
OBJS += aescrypt.o aeskey.o aestab.o OBJS += aescrypt.o aeskey.o aestab.o
all: tests test-openssl all: tests test-openssl

1
README
View File

@ -12,6 +12,7 @@ These include:
uses RFC6979 for deterministic signatures) uses RFC6979 for deterministic signatures)
- ECDSA public key derivation + Base58 address representation - ECDSA public key derivation + Base58 address representation
- HMAC-SHA256 and HMAC-SHA512 - HMAC-SHA256 and HMAC-SHA512
- PBKDF2
- RIPEMD-160 - RIPEMD-160
- SHA256/SHA512 - SHA256/SHA512
- unit tests (using Check - check.sf.net; in tests.c) - unit tests (using Check - check.sf.net; in tests.c)

21
bip39.c
View File

@ -4,9 +4,10 @@
#include "hmac.h" #include "hmac.h"
#include "rand.h" #include "rand.h"
#include "sha2.h" #include "sha2.h"
#include "pbkdf2.h"
#include "bip39_english.h" #include "bip39_english.h"
#define HMAC_ROUNDS 10000 #define ROUNDS 10000
const char *mnemonic_generate(int strength) const char *mnemonic_generate(int strength)
{ {
@ -65,16 +66,10 @@ const char *mnemonic_from_data(const uint8_t *data, int len)
void mnemonic_to_seed(const char *mnemonic, const char *passphrase, uint8_t seed[512 / 8]) void mnemonic_to_seed(const char *mnemonic, const char *passphrase, uint8_t seed[512 / 8])
{ {
static uint8_t k[8 + 256]; static uint8_t salt[8 + 256 + 4];
int i, kl; int saltlen = strlen(passphrase);
memcpy(salt, "mnemonic", 8);
kl = strlen(passphrase); memcpy(salt + 8, passphrase, saltlen);
memcpy(k, "mnemonic", 8); saltlen += 8;
memcpy(k + 8, passphrase, kl); pbkdf2((const uint8_t *)mnemonic, strlen(mnemonic), salt, saltlen, ROUNDS, seed, 512 / 8);
kl += 8;
hmac_sha512(k, kl, (const uint8_t *)mnemonic, strlen(mnemonic), seed);
for (i = 1; i < HMAC_ROUNDS; i++) {
hmac_sha512(k, kl, seed, 512 / 8, seed);
}
} }

View File

@ -3,7 +3,6 @@
#include <stdint.h> #include <stdint.h>
const char *mnemonic_generate(int strength); // strength in bits const char *mnemonic_generate(int strength); // strength in bits
const char *mnemonic_from_data(const uint8_t *data, int len); const char *mnemonic_from_data(const uint8_t *data, int len);

36
pbkdf2.c Normal file
View File

@ -0,0 +1,36 @@
#include <string.h>
#include "pbkdf2.h"
#include "hmac.h"
void pbkdf2(const uint8_t *pass, int passlen, uint8_t *salt, int saltlen, uint32_t iterations, uint8_t *key, int keylen)
{
uint32_t i, j, k;
uint8_t f[64], g[64];
uint32_t blocks = keylen / 64; // SHA-512
if (keylen & 63) {
blocks++;
}
for (i = 1; i <= blocks; i++) {
salt[saltlen ] = (i >> 24) & 0xFF;
salt[saltlen + 1] = (i >> 16) & 0xFF;
salt[saltlen + 2] = (i >> 8) & 0xFF;
salt[saltlen + 3] = i & 0xFF;
hmac_sha512(pass, passlen, salt, saltlen + 4, g);
memcpy(f, g, 64);
for (j = 1; j < iterations; j++) {
hmac_sha512(pass, passlen, g, 64, g);
for (k = 0; k < 64; k++) {
f[k] ^= g[k];
}
}
if (i == blocks - 1 && (keylen & 63)) {
for (j = 0; j < (keylen & 63); j++) {
key[64 * (i - 1) + j] = f[j];
}
} else {
for (j = 0; j < 64; j++) {
key[64 * (i - 1) + j] = f[j];
}
}
}
}

9
pbkdf2.h Normal file
View File

@ -0,0 +1,9 @@
#ifndef __PBKDF2_H__
#define __PBKDF2_H__
#include <stdint.h>
// salt needs to have 4 extra bytes available beyond saltlen
void pbkdf2(const uint8_t *pass, int passlen, uint8_t *salt, int saltlen, uint32_t iterations, uint8_t *key, int keylen);
#endif

136
tests.c
View File

@ -24,6 +24,7 @@
#include <check.h> #include <check.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h>
#include <time.h> #include <time.h>
#include "aes.h" #include "aes.h"
@ -31,6 +32,7 @@
#include "bip32.h" #include "bip32.h"
#include "bip39.h" #include "bip39.h"
#include "ecdsa.h" #include "ecdsa.h"
#include "pbkdf2.h"
#include "sha2.h" #include "sha2.h"
uint8_t *fromhex(const char *str) uint8_t *fromhex(const char *str)
@ -49,9 +51,10 @@ uint8_t *fromhex(const char *str)
return buf; return buf;
} }
char *tohex(const uint8_t *bin, size_t l) inline char *tohex(const uint8_t *bin, size_t l)
{ {
static char buf[257], digits[] = "0123456789abcdef"; char *buf = (char *)malloc(l * 2 + 1);
static char digits[] = "0123456789abcdef";
size_t i; size_t i;
for (i = 0; i < l; i++) { for (i = 0; i < l; i++) {
buf[i*2 ] = digits[(bin[i] >> 4) & 0xF]; buf[i*2 ] = digits[(bin[i] >> 4) & 0xF];
@ -66,10 +69,10 @@ char *tohex(const uint8_t *bin, size_t l)
const void* _ck_y = (Y); \ const void* _ck_y = (Y); \
size_t _ck_l = (L); \ size_t _ck_l = (L); \
ck_assert_msg(0 OP memcmp(_ck_y, _ck_x, _ck_l), \ ck_assert_msg(0 OP memcmp(_ck_y, _ck_x, _ck_l), \
"Assertion '"#X#OP#Y"' failed: "#X"==\"%s\"", tohex(_ck_x, _ck_l)); \ "Assertion '"#X#OP#Y"' failed: "#X"==\"%s\", "#Y"==\"%s\"", tohex(_ck_x, _ck_l), tohex(_ck_y, _ck_l)); \
} while (0) } while (0)
#define ck_assert_mem_eq(X, Y, L) _ck_assert_mem((X), (Y), (L), ==) #define ck_assert_mem_eq(X, Y, L) _ck_assert_mem(X, Y, L, ==)
#define ck_assert_mem_ne(X, Y, L) _ck_assert_mem((X), (Y), (L), !=) #define ck_assert_mem_ne(X, Y, L) _ck_assert_mem(X, Y, L, !=)
// test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors // test vector 1 from https://en.bitcoin.it/wiki/BIP_0032_TestVectors
START_TEST(test_bip32_vector_1) START_TEST(test_bip32_vector_1)
@ -289,81 +292,104 @@ START_TEST(test_rijndael)
} }
END_TEST END_TEST
// test vectors from http://stackoverflow.com/questions/15593184/pbkdf2-hmac-sha-512-test-vectors
START_TEST(test_pbkdf2)
{
uint8_t k[64], s[64];
strcpy((char *)s, "salt");
pbkdf2((uint8_t *)"password", 8, s, 4, 1, k, 64);
ck_assert_mem_eq(k, fromhex("867f70cf1ade02cff3752599a3a53dc4af34c7a669815ae5d513554e1c8cf252c02d470a285a0501bad999bfe943c08f050235d7d68b1da55e63f73b60a57fce"), 64);
strcpy((char *)s, "salt");
pbkdf2((uint8_t *)"password", 8, s, 4, 2, k, 64);
ck_assert_mem_eq(k, fromhex("e1d9c16aa681708a45f5c7c4e215ceb66e011a2e9f0040713f18aefdb866d53cf76cab2868a39b9f7840edce4fef5a82be67335c77a6068e04112754f27ccf4e"), 64);
strcpy((char *)s, "salt");
pbkdf2((uint8_t *)"password", 8, s, 4, 4096, k, 64);
ck_assert_mem_eq(k, fromhex("d197b1b33db0143e018b12f3d1d1479e6cdebdcc97c5c0f87f6902e072f457b5143f30602641b3d55cd335988cb36b84376060ecd532e039b742a239434af2d5"), 64);
strcpy((char *)s, "saltSALTsaltSALTsaltSALTsaltSALTsalt");
pbkdf2((uint8_t *)"passwordPASSWORDpassword", 3*8, s, 9*4, 4096, k, 64);
ck_assert_mem_eq(k, fromhex("8c0511f4c6e597c6ac6315d8f0362e225f3c501495ba23b868c005174dc4ee71115b59f9e60cd9532fa33e0f75aefe30225c583a186cd82bd4daea9724a3d3b8"), 64);
}
END_TEST
START_TEST(test_mnemonic) START_TEST(test_mnemonic)
{ {
static const char *vectors[] = { static const char *vectors[] = {
"00000000000000000000000000000000", "00000000000000000000000000000000",
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about", "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about",
"cb5e7230ce8229de990674f6aa4288325fd4d8181f761734bd8b5cc944fedc2a4300e64422864b565352de7ffbc5ad0fafdf5344489f3a83e4a4bb5271cafaae", "a3c9324fab99733ef7b5f9313e49cd45a134ee77da9aa176a84458d4b73e46f00a59361709d71d6b68338c957366937942b8f2ce2bd306b4ab0ae63c6b4ff7f5",
"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"legal winner thank year wave sausage worth useful legal winner thank yellow", "legal winner thank year wave sausage worth useful legal winner thank yellow",
"de1277934939d6969519f44b7b3757a905d7f635be41e1e88022c346bc52ad26c0a3e9578e73e9b89066873266f285a5891d27d28cb27fccfe26d92bbd7ee364", "f48f158e9689580f91ae0c813f4353ba2f90cd242e811ec27b2d79f97eb21fcfaf54a0b546c27c3b0a60285df2b064b3eef84fa7269d93ab013af10a20adc758",
"80808080808080808080808080808080", "80808080808080808080808080808080",
"letter advice cage absurd amount doctor acoustic avoid letter advice cage above", "letter advice cage absurd amount doctor acoustic avoid letter advice cage above",
"8863bccef9cfffeacef1e4c6fc97bba8227ab0fc7e8e162be7467282689a13521ea364d7c4bc8cd241b59f53c5147a89c18a47248a96592ab9a2c1f1870b026c", "7804de4eb059484ebd7c384e3bd99654763ff1f736abf4e8a5053b12594ea7389beefd967031f03416fa03994cf6be7d3f2fbe37709a27cd091f9e3d310f16d0",
"ffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffff",
"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong", "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong",
"7a29e57c7a1532af1bddb7e02b892cfccc6a57b74fe9784324ea89fab8a66dc64fde79c31166b159685116f4e93c1795496f20ffdc2d3a69d3439931dabde86e", "ce2467164ca78cbce7c368bf35a390474d0e3af6afc4cc47214d215dcfc52ee567fd9921e66c32fc34e8f37abc468e7ba6cc744a96e815c95c583ad849d1c372",
"000000000000000000000000000000000000000000000000", "000000000000000000000000000000000000000000000000",
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent", "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon agent",
"c3e382025b6a22a901505cf393faea450eb6c4a5f2a8c8f0596285b2bd84688877a6cc7231420e2bbdd2428e62ed549a78fa215b3adafd8dea075dabfc704d5e", "e6fa0d745f5b841a4c90f1487dea80d5e5cc64c46c7aebe115b10ac333066f37b6d34ae514b8a1acb21b38c3836c248aec81c10874c2323bee98e70443cb2e2c",
"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will", "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal will",
"c82666e40eb097bf6eb05fecd7dc2ddfb6bbdc6071900f4b3fd3c3e635db69aa2094f1f450c98e8dc6103aa72df635abdfcc3b6d6ec5261a9208a07a35a3f1c8", "b829d8809875e7cae49114971e6ab87f13bd133c8d676972fb7a7ce8a9604b57759137091f21018ecd757906331c7e5466c8d9bc31b705e96e959beba111acc5",
"808080808080808080808080808080808080808080808080", "808080808080808080808080808080808080808080808080",
"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always", "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter always",
"e90681c67c55504afadca009ce4042819341fa0e90300b6d32b4f2e8e8a6678ff7e7fc1da663ae194dc7a2ef7ec7b50112d1a5efce47bfd00c66eec82f2265b5", "e8716279b6e74e876477061b83c4b29eeab288ea85ea196d95281dc0504c3edb1c70c86042e66f56ad27fb93d24c0a64294eac9668f0bba6d13a13882de542dd",
"ffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffff",
"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when", "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo when",
"2a372547df962742942674170a7cef495ea0b97f4864de16d0f3ee82eb577ca1eca345e601cc2df7c626c5bc51c52c28a3b4294224b685c958c7450bee6769e6", "417b80e3489de48dc644d9bf8e32ed907f918efdaf78541c219e6e1b6e7e17ed38448e7d2ef311ad4446f8be779507d288285eb5eff32ce723d4b3692a26d6a4",
"0000000000000000000000000000000000000000000000000000000000000000", "0000000000000000000000000000000000000000000000000000000000000000",
"abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art", "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon art",
"58cb9c5555d67ecc7b32305a78d1a2fcf0c9b22f1af761cfafc65eb1d3909f63ee2cab84996a7478cfd3e864cda5efb0caf580d56cf49739c6b3638d94e758c1", "c716b0c6e051b60f819ba04bc5c402ac15e3aa4071c99735dfecce05d41b550155ae3511789a0ccf2cb245050f53e48292e8d88864e7c46eaa2fe626373e6fc8",
"7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f", "7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f7f",
"legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title", "legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth useful legal winner thank year wave sausage worth title",
"0093cb3ed6d1302d3cf498017f8cb1c7dc2fdbd62ec57fc49e4b2a4dd47a23e44e0b309517d5a3e7b0f4f0ef0ed132818cf120a098a92e572ad086f1a90ccb7f", "8d80646b3677f02a56efc2977dc5972dadddd96dc34309119fbd44f5f939344df0e6c0aa924fabfe858c123283f904e1fcb24a5e20b70d69ec82a40e3e010c12",
"8080808080808080808080808080808080808080808080808080808080808080", "8080808080808080808080808080808080808080808080808080808080808080",
"letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless", "letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic avoid letter advice cage absurd amount doctor acoustic bless",
"8a21e46b9d264328c63e707e3d38ed4eb21508deda309fa2ef57cc8eca8b351ca3018758844ba9fb5851bab15d026a61cabace53a9a39bc91dc2c51407542cf5", "fd544f531a25958d2980925b10e7146290dd8615fd9241a66b0681cf3afb44e607a279cc88fa4afe65779b07b3ba441dcfb13be42266642c474fb4787683556c",
"ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
"zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote", "zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo vote",
"5c8a1a284ab2844daf02cab322df3996574c9d53cbd36159c493441990f0d2a6bc9bc1502e3a067943d8ec67324663cbfb9667b57fed220e3f28335e26a90f93", "024a5866efbd866885915e8eb2fc743af294c1b69285d2d62efff4228d6b3eb53bfc2ecd97048fc9691b200ee4f11af4e51fab23aa0ac674dd187235b4e3283f",
"1083fa24dbb0afa4e7b327d23f666567", "7dce4ed2284c9134d026608ab684c05c",
"awesome cabin matrix resist april sponsor paddle gossip split will off soon", "lava include region explain simple omit dog slot melt reflect copy reward",
"467406b36a0176e40e013393e5ecef1f5b4019980b502eda9db1db06f7786e088b206f045f2bfcf93bd3b17a598335b078fcc5890115857ff741bd154b54f049", "bf010975d766bec901a632c0eadc9461de1ff89c20e37e49a67ae03730681a08122004304ed92bff0592db5271254967de4bc7f3a20de9b3becc5ab951c28d7c",
"d8cbcd1ac2153ecd74048480c2732f637d642b21f0dd40df", "0ce452419635c1a5faf44d60f2029f73fdc43419b4de1f03",
"sugar fury effort loud fault grit source mountain liar bean slim shoulder stone better march brick dolphin zero", "artefact card motor cluster foster spray type meadow genius mosquito pond tree sword borrow grocery orange business burger",
"f60180ea5047659cbb17ed6ef79c974de86c0170c7a1962b205329eb8fe9dcdd148615d35c515c4ec8da25f4cf54d5b7cd8cd5bf8dc4059df3a7900ca25f8306", "fd81692c4b0341a73bdb479ad5f572444658c68e11e693c06cafbda8d27f31eed03f32fa6e02744fcf902b8383253c64f98ffd659ba12fcb7dff47991d811fb0",
"2952f95cefe041616f6f379ab649cf8b702ecf8e4acceaebdda4cc50e2bf1d7b", "00ac97c48106f0aeb8ba061e0250a559b3251dc35854e694780ba51d53a50120",
"citizen oak fire thank advice radar sad tragic one rather initial black actual guitar decrease flower turtle galaxy hard obvious athlete garbage invest have", "absent gorilla van acoustic humor firm title dolphin bulk barely citizen recall crane moment aspect appear track phrase actual enforce steel spoon afraid benefit",
"eff4b6a15bb55fcf4bbfa2b3b9e24e7dc4bed8319ef7703f1786d472c73666922925778eaa5a06f8a26d2c7e7240be746fd69edfaf197e0dae12d7e0b550cfc8", "97a796e70d1ba31176e0ace6feffa6bdcda6233648deb83b7a92e0dd01ad133d0b545a4d1283e5d5bef984b6b055fe9ebb99f4063607a7f17cdcee20a5fde35f",
"f5e82717078a6ddc538a03e825f91bed", "5baf069620eff15c71dd97c9a6ee328f",
"vote donkey shift audit plug until evolve document trial cool eight swarm", "forum join pitch dove yellow purchase shuffle real situate danger million bunker",
"83dad22293225780a914083fc1a69bfe1d910f5b5962b0364820132a42ae1bd567a1fb4d5a19ad3d64539e38a7ee3d6429fac2b74e72b020913131c5eadb7db4", "8e6416b101bc429d59becfdeef9b4ca40b4dd938efca1d3dabb54dfcbd48a78a65a2a28fdf4732f94806f2e8aa2e40fadff71fa7060883ce50eea7a90fbe4bd3",
"16b59b6a426f2f302f73049a32ab8572394278982212357a", "977f8287f9ed670b8489838ab0476a63b65d4df12f406e68",
"birth proud surround luggage very object saddle gauge olive next throw tongue neither detail gauge drastic cube strategy", "number winter peanut video stool magic banana corn melt lion surround shuffle grape plunge seven trend hover dwarf",
"38ceb07e0dad221f612631843be6ae44a650aaf789c8ebea9313e07498d7864385227d25c7a8268a5b850367eef31639632e9218acadead20980b864b1cd477e", "bb63f0b3e0f9a1ed6afa0a694e6e3673f669ec8ac16b36bb6c3d273db387357b83e0c09e05c9dfc58b09a226a84e93a6bba558050b7b73c3a9b8f1bd8f3b7c33",
"95b6cb48c7bc9c2a54496ae3eea790824b57e52b9637058f084555bc1b809b2f", "3edc83b60740d77af3afa2fcb82c2f1bc541ee4e2518ddef4996d32453f54a3c",
"noble rent split month six benefit eye coil token inside tomorrow afraid rely verb purity shoulder airport joke bacon problem script scare hole trumpet", "disagree tomato unique attend aspect runway solid violin witness scrap armed daring favorite warm decade perfect target kid grant play early wide cigar night",
"e33e3d32e467877596a18ac60050488a0ec1557fda6bf95bad3d33d964c5e99dcd97d378403cc2723ed1c85c12b42bc59f15458d970d7a9d015f556109c146b0", "fdd3a53afaaf299cb3c5c1f9a2bb69627a03da65106deca4301859cda102d34eece0ad49558f145fb8986cf39b4ce88aad96c21ae9be2894da97a6379659ad25",
"7f93397f750f70a26513de2732ed95ee", "63deb1e7f0c3de56f4ab43c9d2ae6c86",
"legend oil garlic tube warfare eye nephew knock cheese number grace tackle", "glow void ketchup thunder digital clock sport half six nice open artefact",
"7f92ad63e4cdf4f15c23740556ad81e7f8cbd67cc672c93894c9c0d4fb171539eed5ab29f366570ed9940b816f45a539c3816f7ac19511794b752c5c1ec0e732", "68ce9777c0adc97c85ff636fd0c677b00c5f1dab44c4090a5f60c516ccb50a8b8a3f59afeaf85a935d986ad37dcea8e921e9ecde3bb6649c4cbc843b19e2b8a5",
"14c29fe840dd1c9f05d392ba13e4e1466b32ed0726a15f89", "e77c6500b49072aefdf0a8aa787cf557d1920e94103e0597",
"below belt wheel like spike exhibit blanket inch ring palace debate mimic rebel isolate broken stage garbage enhance", "trash tobacco dizzy hard already first water bench price sentence diary quick bomb also expect amazing airport royal",
"7bae6e54f8bad645f18f574b310bd3e6fde126dabcaf63a889940380e4798810e48c8151fc56bb2389c07498deacef025f03cbf8fc57ea3ec68f6421b0fcb649", "4c9e646357ea442fb2734018662e7473b5870ef7dc9f5048f9460ec22f08aeea561def3664e8f8a96759eaf1aeedb2b113fb820b96e8dc5853fd7de6293568de",
"cb30610d175ffeab8357d5190d31923997752a7f9815087bfcad5eb0b43f6468", "89bb4bc5555992cdaf3444c5e7ca5a6e9f27efab894f1990bae41be8b2a26ea4",
"sleep loan drive concert zoo fiction ask wide boil hat goose industry jar news wrist actor anchor that clip runway area cabbage museum abuse", "meadow surge vanish primary odor grocery rubber mass shine dinner notable tag venue water purchase clarify book magic ribbon daughter menu eye ritual orchard",
"b922030609e7626696b9cf5ca4c06cd99290be30b1052770f6a60c5f26532d178f287a4285d7a2add2845dc89a816b26fdba1c830067d130740f64c0ab5cfbe1", "71ce132d69f9bd4ebd7a3f8b4c45d057341670f9093fb22ce4855ee1672119d6a430f203ebcde5767e53f7c3ff64a5ad29ccd41f31d5d4f9db59e21f65b02cd0",
"a30b50a5439dcd1774f412ea5ec33403", "00641669f095b433a304ed0f953f28eb",
"perfect fold citizen mango system merry stable liquid tumble voyage snack alter", "about camera omit thrive forget border metal oval auto prepare sketch stomach",
"aae175f26848370c4d5d3d0640597e2bf1b28e95908dd877259b3eac5d71ffe3140739a3ed80180f88159571df84441985620e6b2fb0696e5cba1aa7b8d10b98", "016837c6355b0e8998a2fe8e10294a8b5dc0d9bc87e545e38f1ae77b4ade3247998a101ac1146f52414c9c8e0442f610fd7f0af25b60823fd044dc6902c865c8",
"70044da2175ad681d0ebbf2da83cf407eb9c8fd91fc0a8c9", "b8b0ff94389d3ec591c7d2fb72d8d3666e4e52b8cdf5471d",
"hybrid carbon hammer concert pulp domain dry jewel color draft dial average right elevator good way potato energy", "reward margin topic illness stadium glare either where window nothing crumble smoke top citizen tobacco salt either truth",
"a3dffe3a31a2e949d1b04af7495a5b59db17e41d93b985feeaaae89260a9c86c6dcdf7cb32eaba61c2f4f0340f0f17d1ebb67af11657286b2ffd66ec4e05a8b7", "366e1ba1ab99d840505b94a20d9c63f1e17ec330ff77a7e2db399b57be5d34971ca33d7dea361f5bc9f3e6c939f0624f7231d62f53b9963d9632c8926a031abe",
"0e0bab4df9669b97ba3f75a50b2e92423bbe6e91a1b01dbbf3ba200a917c9106", "911fec0fbd88029f6fa99164896c18d898c9232af18bdcca3e42d53b86493104",
"asthma front square version have slim trophy upgrade pink floor pig love room dance educate current buffalo test update divorce poverty salad dune scheme", "much youth advance kitchen lens exile salt cram goose enter alert raise milk muscle profit cousin system faint mouse price reveal cause series long",
"2eb4d85fbd8deaf9b06bf9cdb3e5f36e8da040d110312075eb32e776fc8e505b94be3e63c1525ad41f5e5968a263853001dc7c40ea3af8e8b0cfb7effd5f408c", "ed60c0f8ee61d91be8c96dbe8fd999c21d77c162e682fff73e904bf138d6f4b48e69becf69d4c72fd0e630179238acc9dd037eaec55eca077e0ad379249dc456",
0, 0,
0, 0,
0, 0,
@ -409,6 +435,10 @@ Suite *test_suite(void)
tcase_add_test(tc, test_rijndael); tcase_add_test(tc, test_rijndael);
suite_add_tcase(s, tc); suite_add_tcase(s, tc);
tc = tcase_create("pbkdf2");
tcase_add_test(tc, test_pbkdf2);
suite_add_tcase(s, tc);
tc = tcase_create("bip39"); tc = tcase_create("bip39");
tcase_add_test(tc, test_mnemonic); tcase_add_test(tc, test_mnemonic);
suite_add_tcase(s, tc); suite_add_tcase(s, tc);