static int e_gmp_rsa_mod_exp(BIGNUM *r, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { E_GMP_RSA_CTX *hptr; int to_return = 0; hptr = e_gmp_get_rsa(rsa); if(!hptr) { GMPerr(GMP_F_E_GMP_RSA_MOD_EXP, GMP_R_KEY_CONTEXT_ERROR); return 0; } if(hptr->public_only) { GMPerr(GMP_F_E_GMP_RSA_MOD_EXP, GMP_R_MISSING_KEY_COMPONENTS); return 0; } /* ugh!!! */ if(!bn2gmp(I, hptr->I0)) return 0; /* This is basically the CRT logic in crypto/rsa/rsa_eay.c reworded into * GMP-speak. It may be that GMP's API facilitates cleaner formulations * of this stuff, eg. better handling of negatives, or functions that * combine operations. */ mpz_mod(hptr->r1, hptr->I0, hptr->q); mpz_powm(hptr->m1, hptr->r1, hptr->dmq1, hptr->q); mpz_mod(hptr->r1, hptr->I0, hptr->p); mpz_powm(hptr->r0, hptr->r1, hptr->dmp1, hptr->p); mpz_sub(hptr->r0, hptr->r0, hptr->m1); if(mpz_sgn(hptr->r0) < 0) mpz_add(hptr->r0, hptr->r0, hptr->p); mpz_mul(hptr->r1, hptr->r0, hptr->iqmp); mpz_mod(hptr->r0, hptr->r1, hptr->p); if(mpz_sgn(hptr->r0) < 0) mpz_add(hptr->r0, hptr->r0, hptr->p); mpz_mul(hptr->r1, hptr->r0, hptr->q); mpz_add(hptr->r0, hptr->r1, hptr->m1); /* ugh!!! */ if(gmp2bn(hptr->r0, r)) to_return = 1; return 1; }
static int e_gmp_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f) (void)) { int to_return = 1; switch (cmd) { /* The command isn't understood by this engine */ default: GMPerr(GMP_F_E_GMP_CTRL, GMP_R_CTRL_COMMAND_NOT_IMPLEMENTED); to_return = 0; break; } return to_return; }