mirror of
https://github.com/openssl/openssl.git
synced 2024-11-25 02:53:30 +08:00
Add prototypes. Make Montgomery stuff explicitly for that purpose.
This commit is contained in:
parent
cb496082f8
commit
03f8b04277
6
CHANGES
6
CHANGES
@ -5,6 +5,10 @@
|
|||||||
|
|
||||||
Changes between 0.9.1c and 0.9.1d
|
Changes between 0.9.1c and 0.9.1d
|
||||||
|
|
||||||
|
*) Fix the RSA header declarations that hid a bug I fixed in 0.9.0b but
|
||||||
|
was already fixed by Eric for 0.9.1 it seems.
|
||||||
|
[Ben Laurie - pointed out by Ulf M<>öller <ulf@fitug.de>]
|
||||||
|
|
||||||
*) Autodetect FreeBSD3.
|
*) Autodetect FreeBSD3.
|
||||||
[Ben Laurie]
|
[Ben Laurie]
|
||||||
|
|
||||||
@ -79,7 +83,7 @@
|
|||||||
|
|
||||||
*) The Genesis of the OpenSSL rpject:
|
*) The Genesis of the OpenSSL rpject:
|
||||||
We start with the latest (unreleased) SSLeay version 0.9.1b which Eric A.
|
We start with the latest (unreleased) SSLeay version 0.9.1b which Eric A.
|
||||||
Joung and Tim J. Hudson created while they were working for C2Net until
|
Young and Tim J. Hudson created while they were working for C2Net until
|
||||||
summer 1998.
|
summer 1998.
|
||||||
[The OpenSSL Project]
|
[The OpenSSL Project]
|
||||||
|
|
||||||
|
@ -66,9 +66,26 @@ extern "C" {
|
|||||||
#include "bn.h"
|
#include "bn.h"
|
||||||
#include "crypto.h"
|
#include "crypto.h"
|
||||||
|
|
||||||
|
typedef struct rsa_st RSA;
|
||||||
|
|
||||||
typedef struct rsa_meth_st
|
typedef struct rsa_meth_st
|
||||||
{
|
{
|
||||||
char *name;
|
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_enc)();
|
||||||
int (*rsa_pub_dec)();
|
int (*rsa_pub_dec)();
|
||||||
int (*rsa_priv_enc)();
|
int (*rsa_priv_enc)();
|
||||||
@ -77,12 +94,12 @@ typedef struct rsa_meth_st
|
|||||||
int (*bn_mod_exp)(); /* Can be null */
|
int (*bn_mod_exp)(); /* Can be null */
|
||||||
int (*init)(/* RSA * */); /* called at new */
|
int (*init)(/* RSA * */); /* called at new */
|
||||||
int (*finish)(/* RSA * */); /* called at free */
|
int (*finish)(/* RSA * */); /* called at free */
|
||||||
|
#endif
|
||||||
int flags; /* RSA_METHOD_FLAG_* things */
|
int flags; /* RSA_METHOD_FLAG_* things */
|
||||||
char *app_data; /* may be needed! */
|
char *app_data; /* may be needed! */
|
||||||
} RSA_METHOD;
|
} RSA_METHOD;
|
||||||
|
|
||||||
typedef struct rsa_st
|
struct rsa_st
|
||||||
{
|
{
|
||||||
/* The first parameter is used to pickup errors where
|
/* The first parameter is used to pickup errors where
|
||||||
* this is passed instead of aEVP_PKEY, it is set to 0 */
|
* this is passed instead of aEVP_PKEY, it is set to 0 */
|
||||||
@ -102,16 +119,16 @@ typedef struct rsa_st
|
|||||||
int references;
|
int references;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
/* Normally used to cache montgomery values */
|
/* Used to cache montgomery values */
|
||||||
char *method_mod_n;
|
BN_MONT_CTX *_method_mod_n;
|
||||||
char *method_mod_p;
|
BN_MONT_CTX *_method_mod_p;
|
||||||
char *method_mod_q;
|
BN_MONT_CTX *_method_mod_q;
|
||||||
|
|
||||||
/* all BIGNUM values are actually in the following data, if it is not
|
/* all BIGNUM values are actually in the following data, if it is not
|
||||||
* NULL */
|
* NULL */
|
||||||
char *bignum_data;
|
char *bignum_data;
|
||||||
BN_BLINDING *blinding;
|
BN_BLINDING *blinding;
|
||||||
} RSA;
|
};
|
||||||
|
|
||||||
#define RSA_3 0x3L
|
#define RSA_3 0x3L
|
||||||
#define RSA_F4 0x10001L
|
#define RSA_F4 0x10001L
|
||||||
|
@ -144,15 +144,15 @@ int padding;
|
|||||||
|
|
||||||
if (BN_bin2bn(buf,num,&f) == NULL) goto err;
|
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 ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL)
|
||||||
if (!BN_MONT_CTX_set((BN_MONT_CTX *)rsa->method_mod_n,
|
if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx))
|
||||||
rsa->n,ctx)) goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
|
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
|
/* put in leading 0 bytes if the number is less than the
|
||||||
* length of the modulus */
|
* length of the modulus */
|
||||||
@ -380,15 +380,15 @@ int padding;
|
|||||||
|
|
||||||
if (BN_bin2bn(from,flen,&f) == NULL) goto err;
|
if (BN_bin2bn(from,flen,&f) == NULL) goto err;
|
||||||
/* do the decrypt */
|
/* 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 ((rsa->_method_mod_n=BN_MONT_CTX_new()) != NULL)
|
||||||
if (!BN_MONT_CTX_set((BN_MONT_CTX *)rsa->method_mod_n,
|
if (!BN_MONT_CTX_set(rsa->_method_mod_n,rsa->n,ctx))
|
||||||
rsa->n,ctx)) goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!rsa->meth->bn_mod_exp(&ret,&f,rsa->e,rsa->n,ctx,
|
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;
|
p=buf;
|
||||||
i=BN_bn2bin(&ret,p);
|
i=BN_bn2bin(&ret,p);
|
||||||
@ -435,31 +435,29 @@ RSA *rsa;
|
|||||||
|
|
||||||
if (rsa->flags & RSA_FLAG_CACHE_PRIVATE)
|
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 *)
|
if ((rsa->_method_mod_p=BN_MONT_CTX_new()) != NULL)
|
||||||
BN_MONT_CTX_new()) != NULL)
|
if (!BN_MONT_CTX_set(rsa->_method_mod_p,rsa->p,
|
||||||
if (!BN_MONT_CTX_set((BN_MONT_CTX *)
|
ctx))
|
||||||
rsa->method_mod_p,rsa->p,ctx))
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if (rsa->method_mod_q == NULL)
|
if (rsa->_method_mod_q == NULL)
|
||||||
{
|
{
|
||||||
if ((rsa->method_mod_q=(char *)
|
if ((rsa->_method_mod_q=BN_MONT_CTX_new()) != NULL)
|
||||||
BN_MONT_CTX_new()) != NULL)
|
if (!BN_MONT_CTX_set(rsa->_method_mod_q,rsa->q,
|
||||||
if (!BN_MONT_CTX_set((BN_MONT_CTX *)
|
ctx))
|
||||||
rsa->method_mod_q,rsa->q,ctx))
|
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!BN_mod(&r1,I,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,
|
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 (!BN_mod(&r1,I,rsa->p,ctx)) goto err;
|
||||||
if (!rsa->meth->bn_mod_exp(r0,&r1,rsa->dmp1,rsa->p,ctx,
|
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;
|
if (!BN_sub(r0,r0,&m1)) goto err;
|
||||||
/* This will help stop the size of r0 increasing, which does
|
/* This will help stop the size of r0 increasing, which does
|
||||||
@ -490,12 +488,12 @@ RSA *rsa;
|
|||||||
static int RSA_eay_finish(rsa)
|
static int RSA_eay_finish(rsa)
|
||||||
RSA *rsa;
|
RSA *rsa;
|
||||||
{
|
{
|
||||||
if (rsa->method_mod_n != NULL)
|
if (rsa->_method_mod_n != NULL)
|
||||||
BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_n);
|
BN_MONT_CTX_free(rsa->_method_mod_n);
|
||||||
if (rsa->method_mod_p != NULL)
|
if (rsa->_method_mod_p != NULL)
|
||||||
BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_p);
|
BN_MONT_CTX_free(rsa->_method_mod_p);
|
||||||
if (rsa->method_mod_q != NULL)
|
if (rsa->_method_mod_q != NULL)
|
||||||
BN_MONT_CTX_free((BN_MONT_CTX *)rsa->method_mod_q);
|
BN_MONT_CTX_free(rsa->_method_mod_q);
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -116,9 +116,9 @@ RSA_METHOD *meth;
|
|||||||
ret->dmq1=NULL;
|
ret->dmq1=NULL;
|
||||||
ret->iqmp=NULL;
|
ret->iqmp=NULL;
|
||||||
ret->references=1;
|
ret->references=1;
|
||||||
ret->method_mod_n=NULL;
|
ret->_method_mod_n=NULL;
|
||||||
ret->method_mod_p=NULL;
|
ret->_method_mod_p=NULL;
|
||||||
ret->method_mod_q=NULL;
|
ret->_method_mod_q=NULL;
|
||||||
ret->blinding=NULL;
|
ret->blinding=NULL;
|
||||||
ret->bignum_data=NULL;
|
ret->bignum_data=NULL;
|
||||||
ret->flags=ret->meth->flags;
|
ret->flags=ret->meth->flags;
|
||||||
@ -283,8 +283,8 @@ BN_CTX *p_ctx;
|
|||||||
if (!BN_rand(A,BN_num_bits(rsa->n)-1,1,0)) goto err;
|
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 ((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,
|
if (!rsa->meth->bn_mod_exp(A,A,rsa->e,rsa->n,ctx,rsa->_method_mod_n))
|
||||||
(char *)rsa->method_mod_n)) goto err;
|
goto err;
|
||||||
rsa->blinding=BN_BLINDING_new(A,Ai,rsa->n);
|
rsa->blinding=BN_BLINDING_new(A,Ai,rsa->n);
|
||||||
ctx->tos--;
|
ctx->tos--;
|
||||||
rsa->flags|=RSA_FLAG_BLINDING;
|
rsa->flags|=RSA_FLAG_BLINDING;
|
||||||
|
Loading…
Reference in New Issue
Block a user