diff --git a/firmware/coins.c b/firmware/coins.c index c22fd4a..db811e3 100644 --- a/firmware/coins.c +++ b/firmware/coins.c @@ -21,11 +21,11 @@ #include "coins.h" const CoinType coins[COINS_COUNT] = { - {true, "Bitcoin", true, "BTC", true, 0, true, 10000}, - {true, "Testnet", true, "TEST", true, 111, true, 10000000}, - {true, "Namecoin", true, "NMC", true, 52, true, 10000000}, - {true, "Litecoin", true, "LTC", true, 48, true, 10000000}, - {true, "Dogecoin", true, "DOGE", true, 30, true, 100000000}, + {true, "Bitcoin", true, "BTC", true, 0, true, 10000, true, 5}, + {true, "Testnet", true, "TEST", true, 111, true, 10000000, true, 196}, + {true, "Namecoin", true, "NMC", true, 52, true, 10000000, true, 5}, + {true, "Litecoin", true, "LTC", true, 48, true, 10000000, true, 5}, + {true, "Dogecoin", true, "DOGE", true, 30, true, 100000000, true, 22}, }; const CoinType *coinByShortcut(const char *shortcut) diff --git a/firmware/fsm.c b/firmware/fsm.c index 128aee1..7263f1f 100644 --- a/firmware/fsm.c +++ b/firmware/fsm.c @@ -282,7 +282,7 @@ void fsm_msgGetPublicKey(GetPublicKey *msg) resp->node.public_key.size = 33; memcpy(resp->node.public_key.bytes, node->public_key, 33); resp->has_xpub = true; - hdnode_serialize_public(node, resp->xpub); + hdnode_serialize_public(node, resp->xpub, sizeof(resp->xpub)); msg_write(MessageType_MessageType_PublicKey, resp); layoutHome(); } @@ -506,6 +506,7 @@ void fsm_msgGetAddress(GetAddress *msg) if (fsm_deriveKey(node, msg->address_n, msg->address_n_count) == 0) return; if (msg->has_multisig) { + layoutProgressSwipe("Preparing", 0); if (cryptoMultisigPubkeyIndex(&(msg->multisig), node->public_key) < 0) { fsm_sendFailure(FailureType_Failure_Other, "Pubkey not found in multisig script"); layoutHome(); @@ -518,10 +519,10 @@ void fsm_msgGetAddress(GetAddress *msg) return; } ripemd160(buf, 32, buf + 1); - buf[0] = 0x05; // multisig cointype - base58_encode_check(buf, 21, resp->address); + buf[0] = coin->address_type_p2sh; // multisig cointype + base58_encode_check(buf, 21, resp->address, sizeof(resp->address)); } else { - ecdsa_get_address(node->public_key, coin->address_type, resp->address); + ecdsa_get_address(node->public_key, coin->address_type, resp->address, sizeof(resp->address)); } if (msg->has_show_display && msg->show_display) { @@ -577,7 +578,7 @@ void fsm_msgSignMessage(SignMessage *msg) resp->has_address = true; uint8_t addr_raw[21]; ecdsa_get_address_raw(node->public_key, coin->address_type, addr_raw); - base58_encode_check(addr_raw, 21, resp->address); + base58_encode_check(addr_raw, 21, resp->address, sizeof(resp->address)); resp->has_signature = true; resp->signature.size = 65; msg_write(MessageType_MessageType_MessageSignature, resp); @@ -707,7 +708,7 @@ void fsm_msgDecryptMessage(DecryptMessage *msg) return; } if (signing) { - base58_encode_check(address_raw, 21, resp->address); + base58_encode_check(address_raw, 21, resp->address, sizeof(resp->address)); } layoutDecryptMessage(resp->message.bytes, resp->message.size, signing ? resp->address : 0); protectButton(ButtonRequestType_ButtonRequest_Other, true); diff --git a/firmware/protob/types.pb.c b/firmware/protob/types.pb.c index ab93718..fa11a45 100644 --- a/firmware/protob/types.pb.c +++ b/firmware/protob/types.pb.c @@ -7,6 +7,8 @@ #error Regenerate this file with the current version of nanopb generator. #endif +const uint32_t CoinType_address_type_default = 0u; +const uint32_t CoinType_address_type_p2sh_default = 5u; const uint32_t TxInputType_sequence_default = 4294967295u; const InputScriptType TxInputType_script_type_default = InputScriptType_SPENDADDRESS; @@ -27,11 +29,12 @@ const pb_field_t HDNodePathType_fields[3] = { PB_LAST_FIELD }; -const pb_field_t CoinType_fields[5] = { +const pb_field_t CoinType_fields[6] = { PB_FIELD( 1, STRING , OPTIONAL, STATIC , FIRST, CoinType, coin_name, coin_name, 0), PB_FIELD( 2, STRING , OPTIONAL, STATIC , OTHER, CoinType, coin_shortcut, coin_name, 0), - PB_FIELD( 3, UINT32 , OPTIONAL, STATIC , OTHER, CoinType, address_type, coin_shortcut, 0), + PB_FIELD( 3, UINT32 , OPTIONAL, STATIC , OTHER, CoinType, address_type, coin_shortcut, &CoinType_address_type_default), PB_FIELD( 4, UINT64 , OPTIONAL, STATIC , OTHER, CoinType, maxfee_kb, address_type, 0), + PB_FIELD( 5, UINT32 , OPTIONAL, STATIC , OTHER, CoinType, address_type_p2sh, maxfee_kb, &CoinType_address_type_p2sh_default), PB_LAST_FIELD }; diff --git a/firmware/protob/types.pb.h b/firmware/protob/types.pb.h index a71313c..215ad3e 100644 --- a/firmware/protob/types.pb.h +++ b/firmware/protob/types.pb.h @@ -75,6 +75,8 @@ typedef struct _CoinType { uint32_t address_type; bool has_maxfee_kb; uint64_t maxfee_kb; + bool has_address_type_p2sh; + uint32_t address_type_p2sh; } CoinType; typedef PB_BYTES_ARRAY_T(32) HDNodeType_chain_code_t; @@ -194,13 +196,15 @@ extern const pb_extension_type_t wire_debug_in; extern const pb_extension_type_t wire_debug_out; /* Default values for struct fields */ +extern const uint32_t CoinType_address_type_default; +extern const uint32_t CoinType_address_type_p2sh_default; extern const uint32_t TxInputType_sequence_default; extern const InputScriptType TxInputType_script_type_default; /* Initializer values for message structs */ #define HDNodeType_init_default {0, 0, 0, {0, {0}}, false, {0, {0}}, false, {0, {0}}} #define HDNodePathType_init_default {HDNodeType_init_default, 0, {0, 0, 0, 0, 0, 0, 0, 0}} -#define CoinType_init_default {false, "", false, "", false, 0, false, 0} +#define CoinType_init_default {false, "", false, "", false, 0u, false, 0, false, 5u} #define MultisigRedeemScriptType_init_default {0, {HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default, HDNodePathType_init_default}, 0, {{0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}}, false, 0} #define TxInputType_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, {0}}, 0, false, {0, {0}}, false, 4294967295u, false, InputScriptType_SPENDADDRESS, false, MultisigRedeemScriptType_init_default} #define TxOutputType_init_default {false, "", 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, (OutputScriptType)0, false, MultisigRedeemScriptType_init_default} @@ -210,7 +214,7 @@ extern const InputScriptType TxInputType_script_type_default; #define TxRequestSerializedType_init_default {false, 0, false, {0, {0}}, false, {0, {0}}} #define HDNodeType_init_zero {0, 0, 0, {0, {0}}, false, {0, {0}}, false, {0, {0}}} #define HDNodePathType_init_zero {HDNodeType_init_zero, 0, {0, 0, 0, 0, 0, 0, 0, 0}} -#define CoinType_init_zero {false, "", false, "", false, 0, false, 0} +#define CoinType_init_zero {false, "", false, "", false, 0, false, 0, false, 0} #define MultisigRedeemScriptType_init_zero {0, {HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero, HDNodePathType_init_zero}, 0, {{0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}, {0, {0}}}, false, 0} #define TxInputType_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, {0}}, 0, false, {0, {0}}, false, 0, false, (InputScriptType)0, false, MultisigRedeemScriptType_init_zero} #define TxOutputType_init_zero {false, "", 0, {0, 0, 0, 0, 0, 0, 0, 0}, 0, (OutputScriptType)0, false, MultisigRedeemScriptType_init_zero} @@ -224,6 +228,7 @@ extern const InputScriptType TxInputType_script_type_default; #define CoinType_coin_shortcut_tag 2 #define CoinType_address_type_tag 3 #define CoinType_maxfee_kb_tag 4 +#define CoinType_address_type_p2sh_tag 5 #define HDNodeType_depth_tag 1 #define HDNodeType_fingerprint_tag 2 #define HDNodeType_child_num_tag 3 @@ -269,7 +274,7 @@ extern const InputScriptType TxInputType_script_type_default; /* Struct field encoding specification for nanopb */ extern const pb_field_t HDNodeType_fields[7]; extern const pb_field_t HDNodePathType_fields[3]; -extern const pb_field_t CoinType_fields[5]; +extern const pb_field_t CoinType_fields[6]; extern const pb_field_t MultisigRedeemScriptType_fields[4]; extern const pb_field_t TxInputType_fields[8]; extern const pb_field_t TxOutputType_fields[6]; @@ -281,7 +286,7 @@ extern const pb_field_t TxRequestSerializedType_fields[4]; /* Maximum encoded size of messages (where known) */ #define HDNodeType_size 121 #define HDNodePathType_size 171 -#define CoinType_size 47 +#define CoinType_size 53 #define MultisigRedeemScriptType_size 3741 #define TxInputType_size 5497 #define TxOutputType_size 3847 diff --git a/firmware/transaction.c b/firmware/transaction.c index c224f41..08cca08 100644 --- a/firmware/transaction.c +++ b/firmware/transaction.c @@ -108,7 +108,7 @@ int compile_output(const CoinType *coin, const HDNode *root, TxOutputType *in, T if (!in->has_address || !ecdsa_address_decode(in->address, addr_raw)) { return 0; } - if (addr_raw[0] != 0x05) { // 0x05 is P2SH + if (addr_raw[0] != coin->address_type_p2sh) { return 0; } if (needs_confirm) { @@ -133,10 +133,10 @@ int compile_output(const CoinType *coin, const HDNode *root, TxOutputType *in, T if (compile_script_multisig_hash(&(in->multisig), buf) == 0) { return 0; } - addr_raw[0] = 0x05; + addr_raw[0] = coin->address_type_p2sh; ripemd160(buf, 32, addr_raw + 1); if (needs_confirm) { - base58_encode_check(addr_raw, 21, in->address); + base58_encode_check(addr_raw, 21, in->address, sizeof(in->address)); layoutConfirmOutput(coin, in); if (!protectButton(ButtonRequestType_ButtonRequest_ConfirmOutput, false)) { return -1; diff --git a/trezor-common b/trezor-common index 94d17ef..60bcde4 160000 --- a/trezor-common +++ b/trezor-common @@ -1 +1 @@ -Subproject commit 94d17ef8bc56d7c0e6ddfed39e84987543259e05 +Subproject commit 60bcde46f584062e3a454bcdfdcf01bff927c8ea diff --git a/trezor-crypto b/trezor-crypto index c6ca89a..89a7d77 160000 --- a/trezor-crypto +++ b/trezor-crypto @@ -1 +1 @@ -Subproject commit c6ca89a8507bd9310c0c92c180525989629fb7d4 +Subproject commit 89a7d7797b806face0d023095c6f39c7869c5ff1