xref: /freebsd/crypto/openssh/kex.c (revision 83d9fd40d5cb67ff1e805523a6fae48c3389f396)
1 /* $OpenBSD: kex.c,v 1.127 2016/10/10 19:28:48 markus Exp $ */
2 /*
3  * Copyright (c) 2000, 2001 Markus Friedl.  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 
29 #include <signal.h>
30 #include <stdarg.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 
35 #ifdef WITH_OPENSSL
36 #include <openssl/crypto.h>
37 #include <openssl/dh.h>
38 #endif
39 
40 #include "ssh2.h"
41 #include "packet.h"
42 #include "compat.h"
43 #include "cipher.h"
44 #include "sshkey.h"
45 #include "kex.h"
46 #include "log.h"
47 #include "mac.h"
48 #include "match.h"
49 #include "misc.h"
50 #include "dispatch.h"
51 #include "monitor.h"
52 
53 #include "ssherr.h"
54 #include "sshbuf.h"
55 #include "digest.h"
56 
57 #if OPENSSL_VERSION_NUMBER >= 0x00907000L
58 # if defined(HAVE_EVP_SHA256)
59 # define evp_ssh_sha256 EVP_sha256
60 # else
61 extern const EVP_MD *evp_ssh_sha256(void);
62 # endif
63 #endif
64 
65 /* prototype */
66 static int kex_choose_conf(struct ssh *);
67 static int kex_input_newkeys(int, u_int32_t, void *);
68 
69 static const char *proposal_names[PROPOSAL_MAX] = {
70 	"KEX algorithms",
71 	"host key algorithms",
72 	"ciphers ctos",
73 	"ciphers stoc",
74 	"MACs ctos",
75 	"MACs stoc",
76 	"compression ctos",
77 	"compression stoc",
78 	"languages ctos",
79 	"languages stoc",
80 };
81 
82 struct kexalg {
83 	char *name;
84 	u_int type;
85 	int ec_nid;
86 	int hash_alg;
87 };
88 static const struct kexalg kexalgs[] = {
89 #ifdef WITH_OPENSSL
90 	{ KEX_DH1, KEX_DH_GRP1_SHA1, 0, SSH_DIGEST_SHA1 },
91 	{ KEX_DH14_SHA1, KEX_DH_GRP14_SHA1, 0, SSH_DIGEST_SHA1 },
92 	{ KEX_DH14_SHA256, KEX_DH_GRP14_SHA256, 0, SSH_DIGEST_SHA256 },
93 	{ KEX_DH16_SHA512, KEX_DH_GRP16_SHA512, 0, SSH_DIGEST_SHA512 },
94 	{ KEX_DH18_SHA512, KEX_DH_GRP18_SHA512, 0, SSH_DIGEST_SHA512 },
95 	{ KEX_DHGEX_SHA1, KEX_DH_GEX_SHA1, 0, SSH_DIGEST_SHA1 },
96 #ifdef HAVE_EVP_SHA256
97 	{ KEX_DHGEX_SHA256, KEX_DH_GEX_SHA256, 0, SSH_DIGEST_SHA256 },
98 #endif /* HAVE_EVP_SHA256 */
99 #ifdef OPENSSL_HAS_ECC
100 	{ KEX_ECDH_SHA2_NISTP256, KEX_ECDH_SHA2,
101 	    NID_X9_62_prime256v1, SSH_DIGEST_SHA256 },
102 	{ KEX_ECDH_SHA2_NISTP384, KEX_ECDH_SHA2, NID_secp384r1,
103 	    SSH_DIGEST_SHA384 },
104 # ifdef OPENSSL_HAS_NISTP521
105 	{ KEX_ECDH_SHA2_NISTP521, KEX_ECDH_SHA2, NID_secp521r1,
106 	    SSH_DIGEST_SHA512 },
107 # endif /* OPENSSL_HAS_NISTP521 */
108 #endif /* OPENSSL_HAS_ECC */
109 #endif /* WITH_OPENSSL */
110 #if defined(HAVE_EVP_SHA256) || !defined(WITH_OPENSSL)
111 	{ KEX_CURVE25519_SHA256, KEX_C25519_SHA256, 0, SSH_DIGEST_SHA256 },
112 	{ KEX_CURVE25519_SHA256_OLD, KEX_C25519_SHA256, 0, SSH_DIGEST_SHA256 },
113 #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */
114 	{ NULL, -1, -1, -1},
115 };
116 
117 char *
118 kex_alg_list(char sep)
119 {
120 	char *ret = NULL, *tmp;
121 	size_t nlen, rlen = 0;
122 	const struct kexalg *k;
123 
124 	for (k = kexalgs; k->name != NULL; k++) {
125 		if (ret != NULL)
126 			ret[rlen++] = sep;
127 		nlen = strlen(k->name);
128 		if ((tmp = realloc(ret, rlen + nlen + 2)) == NULL) {
129 			free(ret);
130 			return NULL;
131 		}
132 		ret = tmp;
133 		memcpy(ret + rlen, k->name, nlen + 1);
134 		rlen += nlen;
135 	}
136 	return ret;
137 }
138 
139 static const struct kexalg *
140 kex_alg_by_name(const char *name)
141 {
142 	const struct kexalg *k;
143 
144 	for (k = kexalgs; k->name != NULL; k++) {
145 		if (strcmp(k->name, name) == 0)
146 			return k;
147 	}
148 	return NULL;
149 }
150 
151 /* Validate KEX method name list */
152 int
153 kex_names_valid(const char *names)
154 {
155 	char *s, *cp, *p;
156 
157 	if (names == NULL || strcmp(names, "") == 0)
158 		return 0;
159 	if ((s = cp = strdup(names)) == NULL)
160 		return 0;
161 	for ((p = strsep(&cp, ",")); p && *p != '\0';
162 	    (p = strsep(&cp, ","))) {
163 		if (kex_alg_by_name(p) == NULL) {
164 			error("Unsupported KEX algorithm \"%.100s\"", p);
165 			free(s);
166 			return 0;
167 		}
168 	}
169 	debug3("kex names ok: [%s]", names);
170 	free(s);
171 	return 1;
172 }
173 
174 /*
175  * Concatenate algorithm names, avoiding duplicates in the process.
176  * Caller must free returned string.
177  */
178 char *
179 kex_names_cat(const char *a, const char *b)
180 {
181 	char *ret = NULL, *tmp = NULL, *cp, *p;
182 	size_t len;
183 
184 	if (a == NULL || *a == '\0')
185 		return NULL;
186 	if (b == NULL || *b == '\0')
187 		return strdup(a);
188 	if (strlen(b) > 1024*1024)
189 		return NULL;
190 	len = strlen(a) + strlen(b) + 2;
191 	if ((tmp = cp = strdup(b)) == NULL ||
192 	    (ret = calloc(1, len)) == NULL) {
193 		free(tmp);
194 		return NULL;
195 	}
196 	strlcpy(ret, a, len);
197 	for ((p = strsep(&cp, ",")); p && *p != '\0'; (p = strsep(&cp, ","))) {
198 		if (match_list(ret, p, NULL) != NULL)
199 			continue; /* Algorithm already present */
200 		if (strlcat(ret, ",", len) >= len ||
201 		    strlcat(ret, p, len) >= len) {
202 			free(tmp);
203 			free(ret);
204 			return NULL; /* Shouldn't happen */
205 		}
206 	}
207 	free(tmp);
208 	return ret;
209 }
210 
211 /*
212  * Assemble a list of algorithms from a default list and a string from a
213  * configuration file. The user-provided string may begin with '+' to
214  * indicate that it should be appended to the default.
215  */
216 int
217 kex_assemble_names(const char *def, char **list)
218 {
219 	char *ret;
220 
221 	if (list == NULL || *list == NULL || **list == '\0') {
222 		*list = strdup(def);
223 		return 0;
224 	}
225 	if (**list != '+') {
226 		return 0;
227 	}
228 
229 	if ((ret = kex_names_cat(def, *list + 1)) == NULL)
230 		return SSH_ERR_ALLOC_FAIL;
231 	free(*list);
232 	*list = ret;
233 	return 0;
234 }
235 
236 /* put algorithm proposal into buffer */
237 int
238 kex_prop2buf(struct sshbuf *b, char *proposal[PROPOSAL_MAX])
239 {
240 	u_int i;
241 	int r;
242 
243 	sshbuf_reset(b);
244 
245 	/*
246 	 * add a dummy cookie, the cookie will be overwritten by
247 	 * kex_send_kexinit(), each time a kexinit is set
248 	 */
249 	for (i = 0; i < KEX_COOKIE_LEN; i++) {
250 		if ((r = sshbuf_put_u8(b, 0)) != 0)
251 			return r;
252 	}
253 	for (i = 0; i < PROPOSAL_MAX; i++) {
254 		if ((r = sshbuf_put_cstring(b, proposal[i])) != 0)
255 			return r;
256 	}
257 	if ((r = sshbuf_put_u8(b, 0)) != 0 ||	/* first_kex_packet_follows */
258 	    (r = sshbuf_put_u32(b, 0)) != 0)	/* uint32 reserved */
259 		return r;
260 	return 0;
261 }
262 
263 /* parse buffer and return algorithm proposal */
264 int
265 kex_buf2prop(struct sshbuf *raw, int *first_kex_follows, char ***propp)
266 {
267 	struct sshbuf *b = NULL;
268 	u_char v;
269 	u_int i;
270 	char **proposal = NULL;
271 	int r;
272 
273 	*propp = NULL;
274 	if ((proposal = calloc(PROPOSAL_MAX, sizeof(char *))) == NULL)
275 		return SSH_ERR_ALLOC_FAIL;
276 	if ((b = sshbuf_fromb(raw)) == NULL) {
277 		r = SSH_ERR_ALLOC_FAIL;
278 		goto out;
279 	}
280 	if ((r = sshbuf_consume(b, KEX_COOKIE_LEN)) != 0) /* skip cookie */
281 		goto out;
282 	/* extract kex init proposal strings */
283 	for (i = 0; i < PROPOSAL_MAX; i++) {
284 		if ((r = sshbuf_get_cstring(b, &(proposal[i]), NULL)) != 0)
285 			goto out;
286 		debug2("%s: %s", proposal_names[i], proposal[i]);
287 	}
288 	/* first kex follows / reserved */
289 	if ((r = sshbuf_get_u8(b, &v)) != 0 ||	/* first_kex_follows */
290 	    (r = sshbuf_get_u32(b, &i)) != 0)	/* reserved */
291 		goto out;
292 	if (first_kex_follows != NULL)
293 		*first_kex_follows = v;
294 	debug2("first_kex_follows %d ", v);
295 	debug2("reserved %u ", i);
296 	r = 0;
297 	*propp = proposal;
298  out:
299 	if (r != 0 && proposal != NULL)
300 		kex_prop_free(proposal);
301 	sshbuf_free(b);
302 	return r;
303 }
304 
305 void
306 kex_prop_free(char **proposal)
307 {
308 	u_int i;
309 
310 	if (proposal == NULL)
311 		return;
312 	for (i = 0; i < PROPOSAL_MAX; i++)
313 		free(proposal[i]);
314 	free(proposal);
315 }
316 
317 /* ARGSUSED */
318 static int
319 kex_protocol_error(int type, u_int32_t seq, void *ctxt)
320 {
321 	struct ssh *ssh = active_state; /* XXX */
322 	int r;
323 
324 	error("kex protocol error: type %d seq %u", type, seq);
325 	if ((r = sshpkt_start(ssh, SSH2_MSG_UNIMPLEMENTED)) != 0 ||
326 	    (r = sshpkt_put_u32(ssh, seq)) != 0 ||
327 	    (r = sshpkt_send(ssh)) != 0)
328 		return r;
329 	return 0;
330 }
331 
332 static void
333 kex_reset_dispatch(struct ssh *ssh)
334 {
335 	ssh_dispatch_range(ssh, SSH2_MSG_TRANSPORT_MIN,
336 	    SSH2_MSG_TRANSPORT_MAX, &kex_protocol_error);
337 	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_input_kexinit);
338 }
339 
340 static int
341 kex_send_ext_info(struct ssh *ssh)
342 {
343 	int r;
344 	char *algs;
345 
346 	if ((algs = sshkey_alg_list(0, 1, ',')) == NULL)
347 		return SSH_ERR_ALLOC_FAIL;
348 	if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 ||
349 	    (r = sshpkt_put_u32(ssh, 1)) != 0 ||
350 	    (r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 ||
351 	    (r = sshpkt_put_cstring(ssh, algs)) != 0 ||
352 	    (r = sshpkt_send(ssh)) != 0)
353 		goto out;
354 	/* success */
355 	r = 0;
356  out:
357 	free(algs);
358 	return r;
359 }
360 
361 int
362 kex_send_newkeys(struct ssh *ssh)
363 {
364 	int r;
365 
366 	kex_reset_dispatch(ssh);
367 	if ((r = sshpkt_start(ssh, SSH2_MSG_NEWKEYS)) != 0 ||
368 	    (r = sshpkt_send(ssh)) != 0)
369 		return r;
370 	debug("SSH2_MSG_NEWKEYS sent");
371 	debug("expecting SSH2_MSG_NEWKEYS");
372 	ssh_dispatch_set(ssh, SSH2_MSG_NEWKEYS, &kex_input_newkeys);
373 	if (ssh->kex->ext_info_c)
374 		if ((r = kex_send_ext_info(ssh)) != 0)
375 			return r;
376 	return 0;
377 }
378 
379 int
380 kex_input_ext_info(int type, u_int32_t seq, void *ctxt)
381 {
382 	struct ssh *ssh = ctxt;
383 	struct kex *kex = ssh->kex;
384 	u_int32_t i, ninfo;
385 	char *name, *val, *found;
386 	int r;
387 
388 	debug("SSH2_MSG_EXT_INFO received");
389 	ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &kex_protocol_error);
390 	if ((r = sshpkt_get_u32(ssh, &ninfo)) != 0)
391 		return r;
392 	for (i = 0; i < ninfo; i++) {
393 		if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0)
394 			return r;
395 		if ((r = sshpkt_get_cstring(ssh, &val, NULL)) != 0) {
396 			free(name);
397 			return r;
398 		}
399 		debug("%s: %s=<%s>", __func__, name, val);
400 		if (strcmp(name, "server-sig-algs") == 0) {
401 			found = match_list("rsa-sha2-256", val, NULL);
402 			if (found) {
403 				kex->rsa_sha2 = 256;
404 				free(found);
405 			}
406 			found = match_list("rsa-sha2-512", val, NULL);
407 			if (found) {
408 				kex->rsa_sha2 = 512;
409 				free(found);
410 			}
411 		}
412 		free(name);
413 		free(val);
414 	}
415 	return sshpkt_get_end(ssh);
416 }
417 
418 static int
419 kex_input_newkeys(int type, u_int32_t seq, void *ctxt)
420 {
421 	struct ssh *ssh = ctxt;
422 	struct kex *kex = ssh->kex;
423 	int r;
424 
425 	debug("SSH2_MSG_NEWKEYS received");
426 	ssh_dispatch_set(ssh, SSH2_MSG_NEWKEYS, &kex_protocol_error);
427 	if ((r = sshpkt_get_end(ssh)) != 0)
428 		return r;
429 	if ((r = ssh_set_newkeys(ssh, MODE_IN)) != 0)
430 		return r;
431 	kex->done = 1;
432 	sshbuf_reset(kex->peer);
433 	/* sshbuf_reset(kex->my); */
434 	kex->flags &= ~KEX_INIT_SENT;
435 	free(kex->name);
436 	kex->name = NULL;
437 	return 0;
438 }
439 
440 int
441 kex_send_kexinit(struct ssh *ssh)
442 {
443 	u_char *cookie;
444 	struct kex *kex = ssh->kex;
445 	int r;
446 
447 	if (kex == NULL)
448 		return SSH_ERR_INTERNAL_ERROR;
449 	if (kex->flags & KEX_INIT_SENT)
450 		return 0;
451 	kex->done = 0;
452 
453 	/* generate a random cookie */
454 	if (sshbuf_len(kex->my) < KEX_COOKIE_LEN)
455 		return SSH_ERR_INVALID_FORMAT;
456 	if ((cookie = sshbuf_mutable_ptr(kex->my)) == NULL)
457 		return SSH_ERR_INTERNAL_ERROR;
458 	arc4random_buf(cookie, KEX_COOKIE_LEN);
459 
460 	if ((r = sshpkt_start(ssh, SSH2_MSG_KEXINIT)) != 0 ||
461 	    (r = sshpkt_putb(ssh, kex->my)) != 0 ||
462 	    (r = sshpkt_send(ssh)) != 0)
463 		return r;
464 	debug("SSH2_MSG_KEXINIT sent");
465 	kex->flags |= KEX_INIT_SENT;
466 	return 0;
467 }
468 
469 /* ARGSUSED */
470 int
471 kex_input_kexinit(int type, u_int32_t seq, void *ctxt)
472 {
473 	struct ssh *ssh = ctxt;
474 	struct kex *kex = ssh->kex;
475 	const u_char *ptr;
476 	u_int i;
477 	size_t dlen;
478 	int r;
479 
480 	debug("SSH2_MSG_KEXINIT received");
481 	if (kex == NULL)
482 		return SSH_ERR_INVALID_ARGUMENT;
483 
484 	ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, NULL);
485 	ptr = sshpkt_ptr(ssh, &dlen);
486 	if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0)
487 		return r;
488 
489 	/* discard packet */
490 	for (i = 0; i < KEX_COOKIE_LEN; i++)
491 		if ((r = sshpkt_get_u8(ssh, NULL)) != 0)
492 			return r;
493 	for (i = 0; i < PROPOSAL_MAX; i++)
494 		if ((r = sshpkt_get_string(ssh, NULL, NULL)) != 0)
495 			return r;
496 	/*
497 	 * XXX RFC4253 sec 7: "each side MAY guess" - currently no supported
498 	 * KEX method has the server move first, but a server might be using
499 	 * a custom method or one that we otherwise don't support. We should
500 	 * be prepared to remember first_kex_follows here so we can eat a
501 	 * packet later.
502 	 * XXX2 - RFC4253 is kind of ambiguous on what first_kex_follows means
503 	 * for cases where the server *doesn't* go first. I guess we should
504 	 * ignore it when it is set for these cases, which is what we do now.
505 	 */
506 	if ((r = sshpkt_get_u8(ssh, NULL)) != 0 ||	/* first_kex_follows */
507 	    (r = sshpkt_get_u32(ssh, NULL)) != 0 ||	/* reserved */
508 	    (r = sshpkt_get_end(ssh)) != 0)
509 			return r;
510 
511 	if (!(kex->flags & KEX_INIT_SENT))
512 		if ((r = kex_send_kexinit(ssh)) != 0)
513 			return r;
514 	if ((r = kex_choose_conf(ssh)) != 0)
515 		return r;
516 
517 	if (kex->kex_type < KEX_MAX && kex->kex[kex->kex_type] != NULL)
518 		return (kex->kex[kex->kex_type])(ssh);
519 
520 	return SSH_ERR_INTERNAL_ERROR;
521 }
522 
523 int
524 kex_new(struct ssh *ssh, char *proposal[PROPOSAL_MAX], struct kex **kexp)
525 {
526 	struct kex *kex;
527 	int r;
528 
529 	*kexp = NULL;
530 	if ((kex = calloc(1, sizeof(*kex))) == NULL)
531 		return SSH_ERR_ALLOC_FAIL;
532 	if ((kex->peer = sshbuf_new()) == NULL ||
533 	    (kex->my = sshbuf_new()) == NULL) {
534 		r = SSH_ERR_ALLOC_FAIL;
535 		goto out;
536 	}
537 	if ((r = kex_prop2buf(kex->my, proposal)) != 0)
538 		goto out;
539 	kex->done = 0;
540 	kex_reset_dispatch(ssh);
541 	r = 0;
542 	*kexp = kex;
543  out:
544 	if (r != 0)
545 		kex_free(kex);
546 	return r;
547 }
548 
549 void
550 kex_free_newkeys(struct newkeys *newkeys)
551 {
552 	if (newkeys == NULL)
553 		return;
554 	if (newkeys->enc.key) {
555 		explicit_bzero(newkeys->enc.key, newkeys->enc.key_len);
556 		free(newkeys->enc.key);
557 		newkeys->enc.key = NULL;
558 	}
559 	if (newkeys->enc.iv) {
560 		explicit_bzero(newkeys->enc.iv, newkeys->enc.iv_len);
561 		free(newkeys->enc.iv);
562 		newkeys->enc.iv = NULL;
563 	}
564 	free(newkeys->enc.name);
565 	explicit_bzero(&newkeys->enc, sizeof(newkeys->enc));
566 	free(newkeys->comp.name);
567 	explicit_bzero(&newkeys->comp, sizeof(newkeys->comp));
568 	mac_clear(&newkeys->mac);
569 	if (newkeys->mac.key) {
570 		explicit_bzero(newkeys->mac.key, newkeys->mac.key_len);
571 		free(newkeys->mac.key);
572 		newkeys->mac.key = NULL;
573 	}
574 	free(newkeys->mac.name);
575 	explicit_bzero(&newkeys->mac, sizeof(newkeys->mac));
576 	explicit_bzero(newkeys, sizeof(*newkeys));
577 	free(newkeys);
578 }
579 
580 void
581 kex_free(struct kex *kex)
582 {
583 	u_int mode;
584 
585 #ifdef WITH_OPENSSL
586 	if (kex->dh)
587 		DH_free(kex->dh);
588 #ifdef OPENSSL_HAS_ECC
589 	if (kex->ec_client_key)
590 		EC_KEY_free(kex->ec_client_key);
591 #endif /* OPENSSL_HAS_ECC */
592 #endif /* WITH_OPENSSL */
593 	for (mode = 0; mode < MODE_MAX; mode++) {
594 		kex_free_newkeys(kex->newkeys[mode]);
595 		kex->newkeys[mode] = NULL;
596 	}
597 	sshbuf_free(kex->peer);
598 	sshbuf_free(kex->my);
599 	free(kex->session_id);
600 	free(kex->client_version_string);
601 	free(kex->server_version_string);
602 	free(kex->failed_choice);
603 	free(kex->hostkey_alg);
604 	free(kex->name);
605 	free(kex);
606 }
607 
608 int
609 kex_setup(struct ssh *ssh, char *proposal[PROPOSAL_MAX])
610 {
611 	int r;
612 
613 	if ((r = kex_new(ssh, proposal, &ssh->kex)) != 0)
614 		return r;
615 	if ((r = kex_send_kexinit(ssh)) != 0) {		/* we start */
616 		kex_free(ssh->kex);
617 		ssh->kex = NULL;
618 		return r;
619 	}
620 	return 0;
621 }
622 
623 /*
624  * Request key re-exchange, returns 0 on success or a ssherr.h error
625  * code otherwise. Must not be called if KEX is incomplete or in-progress.
626  */
627 int
628 kex_start_rekex(struct ssh *ssh)
629 {
630 	if (ssh->kex == NULL) {
631 		error("%s: no kex", __func__);
632 		return SSH_ERR_INTERNAL_ERROR;
633 	}
634 	if (ssh->kex->done == 0) {
635 		error("%s: requested twice", __func__);
636 		return SSH_ERR_INTERNAL_ERROR;
637 	}
638 	ssh->kex->done = 0;
639 	return kex_send_kexinit(ssh);
640 }
641 
642 static int
643 choose_enc(struct sshenc *enc, char *client, char *server)
644 {
645 	char *name = match_list(client, server, NULL);
646 
647 	if (name == NULL)
648 		return SSH_ERR_NO_CIPHER_ALG_MATCH;
649 	if ((enc->cipher = cipher_by_name(name)) == NULL)
650 		return SSH_ERR_INTERNAL_ERROR;
651 	enc->name = name;
652 	enc->enabled = 0;
653 	enc->iv = NULL;
654 	enc->iv_len = cipher_ivlen(enc->cipher);
655 	enc->key = NULL;
656 	enc->key_len = cipher_keylen(enc->cipher);
657 	enc->block_size = cipher_blocksize(enc->cipher);
658 	return 0;
659 }
660 
661 static int
662 choose_mac(struct ssh *ssh, struct sshmac *mac, char *client, char *server)
663 {
664 	char *name = match_list(client, server, NULL);
665 
666 	if (name == NULL)
667 		return SSH_ERR_NO_MAC_ALG_MATCH;
668 	if (mac_setup(mac, name) < 0)
669 		return SSH_ERR_INTERNAL_ERROR;
670 	/* truncate the key */
671 	if (ssh->compat & SSH_BUG_HMAC)
672 		mac->key_len = 16;
673 	mac->name = name;
674 	mac->key = NULL;
675 	mac->enabled = 0;
676 	return 0;
677 }
678 
679 static int
680 choose_comp(struct sshcomp *comp, char *client, char *server)
681 {
682 	char *name = match_list(client, server, NULL);
683 
684 	if (name == NULL)
685 		return SSH_ERR_NO_COMPRESS_ALG_MATCH;
686 	if (strcmp(name, "zlib@openssh.com") == 0) {
687 		comp->type = COMP_DELAYED;
688 	} else if (strcmp(name, "zlib") == 0) {
689 		comp->type = COMP_ZLIB;
690 	} else if (strcmp(name, "none") == 0) {
691 		comp->type = COMP_NONE;
692 	} else {
693 		return SSH_ERR_INTERNAL_ERROR;
694 	}
695 	comp->name = name;
696 	return 0;
697 }
698 
699 static int
700 choose_kex(struct kex *k, char *client, char *server)
701 {
702 	const struct kexalg *kexalg;
703 
704 	k->name = match_list(client, server, NULL);
705 
706 	debug("kex: algorithm: %s", k->name ? k->name : "(no match)");
707 	if (k->name == NULL)
708 		return SSH_ERR_NO_KEX_ALG_MATCH;
709 	if ((kexalg = kex_alg_by_name(k->name)) == NULL)
710 		return SSH_ERR_INTERNAL_ERROR;
711 	k->kex_type = kexalg->type;
712 	k->hash_alg = kexalg->hash_alg;
713 	k->ec_nid = kexalg->ec_nid;
714 	return 0;
715 }
716 
717 static int
718 choose_hostkeyalg(struct kex *k, char *client, char *server)
719 {
720 	k->hostkey_alg = match_list(client, server, NULL);
721 
722 	debug("kex: host key algorithm: %s",
723 	    k->hostkey_alg ? k->hostkey_alg : "(no match)");
724 	if (k->hostkey_alg == NULL)
725 		return SSH_ERR_NO_HOSTKEY_ALG_MATCH;
726 	k->hostkey_type = sshkey_type_from_name(k->hostkey_alg);
727 	if (k->hostkey_type == KEY_UNSPEC)
728 		return SSH_ERR_INTERNAL_ERROR;
729 	k->hostkey_nid = sshkey_ecdsa_nid_from_name(k->hostkey_alg);
730 	return 0;
731 }
732 
733 static int
734 proposals_match(char *my[PROPOSAL_MAX], char *peer[PROPOSAL_MAX])
735 {
736 	static int check[] = {
737 		PROPOSAL_KEX_ALGS, PROPOSAL_SERVER_HOST_KEY_ALGS, -1
738 	};
739 	int *idx;
740 	char *p;
741 
742 	for (idx = &check[0]; *idx != -1; idx++) {
743 		if ((p = strchr(my[*idx], ',')) != NULL)
744 			*p = '\0';
745 		if ((p = strchr(peer[*idx], ',')) != NULL)
746 			*p = '\0';
747 		if (strcmp(my[*idx], peer[*idx]) != 0) {
748 			debug2("proposal mismatch: my %s peer %s",
749 			    my[*idx], peer[*idx]);
750 			return (0);
751 		}
752 	}
753 	debug2("proposals match");
754 	return (1);
755 }
756 
757 static int
758 kex_choose_conf(struct ssh *ssh)
759 {
760 	struct kex *kex = ssh->kex;
761 	struct newkeys *newkeys;
762 	char **my = NULL, **peer = NULL;
763 	char **cprop, **sprop;
764 	int nenc, nmac, ncomp;
765 	u_int mode, ctos, need, dh_need, authlen;
766 	int r, first_kex_follows;
767 
768 	debug2("local %s KEXINIT proposal", kex->server ? "server" : "client");
769 	if ((r = kex_buf2prop(kex->my, NULL, &my)) != 0)
770 		goto out;
771 	debug2("peer %s KEXINIT proposal", kex->server ? "client" : "server");
772 	if ((r = kex_buf2prop(kex->peer, &first_kex_follows, &peer)) != 0)
773 		goto out;
774 
775 	if (kex->server) {
776 		cprop=peer;
777 		sprop=my;
778 	} else {
779 		cprop=my;
780 		sprop=peer;
781 	}
782 
783 	/* Check whether client supports ext_info_c */
784 	if (kex->server) {
785 		char *ext;
786 
787 		ext = match_list("ext-info-c", peer[PROPOSAL_KEX_ALGS], NULL);
788 		kex->ext_info_c = (ext != NULL);
789 		free(ext);
790 	}
791 
792 	/* Algorithm Negotiation */
793 	if ((r = choose_kex(kex, cprop[PROPOSAL_KEX_ALGS],
794 	    sprop[PROPOSAL_KEX_ALGS])) != 0) {
795 		kex->failed_choice = peer[PROPOSAL_KEX_ALGS];
796 		peer[PROPOSAL_KEX_ALGS] = NULL;
797 		goto out;
798 	}
799 	if ((r = choose_hostkeyalg(kex, cprop[PROPOSAL_SERVER_HOST_KEY_ALGS],
800 	    sprop[PROPOSAL_SERVER_HOST_KEY_ALGS])) != 0) {
801 		kex->failed_choice = peer[PROPOSAL_SERVER_HOST_KEY_ALGS];
802 		peer[PROPOSAL_SERVER_HOST_KEY_ALGS] = NULL;
803 		goto out;
804 	}
805 	for (mode = 0; mode < MODE_MAX; mode++) {
806 		if ((newkeys = calloc(1, sizeof(*newkeys))) == NULL) {
807 			r = SSH_ERR_ALLOC_FAIL;
808 			goto out;
809 		}
810 		kex->newkeys[mode] = newkeys;
811 		ctos = (!kex->server && mode == MODE_OUT) ||
812 		    (kex->server && mode == MODE_IN);
813 		nenc  = ctos ? PROPOSAL_ENC_ALGS_CTOS  : PROPOSAL_ENC_ALGS_STOC;
814 		nmac  = ctos ? PROPOSAL_MAC_ALGS_CTOS  : PROPOSAL_MAC_ALGS_STOC;
815 		ncomp = ctos ? PROPOSAL_COMP_ALGS_CTOS : PROPOSAL_COMP_ALGS_STOC;
816 		if ((r = choose_enc(&newkeys->enc, cprop[nenc],
817 		    sprop[nenc])) != 0) {
818 			kex->failed_choice = peer[nenc];
819 			peer[nenc] = NULL;
820 			goto out;
821 		}
822 		authlen = cipher_authlen(newkeys->enc.cipher);
823 		/* ignore mac for authenticated encryption */
824 		if (authlen == 0 &&
825 		    (r = choose_mac(ssh, &newkeys->mac, cprop[nmac],
826 		    sprop[nmac])) != 0) {
827 			kex->failed_choice = peer[nmac];
828 			peer[nmac] = NULL;
829 			goto out;
830 		}
831 		if ((r = choose_comp(&newkeys->comp, cprop[ncomp],
832 		    sprop[ncomp])) != 0) {
833 			kex->failed_choice = peer[ncomp];
834 			peer[ncomp] = NULL;
835 			goto out;
836 		}
837 		debug("kex: %s cipher: %s MAC: %s compression: %s",
838 		    ctos ? "client->server" : "server->client",
839 		    newkeys->enc.name,
840 		    authlen == 0 ? newkeys->mac.name : "<implicit>",
841 		    newkeys->comp.name);
842 	}
843 	need = dh_need = 0;
844 	for (mode = 0; mode < MODE_MAX; mode++) {
845 		newkeys = kex->newkeys[mode];
846 		need = MAXIMUM(need, newkeys->enc.key_len);
847 		need = MAXIMUM(need, newkeys->enc.block_size);
848 		need = MAXIMUM(need, newkeys->enc.iv_len);
849 		need = MAXIMUM(need, newkeys->mac.key_len);
850 		dh_need = MAXIMUM(dh_need, cipher_seclen(newkeys->enc.cipher));
851 		dh_need = MAXIMUM(dh_need, newkeys->enc.block_size);
852 		dh_need = MAXIMUM(dh_need, newkeys->enc.iv_len);
853 		dh_need = MAXIMUM(dh_need, newkeys->mac.key_len);
854 	}
855 	/* XXX need runden? */
856 	kex->we_need = need;
857 	kex->dh_need = dh_need;
858 
859 	/* ignore the next message if the proposals do not match */
860 	if (first_kex_follows && !proposals_match(my, peer) &&
861 	    !(ssh->compat & SSH_BUG_FIRSTKEX))
862 		ssh->dispatch_skip_packets = 1;
863 	r = 0;
864  out:
865 	kex_prop_free(my);
866 	kex_prop_free(peer);
867 	return r;
868 }
869 
870 static int
871 derive_key(struct ssh *ssh, int id, u_int need, u_char *hash, u_int hashlen,
872     const struct sshbuf *shared_secret, u_char **keyp)
873 {
874 	struct kex *kex = ssh->kex;
875 	struct ssh_digest_ctx *hashctx = NULL;
876 	char c = id;
877 	u_int have;
878 	size_t mdsz;
879 	u_char *digest;
880 	int r;
881 
882 	if ((mdsz = ssh_digest_bytes(kex->hash_alg)) == 0)
883 		return SSH_ERR_INVALID_ARGUMENT;
884 	if ((digest = calloc(1, ROUNDUP(need, mdsz))) == NULL) {
885 		r = SSH_ERR_ALLOC_FAIL;
886 		goto out;
887 	}
888 
889 	/* K1 = HASH(K || H || "A" || session_id) */
890 	if ((hashctx = ssh_digest_start(kex->hash_alg)) == NULL ||
891 	    ssh_digest_update_buffer(hashctx, shared_secret) != 0 ||
892 	    ssh_digest_update(hashctx, hash, hashlen) != 0 ||
893 	    ssh_digest_update(hashctx, &c, 1) != 0 ||
894 	    ssh_digest_update(hashctx, kex->session_id,
895 	    kex->session_id_len) != 0 ||
896 	    ssh_digest_final(hashctx, digest, mdsz) != 0) {
897 		r = SSH_ERR_LIBCRYPTO_ERROR;
898 		goto out;
899 	}
900 	ssh_digest_free(hashctx);
901 	hashctx = NULL;
902 
903 	/*
904 	 * expand key:
905 	 * Kn = HASH(K || H || K1 || K2 || ... || Kn-1)
906 	 * Key = K1 || K2 || ... || Kn
907 	 */
908 	for (have = mdsz; need > have; have += mdsz) {
909 		if ((hashctx = ssh_digest_start(kex->hash_alg)) == NULL ||
910 		    ssh_digest_update_buffer(hashctx, shared_secret) != 0 ||
911 		    ssh_digest_update(hashctx, hash, hashlen) != 0 ||
912 		    ssh_digest_update(hashctx, digest, have) != 0 ||
913 		    ssh_digest_final(hashctx, digest + have, mdsz) != 0) {
914 			r = SSH_ERR_LIBCRYPTO_ERROR;
915 			goto out;
916 		}
917 		ssh_digest_free(hashctx);
918 		hashctx = NULL;
919 	}
920 #ifdef DEBUG_KEX
921 	fprintf(stderr, "key '%c'== ", c);
922 	dump_digest("key", digest, need);
923 #endif
924 	*keyp = digest;
925 	digest = NULL;
926 	r = 0;
927  out:
928 	free(digest);
929 	ssh_digest_free(hashctx);
930 	return r;
931 }
932 
933 #define NKEYS	6
934 int
935 kex_derive_keys(struct ssh *ssh, u_char *hash, u_int hashlen,
936     const struct sshbuf *shared_secret)
937 {
938 	struct kex *kex = ssh->kex;
939 	u_char *keys[NKEYS];
940 	u_int i, j, mode, ctos;
941 	int r;
942 
943 	for (i = 0; i < NKEYS; i++) {
944 		if ((r = derive_key(ssh, 'A'+i, kex->we_need, hash, hashlen,
945 		    shared_secret, &keys[i])) != 0) {
946 			for (j = 0; j < i; j++)
947 				free(keys[j]);
948 			return r;
949 		}
950 	}
951 	for (mode = 0; mode < MODE_MAX; mode++) {
952 		ctos = (!kex->server && mode == MODE_OUT) ||
953 		    (kex->server && mode == MODE_IN);
954 		kex->newkeys[mode]->enc.iv  = keys[ctos ? 0 : 1];
955 		kex->newkeys[mode]->enc.key = keys[ctos ? 2 : 3];
956 		kex->newkeys[mode]->mac.key = keys[ctos ? 4 : 5];
957 	}
958 	return 0;
959 }
960 
961 #ifdef WITH_OPENSSL
962 int
963 kex_derive_keys_bn(struct ssh *ssh, u_char *hash, u_int hashlen,
964     const BIGNUM *secret)
965 {
966 	struct sshbuf *shared_secret;
967 	int r;
968 
969 	if ((shared_secret = sshbuf_new()) == NULL)
970 		return SSH_ERR_ALLOC_FAIL;
971 	if ((r = sshbuf_put_bignum2(shared_secret, secret)) == 0)
972 		r = kex_derive_keys(ssh, hash, hashlen, shared_secret);
973 	sshbuf_free(shared_secret);
974 	return r;
975 }
976 #endif
977 
978 #ifdef WITH_SSH1
979 int
980 derive_ssh1_session_id(BIGNUM *host_modulus, BIGNUM *server_modulus,
981     u_int8_t cookie[8], u_int8_t id[16])
982 {
983 	u_int8_t hbuf[2048], sbuf[2048], obuf[SSH_DIGEST_MAX_LENGTH];
984 	struct ssh_digest_ctx *hashctx = NULL;
985 	size_t hlen, slen;
986 	int r;
987 
988 	hlen = BN_num_bytes(host_modulus);
989 	slen = BN_num_bytes(server_modulus);
990 	if (hlen < (512 / 8) || (u_int)hlen > sizeof(hbuf) ||
991 	    slen < (512 / 8) || (u_int)slen > sizeof(sbuf))
992 		return SSH_ERR_KEY_BITS_MISMATCH;
993 	if (BN_bn2bin(host_modulus, hbuf) <= 0 ||
994 	    BN_bn2bin(server_modulus, sbuf) <= 0) {
995 		r = SSH_ERR_LIBCRYPTO_ERROR;
996 		goto out;
997 	}
998 	if ((hashctx = ssh_digest_start(SSH_DIGEST_MD5)) == NULL) {
999 		r = SSH_ERR_ALLOC_FAIL;
1000 		goto out;
1001 	}
1002 	if (ssh_digest_update(hashctx, hbuf, hlen) != 0 ||
1003 	    ssh_digest_update(hashctx, sbuf, slen) != 0 ||
1004 	    ssh_digest_update(hashctx, cookie, 8) != 0 ||
1005 	    ssh_digest_final(hashctx, obuf, sizeof(obuf)) != 0) {
1006 		r = SSH_ERR_LIBCRYPTO_ERROR;
1007 		goto out;
1008 	}
1009 	memcpy(id, obuf, ssh_digest_bytes(SSH_DIGEST_MD5));
1010 	r = 0;
1011  out:
1012 	ssh_digest_free(hashctx);
1013 	explicit_bzero(hbuf, sizeof(hbuf));
1014 	explicit_bzero(sbuf, sizeof(sbuf));
1015 	explicit_bzero(obuf, sizeof(obuf));
1016 	return r;
1017 }
1018 #endif
1019 
1020 #if defined(DEBUG_KEX) || defined(DEBUG_KEXDH) || defined(DEBUG_KEXECDH)
1021 void
1022 dump_digest(char *msg, u_char *digest, int len)
1023 {
1024 	fprintf(stderr, "%s\n", msg);
1025 	sshbuf_dump_data(digest, len, stderr);
1026 }
1027 #endif
1028