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