montgomery
#include "bn.h"
int main(int argc, char *argv[])
{
BN_CTX *ctx = BN_CTX_new();
//BN_CTX_start(ctx);
auto a= BN_CTX_get(ctx);
a->neg = -1;
BN_set_word(a, 0xff7655f);
//a->neg = -1;
auto b= BN_CTX_get(ctx);
BN_set_word(b, 0xff45fff3);
auto c= BN_CTX_get(ctx);
auto e= BN_CTX_get(ctx);
auto cm= BN_CTX_get(ctx);
auto m= BN_CTX_get(ctx);
BN_set_word(m, 0xfffffff3);
int r;
//r = BN_add(a,a, b);
// r = BN_div(c, m, a, b, ctx);
#if 01
//for(int i=0; i<0x7fff; ++i)
{
//r = BN_mod_mul(e, a, b, m, ctx);
r = BN_mod_exp(e, a, b, m, ctx);
}
#endif
BN_MONT_CTX *mont_ctx = BN_MONT_CTX_new();
BN_MONT_CTX_init(mont_ctx);
r =BN_MONT_CTX_set(mont_ctx, m, ctx);
auto am= BN_CTX_get(ctx);
BN_to_montgomery(am, a,mont_ctx, ctx);
auto bm= BN_CTX_get(ctx);
BN_to_montgomery(bm, b,mont_ctx, ctx);
#if 01
//for(int i=0; i<0x7fff; ++i)
{
// r = BN_mod_mul_montgomery(cm, am, bm, mont_ctx, ctx);
// r = BN_from_montgomery(c, cm, mont_ctx, ctx);
//r = BN_mod_exp_mont(cm, am, bm, m, ctx, mont_ctx);
//r = BN_from_montgomery(c, cm, mont_ctx, ctx);
r = BN_mod_exp_mont(c, a, b, m, ctx, mont_ctx);
}
#endif
//r = BN_mod_exp(c,a,b,m,ctx);
//r = BN_mod_exp_mont(c,a,b,m,ctx, mont_ctx);
BN_MONT_CTX_free(mont_ctx);
BN_cmp(a,b);
BN_CTX_free(ctx);
return 0;
}