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