#include <tfm_private.h>
void fp_prime_miller_rabin (fp_int * a, fp_int * b, int *result)
{
fp_int n1, y, r;
int s, j;
*result = FP_NO;
if (fp_cmp_d(b, 1) != FP_GT) {
return;
}
fp_init_copy(&n1, a);
fp_sub_d(&n1, 1, &n1);
fp_init_copy(&r, &n1);
s = fp_cnt_lsb(&r);
fp_div_2d (&r, s, &r, NULL);
fp_init(&y);
fp_exptmod(b, &r, a, &y);
if (fp_cmp_d (&y, 1) != FP_EQ && fp_cmp (&y, &n1) != FP_EQ) {
j = 1;
while ((j <= (s - 1)) && fp_cmp (&y, &n1) != FP_EQ) {
fp_sqrmod (&y, a, &y);
if (fp_cmp_d (&y, 1) == FP_EQ) {
return;
}
++j;
}
if (fp_cmp (&y, &n1) != FP_EQ) {
return;
}
}
*result = FP_YES;
}