From 90b954493ad8f7bf6e7cf2bb9a8dd753a5e2e78e Mon Sep 17 00:00:00 2001 From: keepkeyjon Date: Sun, 13 Oct 2019 09:22:01 -0600 Subject: [PATCH 1/5] Add more testnet support Closes #175 --- include/keepkey/firmware/coins.def | 7 +++++-- include/keepkey/firmware/coins.h | 1 + lib/firmware/coins.c | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/include/keepkey/firmware/coins.def b/include/keepkey/firmware/coins.def index 2abed6a63..d2af50280 100644 --- a/include/keepkey/firmware/coins.def +++ b/include/keepkey/firmware/coins.def @@ -11,7 +11,7 @@ X(true, ETHEREUM, true, "ETH", true, NA, true, 100000, true, N X(true, ETHEREUM_CLS, true, "ETC", true, NA, true, 100000, true, NA, true, "\x19" "Ethereum Signed Message:\n", true, 0x8000003d, true, 62, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) X(true, "BitcoinGold", true, "BTG", true, 38, true, 500000, true, 23, true, "\x1d" "Bitcoin Gold Signed Message:\n", true, 0x8000009c, true, 79, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, true, true, SECP256K1_STRING, false, "", true, "btg", false, false, true, 77429938, false, 0, false, "" ) X(true, "Zcash", true, "ZEC", true, 7352, true, 1000000, true, 7357, true, "\x16" "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Zcash Testnet",true, "TAZ", true, 7461, true, 10000000, true, 7354, true, "\x16" "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Zcash Testnet",true, "TAZ", true, 7461, true, 10000000, true, 7354, true, "\x16" "Zcash Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) X(true, "DigiByte", true, "DGB", true, 30, true, 500000, true, 63, true, "\x19" "DigiByte Signed Message:\n", true, 0x80000014, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, false, false, true, SECP256K1_STRING, false, "", true, "dgb", false, false, false, 0, false, 0, false, "" ) X(true, "EOS", true, "EOS", false, NA, false, 0, false, NA, false, {0}, true, 0x800000c2, false, 0, false, 0, false, NO_CONTRACT, false, 0, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) X(true, "Axe", true, "AXE", true, 55, true, 100000, true, 16, true, "\x19" "DarkCoin Signed Message:\n", true, 0x80001092, false, 0, true, 8, false, NO_CONTRACT, true, 50221772, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) @@ -30,9 +30,12 @@ X(true, "Monacoin", true, "MONA", true, 50, true, 5000000, true, 5 X(true, "Electra", true, "ECA", true, 33, true, 10000, true, 40, true, "\x1d" "Electra very Signed Message:\n", true, 0x800000f9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) X(true, "Nano", true, "NANO", true, NA, false, NA, false, NA, true, "\x16" "Nano Signed Message:\n", true, 0x800000a5, false, 0, true, 30, false, NO_CONTRACT, false, 0, false, false, false, false, true, ED25519_BLAKE2B_NANO_STRING, false, "", false, "", false, false, false, 0, false, 0, true, "xrb_") X(true, "Groestlcoin", true, "GRS", true, 36, true, 100000, true, 5, true, "\x1c" "GroestlCoin Signed Message:\n", true, 0x80000011, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true,"secp256k1-groestl", false, "", true, "grs", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "GRS Testnet", true, "tGRS", true, 111, true, 100000 , true, 196, true, "\x1c" "GroestlCoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true,"secp256k1-groestl", false, "", true, "tgrs", false, false, true, 71979618, true, 73342198, false, "" ) X(true, "Megacoin", true, "MEC", true, 50, true, 1000000, true, 5, true, "\x19" "MegaCoin Signed Message:\n", true, 0x800000d9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, true, 77429938, true, 78792518, false, "" ) X(true, "Terracoin", true, "TRC", true, 0, true, 100000, true, 5, true, "\x19" "DarkCoin Signed Message:\n", true, 0x80000053, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) X(true, "Qtum", true, "QTUM", true, 58, true, 40000000, true, 50, true, "\x15" "Qtum Signed Message:\n", true, 0x800008fd, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "qc", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "GRS Testnet", true, "tGRS", true, 111, true, 100000 , true, 196, true, "\x1c" "GroestlCoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true,"secp256k1-groestl", false, "", true, "tgrs", false, false, true, 71979618, true, 73342198, false, "" ) +X(true, "BCH Testnet", true, "tBCH", true, 0, true, 500000, true, 5, true, "\x18" "Bitcoin Signed Message:\n", true, 0x80000001, true, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, true, true, SECP256K1_STRING, true, "bitcoincash", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "LTC Testnet", true, "tLTC", true, 48, true, 1000000, true, 50, true, "\x19" "Litecoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 27108450, true, true, true, false, true, SECP256K1_STRING, false, "", true, "ltc", false, false, false, 0, false, 0, false, "" ) +X(true, ETHEREUM_TST, true, "tETH", true, NA, true, 100000, true, NA, true, "\x19" "Ethereum Signed Message:\n", true, 0x80000001, true, 1, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) #undef X #undef NO_CONTRACT diff --git a/include/keepkey/firmware/coins.h b/include/keepkey/firmware/coins.h index e12c99705..096dbf1e4 100644 --- a/include/keepkey/firmware/coins.h +++ b/include/keepkey/firmware/coins.h @@ -26,6 +26,7 @@ #define NA 0xFFFF /*etherum does not use P2PH or P2SH */ #define ETHEREUM "Ethereum" #define ETHEREUM_CLS "ETH Classic" +#define ETHEREUM_TST "ETH Testnet" enum { #define X(\ diff --git a/lib/firmware/coins.c b/lib/firmware/coins.c index 487973383..5dca70d37 100644 --- a/lib/firmware/coins.c +++ b/lib/firmware/coins.c @@ -119,6 +119,7 @@ static bool path_mismatched(const CoinType *coin, const uint32_t *address_n, if (address_n_count == 5 && (strncmp(coin->coin_name, ETHEREUM, strlen(ETHEREUM)) == 0 || strncmp(coin->coin_name, ETHEREUM_CLS, sizeof(ETHEREUM_CLS)) == 0 || + strncmp(coin->coin_name, ETHEREUM_TST, sizeof(ETHEREUM_TST)) == 0 || coin->has_contract_address)) { if (whole_account) return true; @@ -422,6 +423,9 @@ bool isEthereumLike(const char *coin_name) if (strcmp(coin_name, ETHEREUM_CLS) == 0) return true; + if (strcmp(coin_name, ETHEREUM_TST) == 0) + return true; + return false; } From 195daa73a2bed47232397b59b2c778eb8b8f6e13 Mon Sep 17 00:00:00 2001 From: keepkeyjon Date: Sun, 13 Oct 2019 09:35:04 -0600 Subject: [PATCH 2/5] firmware: calculate message header len --- include/keepkey/firmware/coins.def | 66 +++++++++++++++--------------- lib/firmware/crypto.c | 9 ++++ 2 files changed, 42 insertions(+), 33 deletions(-) diff --git a/include/keepkey/firmware/coins.def b/include/keepkey/firmware/coins.def index 2abed6a63..e27fd5166 100644 --- a/include/keepkey/firmware/coins.def +++ b/include/keepkey/firmware/coins.def @@ -1,38 +1,38 @@ #define NO_CONTRACT {0, {0}} //coin_name coin_shortcut address_type maxfee_kb p2sh signed_message_header bip44_account_path forkid/chain_id decimals contract_address xpub_magic segwit force_bip143 curve_name cashaddr_prefix bech32_prefix decred xpub_magic_segwit_p2sh xpub_mmagic_segwit_native nanoaddr_prefix -X(true, "Bitcoin", true, "BTC", true, 0, true, 100000, true, 5, true, "\x18" "Bitcoin Signed Message:\n", true, 0x80000000, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "bc", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "Testnet", true, "TEST", true, 111, true, 10000000, true, 196, true, "\x18" "Bitcoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true, SECP256K1_STRING, false, "", true, "tb", false, false, true, 71979618, true, 73342198, false, "" ) -X(true, "BitcoinCash", true, "BCH", true, 0, true, 500000, true, 5, true, "\x18" "Bitcoin Signed Message:\n", true, 0x80000091, true, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, true, true, SECP256K1_STRING, true, "bitcoincash", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Namecoin", true, "NMC", true, 52, true, 10000000, true, 5, true, "\x19" "Namecoin Signed Message:\n", true, 0x80000007, false, 0, true, 8, false, NO_CONTRACT, true, 27108450, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Litecoin", true, "LTC", true, 48, true, 1000000, true, 50, true, "\x19" "Litecoin Signed Message:\n", true, 0x80000002, false, 0, true, 8, false, NO_CONTRACT, true, 27108450, true, true, true, false, true, SECP256K1_STRING, false, "", true, "ltc", false, false, false, 0, false, 0, false, "" ) -X(true, "Dogecoin", true, "DOGE", true, 30, true, 1000000000, true, 22, true, "\x19" "Dogecoin Signed Message:\n", true, 0x80000003, false, 0, true, 8, false, NO_CONTRACT, true, 49990397, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Dash", true, "DASH", true, 76, true, 100000, true, 16, true, "\x19" "DarkCoin Signed Message:\n", true, 0x80000005, false, 0, true, 8, false, NO_CONTRACT, true, 50221772, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, ETHEREUM, true, "ETH", true, NA, true, 100000, true, NA, true, "\x19" "Ethereum Signed Message:\n", true, 0x8000003c, true, 1, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, ETHEREUM_CLS, true, "ETC", true, NA, true, 100000, true, NA, true, "\x19" "Ethereum Signed Message:\n", true, 0x8000003d, true, 62, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "BitcoinGold", true, "BTG", true, 38, true, 500000, true, 23, true, "\x1d" "Bitcoin Gold Signed Message:\n", true, 0x8000009c, true, 79, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, true, true, SECP256K1_STRING, false, "", true, "btg", false, false, true, 77429938, false, 0, false, "" ) -X(true, "Zcash", true, "ZEC", true, 7352, true, 1000000, true, 7357, true, "\x16" "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Zcash Testnet",true, "TAZ", true, 7461, true, 10000000, true, 7354, true, "\x16" "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "DigiByte", true, "DGB", true, 30, true, 500000, true, 63, true, "\x19" "DigiByte Signed Message:\n", true, 0x80000014, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, false, false, true, SECP256K1_STRING, false, "", true, "dgb", false, false, false, 0, false, 0, false, "" ) +X(true, "Bitcoin", true, "BTC", true, 0, true, 100000, true, 5, true, "Bitcoin Signed Message:\n", true, 0x80000000, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "bc", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Testnet", true, "TEST", true, 111, true, 10000000, true, 196, true, "Bitcoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true, SECP256K1_STRING, false, "", true, "tb", false, false, true, 71979618, true, 73342198, false, "" ) +X(true, "BitcoinCash", true, "BCH", true, 0, true, 500000, true, 5, true, "Bitcoin Signed Message:\n", true, 0x80000091, true, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, true, true, SECP256K1_STRING, true, "bitcoincash", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Namecoin", true, "NMC", true, 52, true, 10000000, true, 5, true, "Namecoin Signed Message:\n", true, 0x80000007, false, 0, true, 8, false, NO_CONTRACT, true, 27108450, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Litecoin", true, "LTC", true, 48, true, 1000000, true, 50, true, "Litecoin Signed Message:\n", true, 0x80000002, false, 0, true, 8, false, NO_CONTRACT, true, 27108450, true, true, true, false, true, SECP256K1_STRING, false, "", true, "ltc", false, false, false, 0, false, 0, false, "" ) +X(true, "Dogecoin", true, "DOGE", true, 30, true, 1000000000, true, 22, true, "Dogecoin Signed Message:\n", true, 0x80000003, false, 0, true, 8, false, NO_CONTRACT, true, 49990397, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Dash", true, "DASH", true, 76, true, 100000, true, 16, true, "DarkCoin Signed Message:\n", true, 0x80000005, false, 0, true, 8, false, NO_CONTRACT, true, 50221772, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, ETHEREUM, true, "ETH", true, NA, true, 100000, true, NA, true, "Ethereum Signed Message:\n", true, 0x8000003c, true, 1, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, ETHEREUM_CLS, true, "ETC", true, NA, true, 100000, true, NA, true, "Ethereum Signed Message:\n", true, 0x8000003d, true, 62, true, 18, false, NO_CONTRACT, false, 0, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "BitcoinGold", true, "BTG", true, 38, true, 500000, true, 23, true, "Bitcoin Gold Signed Message:\n", true, 0x8000009c, true, 79, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, true, true, SECP256K1_STRING, false, "", true, "btg", false, false, true, 77429938, false, 0, false, "" ) +X(true, "Zcash", true, "ZEC", true, 7352, true, 1000000, true, 7357, true, "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Zcash Testnet",true, "TAZ", true, 7461, true, 10000000, true, 7354, true, "Zcash Signed Message:\n", true, 0x80000085, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "DigiByte", true, "DGB", true, 30, true, 500000, true, 63, true, "DigiByte Signed Message:\n", true, 0x80000014, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, false, false, true, SECP256K1_STRING, false, "", true, "dgb", false, false, false, 0, false, 0, false, "" ) X(true, "EOS", true, "EOS", false, NA, false, 0, false, NA, false, {0}, true, 0x800000c2, false, 0, false, 0, false, NO_CONTRACT, false, 0, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Axe", true, "AXE", true, 55, true, 100000, true, 16, true, "\x19" "DarkCoin Signed Message:\n", true, 0x80001092, false, 0, true, 8, false, NO_CONTRACT, true, 50221772, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Bitcore", true, "BTX", true, 3, true, 100000, true, 125, true, "\x18" "BitCore Signed Message:\n", true, 0x800000a0, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "btx", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "Fujicoin", true, "FJC", true, 36, true, 10000000, true, 16, true, "\x19" "FujiCoin Signed Message:\n", true, 0x8000004b, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "fc", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "Denarius", true, "D", true, 30, true, 100000, true, 90, true, "\x19" "Denarius Signed Message:\n", true, 0x80000074, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Bitsend", true, "BSD", true, 102, true, 1000000, true, 5, true, "\x18" "Bitsend Signed Message:\n", true, 0x8000005b, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "Bitcloud", true, "BTDX", true, 25, true, 1000000, true, 5, true, "\x18" "Diamond Signed Message:\n", true, 0x800000da, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "BitcoinSV", true, "BSV", true, 0, true, 500000, true, 5, true, "\x18" "Bitcoin Signed Message:\n", true, 0x800000ec, true, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, true, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Komodo", true, "KMD", true, 60, true, 1000000, true, 85, true, "\x17" "Komodo Signed Message:\n", true, 0x8000008d, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Ravencoin", true, "RVN", true, 60, true, 2000000, true, 122, true, "\x1a" "Ravencoin Signed Message:\n", true, 0x800000af, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Decred", true, "DCR", true,1855, true, 1000000, true,1818, true, "\x17" "Decred Signed Message:\n", true, 0x8000002a, false, 0, true, 8, false, NO_CONTRACT, true, 50178342, true, false, true, false, true,"secp256k1-decred", false, "", false, "", true, true, false, 0, false, 0, false, "" ) -X(true, "Vertcoin", true, "VTC", true, 71, true, 40000000, true, 5, true, "\x19" "Vertcoin Signed Message:\n", true, 0x8000001c, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "vtc", false, false, true, 77429938, false, 0, false, "" ) -X(true, "GameCredits", true, "GAME", true, 38, true, 5000000, true, 62, true, "\x1c" "GameCredits Signed Message:\n", true, 0x80000065, false, 0, true, 8, false, NO_CONTRACT, true, 27106558, true, true, true, false, true, SECP256K1_STRING, false, "", true, "game", false, false, true, 28471030, false, 0, false, "" ) -X(true, "Monacoin", true, "MONA", true, 50, true, 5000000, true, 55, true, "\x19" "Monacoin Signed Message:\n", true, 0x80000016, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "mona", false, false, true, 77429938, false, 0, false, "" ) -X(true, "Electra", true, "ECA", true, 33, true, 10000, true, 40, true, "\x1d" "Electra very Signed Message:\n", true, 0x800000f9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Nano", true, "NANO", true, NA, false, NA, false, NA, true, "\x16" "Nano Signed Message:\n", true, 0x800000a5, false, 0, true, 30, false, NO_CONTRACT, false, 0, false, false, false, false, true, ED25519_BLAKE2B_NANO_STRING, false, "", false, "", false, false, false, 0, false, 0, true, "xrb_") -X(true, "Groestlcoin", true, "GRS", true, 36, true, 100000, true, 5, true, "\x1c" "GroestlCoin Signed Message:\n", true, 0x80000011, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true,"secp256k1-groestl", false, "", true, "grs", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "GRS Testnet", true, "tGRS", true, 111, true, 100000 , true, 196, true, "\x1c" "GroestlCoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true,"secp256k1-groestl", false, "", true, "tgrs", false, false, true, 71979618, true, 73342198, false, "" ) -X(true, "Megacoin", true, "MEC", true, 50, true, 1000000, true, 5, true, "\x19" "MegaCoin Signed Message:\n", true, 0x800000d9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, true, 77429938, true, 78792518, false, "" ) -X(true, "Terracoin", true, "TRC", true, 0, true, 100000, true, 5, true, "\x19" "DarkCoin Signed Message:\n", true, 0x80000053, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) -X(true, "Qtum", true, "QTUM", true, 58, true, 40000000, true, 50, true, "\x15" "Qtum Signed Message:\n", true, 0x800008fd, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "qc", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Axe", true, "AXE", true, 55, true, 100000, true, 16, true, "DarkCoin Signed Message:\n", true, 0x80001092, false, 0, true, 8, false, NO_CONTRACT, true, 50221772, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Bitcore", true, "BTX", true, 3, true, 100000, true, 125, true, "BitCore Signed Message:\n", true, 0x800000a0, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "btx", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Fujicoin", true, "FJC", true, 36, true, 10000000, true, 16, true, "FujiCoin Signed Message:\n", true, 0x8000004b, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "fc", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Denarius", true, "D", true, 30, true, 100000, true, 90, true, "Denarius Signed Message:\n", true, 0x80000074, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Bitsend", true, "BSD", true, 102, true, 1000000, true, 5, true, "Bitsend Signed Message:\n", true, 0x8000005b, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Bitcloud", true, "BTDX", true, 25, true, 1000000, true, 5, true, "Diamond Signed Message:\n", true, 0x800000da, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "BitcoinSV", true, "BSV", true, 0, true, 500000, true, 5, true, "Bitcoin Signed Message:\n", true, 0x800000ec, true, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, true, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Komodo", true, "KMD", true, 60, true, 1000000, true, 85, true, "Komodo Signed Message:\n", true, 0x8000008d, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Ravencoin", true, "RVN", true, 60, true, 2000000, true, 122, true, "Ravencoin Signed Message:\n", true, 0x800000af, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Decred", true, "DCR", true,1855, true, 1000000, true,1818, true, "Decred Signed Message:\n", true, 0x8000002a, false, 0, true, 8, false, NO_CONTRACT, true, 50178342, true, false, true, false, true,"secp256k1-decred", false, "", false, "", true, true, false, 0, false, 0, false, "" ) +X(true, "Vertcoin", true, "VTC", true, 71, true, 40000000, true, 5, true, "Vertcoin Signed Message:\n", true, 0x8000001c, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "vtc", false, false, true, 77429938, false, 0, false, "" ) +X(true, "GameCredits", true, "GAME", true, 38, true, 5000000, true, 62, true, "GameCredits Signed Message:\n", true, 0x80000065, false, 0, true, 8, false, NO_CONTRACT, true, 27106558, true, true, true, false, true, SECP256K1_STRING, false, "", true, "game", false, false, true, 28471030, false, 0, false, "" ) +X(true, "Monacoin", true, "MONA", true, 50, true, 5000000, true, 55, true, "Monacoin Signed Message:\n", true, 0x80000016, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "mona", false, false, true, 77429938, false, 0, false, "" ) +X(true, "Electra", true, "ECA", true, 33, true, 10000, true, 40, true, "Electra very Signed Message:\n", true, 0x800000f9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, false, false, false, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Nano", true, "NANO", true, NA, false, NA, false, NA, true, "Nano Signed Message:\n", true, 0x800000a5, false, 0, true, 30, false, NO_CONTRACT, false, 0, false, false, false, false, true, ED25519_BLAKE2B_NANO_STRING, false, "", false, "", false, false, false, 0, false, 0, true, "xrb_") +X(true, "Groestlcoin", true, "GRS", true, 36, true, 100000, true, 5, true, "GroestlCoin Signed Message:\n", true, 0x80000011, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true,"secp256k1-groestl", false, "", true, "grs", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "GRS Testnet", true, "tGRS", true, 111, true, 100000 , true, 196, true, "GroestlCoin Signed Message:\n", true, 0x80000001, false, 0, true, 8, false, NO_CONTRACT, true, 70617039, true, true, true, false, true,"secp256k1-groestl", false, "", true, "tgrs", false, false, true, 71979618, true, 73342198, false, "" ) +X(true, "Megacoin", true, "MEC", true, 50, true, 1000000, true, 5, true, "MegaCoin Signed Message:\n", true, 0x800000d9, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, true, 77429938, true, 78792518, false, "" ) +X(true, "Terracoin", true, "TRC", true, 0, true, 100000, true, 5, true, "DarkCoin Signed Message:\n", true, 0x80000053, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, false, true, false, true, SECP256K1_STRING, false, "", false, "", false, false, false, 0, false, 0, false, "" ) +X(true, "Qtum", true, "QTUM", true, 58, true, 40000000, true, 50, true, "Qtum Signed Message:\n", true, 0x800008fd, false, 0, true, 8, false, NO_CONTRACT, true, 76067358, true, true, true, false, true, SECP256K1_STRING, false, "", true, "qc", false, false, true, 77429938, true, 78792518, false, "" ) #undef X #undef NO_CONTRACT diff --git a/lib/firmware/crypto.c b/lib/firmware/crypto.c index 153e71832..27046ebf2 100644 --- a/lib/firmware/crypto.c +++ b/lib/firmware/crypto.c @@ -132,9 +132,13 @@ int cryptoGetECDHSessionKey(const HDNode *node, const uint8_t *peer_public_key, return 0; } +_Static_assert(sizeof(((CoinType*)0)->signed_message_header) < 256, "Message header too long"); + static void cryptoMessageHash(const CoinType *coin, const curve_info *curve, const uint8_t *message, size_t message_len, uint8_t hash[HASHER_DIGEST_LENGTH]) { Hasher hasher; hasher_Init(&hasher, curve->hasher_sign); + uint8_t header_len = strlen(coin->signed_message_header); + hasher_Update(&hasher, &header_len, 1); hasher_Update(&hasher, (const uint8_t *)coin->signed_message_header, strlen(coin->signed_message_header)); uint8_t varint[5]; uint32_t l = ser_length(message_len, varint); @@ -147,6 +151,9 @@ int cryptoMessageSign(const CoinType *coin, HDNode *node, InputScriptType script { const curve_info *curve = get_curve_by_name(coin->curve_name); if (!curve) return 1; + + if (!coin->has_signed_message_header) return 1; + uint8_t hash[HASHER_DIGEST_LENGTH]; cryptoMessageHash(coin, curve, message, message_len, hash); @@ -181,6 +188,8 @@ int cryptoMessageVerify(const CoinType *coin, const uint8_t *message, size_t mes const curve_info *curve = get_curve_by_name(coin->curve_name); if (!curve) return 1; + if (!coin->has_signed_message_header) return 1; + uint8_t hash[HASHER_DIGEST_LENGTH]; cryptoMessageHash(coin, curve, message, message_len, hash); From 4bdcf892f7aabbea96d65f8ac4d520fadeac81ce Mon Sep 17 00:00:00 2001 From: KeepKeyBrett Date: Wed, 16 Oct 2019 16:13:19 -0600 Subject: [PATCH 3/5] fix typo on recovery seed screen --- lib/firmware/reset.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/firmware/reset.c b/lib/firmware/reset.c index 660e7f026..717fef70f 100644 --- a/lib/firmware/reset.c +++ b/lib/firmware/reset.c @@ -151,7 +151,7 @@ void reset_entropy(const uint8_t *ext_entropy, uint32_t len) fsm_sendSuccess(_("Device reset")); goto exit; } else { - if (!confirm(ButtonRequestType_ButtonRequest_Other, _("Recovery Seed Bakcup"), + if (!confirm(ButtonRequestType_ButtonRequest_Other, _("Recovery Seed Backup"), "This recovery seed will only be shown ONCE. " "Please write it down carefully,\n" "and DO NOT share it with anyone. ")) { From bee9b60e4ce0a48d62494148fd62344491e3b2a6 Mon Sep 17 00:00:00 2001 From: keepkeyjon Date: Thu, 24 Oct 2019 17:10:09 -0600 Subject: [PATCH 4/5] Update trezor-crypto --- deps/crypto/CMakeLists.txt | 1 + deps/crypto/trezor-firmware | 2 +- include/keepkey/board/common.h | 50 ++++++++++++++++++++++++++++++++++ lib/board/CMakeLists.txt | 1 + lib/board/common.c | 50 ++++++++++++++++++++++++++++++++++ lib/firmware/recovery.c | 7 +++-- lib/firmware/recovery_cipher.c | 28 ++++++++++--------- lib/firmware/u2f.c | 3 +- tools/bootloader/main.c | 2 ++ tools/emulator/main.cpp | 2 ++ tools/firmware/keepkey_main.c | 2 ++ 11 files changed, 129 insertions(+), 19 deletions(-) create mode 100644 include/keepkey/board/common.h create mode 100644 lib/board/common.c diff --git a/deps/crypto/CMakeLists.txt b/deps/crypto/CMakeLists.txt index 022dc2116..36e7abfea 100644 --- a/deps/crypto/CMakeLists.txt +++ b/deps/crypto/CMakeLists.txt @@ -1,6 +1,7 @@ set(sources trezor-firmware/crypto/bip39.c trezor-firmware/crypto/hmac.c + trezor-firmware/crypto/hmac_drbg.c trezor-firmware/crypto/sha2.c trezor-firmware/crypto/base32.c trezor-firmware/crypto/hasher.c diff --git a/deps/crypto/trezor-firmware b/deps/crypto/trezor-firmware index 655661668..3740fa946 160000 --- a/deps/crypto/trezor-firmware +++ b/deps/crypto/trezor-firmware @@ -1 +1 @@ -Subproject commit 6556616681a4e2d7e18817e8692d4f6e041dee01 +Subproject commit 3740fa946d6486525f4239c824c5a6d78c4cb7f8 diff --git a/include/keepkey/board/common.h b/include/keepkey/board/common.h new file mode 100644 index 000000000..7e96e62fe --- /dev/null +++ b/include/keepkey/board/common.h @@ -0,0 +1,50 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef __TREZORHAL_COMMON_H__ +#define __TREZORHAL_COMMON_H__ + +#include +#include + +#define HW_ENTROPY_LEN (12 + 32) +extern uint8_t HW_ENTROPY_DATA[HW_ENTROPY_LEN]; + +void __attribute__((noreturn)) +__fatal_error(const char *expr, const char *msg, const char *file, int line, + const char *func); +void __attribute__((noreturn)) +error_shutdown(const char *line1, const char *line2, const char *line3, + const char *line4); + +#define ensure(expr, msg) \ + (((expr) == sectrue) \ + ? (void)0 \ + : __fatal_error(#expr, msg, __FILE__, __LINE__, __func__)) + +void hal_delay(uint32_t ms); + +void wait_random(void); + +void drbg_init(void); +void drbg_reseed(const uint8_t *entropy, size_t len); +void drbg_generate(uint8_t *buf, size_t len); +uint32_t drbg_random32(void); + +#endif diff --git a/lib/board/CMakeLists.txt b/lib/board/CMakeLists.txt index 21797e73e..01c1e3773 100644 --- a/lib/board/CMakeLists.txt +++ b/lib/board/CMakeLists.txt @@ -2,6 +2,7 @@ include(CheckSymbolExists) set(sources check_bootloader.c + common.c confirm_sm.c draw.c font.c diff --git a/lib/board/common.c b/lib/board/common.c new file mode 100644 index 000000000..07c672a66 --- /dev/null +++ b/lib/board/common.c @@ -0,0 +1,50 @@ +/* + * This file is part of the Trezor project, https://trezor.io/ + * + * Copyright (c) SatoshiLabs + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "keepkey/board/common.h" + +#include "keepkey/rand/rng.h" +#include "trezor/crypto/hmac_drbg.h" +#include "trezor/crypto/rand.h" + +#include + +uint8_t HW_ENTROPY_DATA[HW_ENTROPY_LEN]; + +static HMAC_DRBG_CTX drbg_ctx; + +void drbg_init() { + uint8_t entropy[48] = {0}; + random_buffer(entropy, sizeof(entropy)); + hmac_drbg_init(&drbg_ctx, entropy, sizeof(entropy), NULL, 0); +} + +void drbg_reseed(const uint8_t *entropy, size_t len) { + hmac_drbg_reseed(&drbg_ctx, entropy, len, NULL, 0); +} + +void drbg_generate(uint8_t *buf, size_t len) { + hmac_drbg_generate(&drbg_ctx, buf, len); +} + +uint32_t drbg_random32(void) { + uint32_t value = 0; + drbg_generate((uint8_t *)&value, sizeof(value)); + return value; +} diff --git a/lib/firmware/recovery.c b/lib/firmware/recovery.c index 61f3160b3..71c3b3372 100644 --- a/lib/firmware/recovery.c +++ b/lib/firmware/recovery.c @@ -29,6 +29,7 @@ #include "keepkey/firmware/storage.h" #include "keepkey/rand/rng.h" #include "trezor/crypto/bip39.h" +#include "trezor/crypto/bip39_english.h" #include "trezor/crypto/memzero.h" #include "trezor/crypto/rand.h" @@ -61,8 +62,8 @@ void next_word(void) { snprintf(title_formatted, SMALL_STR_BUF, "Device Recovery Step %lu/24", (unsigned long)(word_index + 1)); if (word_pos == 0) { - const char * const *wl = mnemonic_wordlist(); - strlcpy(fake_word, wl[random_uniform(2048)], sizeof(fake_word)); + const char * const *wl = wordlist; + strlcpy(fake_word, wl[random_uniform(2048)], sizeof(fake_word)); /* Format body for fake word */ /* snprintf: 18 + 12 (fake_word) + 1 (NULL) = 31 */ @@ -158,7 +159,7 @@ void recovery_init(uint32_t _word_count, bool passphrase_protection, } static bool isInWordList(const char *word) { - const char * const *wl = mnemonic_wordlist(); + const char * const *wl = wordlist; while (*wl) { if (strcmp(word, *wl) == 0) diff --git a/lib/firmware/recovery_cipher.c b/lib/firmware/recovery_cipher.c index 19517a6f7..2d93b13e8 100644 --- a/lib/firmware/recovery_cipher.c +++ b/lib/firmware/recovery_cipher.c @@ -17,20 +17,22 @@ * along with this library. If not, see . */ +#include "keepkey/firmware/recovery_cipher.h" + +#include "keepkey/board/confirm_sm.h" #include "keepkey/board/keepkey_board.h" #include "keepkey/board/layout.h" #include "keepkey/board/messages.h" -#include "trezor/crypto/bip39.h" -#include "trezor/crypto/memzero.h" -#include "keepkey/firmware/app_layout.h" -#include "keepkey/board/confirm_sm.h" #include "keepkey/board/util.h" +#include "keepkey/firmware/app_layout.h" #include "keepkey/firmware/fsm.h" #include "keepkey/firmware/home_sm.h" #include "keepkey/firmware/pin_sm.h" -#include "keepkey/firmware/recovery_cipher.h" #include "keepkey/firmware/storage.h" #include "keepkey/rand/rng.h" +#include "trezor/crypto/bip39.h" +#include "trezor/crypto/bip39_english.h" +#include "trezor/crypto/memzero.h" #include #include @@ -176,8 +178,8 @@ bool attempt_auto_complete(char *partial_word) { // Do lookup through volatile pointers to prevent the compiler from // optimizing this loop into something that can leak timing information. - const char *const volatile * volatile wordlist = - (const char *const volatile *)mnemonic_wordlist(); + const char *const volatile * volatile words = + (const char *const volatile *)wordlist; uint32_t partial_word_len = strlen(partial_word), match = 0, found = 0; bool precise_match = false; @@ -208,9 +210,9 @@ bool attempt_auto_complete(char *partial_word) asm volatile ("" ::: "memory"); // Look for precise matches first (including null termination) - for (uint32_t volatile i = 0; wordlist[permute[i]] != 0; i++) { - if (exact_str_match(partial_word, wordlist[permute[i]], partial_word_len + 1)) { - strlcpy(partial_word, wordlist[permute[i]], CURRENT_WORD_BUF); + for (uint32_t volatile i = 0; words[permute[i]] != 0; i++) { + if (exact_str_match(partial_word, words[permute[i]], partial_word_len + 1)) { + strlcpy(partial_word, words[permute[i]], CURRENT_WORD_BUF); precise_match = true; } } @@ -219,8 +221,8 @@ bool attempt_auto_complete(char *partial_word) asm volatile ("" ::: "memory"); // Followed by partial matches (ignoring null termination) - for (uint32_t volatile i = 0; wordlist[permute[i]] != 0; i++) { - if (exact_str_match(partial_word, wordlist[permute[i]], partial_word_len)) { + for (uint32_t volatile i = 0; words[permute[i]] != 0; i++) { + if (exact_str_match(partial_word, words[permute[i]], partial_word_len)) { match++; found = i; } @@ -233,7 +235,7 @@ bool attempt_auto_complete(char *partial_word) /* Autocomplete if we can */ if (match == 1) { - strlcpy(partial_word, wordlist[permute[found]], CURRENT_WORD_BUF); + strlcpy(partial_word, words[permute[found]], CURRENT_WORD_BUF); memzero(permute, sizeof(permute)); return true; } diff --git a/lib/firmware/u2f.c b/lib/firmware/u2f.c index 2fa9eb4b5..39b699ab6 100644 --- a/lib/firmware/u2f.c +++ b/lib/firmware/u2f.c @@ -35,6 +35,7 @@ #include "keepkey/firmware/u2f/u2f.h" #include "keepkey/firmware/u2f/u2f_keys.h" #include "trezor/crypto/bip39.h" +#include "trezor/crypto/bip39_english.h" #include "trezor/crypto/ecdsa.h" #include "trezor/crypto/hmac.h" #include "trezor/crypto/memzero.h" @@ -468,8 +469,6 @@ const char *words_from_data(const uint8_t *data, int len) int mlen = len * 3 / 4; static char mnemo[24 * 10]; - const char *const *wordlist = mnemonic_wordlist(); - int i, j, idx; char *p = mnemo; for (i = 0; i < mlen; i++) { diff --git a/tools/bootloader/main.c b/tools/bootloader/main.c index b22cddc97..4964d147b 100644 --- a/tools/bootloader/main.c +++ b/tools/bootloader/main.c @@ -30,6 +30,7 @@ #include #include "keepkey/board/confirm_sm.h" +#include "keepkey/board/common.h" #include "keepkey/board/keepkey_board.h" #include "keepkey/board/keepkey_button.h" #include "keepkey/board/keepkey_display.h" @@ -147,6 +148,7 @@ static void bootloader_init(void) { cm_enable_interrupts(); reset_rng(); + drbg_init(); timer_init(); keepkey_button_init(); svc_enable_interrupts(); diff --git a/tools/emulator/main.cpp b/tools/emulator/main.cpp index 674eb562d..8587bb909 100644 --- a/tools/emulator/main.cpp +++ b/tools/emulator/main.cpp @@ -20,6 +20,7 @@ #include "display.h" extern "C" { + #include "keepkey/board/common.h" #include "keepkey/board/keepkey_board.h" #include "keepkey/board/keepkey_flash.h" #include "keepkey/board/layout.h" @@ -70,6 +71,7 @@ int main(void) { setup(); kk_board_init(); + drbg_init(); led_func(SET_RED_LED); dbg_print("Application Version %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, diff --git a/tools/firmware/keepkey_main.c b/tools/firmware/keepkey_main.c index 86fe274b5..9a7fbc7fd 100644 --- a/tools/firmware/keepkey_main.c +++ b/tools/firmware/keepkey_main.c @@ -184,6 +184,8 @@ int main(void) /* Init for safeguard against stack overflow (-fstack-protector-all) */ __stack_chk_guard = (uintptr_t)random32(); + drbg_init(); + /* Bootloader Verification */ check_bootloader(); From 695cbdc8fe04298179936dab0f81bf6a8701814a Mon Sep 17 00:00:00 2001 From: keepkeyjon Date: Fri, 25 Oct 2019 14:28:36 -0600 Subject: [PATCH 5/5] Fix build --- tools/firmware/keepkey_main.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/firmware/keepkey_main.c b/tools/firmware/keepkey_main.c index 9a7fbc7fd..99281eb78 100644 --- a/tools/firmware/keepkey_main.c +++ b/tools/firmware/keepkey_main.c @@ -24,6 +24,7 @@ # include #endif +#include "keepkey/board/common.h" #include "keepkey/board/check_bootloader.h" #include "keepkey/board/keepkey_board.h" #include "keepkey/board/keepkey_flash.h"