1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-22 15:38:11 +00:00

add EthereumSignMessage/EthereumVerifyMessage

This commit is contained in:
Pavol Rusnak 2017-07-12 17:51:34 +02:00
parent c5e927fac2
commit b0ac3a2af1
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D
7 changed files with 117 additions and 9 deletions

View File

@ -576,8 +576,11 @@ void ethereum_signing_abort(void)
static void ethereum_message_hash(const uint8_t *message, size_t message_len, uint8_t hash[32])
{
struct SHA3_CTX ctx;
sha3_256_Init(&ctx);
sha3_Update(&ctx, (const uint8_t *)"\x19" "Ethereum Signed Message:\n", 26);
uint8_t varint[5];
uint32_t l = ser_length(message_len, varint);
sha3_Update(&ctx, varint, l);
sha3_Update(&ctx, message, message_len);
keccak_Final(&ctx, hash);
}
@ -607,8 +610,7 @@ void ethereum_message_sign(EthereumSignMessage *msg, const HDNode *node, Ethereu
int ethereum_message_verify(EthereumVerifyMessage *msg)
{
if (msg->signature.size != 65
|| msg->address.size != 20) {
if (msg->signature.size != 65 || msg->address.size != 20) {
fsm_sendFailure(FailureType_Failure_DataError, _("Malformed data"));
return 1;
}
@ -622,9 +624,9 @@ int ethereum_message_verify(EthereumVerifyMessage *msg)
* compatible with both.
*/
uint8_t v = msg->signature.bytes[64];
if (v >= 27)
if (v >= 27) {
v -= 27;
}
if (v >= 2 ||
ecdsa_verify_digest_recover(&secp256k1, pubkey, msg->signature.bytes, hash, v) != 0) {
return 2;

View File

@ -735,8 +735,8 @@ void fsm_msgEthereumVerifyMessage(EthereumVerifyMessage *msg)
return;
}
char address[41];
data2hex(msg->address.bytes, 20, address);
char address[43] = { '0', 'x' };
ethereum_address_checksum(msg->address.bytes, address + 2);
layoutVerifyAddress(address);
if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) {
fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL);

View File

@ -65,6 +65,16 @@ VerifyMessage.coin_name max_size:17
MessageSignature.address max_size:41
MessageSignature.signature max_size:65
EthereumSignMessage.address_n max_count:8
EthereumSignMessage.message max_size:1024
EthereumVerifyMessage.address max_size:20
EthereumVerifyMessage.signature max_size:65
EthereumVerifyMessage.message max_size:1024
EthereumMessageSignature.address max_size:20
EthereumMessageSignature.signature max_size:65
# deprecated
EncryptMessage skip_message:true
# EncryptMessage.pubkey max_size:33

View File

@ -314,6 +314,25 @@ const pb_field_t EthereumTxAck_fields[2] = {
PB_LAST_FIELD
};
const pb_field_t EthereumSignMessage_fields[3] = {
PB_FIELD2( 1, UINT32 , REPEATED, STATIC , FIRST, EthereumSignMessage, address_n, address_n, 0),
PB_FIELD2( 2, BYTES , REQUIRED, STATIC , OTHER, EthereumSignMessage, message, address_n, 0),
PB_LAST_FIELD
};
const pb_field_t EthereumVerifyMessage_fields[4] = {
PB_FIELD2( 1, BYTES , OPTIONAL, STATIC , FIRST, EthereumVerifyMessage, address, address, 0),
PB_FIELD2( 2, BYTES , OPTIONAL, STATIC , OTHER, EthereumVerifyMessage, signature, address, 0),
PB_FIELD2( 3, BYTES , OPTIONAL, STATIC , OTHER, EthereumVerifyMessage, message, signature, 0),
PB_LAST_FIELD
};
const pb_field_t EthereumMessageSignature_fields[3] = {
PB_FIELD2( 1, BYTES , OPTIONAL, STATIC , FIRST, EthereumMessageSignature, address, address, 0),
PB_FIELD2( 2, BYTES , OPTIONAL, STATIC , OTHER, EthereumMessageSignature, signature, address, 0),
PB_LAST_FIELD
};
const pb_field_t SignIdentity_fields[5] = {
PB_FIELD2( 1, MESSAGE , OPTIONAL, STATIC , FIRST, SignIdentity, identity, identity, &IdentityType_fields),
PB_FIELD2( 2, BYTES , OPTIONAL, STATIC , OTHER, SignIdentity, challenge_hidden, identity, 0),
@ -413,7 +432,7 @@ const pb_field_t DebugLinkFlashErase_fields[2] = {
* numbers or field sizes that are larger than what can fit in 8 or 16 bit
* field descriptors.
*/
STATIC_ASSERT((pb_membersize(Features, coins[0]) < 65536 && pb_membersize(PublicKey, node) < 65536 && pb_membersize(GetAddress, multisig) < 65536 && pb_membersize(LoadDevice, node) < 65536 && pb_membersize(TxRequest, details) < 65536 && pb_membersize(TxRequest, serialized) < 65536 && pb_membersize(TxAck, tx) < 65536 && pb_membersize(SignIdentity, identity) < 65536 && pb_membersize(GetECDHSessionKey, identity) < 65536 && pb_membersize(DebugLinkState, node) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_Initialize_GetFeatures_Features_ClearSession_ApplySettings_ChangePin_Ping_Success_Failure_ButtonRequest_ButtonAck_PinMatrixRequest_PinMatrixAck_Cancel_PassphraseRequest_PassphraseAck_GetEntropy_Entropy_GetPublicKey_PublicKey_GetAddress_EthereumGetAddress_Address_EthereumAddress_WipeDevice_LoadDevice_ResetDevice_BackupDevice_EntropyRequest_EntropyAck_RecoveryDevice_WordRequest_WordAck_SignMessage_VerifyMessage_MessageSignature_CipherKeyValue_CipheredKeyValue_SignTx_TxRequest_TxAck_EthereumSignTx_EthereumTxRequest_EthereumTxAck_SignIdentity_SignedIdentity_GetECDHSessionKey_ECDHSessionKey_SetU2FCounter_DebugLinkDecision_DebugLinkGetState_DebugLinkState_DebugLinkStop_DebugLinkLog_DebugLinkMemoryRead_DebugLinkMemory_DebugLinkMemoryWrite_DebugLinkFlashErase)
STATIC_ASSERT((pb_membersize(Features, coins[0]) < 65536 && pb_membersize(PublicKey, node) < 65536 && pb_membersize(GetAddress, multisig) < 65536 && pb_membersize(LoadDevice, node) < 65536 && pb_membersize(TxRequest, details) < 65536 && pb_membersize(TxRequest, serialized) < 65536 && pb_membersize(TxAck, tx) < 65536 && pb_membersize(SignIdentity, identity) < 65536 && pb_membersize(GetECDHSessionKey, identity) < 65536 && pb_membersize(DebugLinkState, node) < 65536), YOU_MUST_DEFINE_PB_FIELD_32BIT_FOR_MESSAGES_Initialize_GetFeatures_Features_ClearSession_ApplySettings_ChangePin_Ping_Success_Failure_ButtonRequest_ButtonAck_PinMatrixRequest_PinMatrixAck_Cancel_PassphraseRequest_PassphraseAck_GetEntropy_Entropy_GetPublicKey_PublicKey_GetAddress_EthereumGetAddress_Address_EthereumAddress_WipeDevice_LoadDevice_ResetDevice_BackupDevice_EntropyRequest_EntropyAck_RecoveryDevice_WordRequest_WordAck_SignMessage_VerifyMessage_MessageSignature_CipherKeyValue_CipheredKeyValue_SignTx_TxRequest_TxAck_EthereumSignTx_EthereumTxRequest_EthereumTxAck_EthereumSignMessage_EthereumVerifyMessage_EthereumMessageSignature_SignIdentity_SignedIdentity_GetECDHSessionKey_ECDHSessionKey_SetU2FCounter_DebugLinkDecision_DebugLinkGetState_DebugLinkState_DebugLinkStop_DebugLinkLog_DebugLinkMemoryRead_DebugLinkMemory_DebugLinkMemoryWrite_DebugLinkFlashErase)
#endif
#if !defined(PB_FIELD_16BIT) && !defined(PB_FIELD_32BIT)

View File

@ -72,6 +72,9 @@ typedef enum _MessageType {
MessageType_MessageType_GetECDHSessionKey = 61,
MessageType_MessageType_ECDHSessionKey = 62,
MessageType_MessageType_SetU2FCounter = 63,
MessageType_MessageType_EthereumSignMessage = 64,
MessageType_MessageType_EthereumVerifyMessage = 65,
MessageType_MessageType_EthereumMessageSignature = 66,
MessageType_MessageType_DebugLinkDecision = 100,
MessageType_MessageType_DebugLinkGetState = 101,
MessageType_MessageType_DebugLinkState = 102,
@ -324,6 +327,34 @@ typedef struct _EthereumGetAddress {
bool show_display;
} EthereumGetAddress;
typedef struct {
size_t size;
uint8_t bytes[20];
} EthereumMessageSignature_address_t;
typedef struct {
size_t size;
uint8_t bytes[65];
} EthereumMessageSignature_signature_t;
typedef struct _EthereumMessageSignature {
bool has_address;
EthereumMessageSignature_address_t address;
bool has_signature;
EthereumMessageSignature_signature_t signature;
} EthereumMessageSignature;
typedef struct {
size_t size;
uint8_t bytes[1024];
} EthereumSignMessage_message_t;
typedef struct _EthereumSignMessage {
size_t address_n_count;
uint32_t address_n[8];
EthereumSignMessage_message_t message;
} EthereumSignMessage;
typedef struct {
size_t size;
uint8_t bytes[32];
@ -406,6 +437,30 @@ typedef struct _EthereumTxRequest {
EthereumTxRequest_signature_s_t signature_s;
} EthereumTxRequest;
typedef struct {
size_t size;
uint8_t bytes[20];
} EthereumVerifyMessage_address_t;
typedef struct {
size_t size;
uint8_t bytes[65];
} EthereumVerifyMessage_signature_t;
typedef struct {
size_t size;
uint8_t bytes[1024];
} EthereumVerifyMessage_message_t;
typedef struct _EthereumVerifyMessage {
bool has_address;
EthereumVerifyMessage_address_t address;
bool has_signature;
EthereumVerifyMessage_signature_t signature;
bool has_message;
EthereumVerifyMessage_message_t message;
} EthereumVerifyMessage;
typedef struct _Failure {
bool has_code;
FailureType code;
@ -779,6 +834,9 @@ extern const uint32_t SignTx_lock_time_default;
#define EthereumSignTx_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, 0, false, 0}
#define EthereumTxRequest_init_default {false, 0, false, 0, false, {0, {0}}, false, {0, {0}}}
#define EthereumTxAck_init_default {false, {0, {0}}}
#define EthereumSignMessage_init_default {0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, {0}}}
#define EthereumVerifyMessage_init_default {false, {0, {0}}, false, {0, {0}}, false, {0, {0}}}
#define EthereumMessageSignature_init_default {false, {0, {0}}, false, {0, {0}}}
#define SignIdentity_init_default {false, IdentityType_init_default, false, {0, {0}}, false, "", false, ""}
#define SignedIdentity_init_default {false, "", false, {0, {0}}, false, {0, {0}}}
#define GetECDHSessionKey_init_default {false, IdentityType_init_default, false, {0, {0}}, false, ""}
@ -837,6 +895,9 @@ extern const uint32_t SignTx_lock_time_default;
#define EthereumSignTx_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, {0, {0}}, false, 0, false, 0}
#define EthereumTxRequest_init_zero {false, 0, false, 0, false, {0, {0}}, false, {0, {0}}}
#define EthereumTxAck_init_zero {false, {0, {0}}}
#define EthereumSignMessage_init_zero {0, {0, 0, 0, 0, 0, 0, 0, 0}, {0, {0}}}
#define EthereumVerifyMessage_init_zero {false, {0, {0}}, false, {0, {0}}, false, {0, {0}}}
#define EthereumMessageSignature_init_zero {false, {0, {0}}, false, {0, {0}}}
#define SignIdentity_init_zero {false, IdentityType_init_zero, false, {0, {0}}, false, "", false, ""}
#define SignedIdentity_init_zero {false, "", false, {0, {0}}, false, {0, {0}}}
#define GetECDHSessionKey_init_zero {false, IdentityType_init_zero, false, {0, {0}}, false, ""}
@ -896,6 +957,10 @@ extern const uint32_t SignTx_lock_time_default;
#define EthereumAddress_address_tag 1
#define EthereumGetAddress_address_n_tag 1
#define EthereumGetAddress_show_display_tag 2
#define EthereumMessageSignature_address_tag 1
#define EthereumMessageSignature_signature_tag 2
#define EthereumSignMessage_address_n_tag 1
#define EthereumSignMessage_message_tag 2
#define EthereumSignTx_address_n_tag 1
#define EthereumSignTx_nonce_tag 2
#define EthereumSignTx_gas_price_tag 3
@ -910,6 +975,9 @@ extern const uint32_t SignTx_lock_time_default;
#define EthereumTxRequest_signature_v_tag 2
#define EthereumTxRequest_signature_r_tag 3
#define EthereumTxRequest_signature_s_tag 4
#define EthereumVerifyMessage_address_tag 1
#define EthereumVerifyMessage_signature_tag 2
#define EthereumVerifyMessage_message_tag 3
#define Failure_code_tag 1
#define Failure_message_tag 2
#define Features_vendor_tag 1
@ -1053,6 +1121,9 @@ extern const pb_field_t TxAck_fields[2];
extern const pb_field_t EthereumSignTx_fields[10];
extern const pb_field_t EthereumTxRequest_fields[5];
extern const pb_field_t EthereumTxAck_fields[2];
extern const pb_field_t EthereumSignMessage_fields[3];
extern const pb_field_t EthereumVerifyMessage_fields[4];
extern const pb_field_t EthereumMessageSignature_fields[3];
extern const pb_field_t SignIdentity_fields[5];
extern const pb_field_t SignedIdentity_fields[4];
extern const pb_field_t GetECDHSessionKey_fields[4];
@ -1113,6 +1184,9 @@ extern const pb_field_t DebugLinkFlashErase_fields[2];
#define EthereumSignTx_size 1245
#define EthereumTxRequest_size 80
#define EthereumTxAck_size 1027
#define EthereumSignMessage_size 1075
#define EthereumVerifyMessage_size 1116
#define EthereumMessageSignature_size 89
#define SignIdentity_size (558 + IdentityType_size)
#define SignedIdentity_size 145
#define GetECDHSessionKey_size (107 + IdentityType_size)

View File

@ -40,6 +40,8 @@
{ 'n', 'i', MessageType_MessageType_EthereumTxAck, EthereumTxAck_fields, (void (*)(void *)) fsm_msgEthereumTxAck },
{ 'n', 'i', MessageType_MessageType_GetECDHSessionKey, GetECDHSessionKey_fields, (void (*)(void *)) fsm_msgGetECDHSessionKey },
{ 'n', 'i', MessageType_MessageType_SetU2FCounter, SetU2FCounter_fields, (void (*)(void *)) fsm_msgSetU2FCounter },
{ 'n', 'i', MessageType_MessageType_EthereumSignMessage, EthereumSignMessage_fields, (void (*)(void *)) fsm_msgEthereumSignMessage },
{ 'n', 'i', MessageType_MessageType_EthereumVerifyMessage, EthereumVerifyMessage_fields, (void (*)(void *)) fsm_msgEthereumVerifyMessage },
// out messages
@ -65,6 +67,7 @@
{ 'n', 'o', MessageType_MessageType_EthereumAddress, EthereumAddress_fields, 0 },
{ 'n', 'o', MessageType_MessageType_EthereumTxRequest, EthereumTxRequest_fields, 0 },
{ 'n', 'o', MessageType_MessageType_ECDHSessionKey, ECDHSessionKey_fields, 0 },
{ 'n', 'o', MessageType_MessageType_EthereumMessageSignature, EthereumMessageSignature_fields, 0 },
#if DEBUG_LINK

@ -1 +1 @@
Subproject commit c2a40f4b675ed3bf137360a6fa22ff72775f38ff
Subproject commit b29b98d69ba43571dcbe54dc927aa3ecd2b95113