#include "bn.h"
#include "crypto.h"
+typedef struct rsa_st RSA;
+
typedef struct rsa_meth_st
{
char *name;
+#ifndef NOPROTO
+ int (*rsa_pub_enc)(int flen,unsigned char *from,unsigned char *to,
+ RSA *rsa,int padding);
+ int (*rsa_pub_dec)(int flen,unsigned char *from,unsigned char *to,
+ RSA *rsa,int padding);
+ int (*rsa_priv_enc)(int flen,unsigned char *from,unsigned char *to,
+ RSA *rsa,int padding);
+ int (*rsa_priv_dec)(int flen,unsigned char *from,unsigned char *to,
+ RSA *rsa,int padding);
+ int (*rsa_mod_exp)(BIGNUM *r0,BIGNUM *I,RSA *rsa); /* Can be null */
+ int (*bn_mod_exp)(BIGNUM *r, BIGNUM *a, BIGNUM *p, BIGNUM *m,
+ BN_CTX *ctx,BN_MONT_CTX *m_ctx); /* Can be null */
+ int (*init)(RSA *rsa); /* called at new */
+ int (*finish)(RSA *rsa); /* called at free */
+#else
int (*rsa_pub_enc)();
int (*rsa_pub_dec)();
int (*rsa_priv_enc)();
int (*bn_mod_exp)(); /* Can be null */
int (*init)(/* RSA * */); /* called at new */
int (*finish)(/* RSA * */); /* called at free */
-
+#endif
int flags; /* RSA_METHOD_FLAG_* things */
char *app_data; /* may be needed! */
} RSA_METHOD;
-typedef struct rsa_st
+struct rsa_st
{
/* The first parameter is used to pickup errors where
* this is passed instead of aEVP_PKEY, it is set to 0 */
int references;
int flags;
- /* Normally used to cache montgomery values */
- char *method_mod_n;
- char *method_mod_p;
- char *method_mod_q;
+ /* Used to cache montgomery values */
+ BN_MONT_CTX *_method_mod_n;
+ BN_MONT_CTX *_method_mod_p;
+ BN_MONT_CTX *_method_mod_q;
/* all BIGNUM values are actually in the following data, if it is not
* NULL */
char *bignum_data;
BN_BLINDING *blinding;
- } RSA;
+ };
#define RSA_3 0x3L
#define RSA_F4 0x10001L
if (BN_bin2bn(buf,num,&f) == NULL) goto err;
- if ((rsa->method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
+ if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
{
- if ((rsa->method_mod_n=(char *)BN_MONT_CTX_new()) != NULL)
- if (!BN_MONT_CTX_set((BN_MONT_CTX *)rsa->method_mod_n,
- rsa->n,ctx)) goto err;
+ if ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL)
+ if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx))
+ goto err;
}
if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
- rsa->method_mod_n)) goto err;
+ rsa->_method_mod_n)) goto err;
/* put in leading 0 bytes if the number is less than the
* length of the modulus */
if (BN_bin2bn(from,flen,&f) == NULL) goto err;
/* do the decrypt */
- if ((rsa->method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
+ if ((rsa->_method_mod_n == NULL) && (rsa->flags & RSA_FLAG_CACHE_PUBLIC))
{
- if ((rsa->method_mod_n=(char *)BN_MONT_CTX_new()) != NULL)
- if (!BN_MONT_CTX_set((BN_MONT_CTX *)rsa->method_mod_n,
- rsa->n,ctx)) goto err;
+ if ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL)
+ if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx))
+ goto err;
}
if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
- rsa->method_mod_n)) goto err;
+ rsa->_method_mod_n)) goto err;
p=buf;
i=BN_bn2bin(&ret,p);
if (rsa->flags & RSA_FLAG_CACHE_PRIVATE)
{
- if (rsa->method_mod_p == NULL)
+ if (rsa->_method_mod_p == NULL)
{
- if ((rsa->method_mod_p=(char *)
- BN_MONT_CTX_new()) != NULL)
- if (!BN_MONT_CTX_set((BN_MONT_CTX *)
- rsa->method_mod_p,rsa->p,ctx))
+ if ((rsa->_method_mod_p=BN_MONT_CTX_new()) != NULL)
+ if (!BN_MONT_CTX_set(rsa->_method_mod_p,rsa->p,
+ ctx))
goto err;
}
- if (rsa->method_mod_q == NULL)
+ if (rsa->_method_mod_q == NULL)
{
- if ((rsa->method_mod_q=(char *)
- BN_MONT_CTX_new()) != NULL)
- if (!BN_MONT_CTX_set((BN_MONT_CTX *)
- rsa->method_mod_q,rsa->q,ctx))
+ if ((rsa->_method_mod_q=BN_MONT_CTX_new()) != NULL)
+ if (!BN_MONT_CTX_set(rsa->_method_mod_q,rsa->q,
+ ctx))
goto err;
}
}
if (!BN_mod(&r1,I,rsa->q,ctx)) goto err;
if (!rsa->meth->bn_mod_exp(&m1,&r1,rsa->dmq1,rsa->q,ctx,
- rsa->method_mod_q)) goto err;
+ rsa->_method_mod_q)) goto err;
if (!BN_mod(&r1,I,rsa->p,ctx)) goto err;
if (!rsa->meth->bn_mod_exp(r0,&r1,rsa->dmp1,rsa->p,ctx,
- rsa->method_mod_p)) goto err;
+ rsa->_method_mod_p)) goto err;
if (!BN_sub(r0,r0,&m1)) goto err;
/* This will help stop the size of r0 increasing, which does
static int RSA_eay_finish(rsa)
RSA *rsa;
{
- if (rsa->method_mod_n != NULL)
- BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_n);
- if (rsa->method_mod_p != NULL)
- BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_p);
- if (rsa->method_mod_q != NULL)
- BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_q);
+ if (rsa->_method_mod_n != NULL)
+ BN_MONT_CTX_free(rsa->_method_mod_n);
+ if (rsa->_method_mod_p != NULL)
+ BN_MONT_CTX_free(rsa->_method_mod_p);
+ if (rsa->_method_mod_q != NULL)
+ BN_MONT_CTX_free(rsa->_method_mod_q);
return(1);
}
ret->dmq1=NULL;
ret->iqmp=NULL;
ret->references=1;
- ret->method_mod_n=NULL;
- ret->method_mod_p=NULL;
- ret->method_mod_q=NULL;
+ ret->_method_mod_n=NULL;
+ ret->_method_mod_p=NULL;
+ ret->_method_mod_q=NULL;
ret->blinding=NULL;
ret->bignum_data=NULL;
ret->flags=ret->meth->flags;
if (!BN_rand(A,BN_num_bits(rsa->n)-1,1,0)) goto err;
if ((Ai=BN_mod_inverse(NULL,A,rsa->n,ctx)) == NULL) goto err;
- if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,
- (char *)rsa->method_mod_n)) goto err;
+ if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,rsa->_method_mod_n))
+ goto err;
rsa->blinding=BN_BLINDING_new(A,Ai,rsa->n);
ctx->tos--;
rsa->flags|=RSA_FLAG_BLINDING;