#include <stdio.h>
#include <bee2/core/prng.h>
#include <bee2/core/tm.h>
#include <bee2/core/util.h>
#include <bee2/math/ec.h>
#include <crypto/bign/bign_lcl.h>
static size_t _ecpBench_deep(size_t n, size_t f_deep, size_t ec_d,
size_t ec_deep)
{
return O_OF_W(3 * n) + prngCOMBO_keep() +
ecMulA_deep(n, ec_d, ec_deep, n);
}
bool_t ecpBench()
{
bign_params params[1];
octet state[6000];
ec_o* ec;
octet* combo_state;
word* pt;
word* d;
void* stack;
if (sizeof(state) < bignStart_keep(128, _ecpBench_deep))
return FALSE;
if (bignParamsStd(params, "1.2.112.0.2.0.34.101.45.3.1") != ERR_OK ||
bignStart(state, params) != ERR_OK)
return FALSE;
ec = (ec_o*)state;
ec->tpl = 0;
combo_state = objEnd(ec, octet);
pt = (word*)(combo_state + prngCOMBO_keep());
d = pt + 2 * ec->f->n;
stack = d + ec->f->n;
prngCOMBOStart(combo_state, utilNonce32());
{
const size_t reps = 1000;
size_t i;
tm_ticks_t ticks;
for (i = 0, ticks = tmTicks(); i < reps; ++i)
{
prngCOMBOStepR(d, ec->f->no, combo_state);
ecMulA(pt, ec->base, ec, d, ec->f->n, stack);
}
ticks = tmTicks() - ticks;
printf("ecpBench: %u cycles/mulpoint [%u mulpoints/sec]\n",
(unsigned)(ticks / reps),
(unsigned)tmSpeed(reps, ticks));
}
return TRUE;
}