parent
8434b2468c
commit
0c622d62e1
@ -0,0 +1,2 @@
|
||||
---
|
||||
BasedOnStyle: Google
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,215 +1,379 @@
|
||||
// https://github.com/input-output-hk/cardano-crypto/blob/master/tests/goldens/cardano/crypto/wallet/BIP39-128
|
||||
START_TEST(test_ed25519_cardano_sign_vectors)
|
||||
{
|
||||
ed25519_public_key public_key;
|
||||
ed25519_secret_key secret_key;
|
||||
ed25519_secret_key secret_key_extension;
|
||||
ed25519_signature signature;
|
||||
|
||||
static const char *vectors[] = {
|
||||
"6065a956b1b34145c4416fdc3ba3276801850e91a77a31a7be782463288aea53", // private key
|
||||
"60ba6e25b1a02157fb69c5d1d7b96c4619736e545447069a6a6f0ba90844bc8e", // private key extension
|
||||
"64b20fa082b3143d6b5eed42c6ef63f99599d0888afe060620abc1b319935fe1", // public key
|
||||
"45b1a75fe3119e13c6f60ab9ba674b42f946fdc558e07c83dfa0751c2eba69c79331bd8a4a975662b23628a438a0eba76367e44c12ca91b39ec59063f860f10d", // signature
|
||||
|
||||
"e7d27516538403a53a8b041656a3f570909df641a0ab811fe7d87c9ba02a830c", // private key
|
||||
"794a2c54ad8b525b781773c87d38cbf4197636bc427a9d551368286fe4c294a4", // private key extension
|
||||
"95bb82ffd5707716bc65170ab4e8dafeed90fbe0ce9258713b7751e962d931df", // public key
|
||||
"f2c9171782e7df7665126ac545ae53b05964b0160536efdb545e2460dbbec2b19ec6b338b8f1bf4dfee94360ed024b115e37b1d7e6f3f9ae4beb79539428560f", // signature
|
||||
|
||||
"9b5a3d9a4c60bcd49bb64b72c082b164314d0f61d842f2575fd1d4fb30a28a0c", // private key
|
||||
"b093e376f41eb7bf80abcd0073a52455d25b5d21815bc758e5f6f81536aedebb", // private key extension
|
||||
"79fc8154554b97e4c56ef2f9dbb4c1421ff19509688931a1e964bda5dec0f19f", // public key
|
||||
"2ba1439ae648a7e8da7c9ab1ee6da94fd4ebe37abd0978306e8fba2afa8f111a88a993dbf008bedae9167f4f68409e4c9ddaf02cba12418447b1848907ad800f", // signature
|
||||
|
||||
"52e0c98aa600cfdcd1ff28fcda5227ed87063f4a98547a78b771052cf102b40c", // private key
|
||||
"6c18d9f8075b1a6a1833540607479bd58b7beb8a83d2bb01ca7ae02452a25803", // private key extension
|
||||
"dc907c7c06e6314eedd9e18c9f6c6f9cc4e205fb1c70da608234c319f1f7b0d6", // public key
|
||||
"0cd34f84e0d2fcb1800bdb0e869b9041349955ced66aedbe6bda187ebe8d36a62a05b39647e92fcc42aa7a7368174240afba08b8c81f981a22f942d6bd781602", // signature
|
||||
|
||||
"11fd6462a3a92b35c22703f6f1c124ddcf36b7c2b09cc2784f320e1cfa12ec04", // private key
|
||||
"c2785803c61c46aeca192a1bb1b7b20a8c4cc7fa01db57fc5d1d8a5473402352", // private key extension
|
||||
"839775a41876e328986aa26168958bba1176e67819b357eea84afceab8b1db78", // public key
|
||||
"e41f73db2f8d2896a687802b2be76b7cabb73dfbb4891494883a0cbd9bbb9e5f9d3e14d2d0b06c6674333508496db660936737c0efd9511514147dac79fa4905", // signature
|
||||
|
||||
"5b1e5cad02274ba461f4708d8598d3497faf8fe3e894a379573aa6ac3a03e505", // private key
|
||||
"ba179d2e3c67aabb486c48d16002b51ad32eab434c738a1550962313b07098cd", // private key extension
|
||||
"75eb8d197ec8627c85af88e66aa1e49065dd8ac98ed8991db52ece01635dfb76", // public key
|
||||
"631015357cee3051116b4c2ff4d1c5beb13b6e5023635aa1eeb0563cadf0d4fbc10bd5e31b4a4220c67875558c41b5cc0328104ae39cc7ff20ff0c2bda598906", // signature
|
||||
|
||||
"624b47150f58dfa44284fbc63c9f99b9b79f808c4955a461f0e2be44eb0be50d", // private key
|
||||
"097aa006d694b165ef37cf23562e5967c96e49255d2f20faae478dee83aa5b02", // private key extension
|
||||
"0588589cd9b51dfc028cf225674069cbe52e0e70deb02dc45b79b26ee3548b00", // public key
|
||||
"1de1d275428ba9491a433cd473cd076c027f61e7a8b5391df9dea5cb4bc88d8a57b095906a30b13e68259851a8dd3f57b6f0ffa37a5d3ffc171240f2d404f901", // signature
|
||||
|
||||
0, 0,
|
||||
};
|
||||
|
||||
const char **test_data;
|
||||
test_data = vectors;
|
||||
while (*test_data) {
|
||||
memcpy(secret_key, fromhex(*test_data), 32);
|
||||
MARK_SECRET_DATA(secret_key, sizeof(secret_key));
|
||||
|
||||
memcpy(secret_key_extension, fromhex(*(test_data + 1)), 32);
|
||||
MARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
|
||||
|
||||
ed25519_publickey_ext(secret_key, secret_key_extension, public_key);
|
||||
UNMARK_SECRET_DATA(public_key, sizeof(public_key));
|
||||
|
||||
ck_assert_mem_eq(public_key, fromhex(*(test_data + 2)), 32);
|
||||
|
||||
const uint8_t * message = (const uint8_t *) "Hello World";
|
||||
ed25519_sign_ext(message, 11, secret_key, secret_key_extension, public_key, signature);
|
||||
UNMARK_SECRET_DATA(signature, sizeof(signature));
|
||||
|
||||
ck_assert_mem_eq(signature, fromhex(*(test_data + 3)), 64);
|
||||
|
||||
UNMARK_SECRET_DATA(secret_key, sizeof(secret_key));
|
||||
UNMARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
|
||||
|
||||
test_data += 4;
|
||||
}
|
||||
START_TEST(test_ed25519_cardano_sign_vectors) {
|
||||
ed25519_public_key public_key;
|
||||
ed25519_secret_key secret_key;
|
||||
ed25519_secret_key secret_key_extension;
|
||||
ed25519_signature signature;
|
||||
|
||||
static const char
|
||||
*vectors[] =
|
||||
{
|
||||
"6065a956b1b34145c4416fdc3ba3276801850e91a77a31a7be782463288aea5"
|
||||
"3", // private key
|
||||
"60ba6e25b1a02157fb69c5d1d7b96c4619736e545447069a6a6f0ba90844bc8"
|
||||
"e", // private key extension
|
||||
"64b20fa082b3143d6b5eed42c6ef63f99599d0888afe060620abc1b319935fe"
|
||||
"1", // public key
|
||||
"45b1a75fe3119e13c6f60ab9ba674b42f946fdc558e07c83dfa0751c2eba69c7"
|
||||
"9331bd8a4a975662b23628a438a0eba76367e44c12ca91b39ec59063f860f10"
|
||||
"d", // signature
|
||||
|
||||
"e7d27516538403a53a8b041656a3f570909df641a0ab811fe7d87c9ba02a830"
|
||||
"c", // private key
|
||||
"794a2c54ad8b525b781773c87d38cbf4197636bc427a9d551368286fe4c294a"
|
||||
"4", // private key extension
|
||||
"95bb82ffd5707716bc65170ab4e8dafeed90fbe0ce9258713b7751e962d931d"
|
||||
"f", // public key
|
||||
"f2c9171782e7df7665126ac545ae53b05964b0160536efdb545e2460dbbec2b1"
|
||||
"9ec6b338b8f1bf4dfee94360ed024b115e37b1d7e6f3f9ae4beb79539428560"
|
||||
"f", // signature
|
||||
|
||||
"9b5a3d9a4c60bcd49bb64b72c082b164314d0f61d842f2575fd1d4fb30a28a0"
|
||||
"c", // private key
|
||||
"b093e376f41eb7bf80abcd0073a52455d25b5d21815bc758e5f6f81536aedeb"
|
||||
"b", // private key extension
|
||||
"79fc8154554b97e4c56ef2f9dbb4c1421ff19509688931a1e964bda5dec0f19"
|
||||
"f", // public key
|
||||
"2ba1439ae648a7e8da7c9ab1ee6da94fd4ebe37abd0978306e8fba2afa8f111a"
|
||||
"88a993dbf008bedae9167f4f68409e4c9ddaf02cba12418447b1848907ad800"
|
||||
"f", // signature
|
||||
|
||||
"52e0c98aa600cfdcd1ff28fcda5227ed87063f4a98547a78b771052cf102b40"
|
||||
"c", // private key
|
||||
"6c18d9f8075b1a6a1833540607479bd58b7beb8a83d2bb01ca7ae02452a2580"
|
||||
"3", // private key extension
|
||||
"dc907c7c06e6314eedd9e18c9f6c6f9cc4e205fb1c70da608234c319f1f7b0d"
|
||||
"6", // public key
|
||||
"0cd34f84e0d2fcb1800bdb0e869b9041349955ced66aedbe6bda187ebe8d36a6"
|
||||
"2a05b39647e92fcc42aa7a7368174240afba08b8c81f981a22f942d6bd78160"
|
||||
"2", // signature
|
||||
|
||||
"11fd6462a3a92b35c22703f6f1c124ddcf36b7c2b09cc2784f320e1cfa12ec0"
|
||||
"4", // private key
|
||||
"c2785803c61c46aeca192a1bb1b7b20a8c4cc7fa01db57fc5d1d8a547340235"
|
||||
"2", // private key extension
|
||||
"839775a41876e328986aa26168958bba1176e67819b357eea84afceab8b1db7"
|
||||
"8", // public key
|
||||
"e41f73db2f8d2896a687802b2be76b7cabb73dfbb4891494883a0cbd9bbb9e5f"
|
||||
"9d3e14d2d0b06c6674333508496db660936737c0efd9511514147dac79fa490"
|
||||
"5", // signature
|
||||
|
||||
"5b1e5cad02274ba461f4708d8598d3497faf8fe3e894a379573aa6ac3a03e50"
|
||||
"5", // private key
|
||||
"ba179d2e3c67aabb486c48d16002b51ad32eab434c738a1550962313b07098c"
|
||||
"d", // private key extension
|
||||
"75eb8d197ec8627c85af88e66aa1e49065dd8ac98ed8991db52ece01635dfb7"
|
||||
"6", // public key
|
||||
"631015357cee3051116b4c2ff4d1c5beb13b6e5023635aa1eeb0563cadf0d4fb"
|
||||
"c10bd5e31b4a4220c67875558c41b5cc0328104ae39cc7ff20ff0c2bda59890"
|
||||
"6", // signature
|
||||
|
||||
"624b47150f58dfa44284fbc63c9f99b9b79f808c4955a461f0e2be44eb0be50"
|
||||
"d", // private key
|
||||
"097aa006d694b165ef37cf23562e5967c96e49255d2f20faae478dee83aa5b0"
|
||||
"2", // private key extension
|
||||
"0588589cd9b51dfc028cf225674069cbe52e0e70deb02dc45b79b26ee3548b0"
|
||||
"0", // public key
|
||||
"1de1d275428ba9491a433cd473cd076c027f61e7a8b5391df9dea5cb4bc88d8a"
|
||||
"57b095906a30b13e68259851a8dd3f57b6f0ffa37a5d3ffc171240f2d404f90"
|
||||
"1", // signature
|
||||
|
||||
0,
|
||||
0,
|
||||
};
|
||||
|
||||
const char **test_data;
|
||||
test_data = vectors;
|
||||
while (*test_data) {
|
||||
memcpy(secret_key, fromhex(*test_data), 32);
|
||||
MARK_SECRET_DATA(secret_key, sizeof(secret_key));
|
||||
|
||||
memcpy(secret_key_extension, fromhex(*(test_data + 1)), 32);
|
||||
MARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
|
||||
|
||||
ed25519_publickey_ext(secret_key, secret_key_extension, public_key);
|
||||
UNMARK_SECRET_DATA(public_key, sizeof(public_key));
|
||||
|
||||
ck_assert_mem_eq(public_key, fromhex(*(test_data + 2)), 32);
|
||||
|
||||
const uint8_t *message = (const uint8_t *)"Hello World";
|
||||
ed25519_sign_ext(message, 11, secret_key, secret_key_extension, public_key,
|
||||
signature);
|
||||
UNMARK_SECRET_DATA(signature, sizeof(signature));
|
||||
|
||||
ck_assert_mem_eq(signature, fromhex(*(test_data + 3)), 64);
|
||||
|
||||
UNMARK_SECRET_DATA(secret_key, sizeof(secret_key));
|
||||
UNMARK_SECRET_DATA(secret_key_extension, sizeof(secret_key_extension));
|
||||
|
||||
test_data += 4;
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_1)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("affbc325d9027c0f2d9f925b1dcf6c12bf5c1dd08904474066a4f2c00db56173"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("08a14df748e477a69d21c97c56db151fc19e2521f31dd0ac5360f269e5b6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("daeb991f2d2128e2525415c56a07f4366baa26c1e48572a5e073934b6de35fbc"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("9a1d04808b4c0682816961cf666e82a7fd35949658aba5354c517eccf12aacb4"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_1) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"affbc325d9027c0f2d9f925b1dcf6c12bf5c1dd08904474066a4f2c00db56173"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"08a14df748e477a69d21c97c56db151fc19e2521f31dd0ac5360f269e5b6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"daeb991f2d2128e2525415c56a07f4366baa26c1e48572a5e073934b6de35fbc"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"9a1d04808b4c0682816961cf666e82a7fd35949658aba5354c517eccf12aacb4"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_2)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("104c6a0736e501c9bfe2966ba3773f5320495b19c3f2ed222234850af2ccd5b1"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("6064bf06b2e981d7c9792b1482eeecd40ec3cfa12143f4a1f149d48ce8b6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("64aa9a16331f14c981b769efcf96addcc4c6db44047fe7a7feae0be23d33bf54"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("c651c14a13c2311fc30a7acf244add1fdac3683e7ba89b4571e4cbcab509b915"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_2) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"104c6a0736e501c9bfe2966ba3773f5320495b19c3f2ed222234850af2ccd5b1"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"6064bf06b2e981d7c9792b1482eeecd40ec3cfa12143f4a1f149d48ce8b6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"64aa9a16331f14c981b769efcf96addcc4c6db44047fe7a7feae0be23d33bf54"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"c651c14a13c2311fc30a7acf244add1fdac3683e7ba89b4571e4cbcab509b915"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_3)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("da99870d7e69de2a76f255ba8c7ed22428c7e5b0a8df978753c707c95ec3d4ca"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("c85fa69f4a1891fd98d1d1fc5f0cf9b1d6e44b0e6906744ab23ea766edb6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("b4fc241feffe840b8a54a26ab447f5a5caa31032db3a8091fca14f38b86ed539"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("5a5b0c92530cd366f05cf072509c806f904262c259e79a0080bbd5ee35706bb1"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_3) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"da99870d7e69de2a76f255ba8c7ed22428c7e5b0a8df978753c707c95ec3d4ca"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"c85fa69f4a1891fd98d1d1fc5f0cf9b1d6e44b0e6906744ab23ea766edb6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"b4fc241feffe840b8a54a26ab447f5a5caa31032db3a8091fca14f38b86ed539"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"5a5b0c92530cd366f05cf072509c806f904262c259e79a0080bbd5ee35706bb1"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_4)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("b40c44dfd9be08591b62be7f9991c85f812d8196927f3c824d9fcb17d275089e"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("d064dcf1449d9c3e47f5b422680343561989035bf2e4e23fc34cb61fedb6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("a3071959013af95aaecf78a7a2e1b9838bbbc4864d6a8a2295243782078345cd"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("aaaca5e7adc69a03ef1f5c017ed02879e8ca871df028461ed9bf19fb8fa15038"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_4) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"b40c44dfd9be08591b62be7f9991c85f812d8196927f3c824d9fcb17d275089e"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"d064dcf1449d9c3e47f5b422680343561989035bf2e4e23fc34cb61fedb6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"a3071959013af95aaecf78a7a2e1b9838bbbc4864d6a8a2295243782078345cd"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"aaaca5e7adc69a03ef1f5c017ed02879e8ca871df028461ed9bf19fb8fa15038"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_5)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("2593896baf92f6ab2c0f253787ab16be0244ba95e0d48ba09da1a7fd3f926c72"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("0811b6d5d6f7120cb05d4ce5453d6ce42825c2a8e53b6d370a6b05ccf4b6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("5bebf1eea68acd04932653d944b064b10baaf5886dd73c185cc285059bf93363"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("1c87a32c5babad2fe33e0586bdc523574c6126f8368bc76598e17ea46201f980"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_5) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"2593896baf92f6ab2c0f253787ab16be0244ba95e0d48ba09da1a7fd3f926c72"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"0811b6d5d6f7120cb05d4ce5453d6ce42825c2a8e53b6d370a6b05ccf4b6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"5bebf1eea68acd04932653d944b064b10baaf5886dd73c185cc285059bf93363"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"1c87a32c5babad2fe33e0586bdc523574c6126f8368bc76598e17ea46201f980"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_6)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("fe8c6c2ab1e30385513fcffb49dcfe3e7805260425ea76b3b72b9f5bbe3b3d40"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("6019b9f5ef6ca530b657bcdb500de5455db8d51afb951fa045b6fbb3f6b6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("466332cb097934b43008701e7e27044aa56c7859019e4eba18d91a3bea23dff7"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("0b8f04755481ced76b4e5795aaafdb3cbd757c10fe60e9c58f48cf29a7ec3575"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_6) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"fe8c6c2ab1e30385513fcffb49dcfe3e7805260425ea76b3b72b9f5bbe3b3d40"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"6019b9f5ef6ca530b657bcdb500de5455db8d51afb951fa045b6fbb3f6b6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"466332cb097934b43008701e7e27044aa56c7859019e4eba18d91a3bea23dff7"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"0b8f04755481ced76b4e5795aaafdb3cbd757c10fe60e9c58f48cf29a7ec3575"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_7)
|
||||
{
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy("ring crime symptom enough erupt lady behave ramp apart settle citizen junk", seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0xBB9ACA00);
|
||||
|
||||
ck_assert_mem_eq(node.chain_code, fromhex("ff77c08d37471c1d4cedd3fae2642c009324d9712492efc74dedab09c9bf973c"), 32);
|
||||
ck_assert_mem_eq(node.private_key, fromhex("488f34840bba516f7920f91676b8681d0dd833b4ce14468e0810b255f9b6ea46"), 32);
|
||||
ck_assert_mem_eq(node.private_key_extension, fromhex("01eccef768a79859f824a1d3c3e35e131184e2940c3fca9a4c9b307741f65363"), 32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(node.public_key + 1, fromhex("148605be54585773b44ba87e79265149ae444c4cc37cb1f8db8c08482fba293b"), 32);
|
||||
START_TEST(test_bip32_cardano_hdnode_vector_7) {
|
||||
HDNode node;
|
||||
|
||||
uint8_t seed[66];
|
||||
int seed_len = mnemonic_to_entropy(
|
||||
"ring crime symptom enough erupt lady behave ramp apart settle citizen "
|
||||
"junk",
|
||||
seed);
|
||||
ck_assert_int_eq(seed_len, 132);
|
||||
hdnode_from_seed_cardano((const uint8_t *)"", 0, seed, seed_len / 8, &node);
|
||||
|
||||
hdnode_private_ckd_cardano(&node, 0x80000000);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000001);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0x80000002);
|
||||
hdnode_private_ckd_cardano(&node, 0xBB9ACA00);
|
||||
|
||||
ck_assert_mem_eq(
|
||||
node.chain_code,
|
||||
fromhex(
|
||||
"ff77c08d37471c1d4cedd3fae2642c009324d9712492efc74dedab09c9bf973c"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key,
|
||||
fromhex(
|
||||
"488f34840bba516f7920f91676b8681d0dd833b4ce14468e0810b255f9b6ea46"),
|
||||
32);
|
||||
ck_assert_mem_eq(
|
||||
node.private_key_extension,
|
||||
fromhex(
|
||||
"01eccef768a79859f824a1d3c3e35e131184e2940c3fca9a4c9b307741f65363"),
|
||||
32);
|
||||
hdnode_fill_public_key(&node);
|
||||
ck_assert_mem_eq(
|
||||
node.public_key + 1,
|
||||
fromhex(
|
||||
"148605be54585773b44ba87e79265149ae444c4cc37cb1f8db8c08482fba293b"),
|
||||
32);
|
||||
}
|
||||
END_TEST
|
||||
|
@ -1,76 +1,67 @@
|
||||
#include "cash_addr.h"
|
||||
|
||||
static const char* valid_cashchecksum[] = {
|
||||
"prefix:x64nx6hz",
|
||||
"p:gpf8m4h7",
|
||||
"bitcoincash:qpzry9x8gf2tvdw0s3jn54khce6mua7lcw20ayyn",
|
||||
"bchtest:testnetaddress4d6njnut",
|
||||
"bchreg:555555555555555555555555555555555555555555555udxmlmrz",
|
||||
"prefix:x64nx6hz",
|
||||
"p:gpf8m4h7",
|
||||
"bitcoincash:qpzry9x8gf2tvdw0s3jn54khce6mua7lcw20ayyn",
|
||||
"bchtest:testnetaddress4d6njnut",
|
||||
"bchreg:555555555555555555555555555555555555555555555udxmlmrz",
|
||||
};
|
||||
|
||||
struct valid_cashaddr_data {
|
||||
const char* legacy;
|
||||
const char* cashaddress;
|
||||
const char* legacy;
|
||||
const char* cashaddress;
|
||||
};
|
||||
|
||||
static struct valid_cashaddr_data valid_cashaddr[] = {
|
||||
{
|
||||
"1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu",
|
||||
"bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"
|
||||
},
|
||||
{
|
||||
"1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR",
|
||||
"bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy"
|
||||
},
|
||||
{
|
||||
"16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb",
|
||||
"bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r"
|
||||
},
|
||||
{
|
||||
"3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC",
|
||||
"bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq"
|
||||
},
|
||||
{
|
||||
"3LDsS579y7sruadqu11beEJoTjdFiFCdX4",
|
||||
"bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e"
|
||||
},
|
||||
{
|
||||
"31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw",
|
||||
"bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37"
|
||||
}
|
||||
};
|
||||
{"1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu",
|
||||
"bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a"},
|
||||
{"1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR",
|
||||
"bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy"},
|
||||
{"16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb",
|
||||
"bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r"},
|
||||
{"3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC",
|
||||
"bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq"},
|
||||
{"3LDsS579y7sruadqu11beEJoTjdFiFCdX4",
|
||||
"bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e"},
|
||||
{"31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw",
|
||||
"bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37"}};
|
||||
|
||||
START_TEST(test_cashaddr)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < sizeof(valid_cashchecksum) / sizeof(valid_cashchecksum[0]); ++i) {
|
||||
uint8_t data[82];
|
||||
char rebuild[92];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = cash_decode(hrp, data, &data_len, valid_cashchecksum[i]);
|
||||
ck_assert_int_eq(res, 1);
|
||||
res = cash_encode(rebuild, hrp, data, data_len);
|
||||
ck_assert_int_eq(res, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashchecksum[i], 92), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(valid_cashaddr) / sizeof(valid_cashaddr[0]); ++i) {
|
||||
uint8_t prog[65];
|
||||
size_t prog_len;
|
||||
const char* hrp = "bitcoincash";
|
||||
uint8_t rawdata[65];
|
||||
size_t rawdata_len;
|
||||
char rebuild[93];
|
||||
int ret = cash_addr_decode(prog, &prog_len, hrp, valid_cashaddr[i].cashaddress);
|
||||
ck_assert_int_eq(ret, 1);
|
||||
ck_assert_int_eq(prog_len, 21);
|
||||
rawdata_len = base58_decode_check(valid_cashaddr[i].legacy, HASHER_SHA2D, rawdata, sizeof(rawdata));
|
||||
ck_assert_int_eq(rawdata_len, 21);
|
||||
ck_assert_int_eq(prog[0], rawdata[0] == 0 ? 0x00 : rawdata[0] == 5 ? 0x08 : -1);
|
||||
ck_assert_int_eq(memcmp(rawdata + 1, prog + 1, 20), 0);
|
||||
ret = cash_addr_encode(rebuild, hrp, prog, 21);
|
||||
ck_assert_int_eq(ret, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashaddr[i].cashaddress, 92), 0);
|
||||
}
|
||||
START_TEST(test_cashaddr) {
|
||||
size_t i;
|
||||
for (i = 0; i < sizeof(valid_cashchecksum) / sizeof(valid_cashchecksum[0]);
|
||||
++i) {
|
||||
uint8_t data[82];
|
||||
char rebuild[92];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = cash_decode(hrp, data, &data_len, valid_cashchecksum[i]);
|
||||
ck_assert_int_eq(res, 1);
|
||||
res = cash_encode(rebuild, hrp, data, data_len);
|
||||
ck_assert_int_eq(res, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashchecksum[i], 92), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(valid_cashaddr) / sizeof(valid_cashaddr[0]); ++i) {
|
||||
uint8_t prog[65];
|
||||
size_t prog_len;
|
||||
const char* hrp = "bitcoincash";
|
||||
uint8_t rawdata[65];
|
||||
size_t rawdata_len;
|
||||
char rebuild[93];
|
||||
int ret =
|
||||
cash_addr_decode(prog, &prog_len, hrp, valid_cashaddr[i].cashaddress);
|
||||
ck_assert_int_eq(ret, 1);
|
||||
ck_assert_int_eq(prog_len, 21);
|
||||
rawdata_len = base58_decode_check(valid_cashaddr[i].legacy, HASHER_SHA2D,
|
||||
rawdata, sizeof(rawdata));
|
||||
ck_assert_int_eq(rawdata_len, 21);
|
||||
ck_assert_int_eq(prog[0],
|
||||
rawdata[0] == 0 ? 0x00 : rawdata[0] == 5 ? 0x08 : -1);
|
||||
ck_assert_int_eq(memcmp(rawdata + 1, prog + 1, 20), 0);
|
||||
ret = cash_addr_encode(rebuild, hrp, prog, 21);
|
||||
ck_assert_int_eq(ret, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_cashaddr[i].cashaddress, 92),
|
||||
0);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,184 +1,160 @@
|
||||
#include "segwit_addr.h"
|
||||
|
||||
static const char* valid_checksum[] = {
|
||||
"A12UEL5L",
|
||||
"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1tt5tgs",
|
||||
"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw",
|
||||
"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqc8247j",
|
||||
"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w",
|
||||
"A12UEL5L",
|
||||
"an83characterlonghumanreadablepartthatcontainsthenumber1andtheexcludedchar"
|
||||
"actersbio1tt5tgs",
|
||||
"abcdef1qpzry9x8gf2tvdw0s3jn54khce6mua7lmqqqxw",
|
||||
"11qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq"
|
||||
"qqqqqqqqqqc8247j",
|
||||
"split1checkupstagehandshakeupstreamerranterredcaperred2y9e3w",
|
||||
};
|
||||
|
||||
static const char* invalid_checksum[] = {
|
||||
" 1nwldj5",
|
||||
"\x7f""1axkwrx",
|
||||
"an84characterslonghumanreadablepartthatcontainsthenumber1andtheexcludedcharactersbio1569pvx",
|
||||
"pzry9x0s0muk",
|
||||
"1pzry9x0s0muk",
|
||||
"x1b4n0q5v",
|
||||
"li1dgmt3",
|
||||
"de1lg7wt\xff",
|
||||
" 1nwldj5",
|
||||
"\x7f"
|
||||
"1axkwrx",
|
||||
"an84characterslonghumanreadablepartthatcontainsthenumber1andtheexcludedcha"
|
||||
"ractersbio1569pvx",
|
||||
"pzry9x0s0muk",
|
||||
"1pzry9x0s0muk",
|
||||
"x1b4n0q5v",
|
||||
"li1dgmt3",
|
||||
"de1lg7wt\xff",
|
||||
};
|
||||
|
||||
struct valid_address_data {
|
||||
const char* address;
|
||||
size_t scriptPubKeyLen;
|
||||
const uint8_t scriptPubKey[42];
|
||||
const char* address;
|
||||
size_t scriptPubKeyLen;
|
||||
const uint8_t scriptPubKey[42];
|
||||
};
|
||||
|
||||
struct invalid_address_data {
|
||||
const char* hrp;
|
||||
int version;
|
||||
size_t program_length;
|
||||
const char* hrp;
|
||||
int version;
|
||||
size_t program_length;
|
||||
};
|
||||
|
||||
static struct valid_address_data valid_address[] = {
|
||||
{
|
||||
"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
|
||||
22, {
|
||||
0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54,
|
||||
0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6
|
||||
}
|
||||
},
|
||||
{
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
|
||||
34, {
|
||||
0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04,
|
||||
0xbd, 0x19, 0x20, 0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78,
|
||||
0xcd, 0x4d, 0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32,
|
||||
0x62
|
||||
}
|
||||
},
|
||||
{
|
||||
"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grplx",
|
||||
42, {
|
||||
0x51, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54,
|
||||
0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,
|
||||
0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c,
|
||||
0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6
|
||||
}
|
||||
},
|
||||
{
|
||||
"BC1SW50QA3JX3S",
|
||||
4, {
|
||||
0x60, 0x02, 0x75, 0x1e
|
||||
}
|
||||
},
|
||||
{
|
||||
"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj",
|
||||
18, {
|
||||
0x52, 0x10, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54,
|
||||
0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23
|
||||
}
|
||||
},
|
||||
{
|
||||
"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
|
||||
34, {
|
||||
0x00, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21,
|
||||
0xb2, 0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5,
|
||||
0xe9, 0x1c, 0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64,
|
||||
0x33
|
||||
}
|
||||
}
|
||||
};
|
||||
{"BC1QW508D6QEJXTDG4Y5R3ZARVARY0C5XW7KV8F3T4",
|
||||
22,
|
||||
{0x00, 0x14, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54,
|
||||
0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}},
|
||||
{"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sl5k7",
|
||||
34,
|
||||
{0x00, 0x20, 0x18, 0x63, 0x14, 0x3c, 0x14, 0xc5, 0x16, 0x68, 0x04, 0xbd,
|
||||
0x19, 0x20, 0x33, 0x56, 0xda, 0x13, 0x6c, 0x98, 0x56, 0x78, 0xcd, 0x4d,
|
||||
0x27, 0xa1, 0xb8, 0xc6, 0x32, 0x96, 0x04, 0x90, 0x32, 0x62}},
|
||||
{"bc1pw508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7k7grpl"
|
||||
"x",
|
||||
42,
|
||||
{0x51, 0x28, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54,
|
||||
0x94, 0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6,
|
||||
0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94, 0x1c,
|
||||
0x45, 0xd1, 0xb3, 0xa3, 0x23, 0xf1, 0x43, 0x3b, 0xd6}},
|
||||
{"BC1SW50QA3JX3S", 4, {0x60, 0x02, 0x75, 0x1e}},
|
||||
{"bc1zw508d6qejxtdg4y5r3zarvaryvg6kdaj",
|
||||
18,
|
||||
{0x52, 0x10, 0x75, 0x1e, 0x76, 0xe8, 0x19, 0x91, 0x96, 0xd4, 0x54, 0x94,
|
||||
0x1c, 0x45, 0xd1, 0xb3, 0xa3, 0x23}},
|
||||
{"tb1qqqqqp399et2xygdj5xreqhjjvcmzhxw4aywxecjdzew6hylgvsesrxh6hy",
|
||||
34,
|
||||
{0x00, 0x20, 0x00, 0x00, 0x00, 0xc4, 0xa5, 0xca, 0xd4, 0x62, 0x21, 0xb2,
|
||||
0xa1, 0x87, 0x90, 0x5e, 0x52, 0x66, 0x36, 0x2b, 0x99, 0xd5, 0xe9, 0x1c,
|
||||
0x6c, 0xe2, 0x4d, 0x16, 0x5d, 0xab, 0x93, 0xe8, 0x64, 0x33}}};
|
||||
|
||||
static const char* invalid_address[] = {
|
||||
"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty",
|
||||
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5",
|
||||
"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2",
|
||||
"bc1rw5uspcuh",
|
||||
"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs90",
|
||||
"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7",
|
||||
"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du",
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv",
|
||||
"bc1gmk9yu",
|
||||
"tc1qw508d6qejxtdg4y5r3zarvary0c5xw7kg3g4ty",
|
||||
"bc1qw508d6qejxtdg4y5r3zarvary0c5xw7kv8f3t5",
|
||||
"BC13W508D6QEJXTDG4Y5R3ZARVARY0C5XW7KN40WF2",
|
||||
"bc1rw5uspcuh",
|
||||
"bc10w508d6qejxtdg4y5r3zarvary0c5xw7kw508d6qejxtdg4y5r3zarvary0c5xw7kw5rljs"
|
||||
"90",
|
||||
"BC1QR508D6QEJXTDG4Y5R3ZARVARYV98GJ9P",
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3q0sL5k7",
|
||||
"bc1zw508d6qejxtdg4y5r3zarvaryvqyzf3du",
|
||||
"tb1qrp33g0q5c5txsp9arysrx4k6zdkfs4nce4xj0gdcccefvpysxf3pjxtptv",
|
||||
"bc1gmk9yu",
|
||||
};
|
||||
|
||||
static struct invalid_address_data invalid_address_enc[] = {
|
||||
{"BC", 0, 20},
|
||||
{"bc", 0, 21},
|
||||
{"bc", 17, 32},
|
||||
{"bc", 1, 1},
|
||||
{"bc", 16, 41},
|
||||
{"BC", 0, 20}, {"bc", 0, 21}, {"bc", 17, 32}, {"bc", 1, 1}, {"bc", 16, 41},
|
||||
};
|
||||
|
||||
static void segwit_scriptpubkey(uint8_t* scriptpubkey, size_t* scriptpubkeylen, int witver, const uint8_t* witprog, size_t witprog_len) {
|
||||
scriptpubkey[0] = witver ? (0x50 + witver) : 0;
|
||||
scriptpubkey[1] = witprog_len;
|
||||
memcpy(scriptpubkey + 2, witprog, witprog_len);
|
||||
*scriptpubkeylen = witprog_len + 2;
|
||||
}
|
||||
|
||||
int my_strncasecmp(const char *s1, const char *s2, size_t n) {
|
||||
size_t i = 0;
|
||||
while (i < n) {
|
||||
char c1 = s1[i];
|
||||
char c2 = s2[i];
|
||||
if (c1 >= 'A' && c1 <= 'Z') c1 = (c1 - 'A') + 'a';
|
||||
if (c2 >= 'A' && c2 <= 'Z') c2 = (c2 - 'A') + 'a';
|
||||
if (c1 < c2) return -1;
|
||||
if (c1 > c2) return 1;
|
||||
if (c1 == 0) return 0;
|
||||
++i;
|
||||
}
|
||||
return 0;
|
||||
static void segwit_scriptpubkey(uint8_t* scriptpubkey, size_t* scriptpubkeylen,
|
||||
int witver, const uint8_t* witprog,
|
||||
size_t witprog_len) {
|
||||
scriptpubkey[0] = witver ? (0x50 + witver) : 0;
|
||||
scriptpubkey[1] = witprog_len;
|
||||
memcpy(scriptpubkey + 2, witprog, witprog_len);
|
||||
*scriptpubkeylen = witprog_len + 2;
|
||||
}
|
||||
|
||||
START_TEST(test_segwit)
|
||||
{
|
||||
size_t i;
|
||||
for (i = 0; i < sizeof(valid_checksum) / sizeof(valid_checksum[0]); ++i) {
|
||||
uint8_t data[82];
|
||||
char rebuild[92];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = bech32_decode(hrp, data, &data_len, valid_checksum[i]);
|
||||
ck_assert_int_eq(res, 1);
|
||||
res = bech32_encode(rebuild, hrp, data, data_len);
|
||||
ck_assert_int_eq(res, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_checksum[i], 92), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_checksum) / sizeof(invalid_checksum[0]); ++i) {
|
||||
uint8_t data[82];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = bech32_decode(hrp, data, &data_len, invalid_checksum[i]);
|
||||
ck_assert_int_eq(res, 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(valid_address) / sizeof(valid_address[0]); ++i) {
|
||||
uint8_t witprog[40];
|
||||
size_t witprog_len;
|
||||
int witver;
|
||||
const char* hrp = "bc";
|
||||
uint8_t scriptpubkey[42];
|
||||
size_t scriptpubkey_len;
|
||||
char rebuild[93];
|
||||
int ret = segwit_addr_decode(&witver, witprog, &witprog_len, hrp, valid_address[i].address);
|
||||
if (!ret) {
|
||||
hrp = "tb";
|
||||
ret = segwit_addr_decode(&witver, witprog, &witprog_len, hrp, valid_address[i].address);
|
||||
}
|
||||
ck_assert_int_eq(ret, 1);
|
||||
segwit_scriptpubkey(scriptpubkey, &scriptpubkey_len, witver, witprog, witprog_len);
|
||||
ck_assert_int_eq(scriptpubkey_len, valid_address[i].scriptPubKeyLen);
|
||||
ck_assert_int_eq(memcmp(scriptpubkey, valid_address[i].scriptPubKey, scriptpubkey_len), 0);
|
||||
ck_assert_int_eq(segwit_addr_encode(rebuild, hrp, witver, witprog, witprog_len), 1);
|
||||
ck_assert_int_eq(my_strncasecmp(valid_address[i].address, rebuild, 93), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_address) / sizeof(invalid_address[0]); ++i) {
|
||||
uint8_t witprog[40];
|
||||
size_t witprog_len;
|
||||
int witver;
|
||||
int ret = segwit_addr_decode(&witver, witprog, &witprog_len, "bc", invalid_address[i]);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
ret = segwit_addr_decode(&witver, witprog, &witprog_len, "tb", invalid_address[i]);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_address_enc) / sizeof(invalid_address_enc[0]); ++i) {
|
||||
char rebuild[93];
|
||||
static const uint8_t program[42] = {0};
|
||||
int ret = segwit_addr_encode(rebuild, invalid_address_enc[i].hrp, invalid_address_enc[i].version, program, invalid_address_enc[i].program_length);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
}
|
||||
START_TEST(test_segwit) {
|
||||
size_t i;
|
||||
for (i = 0; i < sizeof(valid_checksum) / sizeof(valid_checksum[0]); ++i) {
|
||||
uint8_t data[82];
|
||||
char rebuild[92];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = bech32_decode(hrp, data, &data_len, valid_checksum[i]);
|
||||
ck_assert_int_eq(res, 1);
|
||||
res = bech32_encode(rebuild, hrp, data, data_len);
|
||||
ck_assert_int_eq(res, 1);
|
||||
ck_assert_int_eq(my_strncasecmp(rebuild, valid_checksum[i], 92), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_checksum) / sizeof(invalid_checksum[0]); ++i) {
|
||||
uint8_t data[82];
|
||||
char hrp[84];
|
||||
size_t data_len;
|
||||
int res = bech32_decode(hrp, data, &data_len, invalid_checksum[i]);
|
||||
ck_assert_int_eq(res, 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(valid_address) / sizeof(valid_address[0]); ++i) {
|
||||
uint8_t witprog[40];
|
||||
size_t witprog_len;
|
||||
int witver;
|
||||
const char* hrp = "bc";
|
||||
uint8_t scriptpubkey[42];
|
||||
size_t scriptpubkey_len;
|
||||
char rebuild[93];
|
||||
int ret = segwit_addr_decode(&witver, witprog, &witprog_len, hrp,
|
||||
valid_address[i].address);
|
||||
if (!ret) {
|
||||
hrp = "tb";
|
||||
ret = segwit_addr_decode(&witver, witprog, &witprog_len, hrp,
|
||||
valid_address[i].address);
|
||||
}
|
||||
ck_assert_int_eq(ret, 1);
|
||||
segwit_scriptpubkey(scriptpubkey, &scriptpubkey_len, witver, witprog,
|
||||
witprog_len);
|
||||
ck_assert_int_eq(scriptpubkey_len, valid_address[i].scriptPubKeyLen);
|
||||
ck_assert_int_eq(
|
||||
memcmp(scriptpubkey, valid_address[i].scriptPubKey, scriptpubkey_len),
|
||||
0);
|
||||
ck_assert_int_eq(
|
||||
segwit_addr_encode(rebuild, hrp, witver, witprog, witprog_len), 1);
|
||||
ck_assert_int_eq(my_strncasecmp(valid_address[i].address, rebuild, 93), 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_address) / sizeof(invalid_address[0]); ++i) {
|
||||
uint8_t witprog[40];
|
||||
size_t witprog_len;
|
||||
int witver;
|
||||
int ret = segwit_addr_decode(&witver, witprog, &witprog_len, "bc",
|
||||
invalid_address[i]);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
ret = segwit_addr_decode(&witver, witprog, &witprog_len, "tb",
|
||||
invalid_address[i]);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
}
|
||||
for (i = 0; i < sizeof(invalid_address_enc) / sizeof(invalid_address_enc[0]);
|
||||
++i) {
|
||||
char rebuild[93];
|
||||
static const uint8_t program[42] = {0};
|
||||
int ret = segwit_addr_encode(rebuild, invalid_address_enc[i].hrp,
|
||||
invalid_address_enc[i].version, program,
|
||||
invalid_address_enc[i].program_length);
|
||||
ck_assert_int_eq(ret, 0);
|
||||
}
|
||||
}
|
||||
END_TEST
|
||||
|
@ -1,215 +1,233 @@
|
||||
#include <stdio.h>
|
||||
#include <assert.h>
|
||||
#include <time.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <time.h>
|
||||
#include "bip32.h"
|
||||
#include "curves.h"
|
||||
#include "ecdsa.h"
|
||||
#include "bip32.h"
|
||||
#include "secp256k1.h"
|
||||
#include "nist256p1.h"
|
||||
#include "ed25519-donna/ed25519.h"
|
||||
#include "hasher.h"
|
||||
#include "nist256p1.h"
|
||||
#include "secp256k1.h"
|
||||
|
||||
static uint8_t msg[256];
|
||||
|
||||
void prepare_msg(void)
|
||||
{
|
||||
for (size_t i = 0; i < sizeof(msg); i++) {
|
||||
msg[i] = i * 1103515245;
|
||||
}
|
||||
void prepare_msg(void) {
|
||||
for (size_t i = 0; i < sizeof(msg); i++) {
|
||||
msg[i] = i * 1103515245;
|
||||
}
|
||||
}
|
||||
|
||||
void bench_sign_secp256k1(int iterations)
|
||||
{
|
||||
uint8_t sig[64], priv[32], pby;
|
||||
void bench_sign_secp256k1(int iterations) {
|
||||
uint8_t sig[64], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void bench_sign_nist256p1(int iterations)
|
||||
{
|
||||
uint8_t sig[64], priv[32], pby;
|
||||
void bench_sign_nist256p1(int iterations) {
|
||||
uint8_t sig[64], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void bench_sign_ed25519(int iterations)
|
||||
{
|
||||
ed25519_public_key pk;
|
||||
ed25519_secret_key sk;
|
||||
ed25519_signature sig;
|
||||
void bench_sign_ed25519(int iterations) {
|
||||
ed25519_public_key pk;
|
||||
ed25519_secret_key sk;
|
||||
ed25519_signature sig;
|
||||
|
||||
memcpy(pk, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ed25519_publickey(sk, pk);
|
||||
memcpy(pk,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ed25519_publickey(sk, pk);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ed25519_sign(msg, sizeof(msg), sk, pk, sig);
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ed25519_sign(msg, sizeof(msg), sk, pk, sig);
|
||||
}
|
||||
}
|
||||
|
||||
void bench_verify_secp256k1_33(int iterations)
|
||||
{
|
||||
uint8_t sig[64], pub[33], priv[32], pby;
|
||||
void bench_verify_secp256k1_33(int iterations) {
|
||||
uint8_t sig[64], pub[33], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ecdsa_get_public_key33(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ecdsa_get_public_key33(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
}
|
||||
|
||||
void bench_verify_secp256k1_65(int iterations)
|
||||
{
|
||||
uint8_t sig[64], pub[65], priv[32], pby;
|
||||
void bench_verify_secp256k1_65(int iterations) {
|
||||
uint8_t sig[64], pub[65], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
const ecdsa_curve *curve = &secp256k1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ecdsa_get_public_key65(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ecdsa_get_public_key65(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
}
|
||||
|
||||
void bench_verify_nist256p1_33(int iterations)
|
||||
{
|
||||
uint8_t sig[64], pub[33], priv[32], pby;
|
||||
void bench_verify_nist256p1_33(int iterations) {
|
||||
uint8_t sig[64], pub[33], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ecdsa_get_public_key33(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ecdsa_get_public_key33(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
}
|
||||
|
||||
void bench_verify_nist256p1_65(int iterations)
|
||||
{
|
||||
uint8_t sig[64], pub[65], priv[32], pby;
|
||||
void bench_verify_nist256p1_65(int iterations) {
|
||||
uint8_t sig[64], pub[65], priv[32], pby;
|
||||
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
const ecdsa_curve *curve = &nist256p1;
|
||||
|
||||
memcpy(priv, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ecdsa_get_public_key65(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
memcpy(priv,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ecdsa_get_public_key65(curve, priv, pub);
|
||||
ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
|
||||
}
|
||||
}
|
||||
|
||||
void bench_verify_ed25519(int iterations)
|
||||
{
|
||||
ed25519_public_key pk;
|
||||
ed25519_secret_key sk;
|
||||
ed25519_signature sig;
|
||||
|
||||
memcpy(pk, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
ed25519_publickey(sk, pk);
|
||||
ed25519_sign(msg, sizeof(msg), sk, pk, sig);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
ed25519_sign_open(msg, sizeof(msg), pk, sig);
|
||||
}
|
||||
void bench_verify_ed25519(int iterations) {
|
||||
ed25519_public_key pk;
|
||||
ed25519_secret_key sk;
|
||||
ed25519_signature sig;
|
||||
|
||||
memcpy(pk,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
ed25519_publickey(sk, pk);
|
||||
ed25519_sign(msg, sizeof(msg), sk, pk, sig);
|
||||
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
ed25519_sign_open(msg, sizeof(msg), pk, sig);
|
||||
}
|
||||
}
|
||||
|
||||
void bench_multiply_curve25519(int iterations)
|
||||
{
|
||||
uint8_t result[32];
|
||||
uint8_t secret[32];
|
||||
uint8_t basepoint[32];
|
||||
|
||||
memcpy(secret, "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5", 32);
|
||||
memcpy(basepoint, "\x96\x47\xda\xbe\x1e\xea\xaf\x25\x47\x1e\x68\x0b\x4d\x7c\x6f\xd1\x14\x38\x76\xbb\x77\x59\xd8\x3d\x0f\xf7\xa2\x49\x08\xfd\xda\xbc", 32);
|
||||
|
||||
for (int i = 0 ; i < iterations; i++) {
|
||||
curve25519_scalarmult(result, secret, basepoint);
|
||||
}
|
||||
void bench_multiply_curve25519(int iterations) {
|
||||
uint8_t result[32];
|
||||
uint8_t secret[32];
|
||||
uint8_t basepoint[32];
|
||||
|
||||
memcpy(secret,
|
||||
"\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
|
||||
"\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
|
||||
32);
|
||||
memcpy(basepoint,
|
||||
"\x96\x47\xda\xbe\x1e\xea\xaf\x25\x47\x1e\x68\x0b\x4d\x7c\x6f\xd1\x14"
|
||||
"\x38\x76\xbb\x77\x59\xd8\x3d\x0f\xf7\xa2\x49\x08\xfd\xda\xbc",
|
||||
32);
|
||||
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
curve25519_scalarmult(result, secret, basepoint);
|
||||
}
|
||||
}
|
||||
|
||||
static HDNode root;
|
||||
|
||||
void prepare_node(void)
|
||||
{
|
||||
hdnode_from_seed((uint8_t *)"NothingToSeeHere", 16, SECP256K1_NAME, &root);
|
||||
hdnode_fill_public_key(&root);
|
||||
void prepare_node(void) {
|
||||
hdnode_from_seed((uint8_t *)"NothingToSeeHere", 16, SECP256K1_NAME, &root);
|
||||
hdnode_fill_public_key(&root);
|
||||
}
|
||||
|
||||
void bench_ckd_normal(int iterations)
|
||||
{
|
||||
char addr[MAX_ADDR_SIZE];
|
||||
HDNode node;
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
memcpy(&node, &root, sizeof(HDNode));
|
||||
hdnode_public_ckd(&node, i);
|
||||
hdnode_fill_public_key(&node);
|
||||
ecdsa_get_address(node.public_key, HASHER_SHA2, HASHER_SHA2D, 0, addr, sizeof(addr));
|
||||
}
|
||||
void bench_ckd_normal(int iterations) {
|
||||
char addr[MAX_ADDR_SIZE];
|
||||
HDNode node;
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
memcpy(&node, &root, sizeof(HDNode));
|
||||
hdnode_public_ckd(&node, i);
|
||||
hdnode_fill_public_key(&node);
|
||||
ecdsa_get_address(node.public_key, HASHER_SHA2, HASHER_SHA2D, 0, addr,
|
||||
sizeof(addr));
|
||||
}
|
||||
}
|
||||
|
||||
void bench_ckd_optimized(int iterations)
|
||||
{
|
||||
char addr[MAX_ADDR_SIZE];
|
||||
curve_point pub;
|
||||
ecdsa_read_pubkey(&secp256k1, root.public_key, &pub);
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
hdnode_public_ckd_address_optimized(&pub, root.chain_code, i, 0, HASHER_SHA2, HASHER_SHA2D, addr, sizeof(addr), false);
|
||||
}
|
||||
void bench_ckd_optimized(int iterations) {
|
||||
char addr[MAX_ADDR_SIZE];
|
||||
curve_point pub;
|
||||
ecdsa_read_pubkey(&secp256k1, root.public_key, &pub);
|
||||
for (int i = 0; i < iterations; i++) {
|
||||
hdnode_public_ckd_address_optimized(&pub, root.chain_code, i, 0,
|
||||
HASHER_SHA2, HASHER_SHA2D, addr,
|
||||
sizeof(addr), false);
|
||||
}
|
||||
}
|
||||
|
||||
void bench(void (*func)(int), const char *name, int iterations)
|
||||
{
|
||||
clock_t t = clock();
|
||||
func(iterations);
|
||||
float speed = iterations / ((float)(clock() - t) / CLOCKS_PER_SEC);
|
||||
printf("%25s: %8.2f ops/s\n", name, speed);
|
||||
void bench(void (*func)(int), const char *name, int iterations) {
|
||||
clock_t t = clock();
|
||||
func(iterations);
|
||||
float speed = iterations / ((float)(clock() - t) / CLOCKS_PER_SEC);
|
||||
printf("%25s: %8.2f ops/s\n", name, speed);
|
||||
}
|
||||
|
||||
#define BENCH(FUNC, ITER) bench(FUNC, #FUNC, ITER)
|
||||
|
||||
int main(void) {
|
||||
prepare_msg();
|
||||
|
||||
prepare_msg();
|
||||
|
||||
BENCH(bench_sign_secp256k1, 500);
|
||||
BENCH(bench_verify_secp256k1_33, 500);
|
||||
BENCH(bench_verify_secp256k1_65, 500);
|
||||
BENCH(bench_sign_secp256k1, 500);
|
||||
BENCH(bench_verify_secp256k1_33, 500);
|
||||
BENCH(bench_verify_secp256k1_65, 500);
|
||||
|
||||
BENCH(bench_sign_nist256p1, 500);
|
||||
BENCH(bench_verify_nist256p1_33, 500);
|
||||
BENCH(bench_verify_nist256p1_65, 500);
|
||||
BENCH(bench_sign_nist256p1, 500);
|
||||
BENCH(bench_verify_nist256p1_33, 500);
|
||||
BENCH(bench_verify_nist256p1_65, 500);
|
||||
|
||||
BENCH(bench_sign_ed25519, 4000);
|
||||
BENCH(bench_verify_ed25519, 4000);
|
||||
BENCH(bench_sign_ed25519, 4000);
|
||||
BENCH(bench_verify_ed25519, 4000);
|
||||
|
||||
BENCH(bench_multiply_curve25519, 4000);
|
||||
BENCH(bench_multiply_curve25519, 4000);
|
||||
|
||||
prepare_node();
|
||||
prepare_node();
|
||||
|
||||
BENCH(bench_ckd_normal, 1000);
|
||||
BENCH(bench_ckd_optimized, 1000);
|
||||
BENCH(bench_ckd_normal, 1000);
|
||||
BENCH(bench_ckd_optimized, 1000);
|
||||
|
||||
return 0;
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,47 +1,49 @@
|
||||
#include <inttypes.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
#include <inttypes.h>
|
||||
#include "bip32.h"
|
||||
#include "curves.h"
|
||||
#include "ecdsa.h"
|
||||
|
||||
#define VERSION_PUBLIC 0x0488b21e
|
||||
#define VERSION_PUBLIC 0x0488b21e
|
||||
#define VERSION_PRIVATE 0x0488ade4
|
||||
|
||||
void process_job(uint32_t jobid, const char *xpub, uint32_t change, uint32_t from, uint32_t to)
|
||||
{
|
||||
HDNode node, child;
|
||||
if (change > 1 || to <= from || hdnode_deserialize(xpub, VERSION_PUBLIC, VERSION_PRIVATE, SECP256K1_NAME, &node, NULL) != 0) {
|
||||
printf("%d error\n", jobid);
|
||||
return;
|
||||
}
|
||||
hdnode_public_ckd(&node, change);
|
||||
uint32_t i;
|
||||
char address[36];
|
||||
for (i = from; i < to; i++) {
|
||||
memcpy(&child, &node, sizeof(HDNode));
|
||||
hdnode_public_ckd(&child, i);
|
||||
ecdsa_get_address(child.public_key, 0, HASHER_SHA2, HASHER_SHA2D, address, sizeof(address));
|
||||
printf("%d %d %s\n", jobid, i, address);
|
||||
}
|
||||
void process_job(uint32_t jobid, const char *xpub, uint32_t change,
|
||||
uint32_t from, uint32_t to) {
|
||||
HDNode node, child;
|
||||
if (change > 1 || to <= from ||
|
||||
hdnode_deserialize(xpub, VERSION_PUBLIC, VERSION_PRIVATE, SECP256K1_NAME,
|
||||
&node, NULL) != 0) {
|
||||
printf("%d error\n", jobid);
|
||||
return;
|
||||
}
|
||||
hdnode_public_ckd(&node, change);
|
||||
uint32_t i;
|
||||
char address[36];
|
||||
for (i = from; i < to; i++) {
|
||||
memcpy(&child, &node, sizeof(HDNode));
|
||||
hdnode_public_ckd(&child, i);
|
||||
ecdsa_get_address(child.public_key, 0, HASHER_SHA2, HASHER_SHA2D, address,
|
||||
sizeof(address));
|
||||
printf("%d %d %s\n", jobid, i, address);
|
||||
}
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
char line[1024], xpub[1024];
|
||||
uint32_t jobid, change, from, to;
|
||||
int r;
|
||||
for (;;) {
|
||||
if (!fgets(line, sizeof(line), stdin)) break;
|
||||
r = sscanf(line, "%u %s %u %u %u\n", &jobid, xpub, &change, &from, &to);
|
||||
if (r < 1) {
|
||||
printf("error\n");
|
||||
} else if (r != 5) {
|
||||
printf("%d error\n", jobid);
|
||||
} else {
|
||||
process_job(jobid, xpub, change, from, to);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
int main(void) {
|
||||
char line[1024], xpub[1024];
|
||||
uint32_t jobid, change, from, to;
|
||||
int r;
|
||||
for (;;) {
|
||||
if (!fgets(line, sizeof(line), stdin)) break;
|
||||
r = sscanf(line, "%u %s %u %u %u\n", &jobid, xpub, &change, &from, &to);
|
||||
if (r < 1) {
|
||||
printf("error\n");
|
||||
} else if (r != 5) {
|
||||
printf("%d error\n", jobid);
|
||||
} else {
|
||||
process_job(jobid, xpub, change, from, to);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in new issue