#include <libecc/libarith.h>
ATTRIBUTE_WARN_UNUSED_RET int miller_rabin(nn_src_t n, const unsigned int t, int *check);
#ifdef FP_EXAMPLE
int main(int argc, char *argv[])
{
nn p;
fp x, x_sqrt1, x_sqrt2;
fp_ctx ctx;
int ret, ret_sqr, isone, check, cmp;
x.magic = x_sqrt1.magic = x_sqrt2.magic = WORD(0);
ctx.magic = WORD(0);
FORCE_USED_VAR(argc);
FORCE_USED_VAR(argv);
while (1) {
ret = nn_init(&p, 0); EG(ret, err);
while (1) {
ret = nn_get_random_maxlen
(&p, (u16)((NN_MAX_BIT_LEN / 3) / 8)); EG(ret, err);
ret = nn_isone(&p, &isone); EG(ret, err);
if(isone){
continue;
}
ret = miller_rabin(&p, 100, &check); EG(ret, err);
if(check == 1){
break;
}
}
nn_print("Prime p", &p);
ret = fp_ctx_init_from_p(&ctx, &p); EG(ret, err);
ret = fp_init(&x, &ctx); EG(ret, err);
ret = fp_init(&x_sqrt1, &ctx); EG(ret, err);
ret = fp_init(&x_sqrt2, &ctx); EG(ret, err);
ret = fp_get_random(&x, &ctx); EG(ret, err);
ext_printf("Random before squaring:\n");
fp_print("x", &x);
ext_printf("Random after squaring:\n");
ret = fp_sqr(&x, &x); EG(ret, err);
nn_print("x^2", &(x.fp_val));
ret_sqr = fp_sqrt(&x_sqrt1, &x_sqrt2, &x);
if (ret_sqr == 0) {
fp_print("sqrt1", &x_sqrt1);
ret = fp_sqr(&x_sqrt1, &x_sqrt1); EG(ret, err);
ret = fp_cmp(&x, &x_sqrt1, &cmp); EG(ret, err);
if (cmp == 0) {
ext_printf("First found square OK!\n");
} else {
ext_printf("First found square NOK: square "
"is not the expected value ...\n");
}
fp_print("sqrt2", &x_sqrt2);
ret = fp_sqr(&x_sqrt2, &x_sqrt2); EG(ret, err);
ret = fp_cmp(&x, &x_sqrt2, &cmp); EG(ret, err);
if (cmp == 0) {
ext_printf("Second found square OK!\n");
} else {
ext_printf("Second found square NOK: square "
"is not the expected value ...\n");
}
} else {
if (ret_sqr == -1) {
ext_printf("Value n has no square over Fp\n");
ext_printf("(Note: this error can be due to "
"Miller-Rabin providing a false "
"positive prime ...)\n");
ext_printf("(though this should happen with "
"negligible probability))\n");
nn_print("Check primality of p =", &p);
break;
} else {
ext_printf("Tonelli-Shanks algorithm unkown "
"error ...\n");
ext_printf("(Note: this error can be due to "
"Miller-Rabin providing a false "
"positive prime ...)\n");
ext_printf("(though this should happen with "
"negligible probability))\n");
nn_print("Check primality of p =", &p);
break;
}
}
}
return 0;
err:
ext_printf("Error: unkown error ...\n");
return -1;
}
#endif