From 81f462a5c591e209d3165df3b26d2ff42906c874 Mon Sep 17 00:00:00 2001 From: Pavol Rusnak Date: Sun, 2 Feb 2014 22:01:43 +0100 Subject: [PATCH] add ecdsa_sig_to_der --- ecdsa.c | 28 ++++++++++++++++++++++++++++ ecdsa.h | 1 + tests.c | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 71 insertions(+) diff --git a/ecdsa.c b/ecdsa.c index 3fbfe27ab..9a489a1f7 100644 --- a/ecdsa.c +++ b/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; +} diff --git a/ecdsa.h b/ecdsa.h index 4c0bdd9ce..8b73db703 100644 --- a/ecdsa.h +++ b/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 diff --git a/tests.c b/tests.c index a188171e4..2140978b7 100644 --- a/tests.c +++ b/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);