diff --git a/legacy/firmware/crypto.c b/legacy/firmware/crypto.c index 58c9218da..9c555d7a6 100644 --- a/legacy/firmware/crypto.c +++ b/legacy/firmware/crypto.c @@ -110,6 +110,17 @@ int gpgMessageSign(HDNode *node, const uint8_t *message, size_t message_len, } } +int signifyMessageSign(HDNode *node, const uint8_t *message, size_t message_len, + uint8_t *signature) { + signature[0] = 0; // prefix: pad with zero, so all signatures are 65 bytes + const curve_info *ed25519_curve_info = get_curve_by_name(ED25519_NAME); + // only ed25519 is supported + if (!ed25519_curve_info || node->curve != ed25519_curve_info) { + return 1; + } + return hdnode_sign(node, message, message_len, 0, signature + 1, NULL, NULL); +} + static void cryptoMessageHash(const CoinInfo *coin, const uint8_t *message, size_t message_len, uint8_t hash[HASHER_DIGEST_LENGTH]) { diff --git a/legacy/firmware/crypto.h b/legacy/firmware/crypto.h index fb6352ab1..ff5648bee 100644 --- a/legacy/firmware/crypto.h +++ b/legacy/firmware/crypto.h @@ -44,6 +44,9 @@ int sshMessageSign(HDNode *node, const uint8_t *message, size_t message_len, int gpgMessageSign(HDNode *node, const uint8_t *message, size_t message_len, uint8_t *signature); +int signifyMessageSign(HDNode *node, const uint8_t *message, size_t message_len, + uint8_t *signature); + int cryptoMessageSign(const CoinInfo *coin, HDNode *node, InputScriptType script_type, const uint8_t *message, size_t message_len, uint8_t *signature); diff --git a/legacy/firmware/fsm_msg_crypto.h b/legacy/firmware/fsm_msg_crypto.h index 7864d6bfd..4ce787e36 100644 --- a/legacy/firmware/fsm_msg_crypto.h +++ b/legacy/firmware/fsm_msg_crypto.h @@ -118,6 +118,8 @@ void fsm_msgSignIdentity(const SignIdentity *msg) { msg->identity.has_proto && (strcmp(msg->identity.proto, "ssh") == 0); bool sign_gpg = msg->identity.has_proto && (strcmp(msg->identity.proto, "gpg") == 0); + bool sign_signify = + msg->identity.has_proto && (strcmp(msg->identity.proto, "signify") == 0); int result = 0; layoutProgressSwipe(_("Signing"), 0); @@ -127,6 +129,10 @@ void fsm_msgSignIdentity(const SignIdentity *msg) { } else if (sign_gpg) { // GPG should sign a message digest result = gpgMessageSign(node, msg->challenge_hidden.bytes, msg->challenge_hidden.size, resp->signature.bytes); + } else if (sign_signify) { // Signify should sign a message digest + result = + signifyMessageSign(node, msg->challenge_hidden.bytes, + msg->challenge_hidden.size, resp->signature.bytes); } else { uint8_t digest[64]; sha256_Raw(msg->challenge_hidden.bytes, msg->challenge_hidden.size, digest); diff --git a/tests/device_tests/test_msg_signidentity.py b/tests/device_tests/test_msg_signidentity.py index f91294ee3..e9d95c679 100644 --- a/tests/device_tests/test_msg_signidentity.py +++ b/tests/device_tests/test_msg_signidentity.py @@ -135,3 +135,37 @@ class TestMsgSignidentity(TrezorTest): sig.signature.hex() == "00f05e5085e666429de397c70a081932654369619c0bd2a6579ea6c1ef2af112ef79998d6c862a16b932d44b1ac1b83c8cbcd0fbda228274fde9e0d0ca6e9cb709" ) + + # URI : gpg://satoshi@bitcoin.org + identity = proto.IdentityType( + proto="gpg", user="satoshi", host="bitcoin.org", port="", path="" + ) + sig = misc.sign_identity( + self.client, identity, hidden, visual, ecdsa_curve_name="ed25519" + ) + assert sig.address is None + assert ( + sig.public_key.hex() + == "00d18cdf4dbdbb50ef1fdba1ae0539451f3354a366d6a35313712ab82f16d4cd9e" + ) + assert ( + sig.signature.hex() + == "00f47f1a09a2875b971811ebbece19c3004c3ecbe84e65666dc8c36cc2fc002544af8a3f545375ebe53d73b41c700df2f9020256c31bb774a7eb03ed9819226407" + ) + + # URI : signify://satoshi@bitcoin.org + identity = proto.IdentityType( + proto="signify", user="satoshi", host="bitcoin.org", port="", path="" + ) + sig = misc.sign_identity( + self.client, identity, hidden, visual, ecdsa_curve_name="ed25519" + ) + assert sig.address is None + assert ( + sig.public_key.hex() + == "0038c0f42c0e47b233e837763098f029fd01009b74fdf4b0d60db114fb0f4f8b17" + ) + assert ( + sig.signature.hex() + == "009bb30a7a894e6cdd86e2b75803745e93bd5294b979f9e00ce9dc870642c7f6ad7322af4c54d401ea793494e8a5fdf2bf8b88c6e875094512bd67b94f9188000d" + )