ecp_bench.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. *******************************************************************************
  3. \file ecp_bench.c
  4. \brief Benchmarks for elliptic curves over prime fields
  5. \project bee2/test
  6. \created 2013.10.17
  7. \version 2023.09.22
  8. \copyright The Bee2 authors
  9. \license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
  10. *******************************************************************************
  11. */
  12. #include <stdio.h>
  13. #include <bee2/core/mem.h>
  14. #include <bee2/core/prng.h>
  15. #include <bee2/core/stack.h>
  16. #include <bee2/core/tm.h>
  17. #include <bee2/core/util.h>
  18. #include <crypto/bign/bign_lcl.h>
  19. #include <bee2/math/ecp.h>
  20. #include <bee2/math/gfp.h>
  21. /*
  22. *******************************************************************************
  23. Потребности в стеке
  24. *******************************************************************************
  25. */
  26. static size_t _ecpBench_deep(size_t n, size_t f_deep, size_t ec_d,
  27. size_t ec_deep)
  28. {
  29. return O_OF_W(3 * n) + prngCOMBO_keep() +
  30. ecMulA_deep(n, ec_d, ec_deep, n);
  31. }
  32. bool_t ecpBench()
  33. {
  34. // описание кривой
  35. bign_params params[1];
  36. // состояние
  37. octet state[6000];
  38. ec_o* ec;
  39. octet* combo_state;
  40. word* pt;
  41. word* d;
  42. void* stack;
  43. // подготовить память
  44. if (sizeof(state) < bignStart_keep(128, _ecpBench_deep))
  45. return FALSE;
  46. // загрузить параметры и создать описание кривой
  47. if (bignParamsStd(params, "1.2.112.0.2.0.34.101.45.3.1") != ERR_OK ||
  48. bignStart(state, params) != ERR_OK)
  49. return FALSE;
  50. // раскладка состояния
  51. ec = (ec_o*)state;
  52. ec->tpl = 0;
  53. combo_state = objEnd(ec, octet);
  54. pt = (word*)(combo_state + prngCOMBO_keep());
  55. d = pt + 2 * ec->f->n;
  56. stack = d + ec->f->n;
  57. // создать генератор COMBO
  58. prngCOMBOStart(combo_state, utilNonce32());
  59. // оценить число кратных точек в секунду
  60. {
  61. const size_t reps = 1000;
  62. size_t i;
  63. tm_ticks_t ticks;
  64. // эксперимент
  65. for (i = 0, ticks = tmTicks(); i < reps; ++i)
  66. {
  67. prngCOMBOStepR(d, ec->f->no, combo_state);
  68. ecMulA(pt, ec->base, ec, d, ec->f->n, stack);
  69. }
  70. ticks = tmTicks() - ticks;
  71. // печать результатов
  72. printf("ecpBench: %u cycles/mulpoint [%u mulpoints/sec]\n",
  73. (unsigned)(ticks / reps),
  74. (unsigned)tmSpeed(reps, ticks));
  75. }
  76. // все нормально
  77. return TRUE;
  78. }