Merge branch 'vendor/XZ'
[dragonfly.git] / crypto / openssh / dh.c
1 /* $OpenBSD: dh.c,v 1.53 2013/11/21 00:45:44 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>
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
38 #include "dh.h"
39 #include "pathnames.h"
40 #include "log.h"
41 #include "misc.h"
42
43 static int
44 parse_prime(int linenum, char *line, struct dhgroup *dhg)
45 {
46         char *cp, *arg;
47         char *strsize, *gen, *prime;
48         const char *errstr = NULL;
49         long long n;
50
51         dhg->p = dhg->g = NULL;
52         cp = line;
53         if ((arg = strdelim(&cp)) == NULL)
54                 return 0;
55         /* Ignore leading whitespace */
56         if (*arg == '\0')
57                 arg = strdelim(&cp);
58         if (!arg || !*arg || *arg == '#')
59                 return 0;
60
61         /* time */
62         if (cp == NULL || *arg == '\0')
63                 goto truncated;
64         arg = strsep(&cp, " "); /* type */
65         if (cp == NULL || *arg == '\0')
66                 goto truncated;
67         /* Ensure this is a safe prime */
68         n = strtonum(arg, 0, 5, &errstr);
69         if (errstr != NULL || n != MODULI_TYPE_SAFE) {
70                 error("moduli:%d: type is not %d", linenum, MODULI_TYPE_SAFE);
71                 goto fail;
72         }
73         arg = strsep(&cp, " "); /* tests */
74         if (cp == NULL || *arg == '\0')
75                 goto truncated;
76         /* Ensure prime has been tested and is not composite */
77         n = strtonum(arg, 0, 0x1f, &errstr);
78         if (errstr != NULL ||
79             (n & MODULI_TESTS_COMPOSITE) || !(n & ~MODULI_TESTS_COMPOSITE)) {
80                 error("moduli:%d: invalid moduli tests flag", linenum);
81                 goto fail;
82         }
83         arg = strsep(&cp, " "); /* tries */
84         if (cp == NULL || *arg == '\0')
85                 goto truncated;
86         n = strtonum(arg, 0, 1<<30, &errstr);
87         if (errstr != NULL || n == 0) {
88                 error("moduli:%d: invalid primality trial count", linenum);
89                 goto fail;
90         }
91         strsize = strsep(&cp, " "); /* size */
92         if (cp == NULL || *strsize == '\0' ||
93             (dhg->size = (int)strtonum(strsize, 0, 64*1024, &errstr)) == 0 ||
94             errstr) {
95                 error("moduli:%d: invalid prime length", linenum);
96                 goto fail;
97         }
98         /* The whole group is one bit larger */
99         dhg->size++;
100         gen = strsep(&cp, " "); /* gen */
101         if (cp == NULL || *gen == '\0')
102                 goto truncated;
103         prime = strsep(&cp, " "); /* prime */
104         if (cp != NULL || *prime == '\0') {
105  truncated:
106                 error("moduli:%d: truncated", linenum);
107                 goto fail;
108         }
109
110         if ((dhg->g = BN_new()) == NULL)
111                 fatal("parse_prime: BN_new failed");
112         if ((dhg->p = BN_new()) == NULL)
113                 fatal("parse_prime: BN_new failed");
114         if (BN_hex2bn(&dhg->g, gen) == 0) {
115                 error("moduli:%d: could not parse generator value", linenum);
116                 goto fail;
117         }
118         if (BN_hex2bn(&dhg->p, prime) == 0) {
119                 error("moduli:%d: could not parse prime value", linenum);
120                 goto fail;
121         }
122         if (BN_num_bits(dhg->p) != dhg->size) {
123                 error("moduli:%d: prime has wrong size: actual %d listed %d",
124                     linenum, BN_num_bits(dhg->p), dhg->size - 1);
125                 goto fail;
126         }
127         if (BN_cmp(dhg->g, BN_value_one()) <= 0) {
128                 error("moduli:%d: generator is invalid", linenum);
129                 goto fail;
130         }
131
132         return 1;
133
134  fail:
135         if (dhg->g != NULL)
136                 BN_clear_free(dhg->g);
137         if (dhg->p != NULL)
138                 BN_clear_free(dhg->p);
139         dhg->g = dhg->p = NULL;
140         error("Bad prime description in line %d", linenum);
141         return 0;
142 }
143
144 DH *
145 choose_dh(int min, int wantbits, int max)
146 {
147         FILE *f;
148         char line[4096];
149         int best, bestcount, which;
150         int linenum;
151         struct dhgroup dhg;
152
153         if ((f = fopen(_PATH_DH_MODULI, "r")) == NULL &&
154             (f = fopen(_PATH_DH_PRIMES, "r")) == NULL) {
155                 logit("WARNING: %s does not exist, using fixed modulus",
156                     _PATH_DH_MODULI);
157                 return (dh_new_group14());
158         }
159
160         linenum = 0;
161         best = bestcount = 0;
162         while (fgets(line, sizeof(line), f)) {
163                 linenum++;
164                 if (!parse_prime(linenum, line, &dhg))
165                         continue;
166                 BN_clear_free(dhg.g);
167                 BN_clear_free(dhg.p);
168
169                 if (dhg.size > max || dhg.size < min)
170                         continue;
171
172                 if ((dhg.size > wantbits && dhg.size < best) ||
173                     (dhg.size > best && best < wantbits)) {
174                         best = dhg.size;
175                         bestcount = 0;
176                 }
177                 if (dhg.size == best)
178                         bestcount++;
179         }
180         rewind(f);
181
182         if (bestcount == 0) {
183                 fclose(f);
184                 logit("WARNING: no suitable primes in %s", _PATH_DH_PRIMES);
185                 return (dh_new_group14());
186         }
187
188         linenum = 0;
189         which = arc4random_uniform(bestcount);
190         while (fgets(line, sizeof(line), f)) {
191                 if (!parse_prime(linenum, line, &dhg))
192                         continue;
193                 if ((dhg.size > max || dhg.size < min) ||
194                     dhg.size != best ||
195                     linenum++ != which) {
196                         BN_clear_free(dhg.g);
197                         BN_clear_free(dhg.p);
198                         continue;
199                 }
200                 break;
201         }
202         fclose(f);
203         if (linenum != which+1)
204                 fatal("WARNING: line %d disappeared in %s, giving up",
205                     which, _PATH_DH_PRIMES);
206
207         return (dh_new_group(dhg.g, dhg.p));
208 }
209
210 /* diffie-hellman-groupN-sha1 */
211
212 int
213 dh_pub_is_valid(DH *dh, BIGNUM *dh_pub)
214 {
215         int i;
216         int n = BN_num_bits(dh_pub);
217         int bits_set = 0;
218         BIGNUM *tmp;
219
220         if (dh_pub->neg) {
221                 logit("invalid public DH value: negative");
222                 return 0;
223         }
224         if (BN_cmp(dh_pub, BN_value_one()) != 1) {      /* pub_exp <= 1 */
225                 logit("invalid public DH value: <= 1");
226                 return 0;
227         }
228
229         if ((tmp = BN_new()) == NULL) {
230                 error("%s: BN_new failed", __func__);
231                 return 0;
232         }
233         if (!BN_sub(tmp, dh->p, BN_value_one()) ||
234             BN_cmp(dh_pub, tmp) != -1) {                /* pub_exp > p-2 */
235                 BN_clear_free(tmp);
236                 logit("invalid public DH value: >= p-1");
237                 return 0;
238         }
239         BN_clear_free(tmp);
240
241         for (i = 0; i <= n; i++)
242                 if (BN_is_bit_set(dh_pub, i))
243                         bits_set++;
244         debug2("bits set: %d/%d", bits_set, BN_num_bits(dh->p));
245
246         /* if g==2 and bits_set==1 then computing log_g(dh_pub) is trivial */
247         if (bits_set > 1)
248                 return 1;
249
250         logit("invalid public DH value (%d/%d)", bits_set, BN_num_bits(dh->p));
251         return 0;
252 }
253
254 void
255 dh_gen_key(DH *dh, int need)
256 {
257         int pbits;
258
259         if (need <= 0)
260                 fatal("%s: need <= 0", __func__);
261         if (dh->p == NULL)
262                 fatal("%s: dh->p == NULL", __func__);
263         if ((pbits = BN_num_bits(dh->p)) <= 0)
264                 fatal("%s: bits(p) <= 0", __func__);
265         dh->length = MIN(need * 2, pbits - 1);
266         if (DH_generate_key(dh) == 0)
267                 fatal("%s: key generation failed", __func__);
268         if (!dh_pub_is_valid(dh, dh->pub_key))
269                 fatal("%s: generated invalid key", __func__);
270 }
271
272 DH *
273 dh_new_group_asc(const char *gen, const char *modulus)
274 {
275         DH *dh;
276
277         if ((dh = DH_new()) == NULL)
278                 fatal("dh_new_group_asc: DH_new");
279
280         if (BN_hex2bn(&dh->p, modulus) == 0)
281                 fatal("BN_hex2bn p");
282         if (BN_hex2bn(&dh->g, gen) == 0)
283                 fatal("BN_hex2bn g");
284
285         return (dh);
286 }
287
288 /*
289  * This just returns the group, we still need to generate the exchange
290  * value.
291  */
292
293 DH *
294 dh_new_group(BIGNUM *gen, BIGNUM *modulus)
295 {
296         DH *dh;
297
298         if ((dh = DH_new()) == NULL)
299                 fatal("dh_new_group: DH_new");
300         dh->p = modulus;
301         dh->g = gen;
302
303         return (dh);
304 }
305
306 DH *
307 dh_new_group1(void)
308 {
309         static char *gen = "2", *group1 =
310             "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
311             "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
312             "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
313             "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
314             "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE65381"
315             "FFFFFFFF" "FFFFFFFF";
316
317         return (dh_new_group_asc(gen, group1));
318 }
319
320 DH *
321 dh_new_group14(void)
322 {
323         static char *gen = "2", *group14 =
324             "FFFFFFFF" "FFFFFFFF" "C90FDAA2" "2168C234" "C4C6628B" "80DC1CD1"
325             "29024E08" "8A67CC74" "020BBEA6" "3B139B22" "514A0879" "8E3404DD"
326             "EF9519B3" "CD3A431B" "302B0A6D" "F25F1437" "4FE1356D" "6D51C245"
327             "E485B576" "625E7EC6" "F44C42E9" "A637ED6B" "0BFF5CB6" "F406B7ED"
328             "EE386BFB" "5A899FA5" "AE9F2411" "7C4B1FE6" "49286651" "ECE45B3D"
329             "C2007CB8" "A163BF05" "98DA4836" "1C55D39A" "69163FA8" "FD24CF5F"
330             "83655D23" "DCA3AD96" "1C62F356" "208552BB" "9ED52907" "7096966D"
331             "670C354E" "4ABC9804" "F1746C08" "CA18217C" "32905E46" "2E36CE3B"
332             "E39E772C" "180E8603" "9B2783A2" "EC07A28F" "B5C55DF0" "6F4C52C9"
333             "DE2BCBF6" "95581718" "3995497C" "EA956AE5" "15D22618" "98FA0510"
334             "15728E5A" "8AACAA68" "FFFFFFFF" "FFFFFFFF";
335
336         return (dh_new_group_asc(gen, group14));
337 }
338
339 /*
340  * Estimates the group order for a Diffie-Hellman group that has an
341  * attack complexity approximately the same as O(2**bits).
342  * Values from NIST Special Publication 800-57: Recommendation for Key
343  * Management Part 1 (rev 3) limited by the recommended maximum value
344  * from RFC4419 section 3.
345  */
346
347 int
348 dh_estimate(int bits)
349 {
350         if (bits <= 112)
351                 return 2048;
352         if (bits <= 128)
353                 return 3072;
354         if (bits <= 192)
355                 return 7680;
356         return 8192;
357 }