xref: /dragonfly/crypto/openssh/dh.c (revision f2a91d31)
1 /* $OpenBSD: dh.c,v 1.60 2016/05/02 10:26:04 djm Exp $ */
2 /*
3  * Copyright (c) 2000 Niels Provos.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
15  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
16  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
17  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
18  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
19  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
20  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
21  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
23  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25 
26 #include "includes.h"
27 
28 #include <sys/param.h>	/* MIN */
29 
30 #include <openssl/bn.h>
31 #include <openssl/dh.h>
32 
33 #include <errno.h>
34 #include <stdarg.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <limits.h>
39 
40 #include "dh.h"
41 #include "pathnames.h"
42 #include "log.h"
43 #include "misc.h"
44 #include "ssherr.h"
45 
46 static int
47 parse_prime(int linenum, char *line, struct dhgroup *dhg)
48 {
49 	char *cp, *arg;
50 	char *strsize, *gen, *prime;
51 	const char *errstr = NULL;
52 	long long n;
53 
54 	dhg->p = dhg->g = NULL;
55 	cp = line;
56 	if ((arg = strdelim(&cp)) == NULL)
57 		return 0;
58 	/* Ignore leading whitespace */
59 	if (*arg == '\0')
60 		arg = strdelim(&cp);
61 	if (!arg || !*arg || *arg == '#')
62 		return 0;
63 
64 	/* time */
65 	if (cp == NULL || *arg == '\0')
66 		goto truncated;
67 	arg = strsep(&cp, " "); /* type */
68 	if (cp == NULL || *arg == '\0')
69 		goto truncated;
70 	/* Ensure this is a safe prime */
71 	n = strtonum(arg, 0, 5, &errstr);
72 	if (errstr != NULL || n != MODULI_TYPE_SAFE) {
73 		error("moduli:%d: type is not %d", linenum, MODULI_TYPE_SAFE);
74 		goto fail;
75 	}
76 	arg = strsep(&cp, " "); /* tests */
77 	if (cp == NULL || *arg == '\0')
78 		goto truncated;
79 	/* Ensure prime has been tested and is not composite */
80 	n = strtonum(arg, 0, 0x1f, &errstr);
81 	if (errstr != NULL ||
82 	    (n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE)) {
83 		error("moduli:%d: invalid moduli tests flag", linenum);
84 		goto fail;
85 	}
86 	arg = strsep(&cp, " "); /* tries */
87 	if (cp == NULL || *arg == '\0')
88 		goto truncated;
89 	n = strtonum(arg, 0, 1<<30, &errstr);
90 	if (errstr != NULL || n == 0) {
91 		error("moduli:%d: invalid primality trial count", linenum);
92 		goto fail;
93 	}
94 	strsize = strsep(&cp, " "); /* size */
95 	if (cp == NULL || *strsize == '\0' ||
96 	    (dhg->size = (int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 ||
97 	    errstr) {
98 		error("moduli:%d: invalid prime length", linenum);
99 		goto fail;
100 	}
101 	/* The whole group is one bit larger */
102 	dhg->size++;
103 	gen = strsep(&cp, " "); /* gen */
104 	if (cp == NULL || *gen == '\0')
105 		goto truncated;
106 	prime = strsep(&cp, " "); /* prime */
107 	if (cp != NULL || *prime == '\0') {
108  truncated:
109 		error("moduli:%d: truncated", linenum);
110 		goto fail;
111 	}
112 
113 	if ((dhg->g = BN_new()) == NULL ||
114 	    (dhg->p = BN_new()) == NULL) {
115 		error("parse_prime: BN_new failed");
116 		goto fail;
117 	}
118 	if (BN_hex2bn(&dhg->g, gen) == 0) {
119 		error("moduli:%d: could not parse generator value", linenum);
120 		goto fail;
121 	}
122 	if (BN_hex2bn(&dhg->p, prime) == 0) {
123 		error("moduli:%d: could not parse prime value", linenum);
124 		goto fail;
125 	}
126 	if (BN_num_bits(dhg->p) != dhg->size) {
127 		error("moduli:%d: prime has wrong size: actual %d listed %d",
128 		    linenum, BN_num_bits(dhg->p), dhg->size - 1);
129 		goto fail;
130 	}
131 	if (BN_cmp(dhg->g, BN_value_one()) <= 0) {
132 		error("moduli:%d: generator is invalid", linenum);
133 		goto fail;
134 	}
135 	return 1;
136 
137  fail:
138 	if (dhg->g != NULL)
139 		BN_clear_free(dhg->g);
140 	if (dhg->p != NULL)
141 		BN_clear_free(dhg->p);
142 	dhg->g = dhg->p = NULL;
143 	return 0;
144 }
145 
146 DH *
147 choose_dh(int min, int wantbits, int max)
148 {
149 	FILE *f;
150 	char line[4096];
151 	int best, bestcount, which;
152 	int linenum;
153 	struct dhgroup dhg;
154 
155 	if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL) {
156 		logit("WARNING: could open open %s (%s), using fixed modulus",
157 		    _PATH_DH_MODULI, strerror(errno));
158 		return (dh_new_group_fallback(max));
159 	}
160 
161 	linenum = 0;
162 	best = bestcount = 0;
163 	while (fgets(line, sizeof(line), f)) {
164 		linenum++;
165 		if (!parse_prime(linenum, line, &dhg))
166 			continue;
167 		BN_clear_free(dhg.g);
168 		BN_clear_free(dhg.p);
169 
170 		if (dhg.size > max || dhg.size < min)
171 			continue;
172 
173 		if ((dhg.size > wantbits && dhg.size < best) ||
174 		    (dhg.size > best && best < wantbits)) {
175 			best = dhg.size;
176 			bestcount = 0;
177 		}
178 		if (dhg.size == best)
179 			bestcount++;
180 	}
181 	rewind(f);
182 
183 	if (bestcount == 0) {
184 		fclose(f);
185 		logit("WARNING: no suitable primes in %s", _PATH_DH_MODULI);
186 		return (dh_new_group_fallback(max));
187 	}
188 
189 	linenum = 0;
190 	which = arc4random_uniform(bestcount);
191 	while (fgets(line, sizeof(line), f)) {
192 		if (!parse_prime(linenum, line, &dhg))
193 			continue;
194 		if ((dhg.size > max || dhg.size < min) ||
195 		    dhg.size != best ||
196 		    linenum++ != which) {
197 			BN_clear_free(dhg.g);
198 			BN_clear_free(dhg.p);
199 			continue;
200 		}
201 		break;
202 	}
203 	fclose(f);
204 	if (linenum != which+1) {
205 		logit("WARNING: line %d disappeared in %s, giving up",
206 		    which, _PATH_DH_MODULI);
207 		return (dh_new_group_fallback(max));
208 	}
209 
210 	return (dh_new_group(dhg.g, dhg.p));
211 }
212 
213 /* diffie-hellman-groupN-sha1 */
214 
215 int
216 dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
217 {
218 	int i;
219 	int n = BN_num_bits(dh_pub);
220 	int bits_set = 0;
221 	BIGNUM *tmp;
222 
223 	if (dh_pub->neg) {
224 		logit("invalid public DH value: negative");
225 		return 0;
226 	}
227 	if (BN_cmp(dh_pub, BN_value_one()) != 1) {	/* pub_exp <= 1 */
228 		logit("invalid public DH value: <= 1");
229 		return 0;
230 	}
231 
232 	if ((tmp = BN_new()) == NULL) {
233 		error("%s: BN_new failed", __func__);
234 		return 0;
235 	}
236 	if (!BN_sub(tmp, dh->p, BN_value_one()) ||
237 	    BN_cmp(dh_pub, tmp) != -1) {		/* pub_exp > p-2 */
238 		BN_clear_free(tmp);
239 		logit("invalid public DH value: >= p-1");
240 		return 0;
241 	}
242 	BN_clear_free(tmp);
243 
244 	for (i = 0; i <= n; i++)
245 		if (BN_is_bit_set(dh_pub, i))
246 			bits_set++;
247 	debug2("bits set: %d/%d", bits_set, BN_num_bits(dh->p));
248 
249 	/*
250 	 * if g==2 and bits_set==1 then computing log_g(dh_pub) is trivial
251 	 */
252 	if (bits_set < 4) {
253 		logit("invalid public DH value (%d/%d)",
254 		   bits_set, BN_num_bits(dh->p));
255 		return 0;
256 	}
257 	return 1;
258 }
259 
260 int
261 dh_gen_key(DH *dh, int need)
262 {
263 	int pbits;
264 
265 	if (need < 0 || dh->p == NULL ||
266 	    (pbits = BN_num_bits(dh->p)) <= 0 ||
267 	    need > INT_MAX / 2 || 2 * need > pbits)
268 		return SSH_ERR_INVALID_ARGUMENT;
269 	if (need < 256)
270 		need = 256;
271 	/*
272 	 * Pollard Rho, Big step/Little Step attacks are O(sqrt(n)),
273 	 * so double requested need here.
274 	 */
275 	dh->length = MIN(need * 2, pbits - 1);
276 	if (DH_generate_key(dh) == 0 ||
277 	    !dh_pub_is_valid(dh, dh->pub_key)) {
278 		BN_clear_free(dh->priv_key);
279 		return SSH_ERR_LIBCRYPTO_ERROR;
280 	}
281 	return 0;
282 }
283 
284 DH *
285 dh_new_group_asc(const char *gen, const char *modulus)
286 {
287 	DH *dh;
288 
289 	if ((dh = DH_new()) == NULL)
290 		return NULL;
291 	if (BN_hex2bn(&dh->p, modulus) == 0 ||
292 	    BN_hex2bn(&dh->g, gen) == 0) {
293 		DH_free(dh);
294 		return NULL;
295 	}
296 	return (dh);
297 }
298 
299 /*
300  * This just returns the group, we still need to generate the exchange
301  * value.
302  */
303 
304 DH *
305 dh_new_group(BIGNUM *gen, BIGNUM *modulus)
306 {
307 	DH *dh;
308 
309 	if ((dh = DH_new()) == NULL)
310 		return NULL;
311 	dh->p = modulus;
312 	dh->g = gen;
313 
314 	return (dh);
315 }
316 
317 /* rfc2409 "Second Oakley Group" (1024 bits) */
318 DH *
319 dh_new_group1(void)
320 {
321 	static char *gen = "2", *group1 =
322 	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
323 	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
324 	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
325 	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
326 	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
327 	    "FFFFFFFF" "FFFFFFFF";
328 
329 	return (dh_new_group_asc(gen, group1));
330 }
331 
332 /* rfc3526 group 14 "2048-bit MODP Group" */
333 DH *
334 dh_new_group14(void)
335 {
336 	static char *gen = "2", *group14 =
337 	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
338 	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
339 	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
340 	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
341 	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
342 	    "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
343 	    "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
344 	    "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
345 	    "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
346 	    "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
347 	    "15728E5A" "8AACAA68" "FFFFFFFF" "FFFFFFFF";
348 
349 	return (dh_new_group_asc(gen, group14));
350 }
351 
352 /* rfc3526 group 16 "4096-bit MODP Group" */
353 DH *
354 dh_new_group16(void)
355 {
356 	static char *gen = "2", *group16 =
357 	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
358 	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
359 	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
360 	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
361 	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
362 	    "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
363 	    "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
364 	    "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
365 	    "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
366 	    "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
367 	    "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
368 	    "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
369 	    "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
370 	    "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
371 	    "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
372 	    "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
373 	    "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
374 	    "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
375 	    "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
376 	    "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
377 	    "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34063199"
378 	    "FFFFFFFF" "FFFFFFFF";
379 
380 	return (dh_new_group_asc(gen, group16));
381 }
382 
383 /* rfc3526 group 18 "8192-bit MODP Group" */
384 DH *
385 dh_new_group18(void)
386 {
387 	static char *gen = "2", *group16 =
388 	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
389 	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
390 	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
391 	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
392 	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
393 	    "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
394 	    "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
395 	    "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
396 	    "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
397 	    "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
398 	    "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
399 	    "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
400 	    "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
401 	    "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
402 	    "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
403 	    "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
404 	    "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
405 	    "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
406 	    "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
407 	    "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
408 	    "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34028492"
409 	    "36C3FAB4" "D27C7026" "C1D4DCB2" "602646DE" "C9751E76" "3DBA37BD"
410 	    "F8FF9406" "AD9E530E" "E5DB382F" "413001AE" "B06A53ED" "9027D831"
411 	    "179727B0" "865A8918" "DA3EDBEB" "CF9B14ED" "44CE6CBA" "CED4BB1B"
412 	    "DB7F1447" "E6CC254B" "33205151" "2BD7AF42" "6FB8F401" "378CD2BF"
413 	    "5983CA01" "C64B92EC" "F032EA15" "D1721D03" "F482D7CE" "6E74FEF6"
414 	    "D55E702F" "46980C82" "B5A84031" "900B1C9E" "59E7C97F" "BEC7E8F3"
415 	    "23A97A7E" "36CC88BE" "0F1D45B7" "FF585AC5" "4BD407B2" "2B4154AA"
416 	    "CC8F6D7E" "BF48E1D8" "14CC5ED2" "0F8037E0" "A79715EE" "F29BE328"
417 	    "06A1D58B" "B7C5DA76" "F550AA3D" "8A1FBFF0" "EB19CCB1" "A313D55C"
418 	    "DA56C9EC" "2EF29632" "387FE8D7" "6E3C0468" "043E8F66" "3F4860EE"
419 	    "12BF2D5B" "0B7474D6" "E694F91E" "6DBE1159" "74A3926F" "12FEE5E4"
420 	    "38777CB6" "A932DF8C" "D8BEC4D0" "73B931BA" "3BC832B6" "8D9DD300"
421 	    "741FA7BF" "8AFC47ED" "2576F693" "6BA42466" "3AAB639C" "5AE4F568"
422 	    "3423B474" "2BF1C978" "238F16CB" "E39D652D" "E3FDB8BE" "FC848AD9"
423 	    "22222E04" "A4037C07" "13EB57A8" "1A23F0C7" "3473FC64" "6CEA306B"
424 	    "4BCBC886" "2F8385DD" "FA9D4B7F" "A2C087E8" "79683303" "ED5BDD3A"
425 	    "062B3CF5" "B3A278A6" "6D2A13F8" "3F44F82D" "DF310EE0" "74AB6A36"
426 	    "4597E899" "A0255DC1" "64F31CC5" "0846851D" "F9AB4819" "5DED7EA1"
427 	    "B1D510BD" "7EE74D73" "FAF36BC3" "1ECFA268" "359046F4" "EB879F92"
428 	    "4009438B" "481C6CD7" "889A002E" "D5EE382B" "C9190DA6" "FC026E47"
429 	    "9558E447" "5677E9AA" "9E3050E2" "765694DF" "C81F56E8" "80B96E71"
430 	    "60C980DD" "98EDD3DF" "FFFFFFFF" "FFFFFFFF";
431 
432 	return (dh_new_group_asc(gen, group16));
433 }
434 
435 /* Select fallback group used by DH-GEX if moduli file cannot be read. */
436 DH *
437 dh_new_group_fallback(int max)
438 {
439 	debug3("%s: requested max size %d", __func__, max);
440 	if (max < 3072) {
441 		debug3("using 2k bit group 14");
442 		return dh_new_group14();
443 	} else if (max < 6144) {
444 		debug3("using 4k bit group 16");
445 		return dh_new_group16();
446 	}
447 	debug3("using 8k bit group 18");
448 	return dh_new_group18();
449 }
450 
451 /*
452  * Estimates the group order for a Diffie-Hellman group that has an
453  * attack complexity approximately the same as O(2**bits).
454  * Values from NIST Special Publication 800-57: Recommendation for Key
455  * Management Part 1 (rev 3) limited by the recommended maximum value
456  * from RFC4419 section 3.
457  */
458 u_int
459 dh_estimate(int bits)
460 {
461 	if (bits <= 112)
462 		return 2048;
463 	if (bits <= 128)
464 		return 3072;
465 	if (bits <= 192)
466 		return 7680;
467 	return 8192;
468 }
469