summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/dh/dh_gen.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/lib/libcrypto/dh/dh_gen.c129
1 files changed, 70 insertions, 59 deletions
diff --git a/src/lib/libcrypto/dh/dh_gen.c b/src/lib/libcrypto/dh/dh_gen.c
index 67bdc5f769..453ea3e8e4 100644
--- a/src/lib/libcrypto/dh/dh_gen.c
+++ b/src/lib/libcrypto/dh/dh_gen.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: dh_gen.c,v 1.11 2014/06/12 15:49:28 deraadt Exp $ */ 1/* $OpenBSD: dh_gen.c,v 1.12 2014/07/09 13:26:47 miod Exp $ */
2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 2/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3 * All rights reserved. 3 * All rights reserved.
4 * 4 *
@@ -66,16 +66,19 @@
66#include <openssl/bn.h> 66#include <openssl/bn.h>
67#include <openssl/dh.h> 67#include <openssl/dh.h>
68 68
69static int dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb); 69static int dh_builtin_genparams(DH *ret, int prime_len, int generator,
70 BN_GENCB *cb);
70 71
71int DH_generate_parameters_ex(DH *ret, int prime_len, int generator, BN_GENCB *cb) 72int
72 { 73DH_generate_parameters_ex(DH *ret, int prime_len, int generator, BN_GENCB *cb)
73 if(ret->meth->generate_params) 74{
75 if (ret->meth->generate_params)
74 return ret->meth->generate_params(ret, prime_len, generator, cb); 76 return ret->meth->generate_params(ret, prime_len, generator, cb);
75 return dh_builtin_genparams(ret, prime_len, generator, cb); 77 return dh_builtin_genparams(ret, prime_len, generator, cb);
76 } 78}
77 79
78/* We generate DH parameters as follows 80/*
81 * We generate DH parameters as follows:
79 * find a prime q which is prime_len/2 bits long. 82 * find a prime q which is prime_len/2 bits long.
80 * p=(2*q)+1 or (p-1)/2 = q 83 * p=(2*q)+1 or (p-1)/2 = q
81 * For this case, g is a generator if 84 * For this case, g is a generator if
@@ -100,76 +103,84 @@ int DH_generate_parameters_ex(DH *ret, int prime_len, int generator, BN_GENCB *c
100 * It's just as OK (and in some sense better) to use a generator of the 103 * It's just as OK (and in some sense better) to use a generator of the
101 * order-q subgroup. 104 * order-q subgroup.
102 */ 105 */
103static int dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb) 106static int
104 { 107dh_builtin_genparams(DH *ret, int prime_len, int generator, BN_GENCB *cb)
105 BIGNUM *t1,*t2; 108{
106 int g,ok= -1; 109 BIGNUM *t1, *t2;
107 BN_CTX *ctx=NULL; 110 int g, ok = -1;
111 BN_CTX *ctx = NULL;
108 112
109 ctx=BN_CTX_new(); 113 ctx = BN_CTX_new();
110 if (ctx == NULL) goto err; 114 if (ctx == NULL)
115 goto err;
111 BN_CTX_start(ctx); 116 BN_CTX_start(ctx);
112 t1 = BN_CTX_get(ctx); 117 t1 = BN_CTX_get(ctx);
113 t2 = BN_CTX_get(ctx); 118 t2 = BN_CTX_get(ctx);
114 if (t1 == NULL || t2 == NULL) goto err; 119 if (t1 == NULL || t2 == NULL)
120 goto err;
115 121
116 /* Make sure 'ret' has the necessary elements */ 122 /* Make sure 'ret' has the necessary elements */
117 if(!ret->p && ((ret->p = BN_new()) == NULL)) goto err; 123 if (!ret->p && ((ret->p = BN_new()) == NULL))
118 if(!ret->g && ((ret->g = BN_new()) == NULL)) goto err; 124 goto err;
125 if (!ret->g && ((ret->g = BN_new()) == NULL))
126 goto err;
119 127
120 if (generator <= 1) 128 if (generator <= 1) {
121 {
122 DHerr(DH_F_DH_BUILTIN_GENPARAMS, DH_R_BAD_GENERATOR); 129 DHerr(DH_F_DH_BUILTIN_GENPARAMS, DH_R_BAD_GENERATOR);
123 goto err; 130 goto err;
124 } 131 }
125 if (generator == DH_GENERATOR_2) 132 if (generator == DH_GENERATOR_2) {
126 { 133 if (!BN_set_word(t1, 24))
127 if (!BN_set_word(t1,24)) goto err; 134 goto err;
128 if (!BN_set_word(t2,11)) goto err; 135 if (!BN_set_word(t2, 11))
129 g=2; 136 goto err;
130 } 137 g = 2;
131#if 0 /* does not work for safe primes */ 138#if 0 /* does not work for safe primes */
132 else if (generator == DH_GENERATOR_3) 139 } else if (generator == DH_GENERATOR_3) {
133 { 140 if (!BN_set_word(t1, 12))
134 if (!BN_set_word(t1,12)) goto err; 141 goto err;
135 if (!BN_set_word(t2,5)) goto err; 142 if (!BN_set_word(t2, 5))
136 g=3; 143 goto err;
137 } 144 g = 3;
138#endif 145#endif
139 else if (generator == DH_GENERATOR_5) 146 } else if (generator == DH_GENERATOR_5) {
140 { 147 if (!BN_set_word(t1, 10))
141 if (!BN_set_word(t1,10)) goto err; 148 goto err;
142 if (!BN_set_word(t2,3)) goto err; 149 if (!BN_set_word(t2, 3))
150 goto err;
143 /* BN_set_word(t3,7); just have to miss 151 /* BN_set_word(t3,7); just have to miss
144 * out on these ones :-( */ 152 * out on these ones :-( */
145 g=5; 153 g = 5;
146 } 154 } else {
147 else 155 /*
148 { 156 * in the general case, don't worry if 'generator' is a
149 /* in the general case, don't worry if 'generator' is a
150 * generator or not: since we are using safe primes, 157 * generator or not: since we are using safe primes,
151 * it will generate either an order-q or an order-2q group, 158 * it will generate either an order-q or an order-2q group,
152 * which both is OK */ 159 * which both is OK
153 if (!BN_set_word(t1,2)) goto err; 160 */
154 if (!BN_set_word(t2,1)) goto err; 161 if (!BN_set_word(t1, 2))
155 g=generator; 162 goto err;
156 } 163 if (!BN_set_word(t2, 1))
164 goto err;
165 g = generator;
166 }
157 167
158 if(!BN_generate_prime_ex(ret->p,prime_len,1,t1,t2,cb)) goto err; 168 if (!BN_generate_prime_ex(ret->p, prime_len, 1, t1, t2, cb))
159 if(!BN_GENCB_call(cb, 3, 0)) goto err; 169 goto err;
160 if (!BN_set_word(ret->g,g)) goto err; 170 if (!BN_GENCB_call(cb, 3, 0))
161 ok=1; 171 goto err;
172 if (!BN_set_word(ret->g, g))
173 goto err;
174 ok = 1;
162err: 175err:
163 if (ok == -1) 176 if (ok == -1) {
164 { 177 DHerr(DH_F_DH_BUILTIN_GENPARAMS, ERR_R_BN_LIB);
165 DHerr(DH_F_DH_BUILTIN_GENPARAMS,ERR_R_BN_LIB); 178 ok = 0;
166 ok=0; 179 }
167 }
168 180
169 if (ctx != NULL) 181 if (ctx != NULL) {
170 {
171 BN_CTX_end(ctx); 182 BN_CTX_end(ctx);
172 BN_CTX_free(ctx); 183 BN_CTX_free(ctx);
173 }
174 return ok;
175 } 184 }
185 return ok;
186}