static int cswift_rsa_mod_exp(BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx) { int to_return = 0; const RSA_METHOD * def_rsa_method; /* Try the limits of RSA (2048 bits) */ if(BN_num_bytes(rsa->p) > 128 || BN_num_bytes(rsa->q) > 128 || BN_num_bytes(rsa->dmp1) > 128 || BN_num_bytes(rsa->dmq1) > 128 || BN_num_bytes(rsa->iqmp) > 128) { #ifdef RSA_NULL def_rsa_method=RSA_null_method(); #else #if 0 def_rsa_method=RSA_PKCS1_RSAref(); #else def_rsa_method=RSA_PKCS1_SSLeay(); #endif #endif if(def_rsa_method) return def_rsa_method->rsa_mod_exp(r0, I, rsa, ctx); } if(!rsa->p || !rsa->q || !rsa->dmp1 || !rsa->dmq1 || !rsa->iqmp) { CSWIFTerr(CSWIFT_F_CSWIFT_RSA_MOD_EXP,CSWIFT_R_MISSING_KEY_COMPONENTS); goto err; } to_return = cswift_mod_exp_crt(r0, I, rsa->p, rsa->q, rsa->dmp1, rsa->dmq1, rsa->iqmp, ctx); err: return to_return; }
/* This function is aliased to mod_exp (with the mont stuff dropped). */ static int cswift_mod_exp_mont(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx) { const RSA_METHOD * def_rsa_method; /* Try the limits of RSA (2048 bits) */ if(BN_num_bytes(r) > 256 || BN_num_bytes(a) > 256 || BN_num_bytes(m) > 256) { #ifdef RSA_NULL def_rsa_method=RSA_null_method(); #else #if 0 def_rsa_method=RSA_PKCS1_RSAref(); #else def_rsa_method=RSA_PKCS1_SSLeay(); #endif #endif if(def_rsa_method) return def_rsa_method->bn_mod_exp(r, a, p, m, ctx, m_ctx); } return cswift_mod_exp(r, a, p, m, ctx); }
RSA *RSA_new_method(const RSA_METHOD *meth) { RSA *ret; if (default_RSA_meth == NULL) { #ifdef RSA_NULL default_RSA_meth=RSA_null_method(); #else #ifdef RSAref default_RSA_meth=RSA_PKCS1_RSAref(); #else default_RSA_meth=RSA_PKCS1_SSLeay(); #endif #endif } ret=(RSA *)Malloc(sizeof(RSA)); if (ret == NULL) { RSAerr(RSA_F_RSA_NEW_METHOD,ERR_R_MALLOC_FAILURE); return(NULL); } if (meth == NULL) ret->meth=default_RSA_meth; else ret->meth=meth; ret->pad=0; ret->version=0; ret->n=NULL; ret->e=NULL; ret->d=NULL; ret->p=NULL; ret->q=NULL; ret->dmp1=NULL; ret->dmq1=NULL; ret->iqmp=NULL; ret->references=1; ret->_method_mod_n=NULL; ret->_method_mod_p=NULL; ret->_method_mod_q=NULL; // make blinding per thread ret->num_blinding_threads = 0; pthread_mutex_init(&ret->blinding_mutex, NULL); ret->blinding_array = NULL; ret->bignum_data=NULL; ret->flags=ret->meth->flags; if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { Free(ret); ret=NULL; } else CRYPTO_new_ex_data(rsa_meth,ret,&ret->ex_data); return(ret); }
const RSA_METHOD *RSA_get_default_method(void) { if (default_RSA_meth == NULL) { #ifdef RSA_NULL default_RSA_meth=RSA_null_method(); #else #if 0 /* was: #ifdef RSAref */ default_RSA_meth=RSA_PKCS1_RSAref(); #else default_RSA_meth=RSA_PKCS1_SSLeay(); #endif #endif } return default_RSA_meth; }