diff options
Diffstat (limited to 'src/lib/libcrypto/dh/dh_key.c')
| -rw-r--r-- | src/lib/libcrypto/dh/dh_key.c | 34 |
1 files changed, 22 insertions, 12 deletions
diff --git a/src/lib/libcrypto/dh/dh_key.c b/src/lib/libcrypto/dh/dh_key.c index 0c7eeaf260..6915d79dcc 100644 --- a/src/lib/libcrypto/dh/dh_key.c +++ b/src/lib/libcrypto/dh/dh_key.c | |||
| @@ -61,6 +61,7 @@ | |||
| 61 | #include <openssl/bn.h> | 61 | #include <openssl/bn.h> |
| 62 | #include <openssl/rand.h> | 62 | #include <openssl/rand.h> |
| 63 | #include <openssl/dh.h> | 63 | #include <openssl/dh.h> |
| 64 | #include <openssl/engine.h> | ||
| 64 | 65 | ||
| 65 | static int generate_key(DH *dh); | 66 | static int generate_key(DH *dh); |
| 66 | static int compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh); | 67 | static int compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh); |
| @@ -72,12 +73,12 @@ static int dh_finish(DH *dh); | |||
| 72 | 73 | ||
| 73 | int DH_generate_key(DH *dh) | 74 | int DH_generate_key(DH *dh) |
| 74 | { | 75 | { |
| 75 | return dh->meth->generate_key(dh); | 76 | return ENGINE_get_DH(dh->engine)->generate_key(dh); |
| 76 | } | 77 | } |
| 77 | 78 | ||
| 78 | int DH_compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh) | 79 | int DH_compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh) |
| 79 | { | 80 | { |
| 80 | return dh->meth->compute_key(key, pub_key, dh); | 81 | return ENGINE_get_DH(dh->engine)->compute_key(key, pub_key, dh); |
| 81 | } | 82 | } |
| 82 | 83 | ||
| 83 | static DH_METHOD dh_ossl = { | 84 | static DH_METHOD dh_ossl = { |
| @@ -137,8 +138,9 @@ static int generate_key(DH *dh) | |||
| 137 | } | 138 | } |
| 138 | mont=(BN_MONT_CTX *)dh->method_mont_p; | 139 | mont=(BN_MONT_CTX *)dh->method_mont_p; |
| 139 | 140 | ||
| 140 | if (!dh->meth->bn_mod_exp(dh, pub_key,dh->g,priv_key,dh->p,&ctx,mont)) | 141 | if (!ENGINE_get_DH(dh->engine)->bn_mod_exp(dh, pub_key, dh->g, |
| 141 | goto err; | 142 | priv_key,dh->p,&ctx,mont)) |
| 143 | goto err; | ||
| 142 | 144 | ||
| 143 | dh->pub_key=pub_key; | 145 | dh->pub_key=pub_key; |
| 144 | dh->priv_key=priv_key; | 146 | dh->priv_key=priv_key; |
| @@ -177,7 +179,8 @@ static int compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh) | |||
| 177 | } | 179 | } |
| 178 | 180 | ||
| 179 | mont=(BN_MONT_CTX *)dh->method_mont_p; | 181 | mont=(BN_MONT_CTX *)dh->method_mont_p; |
| 180 | if (!dh->meth->bn_mod_exp(dh, tmp,pub_key,dh->priv_key,dh->p,&ctx,mont)) | 182 | if (!ENGINE_get_DH(dh->engine)->bn_mod_exp(dh, tmp, pub_key, |
| 183 | dh->priv_key,dh->p,&ctx,mont)) | ||
| 181 | { | 184 | { |
| 182 | DHerr(DH_F_DH_COMPUTE_KEY,ERR_R_BN_LIB); | 185 | DHerr(DH_F_DH_COMPUTE_KEY,ERR_R_BN_LIB); |
| 183 | goto err; | 186 | goto err; |
| @@ -193,19 +196,26 @@ err: | |||
| 193 | static int dh_bn_mod_exp(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p, | 196 | static int dh_bn_mod_exp(DH *dh, BIGNUM *r, BIGNUM *a, const BIGNUM *p, |
| 194 | const BIGNUM *m, BN_CTX *ctx, | 197 | const BIGNUM *m, BN_CTX *ctx, |
| 195 | BN_MONT_CTX *m_ctx) | 198 | BN_MONT_CTX *m_ctx) |
| 196 | { | 199 | { |
| 197 | return BN_mod_exp_mont(r, a, p, m, ctx, m_ctx); | 200 | if (a->top == 1) |
| 198 | } | 201 | { |
| 202 | BN_ULONG A = a->d[0]; | ||
| 203 | return BN_mod_exp_mont_word(r,A,p,m,ctx,m_ctx); | ||
| 204 | } | ||
| 205 | else | ||
| 206 | return BN_mod_exp_mont(r,a,p,m,ctx,m_ctx); | ||
| 207 | } | ||
| 208 | |||
| 199 | 209 | ||
| 200 | static int dh_init(DH *dh) | 210 | static int dh_init(DH *dh) |
| 201 | { | 211 | { |
| 202 | dh->flags |= DH_FLAG_CACHE_MONT_P; | 212 | dh->flags |= DH_FLAG_CACHE_MONT_P; |
| 203 | return(1); | 213 | return(1); |
| 204 | } | 214 | } |
| 205 | 215 | ||
| 206 | static int dh_finish(DH *dh) | 216 | static int dh_finish(DH *dh) |
| 207 | { | 217 | { |
| 208 | if(dh->method_mont_p) | 218 | if(dh->method_mont_p) |
| 209 | BN_MONT_CTX_free((BN_MONT_CTX *)dh->method_mont_p); | 219 | BN_MONT_CTX_free((BN_MONT_CTX *)dh->method_mont_p); |
| 210 | return(1); | 220 | return(1); |
| 211 | } | 221 | } |
