mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-12 18:49:07 +00:00
add ecdsa_sig_to_der
This commit is contained in:
parent
73489fbd33
commit
81f462a5c5
28
ecdsa.c
28
ecdsa.c
@ -490,3 +490,31 @@ int ecdsa_verify(const uint8_t *pub_key, const uint8_t *sig, const uint8_t *msg,
|
||||
// all OK
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ecdsa_sig_to_der(const uint8_t *sig, uint8_t *der)
|
||||
{
|
||||
int p1, p2;
|
||||
p1 = sig[0] >= 0x80;
|
||||
p2 = sig[32] >= 0x80;
|
||||
der[0] = 0x30; // sequence
|
||||
der[1] = (1 + 1 + p1 + 32) + (1 + 1 + p2 + 32); // total len
|
||||
der[2] = 0x02; // int
|
||||
if (p1) {
|
||||
der[3] = 33;
|
||||
der[4] = 0x00;
|
||||
memcpy(der + 5, sig, 32);
|
||||
} else {
|
||||
der[3] = 32;
|
||||
memcpy(der + 4, sig, 32);
|
||||
}
|
||||
der[36 + p1] = 0x02; // int
|
||||
if (p2) {
|
||||
der[37 + p1] = 33;
|
||||
der[38 + p1] = 0x00;
|
||||
memcpy(der + 39 + p1, sig + 32, 32);
|
||||
} else {
|
||||
der[37 + p1] = 32;
|
||||
memcpy(der + 38 + p1, sig + 32, 32);
|
||||
}
|
||||
return der[1] + 2;
|
||||
}
|
||||
|
1
ecdsa.h
1
ecdsa.h
@ -45,5 +45,6 @@ void ecdsa_get_address(const uint8_t *pub_key, uint8_t version, char *addr);
|
||||
int ecdsa_address_decode(const char *addr, uint8_t *out);
|
||||
int ecdsa_read_pubkey(const uint8_t *pub_key, curve_point *pub);
|
||||
int ecdsa_verify(const uint8_t *pub_key, const uint8_t *sig, const uint8_t *msg, uint32_t msg_len);
|
||||
int ecdsa_sig_to_der(const uint8_t *sig, uint8_t *der);
|
||||
|
||||
#endif
|
||||
|
42
tests.c
42
tests.c
@ -539,6 +539,44 @@ START_TEST(test_address_decode)
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_ecdsa_der)
|
||||
{
|
||||
uint8_t sig[64], der[70];
|
||||
int res;
|
||||
|
||||
memcpy(sig, fromhex("9a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b70771"), 32);
|
||||
memcpy(sig + 32, fromhex("2b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781"), 32);
|
||||
res = ecdsa_sig_to_der(sig, der);
|
||||
ck_assert_int_eq(res, 71);
|
||||
ck_assert_mem_eq(der, fromhex("30450221009a0b7be0d4ed3146ee262b42202841834698bb3ee39c24e7437df208b8b7077102202b79ab1e7736219387dffe8d615bbdba87e11477104b867ef47afed1a5ede781"), 71);
|
||||
|
||||
memcpy(sig, fromhex("6666666666666666666666666666666666666666666666666666666666666666"), 32);
|
||||
memcpy(sig + 32, fromhex("7777777777777777777777777777777777777777777777777777777777777777"), 32);
|
||||
res = ecdsa_sig_to_der(sig, der);
|
||||
ck_assert_int_eq(res, 70);
|
||||
ck_assert_mem_eq(der, fromhex("30440220666666666666666666666666666666666666666666666666666666666666666602207777777777777777777777777777777777777777777777777777777777777777"), 70);
|
||||
|
||||
memcpy(sig, fromhex("6666666666666666666666666666666666666666666666666666666666666666"), 32);
|
||||
memcpy(sig + 32, fromhex("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), 32);
|
||||
res = ecdsa_sig_to_der(sig, der);
|
||||
ck_assert_int_eq(res, 71);
|
||||
ck_assert_mem_eq(der, fromhex("304502206666666666666666666666666666666666666666666666666666666666666666022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), 71);
|
||||
|
||||
memcpy(sig, fromhex("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), 32);
|
||||
memcpy(sig + 32, fromhex("7777777777777777777777777777777777777777777777777777777777777777"), 32);
|
||||
res = ecdsa_sig_to_der(sig, der);
|
||||
ck_assert_int_eq(res, 71);
|
||||
ck_assert_mem_eq(der, fromhex("3045022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee02207777777777777777777777777777777777777777777777777777777777777777"), 71);
|
||||
|
||||
memcpy(sig, fromhex("eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee"), 32);
|
||||
memcpy(sig + 32, fromhex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), 32);
|
||||
res = ecdsa_sig_to_der(sig, der);
|
||||
ck_assert_int_eq(res, 72);
|
||||
ck_assert_mem_eq(der, fromhex("3046022100eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee022100ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), 72);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
|
||||
// define test suite and cases
|
||||
Suite *test_suite(void)
|
||||
{
|
||||
@ -567,6 +605,10 @@ Suite *test_suite(void)
|
||||
tcase_add_test(tc, test_address_decode);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("ecdsa_der");
|
||||
tcase_add_test(tc, test_ecdsa_der);
|
||||
suite_add_tcase(s, tc);
|
||||
|
||||
tc = tcase_create("rijndael");
|
||||
tcase_add_test(tc, test_rijndael);
|
||||
suite_add_tcase(s, tc);
|
||||
|
Loading…
Reference in New Issue
Block a user