legacy: support Signify Ed25519 signatures + add device test

pull/421/head
Pavol Rusnak 5 years ago
parent 588998cb85
commit c6b9fa4873
No known key found for this signature in database
GPG Key ID: 91F3B339B9A02A3D

@ -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]) {

@ -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);

@ -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);

@ -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"
)

Loading…
Cancel
Save