static void barrett_mulm( gcry_mpi_t w, gcry_mpi_t u, gcry_mpi_t v, gcry_mpi_t m, gcry_mpi_t y, int k, gcry_mpi_t r1, gcry_mpi_t r2 ) { mpi_mul(w, u, v); if( calc_barrett( w, w, m, y, k, r1, r2 ) ) mpi_fdiv_r( w, w, m ); }
/**************** * Find the greatest common divisor G of A and B. * Return: true if this 1, false in all other cases */ int mpi_gcd( MPI g, const MPI xa, const MPI xb ) { MPI a = NULL, b = NULL; if (mpi_copy(&a, xa) < 0) goto nomem; if (mpi_copy(&b, xb) < 0) goto nomem; /* TAOCP Vol II, 4.5.2, Algorithm A */ a->sign = 0; b->sign = 0; while( mpi_cmp_ui( b, 0 ) ) { if (mpi_fdiv_r( g, a, b ) < 0) /* g used as temorary variable */ goto nomem; if (mpi_set(a,b) < 0) goto nomem; if (mpi_set(b,g) < 0) goto nomem; } if (mpi_set(g, a) < 0) goto nomem; mpi_free(a); mpi_free(b); return !mpi_cmp_ui( g, 1); nomem: mpi_free(a); mpi_free(b); return -ENOMEM; }
static void do_rem(void) { if( stackidx < 2 ) { fputs("stack underflow\n", stderr); return; } mpi_fdiv_r( stack[stackidx-2], stack[stackidx-2], stack[stackidx-1] ); stackidx--; }
/**************** * Find the greatest common divisor G of A and B. * Return: true if this 1, false in all other cases */ int mpi_gcd( MPI g, MPI xa, MPI xb ) { MPI a, b; a = mpi_copy(xa); b = mpi_copy(xb); /* TAOCP Vol II, 4.5.2, Algorithm A */ a->sign = 0; b->sign = 0; while( mpi_cmp_ui( b, 0 ) ) { mpi_fdiv_r( g, a, b ); /* g used as temorary variable */ mpi_set(a,b); mpi_set(b,g); } mpi_set(g, a); mpi_free(a); mpi_free(b); return !mpi_cmp_ui( g, 1); }
void mpi_mulm( MPI w, MPI u, MPI v, MPI m) { mpi_mul(w, u, v); mpi_fdiv_r( w, w, m ); }
int mpi_subm(MPI w, MPI u, MPI v, MPI m) { if (mpi_sub(w, u, v) < 0 || mpi_fdiv_r(w, w, m) < 0) return -ENOMEM; return 0; }
void mpi_subm( MPI w, MPI u, MPI v, MPI m) { mpi_sub(w, u, v); mpi_fdiv_r( w, w, m ); }
void mpi_addm( MPI w, MPI u, MPI v, MPI m) { mpi_add(w, u, v); mpi_fdiv_r( w, w, m ); }
int mpi_mulm(MPI w, MPI u, MPI v, MPI m) { if (mpi_mul(w, u, v) < 0) return -ENOMEM; return mpi_fdiv_r(w, w, m); }