summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dh/dh_key.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libcrypto/dh/dh_key.c')
-rw-r--r--src/lib/libcrypto/dh/dh_key.c52
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
65int DH_generate_key(dh) 65int DH_generate_key(DH *dh)
66DH *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
114int DH_compute_key(key,pub_key,dh) 121int DH_compute_key(unsigned char *key, BIGNUM *pub_key, DH *dh)
115unsigned char *key;
116BIGNUM *pub_key;
117DH *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);
139err: 151err:
140 if (ctx != NULL) BN_CTX_free(ctx); 152 BN_CTX_free(&ctx);
141 return(ret); 153 return(ret);
142 } 154 }