summaryrefslogtreecommitdiff
path: root/dh.c
diff options
context:
space:
mode:
Diffstat (limited to 'dh.c')
-rw-r--r--dh.c109
1 files changed, 108 insertions, 1 deletions
diff --git a/dh.c b/dh.c
index 636758fa8..6c53b0038 100644
--- a/dh.c
+++ b/dh.c
@@ -23,7 +23,7 @@
23 */ 23 */
24 24
25#include "includes.h" 25#include "includes.h"
26RCSID("$OpenBSD: dh.c,v 1.10 2001/03/28 22:04:57 provos Exp $"); 26RCSID("$OpenBSD: dh.c,v 1.11 2001/03/29 21:17:39 markus Exp $");
27 27
28#include "xmalloc.h" 28#include "xmalloc.h"
29 29
@@ -166,3 +166,110 @@ choose_dh(int min, int wantbits, int max)
166 166
167 return (dh_new_group(dhg.g, dhg.p)); 167 return (dh_new_group(dhg.g, dhg.p));
168} 168}
169
170/* diffie-hellman-group1-sha1 */
171
172int
173dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
174{
175 int i;
176 int n = BN_num_bits(dh_pub);
177 int bits_set = 0;
178
179 if (dh_pub->neg) {
180 log("invalid public DH value: negativ");
181 return 0;
182 }
183 for (i = 0; i <= n; i++)
184 if (BN_is_bit_set(dh_pub, i))
185 bits_set++;
186 debug("bits set: %d/%d", bits_set, BN_num_bits(dh->p));
187
188 /* if g==2 and bits_set==1 then computing log_g(dh_pub) is trivial */
189 if (bits_set > 1 && (BN_cmp(dh_pub, dh->p) == -1))
190 return 1;
191 log("invalid public DH value (%d/%d)", bits_set, BN_num_bits(dh->p));
192 return 0;
193}
194
195void
196dh_gen_key(DH *dh, int need)
197{
198 int i, bits_set = 0, tries = 0;
199
200 if (dh->p == NULL)
201 fatal("dh_gen_key: dh->p == NULL");
202 if (2*need >= BN_num_bits(dh->p))
203 fatal("dh_gen_key: group too small: %d (2*need %d)",
204 BN_num_bits(dh->p), 2*need);
205 do {
206 if (dh->priv_key != NULL)
207 BN_free(dh->priv_key);
208 dh->priv_key = BN_new();
209 if (dh->priv_key == NULL)
210 fatal("dh_gen_key: BN_new failed");
211 /* generate a 2*need bits random private exponent */
212 if (!BN_rand(dh->priv_key, 2*need, 0, 0))
213 fatal("dh_gen_key: BN_rand failed");
214 if (DH_generate_key(dh) == 0)
215 fatal("DH_generate_key");
216 for (i = 0; i <= BN_num_bits(dh->priv_key); i++)
217 if (BN_is_bit_set(dh->priv_key, i))
218 bits_set++;
219 debug("dh_gen_key: priv key bits set: %d/%d",
220 bits_set, BN_num_bits(dh->priv_key));
221 if (tries++ > 10)
222 fatal("dh_gen_key: too many bad keys: giving up");
223 } while (!dh_pub_is_valid(dh, dh->pub_key));
224}
225
226DH *
227dh_new_group_asc(const char *gen, const char *modulus)
228{
229 DH *dh;
230 int ret;
231
232 dh = DH_new();
233 if (dh == NULL)
234 fatal("DH_new");
235
236 if ((ret = BN_hex2bn(&dh->p, modulus)) < 0)
237 fatal("BN_hex2bn p");
238 if ((ret = BN_hex2bn(&dh->g, gen)) < 0)
239 fatal("BN_hex2bn g");
240
241 return (dh);
242}
243
244/*
245 * This just returns the group, we still need to generate the exchange
246 * value.
247 */
248
249DH *
250dh_new_group(BIGNUM *gen, BIGNUM *modulus)
251{
252 DH *dh;
253
254 dh = DH_new();
255 if (dh == NULL)
256 fatal("DH_new");
257 dh->p = modulus;
258 dh->g = gen;
259
260 return (dh);
261}
262
263DH *
264dh_new_group1(void)
265{
266 static char *gen = "2", *group1 =
267 "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
268 "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
269 "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
270 "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
271 "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
272 "FFFFFFFF" "FFFFFFFF";
273
274 return (dh_new_group_asc(gen, group1));
275}