diff options
Diffstat (limited to 'src/lib/libcrypto/dh/dh_key.c')
-rw-r--r-- | src/lib/libcrypto/dh/dh_key.c | 52 |
1 files changed, 32 insertions, 20 deletions
diff --git a/src/lib/libcrypto/dh/dh_key.c b/src/lib/libcrypto/dh/dh_key.c index 7576772bcd..cede53bfc1 100644 --- a/src/lib/libcrypto/dh/dh_key.c +++ b/src/lib/libcrypto/dh/dh_key.c | |||
@@ -58,20 +58,19 @@ | |||
58 | 58 | ||
59 | #include <stdio.h> | 59 | #include <stdio.h> |
60 | #include "cryptlib.h" | 60 | #include "cryptlib.h" |
61 | #include "bn.h" | 61 | #include <openssl/bn.h> |
62 | #include "rand.h" | 62 | #include <openssl/rand.h> |
63 | #include "dh.h" | 63 | #include <openssl/dh.h> |
64 | 64 | ||
65 | int DH_generate_key(dh) | 65 | int DH_generate_key(DH *dh) |
66 | DH *dh; | ||
67 | { | 66 | { |
68 | int ok=0; | 67 | int ok=0; |
69 | unsigned int i; | 68 | unsigned int i; |
70 | BN_CTX *ctx=NULL; | 69 | BN_CTX ctx; |
70 | BN_MONT_CTX *mont; | ||
71 | BIGNUM *pub_key=NULL,*priv_key=NULL; | 71 | BIGNUM *pub_key=NULL,*priv_key=NULL; |
72 | 72 | ||
73 | ctx=BN_CTX_new(); | 73 | BN_CTX_init(&ctx); |
74 | if (ctx == NULL) goto err; | ||
75 | 74 | ||
76 | if (dh->priv_key == NULL) | 75 | if (dh->priv_key == NULL) |
77 | { | 76 | { |
@@ -96,7 +95,15 @@ DH *dh; | |||
96 | else | 95 | else |
97 | pub_key=dh->pub_key; | 96 | pub_key=dh->pub_key; |
98 | 97 | ||
99 | if (!BN_mod_exp(pub_key,dh->g,priv_key,dh->p,ctx)) goto err; | 98 | if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P)) |
99 | { | ||
100 | if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL) | ||
101 | if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p, | ||
102 | dh->p,&ctx)) goto err; | ||
103 | } | ||
104 | mont=(BN_MONT_CTX *)dh->method_mont_p; | ||
105 | |||
106 | if (!BN_mod_exp_mont(pub_key,dh->g,priv_key,dh->p,&ctx,mont)) goto err; | ||
100 | 107 | ||
101 | dh->pub_key=pub_key; | 108 | dh->pub_key=pub_key; |
102 | dh->priv_key=priv_key; | 109 | dh->priv_key=priv_key; |
@@ -107,29 +114,34 @@ err: | |||
107 | 114 | ||
108 | if ((pub_key != NULL) && (dh->pub_key == NULL)) BN_free(pub_key); | 115 | if ((pub_key != NULL) && (dh->pub_key == NULL)) BN_free(pub_key); |
109 | if ((priv_key != NULL) && (dh->priv_key == NULL)) BN_free(priv_key); | 116 | if ((priv_key != NULL) && (dh->priv_key == NULL)) BN_free(priv_key); |
110 | if (ctx != NULL) BN_CTX_free(ctx); | 117 | BN_CTX_free(&ctx); |
111 | return(ok); | 118 | return(ok); |
112 | } | 119 | } |
113 | 120 | ||
114 | int DH_compute_key(key,pub_key,dh) | 121 | int DH_compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh) |
115 | unsigned char *key; | ||
116 | BIGNUM *pub_key; | ||
117 | DH *dh; | ||
118 | { | 122 | { |
119 | BN_CTX *ctx; | 123 | BN_CTX ctx; |
124 | BN_MONT_CTX *mont; | ||
120 | BIGNUM *tmp; | 125 | BIGNUM *tmp; |
121 | int ret= -1; | 126 | int ret= -1; |
122 | 127 | ||
123 | ctx=BN_CTX_new(); | 128 | BN_CTX_init(&ctx); |
124 | if (ctx == NULL) goto err; | 129 | tmp= &(ctx.bn[ctx.tos++]); |
125 | tmp=ctx->bn[ctx->tos++]; | ||
126 | 130 | ||
127 | if (dh->priv_key == NULL) | 131 | if (dh->priv_key == NULL) |
128 | { | 132 | { |
129 | DHerr(DH_F_DH_COMPUTE_KEY,DH_R_NO_PRIVATE_VALUE); | 133 | DHerr(DH_F_DH_COMPUTE_KEY,DH_R_NO_PRIVATE_VALUE); |
130 | goto err; | 134 | goto err; |
131 | } | 135 | } |
132 | if (!BN_mod_exp(tmp,pub_key,dh->priv_key,dh->p,ctx)) | 136 | if ((dh->method_mont_p == NULL) && (dh->flags & DH_FLAG_CACHE_MONT_P)) |
137 | { | ||
138 | if ((dh->method_mont_p=(char *)BN_MONT_CTX_new()) != NULL) | ||
139 | if (!BN_MONT_CTX_set((BN_MONT_CTX *)dh->method_mont_p, | ||
140 | dh->p,&ctx)) goto err; | ||
141 | } | ||
142 | |||
143 | mont=(BN_MONT_CTX *)dh->method_mont_p; | ||
144 | if (!BN_mod_exp_mont(tmp,pub_key,dh->priv_key,dh->p,&ctx,mont)) | ||
133 | { | 145 | { |
134 | DHerr(DH_F_DH_COMPUTE_KEY,ERR_R_BN_LIB); | 146 | DHerr(DH_F_DH_COMPUTE_KEY,ERR_R_BN_LIB); |
135 | goto err; | 147 | goto err; |
@@ -137,6 +149,6 @@ DH *dh; | |||
137 | 149 | ||
138 | ret=BN_bn2bin(tmp,key); | 150 | ret=BN_bn2bin(tmp,key); |
139 | err: | 151 | err: |
140 | if (ctx != NULL) BN_CTX_free(ctx); | 152 | BN_CTX_free(&ctx); |
141 | return(ret); | 153 | return(ret); |
142 | } | 154 | } |