test_speed.c 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. #include <assert.h>
  2. #include <stdint.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <time.h>
  6. #include "bip32.h"
  7. #include "curves.h"
  8. #include "ecdsa.h"
  9. #include "ed25519-donna/ed25519.h"
  10. #include "hasher.h"
  11. #include "nist256p1.h"
  12. #include "secp256k1.h"
  13. static uint8_t msg[256];
  14. void prepare_msg(void) {
  15. for (size_t i = 0; i < sizeof(msg); i++) {
  16. msg[i] = i * 1103515245;
  17. }
  18. }
  19. void bench_sign_secp256k1(int iterations) {
  20. uint8_t sig[64], priv[32], pby;
  21. const ecdsa_curve *curve = &secp256k1;
  22. memcpy(priv,
  23. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  24. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  25. 32);
  26. for (int i = 0; i < iterations; i++) {
  27. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  28. }
  29. }
  30. void bench_sign_nist256p1(int iterations) {
  31. uint8_t sig[64], priv[32], pby;
  32. const ecdsa_curve *curve = &nist256p1;
  33. memcpy(priv,
  34. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  35. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  36. 32);
  37. for (int i = 0; i < iterations; i++) {
  38. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  39. }
  40. }
  41. void bench_sign_ed25519(int iterations) {
  42. ed25519_secret_key sk;
  43. ed25519_signature sig;
  44. memcpy(sk,
  45. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  46. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  47. 32);
  48. for (int i = 0; i < iterations; i++) {
  49. ed25519_sign(msg, sizeof(msg), sk, sig);
  50. }
  51. }
  52. void bench_verify_secp256k1_33(int iterations) {
  53. uint8_t sig[64], pub[33], priv[32], pby;
  54. const ecdsa_curve *curve = &secp256k1;
  55. memcpy(priv,
  56. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  57. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  58. 32);
  59. ecdsa_get_public_key33(curve, priv, pub);
  60. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  61. for (int i = 0; i < iterations; i++) {
  62. ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
  63. }
  64. }
  65. void bench_verify_secp256k1_65(int iterations) {
  66. uint8_t sig[64], pub[65], priv[32], pby;
  67. const ecdsa_curve *curve = &secp256k1;
  68. memcpy(priv,
  69. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  70. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  71. 32);
  72. ecdsa_get_public_key65(curve, priv, pub);
  73. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  74. for (int i = 0; i < iterations; i++) {
  75. ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
  76. }
  77. }
  78. void bench_verify_nist256p1_33(int iterations) {
  79. uint8_t sig[64], pub[33], priv[32], pby;
  80. const ecdsa_curve *curve = &nist256p1;
  81. memcpy(priv,
  82. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  83. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  84. 32);
  85. ecdsa_get_public_key33(curve, priv, pub);
  86. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  87. for (int i = 0; i < iterations; i++) {
  88. ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
  89. }
  90. }
  91. void bench_verify_nist256p1_65(int iterations) {
  92. uint8_t sig[64], pub[65], priv[32], pby;
  93. const ecdsa_curve *curve = &nist256p1;
  94. memcpy(priv,
  95. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  96. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  97. 32);
  98. ecdsa_get_public_key65(curve, priv, pub);
  99. ecdsa_sign(curve, HASHER_SHA2, priv, msg, sizeof(msg), sig, &pby, NULL);
  100. for (int i = 0; i < iterations; i++) {
  101. ecdsa_verify(curve, HASHER_SHA2, pub, sig, msg, sizeof(msg));
  102. }
  103. }
  104. void bench_verify_ed25519(int iterations) {
  105. ed25519_public_key pk;
  106. ed25519_secret_key sk;
  107. ed25519_signature sig;
  108. memcpy(sk,
  109. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  110. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  111. 32);
  112. ed25519_publickey(sk, pk);
  113. ed25519_sign(msg, sizeof(msg), sk, sig);
  114. for (int i = 0; i < iterations; i++) {
  115. ed25519_sign_open(msg, sizeof(msg), pk, sig);
  116. }
  117. }
  118. void bench_multiply_curve25519(int iterations) {
  119. uint8_t result[32];
  120. uint8_t secret[32];
  121. uint8_t basepoint[32];
  122. memcpy(secret,
  123. "\xc5\x5e\xce\x85\x8b\x0d\xdd\x52\x63\xf9\x68\x10\xfe\x14\x43\x7c\xd3"
  124. "\xb5\xe1\xfb\xd7\xc6\xa2\xec\x1e\x03\x1f\x05\xe8\x6d\x8b\xd5",
  125. 32);
  126. memcpy(basepoint,
  127. "\x96\x47\xda\xbe\x1e\xea\xaf\x25\x47\x1e\x68\x0b\x4d\x7c\x6f\xd1\x14"
  128. "\x38\x76\xbb\x77\x59\xd8\x3d\x0f\xf7\xa2\x49\x08\xfd\xda\xbc",
  129. 32);
  130. for (int i = 0; i < iterations; i++) {
  131. curve25519_scalarmult(result, secret, basepoint);
  132. }
  133. }
  134. static HDNode root;
  135. void prepare_node(void) {
  136. hdnode_from_seed((uint8_t *)"NothingToSeeHere", 16, SECP256K1_NAME, &root);
  137. hdnode_fill_public_key(&root);
  138. }
  139. void bench_ckd_normal(int iterations) {
  140. char addr[MAX_ADDR_SIZE];
  141. HDNode node;
  142. for (int i = 0; i < iterations; i++) {
  143. memcpy(&node, &root, sizeof(HDNode));
  144. hdnode_public_ckd(&node, i);
  145. hdnode_fill_public_key(&node);
  146. ecdsa_get_address(node.public_key, HASHER_SHA2, HASHER_SHA2D, 0, addr,
  147. sizeof(addr));
  148. }
  149. }
  150. void bench_ckd_optimized(int iterations) {
  151. char addr[MAX_ADDR_SIZE];
  152. curve_point pub;
  153. ecdsa_read_pubkey(&secp256k1, root.public_key, &pub);
  154. for (int i = 0; i < iterations; i++) {
  155. hdnode_public_ckd_address_optimized(&pub, root.chain_code, i, 0,
  156. HASHER_SHA2, HASHER_SHA2D, addr,
  157. sizeof(addr), false);
  158. }
  159. }
  160. void bench(void (*func)(int), const char *name, int iterations) {
  161. clock_t t = clock();
  162. func(iterations);
  163. float speed = iterations / ((float)(clock() - t) / CLOCKS_PER_SEC);
  164. printf("%25s: %8.2f ops/s\n", name, speed);
  165. }
  166. #define BENCH(FUNC, ITER) bench(FUNC, #FUNC, ITER)
  167. int main(void) {
  168. prepare_msg();
  169. BENCH(bench_sign_secp256k1, 500);
  170. BENCH(bench_verify_secp256k1_33, 500);
  171. BENCH(bench_verify_secp256k1_65, 500);
  172. BENCH(bench_sign_nist256p1, 500);
  173. BENCH(bench_verify_nist256p1_33, 500);
  174. BENCH(bench_verify_nist256p1_65, 500);
  175. BENCH(bench_sign_ed25519, 4000);
  176. BENCH(bench_verify_ed25519, 4000);
  177. BENCH(bench_multiply_curve25519, 4000);
  178. prepare_node();
  179. BENCH(bench_ckd_normal, 1000);
  180. BENCH(bench_ckd_optimized, 1000);
  181. return 0;
  182. }