diff --git a/bip32.c b/bip32.c index 820cc9136..a9fac779b 100644 --- a/bip32.c +++ b/bip32.c @@ -132,7 +132,7 @@ int hdnode_from_seed(const uint8_t *seed, int seed_len, const char* curve, HDNod } memcpy(out->private_key, I, 32); memcpy(out->chain_code, I + 32, 32); - + MEMSET_BZERO(out->public_key, sizeof(out->public_key)); MEMSET_BZERO(I, sizeof(I)); return 1; } @@ -215,7 +215,6 @@ int hdnode_public_ckd(HDNode *inout, uint32_t i) { uint8_t data[1 + 32 + 4]; uint8_t I[32 + 32]; - uint8_t fingerprint[32]; curve_point a, b; bignum256 c; @@ -265,7 +264,6 @@ int hdnode_public_ckd(HDNode *inout, uint32_t i) // Wipe all stack data. MEMSET_BZERO(data, sizeof(data)); MEMSET_BZERO(I, sizeof(I)); - MEMSET_BZERO(fingerprint, sizeof(fingerprint)); MEMSET_BZERO(&a, sizeof(a)); MEMSET_BZERO(&b, sizeof(b)); MEMSET_BZERO(&c, sizeof(c)); @@ -295,7 +293,7 @@ int hdnode_public_ckd_address_optimized(const curve_point *pub, const uint8_t *p failed = true; } else { scalar_multiply(&secp256k1, &c, &b); // b = c * G - point_add(&secp256k1, pub, &b); // b = a + b + point_add(&secp256k1, pub, &b); // b = a + b if (point_is_infinity(&b)) { failed = true; } diff --git a/ecdsa.h b/ecdsa.h index f74bf2efc..a2a4e29c2 100644 --- a/ecdsa.h +++ b/ecdsa.h @@ -50,6 +50,8 @@ typedef struct { #define MAX_ADDR_RAW_SIZE (4 + 20) #define MAX_WIF_RAW_SIZE (4 + 32 + 1) +#define MAX_ADDR_SIZE (40) +#define MAX_WIF_SIZE (58) // rfc6979 pseudo random number generator state typedef struct { diff --git a/test_speed.c b/test_speed.c index 23ce4dcc4..070561c91 100644 --- a/test_speed.c +++ b/test_speed.c @@ -9,7 +9,7 @@ #include "nist256p1.h" #include "ed25519.h" -uint8_t msg[32]; +static uint8_t msg[32]; void prepare_msg(void) { @@ -76,49 +76,52 @@ void test_verify_speed(void) { bench_ed25519(); } -HDNode root; +static HDNode root; void prepare_node(void) { hdnode_from_seed((uint8_t *)"NothingToSeeHere", 16, SECP256K1_NAME, &root); + hdnode_fill_public_key(&root); } -void bench_ckd_normal(void) { - char addr[40]; +void bench_ckd_normal(int iterations) { + char addr[MAX_ADDR_SIZE]; + HDNode node; clock_t t = clock(); - for (int i = 0; i < 1000; i++) { - HDNode node = root; + for (int i = 0; i < iterations; i++) { + memcpy(&node, &root, sizeof(HDNode)); hdnode_public_ckd(&node, i); - ecdsa_get_address(node.public_key, 0, addr, 40); - if (i == 0) { + hdnode_fill_public_key(&node); + ecdsa_get_address(node.public_key, 0, addr, sizeof(addr)); + if (i == 0 || i == iterations - 1) { printf("address = %s\n", addr); } } - printf("CKD normal speed: %0.2f iter/s\n", 1000.0f / ((float)(clock() - t) / CLOCKS_PER_SEC)); + printf("CKD normal speed: %0.2f iter/s\n", iterations / ((float)(clock() - t) / CLOCKS_PER_SEC)); } -void bench_ckd_optimized(void) { - char addr[40]; +void bench_ckd_optimized(int iterations) { + char addr[MAX_ADDR_SIZE]; curve_point pub; - ecdsa_read_pubkey(0, root.public_key, &pub); + ecdsa_read_pubkey(&secp256k1, root.public_key, &pub); clock_t t = clock(); - for (int i = 0; i < 1000; i++) { - hdnode_public_ckd_address_optimized(&pub, root.public_key, root.chain_code, i, 0, addr, 40); - if (i == 0) { + for (int i = 0; i < iterations; i++) { + hdnode_public_ckd_address_optimized(&pub, root.public_key, root.chain_code, i, 0, addr, sizeof(addr)); + if (i == 0 || i == iterations -1) { printf("address = %s\n", addr); } } - printf("CKD optim speed: %0.2f iter/s\n", 1000.0f / ((float)(clock() - t) / CLOCKS_PER_SEC)); + printf("CKD optim speed: %0.2f iter/s\n", iterations / ((float)(clock() - t) / CLOCKS_PER_SEC)); } -void test_ckd_speed(void) { +void test_ckd_speed(int iterations) { prepare_node(); - bench_ckd_normal(); - bench_ckd_optimized(); + bench_ckd_normal(iterations); + bench_ckd_optimized(iterations); } int main(void) { test_verify_speed(); - test_ckd_speed(); + test_ckd_speed(1000); return 0; }