mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-22 04:22:07 +00:00
sign message speedup
see https://github.com/spesmilo/electrum/pull/695/files#diff-3
This commit is contained in:
parent
10fc0b69fc
commit
86dd83f93b
@ -63,7 +63,7 @@ uint32_t deser_length(const uint8_t *in, uint32_t *out)
|
||||
return 1 + 8;
|
||||
}
|
||||
|
||||
int cryptoMessageSign(const uint8_t *message, pb_size_t message_len, const uint8_t *privkey, const uint8_t *address_raw, uint8_t *signature)
|
||||
int cryptoMessageSign(const uint8_t *message, pb_size_t message_len, const uint8_t *privkey, uint8_t *signature)
|
||||
{
|
||||
SHA256_CTX ctx;
|
||||
sha256_Init(&ctx);
|
||||
@ -75,15 +75,10 @@ int cryptoMessageSign(const uint8_t *message, pb_size_t message_len, const uint8
|
||||
uint8_t hash[32];
|
||||
sha256_Final(hash, &ctx);
|
||||
sha256_Raw(hash, 32, hash);
|
||||
ecdsa_sign_digest(privkey, hash, signature + 1);
|
||||
uint8_t i;
|
||||
for (i = 27 + 4; i < 27 + 4 + 4; i++) {
|
||||
signature[0] = i;
|
||||
if (cryptoMessageVerify(message, message_len, address_raw, signature) == 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
uint8_t pby;
|
||||
ecdsa_sign_digest(privkey, hash, signature + 1, &pby);
|
||||
signature[0] = 27 + pby + 4;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int cryptoMessageVerify(const uint8_t *message, pb_size_t message_len, const uint8_t *address_raw, const uint8_t *signature)
|
||||
@ -106,13 +101,8 @@ int cryptoMessageVerify(const uint8_t *message, pb_size_t message_len, const uin
|
||||
// read r and s
|
||||
bn_read_be(signature + 1, &r);
|
||||
bn_read_be(signature + 33, &s);
|
||||
// x = r + (recid / 2) * order
|
||||
bn_zero(&cp.x);
|
||||
uint8_t i;
|
||||
for (i = 0; i < recid / 2; i++) {
|
||||
bn_addmod(&cp.x, &order256k1, &prime256k1);
|
||||
}
|
||||
bn_addmod(&cp.x, &r, &prime256k1);
|
||||
// x = r
|
||||
memcpy(&cp.x, &r, sizeof(bignum256));
|
||||
// compute y from x
|
||||
uncompress_coords(recid % 2, &cp.x, &cp.y);
|
||||
// calculate hash
|
||||
@ -161,7 +151,7 @@ int cryptoMessageEncrypt(curve_point *pubkey, const uint8_t *msg, pb_size_t msg_
|
||||
uint32_t l = ser_length(msg_size, payload + 1);
|
||||
memcpy(payload + 1 + l, msg, msg_size);
|
||||
memcpy(payload + 1 + l + msg_size, address_raw, 21);
|
||||
if (cryptoMessageSign(msg, msg_size, privkey, address_raw, payload + 1 + l + msg_size + 21) != 0) {
|
||||
if (cryptoMessageSign(msg, msg_size, privkey, payload + 1 + l + msg_size + 21) != 0) {
|
||||
return 1;
|
||||
}
|
||||
*payload_len = 1 + l + msg_size + 21 + 65;
|
||||
|
@ -28,7 +28,7 @@
|
||||
|
||||
uint32_t ser_length(uint32_t len, uint8_t *out);
|
||||
|
||||
int cryptoMessageSign(const uint8_t *message, pb_size_t message_len, const uint8_t *privkey, const uint8_t *address_raw, uint8_t *signature);
|
||||
int cryptoMessageSign(const uint8_t *message, pb_size_t message_len, const uint8_t *privkey, uint8_t *signature);
|
||||
|
||||
int cryptoMessageVerify(const uint8_t *message, pb_size_t message_len, const uint8_t *address_raw, const uint8_t *signature);
|
||||
|
||||
|
@ -537,12 +537,12 @@ void fsm_msgSignMessage(SignMessage *msg)
|
||||
}
|
||||
|
||||
fsm_deriveKey(node, msg->address_n, msg->address_n_count);
|
||||
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);
|
||||
layoutProgressSwipe("Signing", 0, 0);
|
||||
if (cryptoMessageSign(msg->message.bytes, msg->message.size, node->private_key, addr_raw, resp->signature.bytes) == 0) {
|
||||
if (cryptoMessageSign(msg->message.bytes, msg->message.size, node->private_key, resp->signature.bytes) == 0) {
|
||||
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);
|
||||
resp->has_signature = true;
|
||||
resp->signature.size = 65;
|
||||
msg_write(MessageType_MessageType_MessageSignature, resp);
|
||||
|
@ -369,7 +369,7 @@ void signing_txack(TransactionType *tx)
|
||||
resp.serialized.signature_index = idx1i;
|
||||
resp.serialized.has_signature = true;
|
||||
resp.serialized.has_serialized_tx = true;
|
||||
ecdsa_sign_digest(privkey, hash, sig);
|
||||
ecdsa_sign_digest(privkey, hash, sig, 0);
|
||||
resp.serialized.signature.size = ecdsa_sig_to_der(sig, resp.serialized.signature.bytes);
|
||||
if (input.script_type == InputScriptType_SPENDMULTISIG) {
|
||||
if (!input.has_multisig) {
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit 9469a64a0a1ec032b829e7a1465d0e4b2996cd61
|
||||
Subproject commit b4cdba8489201e623b948469609a48495f2eeed2
|
Loading…
Reference in New Issue
Block a user