PageRenderTime 25ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/secp256k1/src/bench_internal.c

https://gitlab.com/vectorci/rippled
C | 318 lines | 254 code | 59 blank | 5 comment | 74 complexity | 1814322c3bfe704745145140afebfc71 MD5 | raw file
  1. /**********************************************************************
  2. * Copyright (c) 2014-2015 Pieter Wuille *
  3. * Distributed under the MIT software license, see the accompanying *
  4. * file COPYING or http://www.opensource.org/licenses/mit-license.php.*
  5. **********************************************************************/
  6. #include <stdio.h>
  7. #include "include/secp256k1.h"
  8. #include "util.h"
  9. #include "hash_impl.h"
  10. #include "num_impl.h"
  11. #include "field_impl.h"
  12. #include "group_impl.h"
  13. #include "scalar_impl.h"
  14. #include "ecmult_impl.h"
  15. #include "bench.h"
  16. typedef struct {
  17. secp256k1_scalar_t scalar_x, scalar_y;
  18. secp256k1_fe_t fe_x, fe_y;
  19. secp256k1_ge_t ge_x, ge_y;
  20. secp256k1_gej_t gej_x, gej_y;
  21. unsigned char data[32];
  22. int wnaf[256];
  23. } bench_inv_t;
  24. void bench_setup(void* arg) {
  25. bench_inv_t *data = (bench_inv_t*)arg;
  26. static const unsigned char init_x[32] = {
  27. 0x02, 0x03, 0x05, 0x07, 0x0b, 0x0d, 0x11, 0x13,
  28. 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,
  29. 0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59,
  30. 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71, 0x7f, 0x83
  31. };
  32. static const unsigned char init_y[32] = {
  33. 0x82, 0x83, 0x85, 0x87, 0x8b, 0x8d, 0x81, 0x83,
  34. 0x97, 0xad, 0xaf, 0xb5, 0xb9, 0xbb, 0xbf, 0xc5,
  35. 0xdb, 0xdd, 0xe3, 0xe7, 0xe9, 0xef, 0xf3, 0xf9,
  36. 0x11, 0x15, 0x17, 0x1b, 0x1d, 0xb1, 0xbf, 0xd3
  37. };
  38. secp256k1_scalar_set_b32(&data->scalar_x, init_x, NULL);
  39. secp256k1_scalar_set_b32(&data->scalar_y, init_y, NULL);
  40. secp256k1_fe_set_b32(&data->fe_x, init_x);
  41. secp256k1_fe_set_b32(&data->fe_y, init_y);
  42. CHECK(secp256k1_ge_set_xo_var(&data->ge_x, &data->fe_x, 0));
  43. CHECK(secp256k1_ge_set_xo_var(&data->ge_y, &data->fe_y, 1));
  44. secp256k1_gej_set_ge(&data->gej_x, &data->ge_x);
  45. secp256k1_gej_set_ge(&data->gej_y, &data->ge_y);
  46. memcpy(data->data, init_x, 32);
  47. }
  48. void bench_scalar_add(void* arg) {
  49. int i;
  50. bench_inv_t *data = (bench_inv_t*)arg;
  51. for (i = 0; i < 2000000; i++) {
  52. secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  53. }
  54. }
  55. void bench_scalar_negate(void* arg) {
  56. int i;
  57. bench_inv_t *data = (bench_inv_t*)arg;
  58. for (i = 0; i < 2000000; i++) {
  59. secp256k1_scalar_negate(&data->scalar_x, &data->scalar_x);
  60. }
  61. }
  62. void bench_scalar_sqr(void* arg) {
  63. int i;
  64. bench_inv_t *data = (bench_inv_t*)arg;
  65. for (i = 0; i < 200000; i++) {
  66. secp256k1_scalar_sqr(&data->scalar_x, &data->scalar_x);
  67. }
  68. }
  69. void bench_scalar_mul(void* arg) {
  70. int i;
  71. bench_inv_t *data = (bench_inv_t*)arg;
  72. for (i = 0; i < 200000; i++) {
  73. secp256k1_scalar_mul(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  74. }
  75. }
  76. #ifdef USE_ENDOMORPHISM
  77. void bench_scalar_split(void* arg) {
  78. int i;
  79. bench_inv_t *data = (bench_inv_t*)arg;
  80. for (i = 0; i < 20000; i++) {
  81. secp256k1_scalar_t l, r;
  82. secp256k1_scalar_split_lambda_var(&l, &r, &data->scalar_x);
  83. secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  84. }
  85. }
  86. #endif
  87. void bench_scalar_inverse(void* arg) {
  88. int i;
  89. bench_inv_t *data = (bench_inv_t*)arg;
  90. for (i = 0; i < 2000; i++) {
  91. secp256k1_scalar_inverse(&data->scalar_x, &data->scalar_x);
  92. secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  93. }
  94. }
  95. void bench_scalar_inverse_var(void* arg) {
  96. int i;
  97. bench_inv_t *data = (bench_inv_t*)arg;
  98. for (i = 0; i < 2000; i++) {
  99. secp256k1_scalar_inverse_var(&data->scalar_x, &data->scalar_x);
  100. secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  101. }
  102. }
  103. void bench_field_normalize(void* arg) {
  104. int i;
  105. bench_inv_t *data = (bench_inv_t*)arg;
  106. for (i = 0; i < 2000000; i++) {
  107. secp256k1_fe_normalize(&data->fe_x);
  108. }
  109. }
  110. void bench_field_normalize_weak(void* arg) {
  111. int i;
  112. bench_inv_t *data = (bench_inv_t*)arg;
  113. for (i = 0; i < 2000000; i++) {
  114. secp256k1_fe_normalize_weak(&data->fe_x);
  115. }
  116. }
  117. void bench_field_mul(void* arg) {
  118. int i;
  119. bench_inv_t *data = (bench_inv_t*)arg;
  120. for (i = 0; i < 200000; i++) {
  121. secp256k1_fe_mul(&data->fe_x, &data->fe_x, &data->fe_y);
  122. }
  123. }
  124. void bench_field_sqr(void* arg) {
  125. int i;
  126. bench_inv_t *data = (bench_inv_t*)arg;
  127. for (i = 0; i < 200000; i++) {
  128. secp256k1_fe_sqr(&data->fe_x, &data->fe_x);
  129. }
  130. }
  131. void bench_field_inverse(void* arg) {
  132. int i;
  133. bench_inv_t *data = (bench_inv_t*)arg;
  134. for (i = 0; i < 20000; i++) {
  135. secp256k1_fe_inv(&data->fe_x, &data->fe_x);
  136. secp256k1_fe_add(&data->fe_x, &data->fe_y);
  137. }
  138. }
  139. void bench_field_inverse_var(void* arg) {
  140. int i;
  141. bench_inv_t *data = (bench_inv_t*)arg;
  142. for (i = 0; i < 20000; i++) {
  143. secp256k1_fe_inv_var(&data->fe_x, &data->fe_x);
  144. secp256k1_fe_add(&data->fe_x, &data->fe_y);
  145. }
  146. }
  147. void bench_field_sqrt_var(void* arg) {
  148. int i;
  149. bench_inv_t *data = (bench_inv_t*)arg;
  150. for (i = 0; i < 20000; i++) {
  151. secp256k1_fe_sqrt_var(&data->fe_x, &data->fe_x);
  152. secp256k1_fe_add(&data->fe_x, &data->fe_y);
  153. }
  154. }
  155. void bench_group_double_var(void* arg) {
  156. int i;
  157. bench_inv_t *data = (bench_inv_t*)arg;
  158. for (i = 0; i < 200000; i++) {
  159. secp256k1_gej_double_var(&data->gej_x, &data->gej_x, NULL);
  160. }
  161. }
  162. void bench_group_add_var(void* arg) {
  163. int i;
  164. bench_inv_t *data = (bench_inv_t*)arg;
  165. for (i = 0; i < 200000; i++) {
  166. secp256k1_gej_add_var(&data->gej_x, &data->gej_x, &data->gej_y, NULL);
  167. }
  168. }
  169. void bench_group_add_affine(void* arg) {
  170. int i;
  171. bench_inv_t *data = (bench_inv_t*)arg;
  172. for (i = 0; i < 200000; i++) {
  173. secp256k1_gej_add_ge(&data->gej_x, &data->gej_x, &data->ge_y);
  174. }
  175. }
  176. void bench_group_add_affine_var(void* arg) {
  177. int i;
  178. bench_inv_t *data = (bench_inv_t*)arg;
  179. for (i = 0; i < 200000; i++) {
  180. secp256k1_gej_add_ge_var(&data->gej_x, &data->gej_x, &data->ge_y, NULL);
  181. }
  182. }
  183. void bench_ecmult_wnaf(void* arg) {
  184. int i;
  185. bench_inv_t *data = (bench_inv_t*)arg;
  186. for (i = 0; i < 20000; i++) {
  187. secp256k1_ecmult_wnaf(data->wnaf, &data->scalar_x, WINDOW_A);
  188. secp256k1_scalar_add(&data->scalar_x, &data->scalar_x, &data->scalar_y);
  189. }
  190. }
  191. void bench_sha256(void* arg) {
  192. int i;
  193. bench_inv_t *data = (bench_inv_t*)arg;
  194. secp256k1_sha256_t sha;
  195. for (i = 0; i < 20000; i++) {
  196. secp256k1_sha256_initialize(&sha);
  197. secp256k1_sha256_write(&sha, data->data, 32);
  198. secp256k1_sha256_finalize(&sha, data->data);
  199. }
  200. }
  201. void bench_hmac_sha256(void* arg) {
  202. int i;
  203. bench_inv_t *data = (bench_inv_t*)arg;
  204. secp256k1_hmac_sha256_t hmac;
  205. for (i = 0; i < 20000; i++) {
  206. secp256k1_hmac_sha256_initialize(&hmac, data->data, 32);
  207. secp256k1_hmac_sha256_write(&hmac, data->data, 32);
  208. secp256k1_hmac_sha256_finalize(&hmac, data->data);
  209. }
  210. }
  211. void bench_rfc6979_hmac_sha256(void* arg) {
  212. int i;
  213. bench_inv_t *data = (bench_inv_t*)arg;
  214. secp256k1_rfc6979_hmac_sha256_t rng;
  215. for (i = 0; i < 20000; i++) {
  216. secp256k1_rfc6979_hmac_sha256_initialize(&rng, data->data, 32, data->data, 32, NULL, 0);
  217. secp256k1_rfc6979_hmac_sha256_generate(&rng, data->data, 32);
  218. }
  219. }
  220. int have_flag(int argc, char** argv, char *flag) {
  221. char** argm = argv + argc;
  222. argv++;
  223. if (argv == argm) {
  224. return 1;
  225. }
  226. while (argv != NULL && argv != argm) {
  227. if (strcmp(*argv, flag) == 0) return 1;
  228. argv++;
  229. }
  230. return 0;
  231. }
  232. int main(int argc, char **argv) {
  233. bench_inv_t data;
  234. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, 2000000);
  235. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, 2000000);
  236. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "sqr")) run_benchmark("scalar_sqr", bench_scalar_sqr, bench_setup, NULL, &data, 10, 200000);
  237. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, 200000);
  238. #ifdef USE_ENDOMORPHISM
  239. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "split")) run_benchmark("scalar_split", bench_scalar_split, bench_setup, NULL, &data, 10, 20000);
  240. #endif
  241. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse", bench_scalar_inverse, bench_setup, NULL, &data, 10, 2000);
  242. if (have_flag(argc, argv, "scalar") || have_flag(argc, argv, "inverse")) run_benchmark("scalar_inverse_var", bench_scalar_inverse_var, bench_setup, NULL, &data, 10, 2000);
  243. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize", bench_field_normalize, bench_setup, NULL, &data, 10, 2000000);
  244. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "normalize")) run_benchmark("field_normalize_weak", bench_field_normalize_weak, bench_setup, NULL, &data, 10, 2000000);
  245. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqr")) run_benchmark("field_sqr", bench_field_sqr, bench_setup, NULL, &data, 10, 200000);
  246. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "mul")) run_benchmark("field_mul", bench_field_mul, bench_setup, NULL, &data, 10, 200000);
  247. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse", bench_field_inverse, bench_setup, NULL, &data, 10, 20000);
  248. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "inverse")) run_benchmark("field_inverse_var", bench_field_inverse_var, bench_setup, NULL, &data, 10, 20000);
  249. if (have_flag(argc, argv, "field") || have_flag(argc, argv, "sqrt")) run_benchmark("field_sqrt_var", bench_field_sqrt_var, bench_setup, NULL, &data, 10, 20000);
  250. if (have_flag(argc, argv, "group") || have_flag(argc, argv, "double")) run_benchmark("group_double_var", bench_group_double_var, bench_setup, NULL, &data, 10, 200000);
  251. if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_var", bench_group_add_var, bench_setup, NULL, &data, 10, 200000);
  252. if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine", bench_group_add_affine, bench_setup, NULL, &data, 10, 200000);
  253. if (have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_affine_var", bench_group_add_affine_var, bench_setup, NULL, &data, 10, 200000);
  254. if (have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, 20000);
  255. if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, 20000);
  256. if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "hmac")) run_benchmark("hash_hmac_sha256", bench_hmac_sha256, bench_setup, NULL, &data, 10, 20000);
  257. if (have_flag(argc, argv, "hash") || have_flag(argc, argv, "rng6979")) run_benchmark("hash_rfc6979_hmac_sha256", bench_rfc6979_hmac_sha256, bench_setup, NULL, &data, 10, 20000);
  258. return 0;
  259. }