dh.c revision 323121
1/* $OpenBSD: dh.c,v 1.57 2015/05/27 23:39:18 dtucker 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 <stdarg.h>
34#include <stdio.h>
35#include <stdlib.h>
36#include <string.h>
37#include <limits.h>
38
39#include "dh.h"
40#include "pathnames.h"
41#include "log.h"
42#include "misc.h"
43#include "ssherr.h"
44
45static int
46parse_prime(int linenum, char *line, struct dhgroup *dhg)
47{
48	char *cp, *arg;
49	char *strsize, *gen, *prime;
50	const char *errstr = NULL;
51	long long n;
52
53	dhg->p = dhg->g = NULL;
54	cp = line;
55	if ((arg = strdelim(&cp)) == NULL)
56		return 0;
57	/* Ignore leading whitespace */
58	if (*arg == '\0')
59		arg = strdelim(&cp);
60	if (!arg || !*arg || *arg == '#')
61		return 0;
62
63	/* time */
64	if (cp == NULL || *arg == '\0')
65		goto truncated;
66	arg = strsep(&cp, " "); /* type */
67	if (cp == NULL || *arg == '\0')
68		goto truncated;
69	/* Ensure this is a safe prime */
70	n = strtonum(arg, 0, 5, &errstr);
71	if (errstr != NULL || n != MODULI_TYPE_SAFE) {
72		error("moduli:%d: type is not %d", linenum, MODULI_TYPE_SAFE);
73		goto fail;
74	}
75	arg = strsep(&cp, " "); /* tests */
76	if (cp == NULL || *arg == '\0')
77		goto truncated;
78	/* Ensure prime has been tested and is not composite */
79	n = strtonum(arg, 0, 0x1f, &errstr);
80	if (errstr != NULL ||
81	    (n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE)) {
82		error("moduli:%d: invalid moduli tests flag", linenum);
83		goto fail;
84	}
85	arg = strsep(&cp, " "); /* tries */
86	if (cp == NULL || *arg == '\0')
87		goto truncated;
88	n = strtonum(arg, 0, 1<<30, &errstr);
89	if (errstr != NULL || n == 0) {
90		error("moduli:%d: invalid primality trial count", linenum);
91		goto fail;
92	}
93	strsize = strsep(&cp, " "); /* size */
94	if (cp == NULL || *strsize == '\0' ||
95	    (dhg->size = (int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 ||
96	    errstr) {
97		error("moduli:%d: invalid prime length", linenum);
98		goto fail;
99	}
100	/* The whole group is one bit larger */
101	dhg->size++;
102	gen = strsep(&cp, " "); /* gen */
103	if (cp == NULL || *gen == '\0')
104		goto truncated;
105	prime = strsep(&cp, " "); /* prime */
106	if (cp != NULL || *prime == '\0') {
107 truncated:
108		error("moduli:%d: truncated", linenum);
109		goto fail;
110	}
111
112	if ((dhg->g = BN_new()) == NULL ||
113	    (dhg->p = BN_new()) == NULL) {
114		error("parse_prime: BN_new failed");
115		goto fail;
116	}
117	if (BN_hex2bn(&dhg->g, gen) == 0) {
118		error("moduli:%d: could not parse generator value", linenum);
119		goto fail;
120	}
121	if (BN_hex2bn(&dhg->p, prime) == 0) {
122		error("moduli:%d: could not parse prime value", linenum);
123		goto fail;
124	}
125	if (BN_num_bits(dhg->p) != dhg->size) {
126		error("moduli:%d: prime has wrong size: actual %d listed %d",
127		    linenum, BN_num_bits(dhg->p), dhg->size - 1);
128		goto fail;
129	}
130	if (BN_cmp(dhg->g, BN_value_one()) <= 0) {
131		error("moduli:%d: generator is invalid", linenum);
132		goto fail;
133	}
134	return 1;
135
136 fail:
137	if (dhg->g != NULL)
138		BN_clear_free(dhg->g);
139	if (dhg->p != NULL)
140		BN_clear_free(dhg->p);
141	dhg->g = dhg->p = NULL;
142	return 0;
143}
144
145DH *
146choose_dh(int min, int wantbits, int max)
147{
148	FILE *f;
149	char line[4096];
150	int best, bestcount, which;
151	int linenum;
152	struct dhgroup dhg;
153
154	if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL &&
155	    (f = fopen(_PATH_DH_PRIMES, "r")) == NULL) {
156		logit("WARNING: %s does not exist, using fixed modulus",
157		    _PATH_DH_MODULI);
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_PRIMES);
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_PRIMES);
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
215int
216dh_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	/* if g==2 and bits_set==1 then computing log_g(dh_pub) is trivial */
250	if (bits_set > 1)
251		return 1;
252
253	logit("invalid public DH value (%d/%d)", bits_set, BN_num_bits(dh->p));
254	return 0;
255}
256
257int
258dh_gen_key(DH *dh, int need)
259{
260	int pbits;
261
262	if (need < 0 || dh->p == NULL ||
263	    (pbits = BN_num_bits(dh->p)) <= 0 ||
264	    need > INT_MAX / 2 || 2 * need > pbits)
265		return SSH_ERR_INVALID_ARGUMENT;
266	dh->length = MIN(need * 2, pbits - 1);
267	if (DH_generate_key(dh) == 0 ||
268	    !dh_pub_is_valid(dh, dh->pub_key)) {
269		BN_clear_free(dh->priv_key);
270		return SSH_ERR_LIBCRYPTO_ERROR;
271	}
272	return 0;
273}
274
275DH *
276dh_new_group_asc(const char *gen, const char *modulus)
277{
278	DH *dh;
279
280	if ((dh = DH_new()) == NULL)
281		return NULL;
282	if (BN_hex2bn(&dh->p, modulus) == 0 ||
283	    BN_hex2bn(&dh->g, gen) == 0) {
284		DH_free(dh);
285		return NULL;
286	}
287	return (dh);
288}
289
290/*
291 * This just returns the group, we still need to generate the exchange
292 * value.
293 */
294
295DH *
296dh_new_group(BIGNUM *gen, BIGNUM *modulus)
297{
298	DH *dh;
299
300	if ((dh = DH_new()) == NULL)
301		return NULL;
302	dh->p = modulus;
303	dh->g = gen;
304
305	return (dh);
306}
307
308DH *
309dh_new_group1(void)
310{
311	static char *gen = "2", *group1 =
312	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
313	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
314	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
315	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
316	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
317	    "FFFFFFFF" "FFFFFFFF";
318
319	return (dh_new_group_asc(gen, group1));
320}
321
322DH *
323dh_new_group14(void)
324{
325	static char *gen = "2", *group14 =
326	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
327	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
328	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
329	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
330	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
331	    "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
332	    "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
333	    "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
334	    "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
335	    "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
336	    "15728E5A" "8AACAA68" "FFFFFFFF" "FFFFFFFF";
337
338	return (dh_new_group_asc(gen, group14));
339}
340
341/*
342 * 4k bit fallback group used by DH-GEX if moduli file cannot be read.
343 * Source: MODP group 16 from RFC3526.
344 */
345DH *
346dh_new_group_fallback(int max)
347{
348	static char *gen = "2", *group16 =
349	    "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
350	    "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
351	    "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
352	    "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
353	    "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
354	    "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
355	    "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
356	    "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
357	    "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
358	    "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
359	    "15728E5A" "8AAAC42D" "AD33170D" "04507A33" "A85521AB" "DF1CBA64"
360	    "ECFB8504" "58DBEF0A" "8AEA7157" "5D060C7D" "B3970F85" "A6E1E4C7"
361	    "ABF5AE8C" "DB0933D7" "1E8C94E0" "4A25619D" "CEE3D226" "1AD2EE6B"
362	    "F12FFA06" "D98A0864" "D8760273" "3EC86A64" "521F2B18" "177B200C"
363	    "BBE11757" "7A615D6C" "770988C0" "BAD946E2" "08E24FA0" "74E5AB31"
364	    "43DB5BFC" "E0FD108E" "4B82D120" "A9210801" "1A723C12" "A787E6D7"
365	    "88719A10" "BDBA5B26" "99C32718" "6AF4E23C" "1A946834" "B6150BDA"
366	    "2583E9CA" "2AD44CE8" "DBBBC2DB" "04DE8EF9" "2E8EFC14" "1FBECAA6"
367	    "287C5947" "4E6BC05D" "99B2964F" "A090C3A2" "233BA186" "515BE7ED"
368	    "1F612970" "CEE2D7AF" "B81BDD76" "2170481C" "D0069127" "D5B05AA9"
369	    "93B4EA98" "8D8FDDC1" "86FFB7DC" "90A6C08F" "4DF435C9" "34063199"
370	    "FFFFFFFF" "FFFFFFFF";
371
372	if (max < 4096) {
373		debug3("requested max size %d, using 2k bit group 14", max);
374		return dh_new_group14();
375	}
376	debug3("using 4k bit group 16");
377	return (dh_new_group_asc(gen, group16));
378}
379
380/*
381 * Estimates the group order for a Diffie-Hellman group that has an
382 * attack complexity approximately the same as O(2**bits).
383 * Values from NIST Special Publication 800-57: Recommendation for Key
384 * Management Part 1 (rev 3) limited by the recommended maximum value
385 * from RFC4419 section 3.
386 */
387
388u_int
389dh_estimate(int bits)
390{
391	if (bits <= 112)
392		return 2048;
393	if (bits <= 128)
394		return 3072;
395	if (bits <= 192)
396		return 7680;
397	return 8192;
398}
399