]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - crypto/openssh/sshkey.c
MFH (r265214, r294333, r294407, r294467): misc prop fixes
[FreeBSD/stable/10.git] / crypto / openssh / sshkey.c
1 /* $OpenBSD: sshkey.c,v 1.21 2015/08/19 23:19:01 djm Exp $ */
2 /*
3  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
4  * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
5  * Copyright (c) 2010,2011 Damien Miller.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27
28 #include "includes.h"
29
30 #include <sys/param.h>  /* MIN MAX */
31 #include <sys/types.h>
32 #include <netinet/in.h>
33
34 #ifdef WITH_OPENSSL
35 #include <openssl/evp.h>
36 #include <openssl/err.h>
37 #include <openssl/pem.h>
38 #endif
39
40 #include "crypto_api.h"
41
42 #include <errno.h>
43 #include <limits.h>
44 #include <stdio.h>
45 #include <string.h>
46 #include <resolv.h>
47 #ifdef HAVE_UTIL_H
48 #include <util.h>
49 #endif /* HAVE_UTIL_H */
50
51 #include "ssh2.h"
52 #include "ssherr.h"
53 #include "misc.h"
54 #include "sshbuf.h"
55 #include "rsa.h"
56 #include "cipher.h"
57 #include "digest.h"
58 #define SSHKEY_INTERNAL
59 #include "sshkey.h"
60 #include "match.h"
61
62 /* openssh private key file format */
63 #define MARK_BEGIN              "-----BEGIN OPENSSH PRIVATE KEY-----\n"
64 #define MARK_END                "-----END OPENSSH PRIVATE KEY-----\n"
65 #define MARK_BEGIN_LEN          (sizeof(MARK_BEGIN) - 1)
66 #define MARK_END_LEN            (sizeof(MARK_END) - 1)
67 #define KDFNAME                 "bcrypt"
68 #define AUTH_MAGIC              "openssh-key-v1"
69 #define SALT_LEN                16
70 #define DEFAULT_CIPHERNAME      "aes256-cbc"
71 #define DEFAULT_ROUNDS          16
72
73 /* Version identification string for SSH v1 identity files. */
74 #define LEGACY_BEGIN            "SSH PRIVATE KEY FILE FORMAT 1.1\n"
75
76 static int sshkey_from_blob_internal(struct sshbuf *buf,
77     struct sshkey **keyp, int allow_cert);
78
79 /* Supported key types */
80 struct keytype {
81         const char *name;
82         const char *shortname;
83         int type;
84         int nid;
85         int cert;
86 };
87 static const struct keytype keytypes[] = {
88         { "ssh-ed25519", "ED25519", KEY_ED25519, 0, 0 },
89         { "ssh-ed25519-cert-v01@openssh.com", "ED25519-CERT",
90             KEY_ED25519_CERT, 0, 1 },
91 #ifdef WITH_OPENSSL
92         { NULL, "RSA1", KEY_RSA1, 0, 0 },
93         { "ssh-rsa", "RSA", KEY_RSA, 0, 0 },
94         { "ssh-dss", "DSA", KEY_DSA, 0, 0 },
95 # ifdef OPENSSL_HAS_ECC
96         { "ecdsa-sha2-nistp256", "ECDSA", KEY_ECDSA, NID_X9_62_prime256v1, 0 },
97         { "ecdsa-sha2-nistp384", "ECDSA", KEY_ECDSA, NID_secp384r1, 0 },
98 #  ifdef OPENSSL_HAS_NISTP521
99         { "ecdsa-sha2-nistp521", "ECDSA", KEY_ECDSA, NID_secp521r1, 0 },
100 #  endif /* OPENSSL_HAS_NISTP521 */
101 # endif /* OPENSSL_HAS_ECC */
102         { "ssh-rsa-cert-v01@openssh.com", "RSA-CERT", KEY_RSA_CERT, 0, 1 },
103         { "ssh-dss-cert-v01@openssh.com", "DSA-CERT", KEY_DSA_CERT, 0, 1 },
104 # ifdef OPENSSL_HAS_ECC
105         { "ecdsa-sha2-nistp256-cert-v01@openssh.com", "ECDSA-CERT",
106             KEY_ECDSA_CERT, NID_X9_62_prime256v1, 1 },
107         { "ecdsa-sha2-nistp384-cert-v01@openssh.com", "ECDSA-CERT",
108             KEY_ECDSA_CERT, NID_secp384r1, 1 },
109 #  ifdef OPENSSL_HAS_NISTP521
110         { "ecdsa-sha2-nistp521-cert-v01@openssh.com", "ECDSA-CERT",
111             KEY_ECDSA_CERT, NID_secp521r1, 1 },
112 #  endif /* OPENSSL_HAS_NISTP521 */
113 # endif /* OPENSSL_HAS_ECC */
114 #endif /* WITH_OPENSSL */
115         { NULL, NULL, -1, -1, 0 }
116 };
117
118 const char *
119 sshkey_type(const struct sshkey *k)
120 {
121         const struct keytype *kt;
122
123         for (kt = keytypes; kt->type != -1; kt++) {
124                 if (kt->type == k->type)
125                         return kt->shortname;
126         }
127         return "unknown";
128 }
129
130 static const char *
131 sshkey_ssh_name_from_type_nid(int type, int nid)
132 {
133         const struct keytype *kt;
134
135         for (kt = keytypes; kt->type != -1; kt++) {
136                 if (kt->type == type && (kt->nid == 0 || kt->nid == nid))
137                         return kt->name;
138         }
139         return "ssh-unknown";
140 }
141
142 int
143 sshkey_type_is_cert(int type)
144 {
145         const struct keytype *kt;
146
147         for (kt = keytypes; kt->type != -1; kt++) {
148                 if (kt->type == type)
149                         return kt->cert;
150         }
151         return 0;
152 }
153
154 const char *
155 sshkey_ssh_name(const struct sshkey *k)
156 {
157         return sshkey_ssh_name_from_type_nid(k->type, k->ecdsa_nid);
158 }
159
160 const char *
161 sshkey_ssh_name_plain(const struct sshkey *k)
162 {
163         return sshkey_ssh_name_from_type_nid(sshkey_type_plain(k->type),
164             k->ecdsa_nid);
165 }
166
167 int
168 sshkey_type_from_name(const char *name)
169 {
170         const struct keytype *kt;
171
172         for (kt = keytypes; kt->type != -1; kt++) {
173                 /* Only allow shortname matches for plain key types */
174                 if ((kt->name != NULL && strcmp(name, kt->name) == 0) ||
175                     (!kt->cert && strcasecmp(kt->shortname, name) == 0))
176                         return kt->type;
177         }
178         return KEY_UNSPEC;
179 }
180
181 int
182 sshkey_ecdsa_nid_from_name(const char *name)
183 {
184         const struct keytype *kt;
185
186         for (kt = keytypes; kt->type != -1; kt++) {
187                 if (kt->type != KEY_ECDSA && kt->type != KEY_ECDSA_CERT)
188                         continue;
189                 if (kt->name != NULL && strcmp(name, kt->name) == 0)
190                         return kt->nid;
191         }
192         return -1;
193 }
194
195 char *
196 key_alg_list(int certs_only, int plain_only)
197 {
198         char *tmp, *ret = NULL;
199         size_t nlen, rlen = 0;
200         const struct keytype *kt;
201
202         for (kt = keytypes; kt->type != -1; kt++) {
203                 if (kt->name == NULL)
204                         continue;
205                 if ((certs_only && !kt->cert) || (plain_only && kt->cert))
206                         continue;
207                 if (ret != NULL)
208                         ret[rlen++] = '\n';
209                 nlen = strlen(kt->name);
210                 if ((tmp = realloc(ret, rlen + nlen + 2)) == NULL) {
211                         free(ret);
212                         return NULL;
213                 }
214                 ret = tmp;
215                 memcpy(ret + rlen, kt->name, nlen + 1);
216                 rlen += nlen;
217         }
218         return ret;
219 }
220
221 int
222 sshkey_names_valid2(const char *names, int allow_wildcard)
223 {
224         char *s, *cp, *p;
225         const struct keytype *kt;
226         int type;
227
228         if (names == NULL || strcmp(names, "") == 0)
229                 return 0;
230         if ((s = cp = strdup(names)) == NULL)
231                 return 0;
232         for ((p = strsep(&cp, ",")); p && *p != '\0';
233             (p = strsep(&cp, ","))) {
234                 type = sshkey_type_from_name(p);
235                 if (type == KEY_RSA1) {
236                         free(s);
237                         return 0;
238                 }
239                 if (type == KEY_UNSPEC) {
240                         if (allow_wildcard) {
241                                 /*
242                                  * Try matching key types against the string.
243                                  * If any has a positive or negative match then
244                                  * the component is accepted.
245                                  */
246                                 for (kt = keytypes; kt->type != -1; kt++) {
247                                         if (kt->type == KEY_RSA1)
248                                                 continue;
249                                         if (match_pattern_list(kt->name,
250                                             p, 0) != 0)
251                                                 break;
252                                 }
253                                 if (kt->type != -1)
254                                         continue;
255                         }
256                         free(s);
257                         return 0;
258                 }
259         }
260         free(s);
261         return 1;
262 }
263
264 u_int
265 sshkey_size(const struct sshkey *k)
266 {
267         switch (k->type) {
268 #ifdef WITH_OPENSSL
269         case KEY_RSA1:
270         case KEY_RSA:
271         case KEY_RSA_CERT:
272                 return BN_num_bits(k->rsa->n);
273         case KEY_DSA:
274         case KEY_DSA_CERT:
275                 return BN_num_bits(k->dsa->p);
276         case KEY_ECDSA:
277         case KEY_ECDSA_CERT:
278                 return sshkey_curve_nid_to_bits(k->ecdsa_nid);
279 #endif /* WITH_OPENSSL */
280         case KEY_ED25519:
281         case KEY_ED25519_CERT:
282                 return 256;     /* XXX */
283         }
284         return 0;
285 }
286
287 static int
288 sshkey_type_is_valid_ca(int type)
289 {
290         switch (type) {
291         case KEY_RSA:
292         case KEY_DSA:
293         case KEY_ECDSA:
294         case KEY_ED25519:
295                 return 1;
296         default:
297                 return 0;
298         }
299 }
300
301 int
302 sshkey_is_cert(const struct sshkey *k)
303 {
304         if (k == NULL)
305                 return 0;
306         return sshkey_type_is_cert(k->type);
307 }
308
309 /* Return the cert-less equivalent to a certified key type */
310 int
311 sshkey_type_plain(int type)
312 {
313         switch (type) {
314         case KEY_RSA_CERT:
315                 return KEY_RSA;
316         case KEY_DSA_CERT:
317                 return KEY_DSA;
318         case KEY_ECDSA_CERT:
319                 return KEY_ECDSA;
320         case KEY_ED25519_CERT:
321                 return KEY_ED25519;
322         default:
323                 return type;
324         }
325 }
326
327 #ifdef WITH_OPENSSL
328 /* XXX: these are really begging for a table-driven approach */
329 int
330 sshkey_curve_name_to_nid(const char *name)
331 {
332         if (strcmp(name, "nistp256") == 0)
333                 return NID_X9_62_prime256v1;
334         else if (strcmp(name, "nistp384") == 0)
335                 return NID_secp384r1;
336 # ifdef OPENSSL_HAS_NISTP521
337         else if (strcmp(name, "nistp521") == 0)
338                 return NID_secp521r1;
339 # endif /* OPENSSL_HAS_NISTP521 */
340         else
341                 return -1;
342 }
343
344 u_int
345 sshkey_curve_nid_to_bits(int nid)
346 {
347         switch (nid) {
348         case NID_X9_62_prime256v1:
349                 return 256;
350         case NID_secp384r1:
351                 return 384;
352 # ifdef OPENSSL_HAS_NISTP521
353         case NID_secp521r1:
354                 return 521;
355 # endif /* OPENSSL_HAS_NISTP521 */
356         default:
357                 return 0;
358         }
359 }
360
361 int
362 sshkey_ecdsa_bits_to_nid(int bits)
363 {
364         switch (bits) {
365         case 256:
366                 return NID_X9_62_prime256v1;
367         case 384:
368                 return NID_secp384r1;
369 # ifdef OPENSSL_HAS_NISTP521
370         case 521:
371                 return NID_secp521r1;
372 # endif /* OPENSSL_HAS_NISTP521 */
373         default:
374                 return -1;
375         }
376 }
377
378 const char *
379 sshkey_curve_nid_to_name(int nid)
380 {
381         switch (nid) {
382         case NID_X9_62_prime256v1:
383                 return "nistp256";
384         case NID_secp384r1:
385                 return "nistp384";
386 # ifdef OPENSSL_HAS_NISTP521
387         case NID_secp521r1:
388                 return "nistp521";
389 # endif /* OPENSSL_HAS_NISTP521 */
390         default:
391                 return NULL;
392         }
393 }
394
395 int
396 sshkey_ec_nid_to_hash_alg(int nid)
397 {
398         int kbits = sshkey_curve_nid_to_bits(nid);
399
400         if (kbits <= 0)
401                 return -1;
402
403         /* RFC5656 section 6.2.1 */
404         if (kbits <= 256)
405                 return SSH_DIGEST_SHA256;
406         else if (kbits <= 384)
407                 return SSH_DIGEST_SHA384;
408         else
409                 return SSH_DIGEST_SHA512;
410 }
411 #endif /* WITH_OPENSSL */
412
413 static void
414 cert_free(struct sshkey_cert *cert)
415 {
416         u_int i;
417
418         if (cert == NULL)
419                 return;
420         if (cert->certblob != NULL)
421                 sshbuf_free(cert->certblob);
422         if (cert->critical != NULL)
423                 sshbuf_free(cert->critical);
424         if (cert->extensions != NULL)
425                 sshbuf_free(cert->extensions);
426         if (cert->key_id != NULL)
427                 free(cert->key_id);
428         for (i = 0; i < cert->nprincipals; i++)
429                 free(cert->principals[i]);
430         if (cert->principals != NULL)
431                 free(cert->principals);
432         if (cert->signature_key != NULL)
433                 sshkey_free(cert->signature_key);
434         explicit_bzero(cert, sizeof(*cert));
435         free(cert);
436 }
437
438 static struct sshkey_cert *
439 cert_new(void)
440 {
441         struct sshkey_cert *cert;
442
443         if ((cert = calloc(1, sizeof(*cert))) == NULL)
444                 return NULL;
445         if ((cert->certblob = sshbuf_new()) == NULL ||
446             (cert->critical = sshbuf_new()) == NULL ||
447             (cert->extensions = sshbuf_new()) == NULL) {
448                 cert_free(cert);
449                 return NULL;
450         }
451         cert->key_id = NULL;
452         cert->principals = NULL;
453         cert->signature_key = NULL;
454         return cert;
455 }
456
457 struct sshkey *
458 sshkey_new(int type)
459 {
460         struct sshkey *k;
461 #ifdef WITH_OPENSSL
462         RSA *rsa;
463         DSA *dsa;
464 #endif /* WITH_OPENSSL */
465
466         if ((k = calloc(1, sizeof(*k))) == NULL)
467                 return NULL;
468         k->type = type;
469         k->ecdsa = NULL;
470         k->ecdsa_nid = -1;
471         k->dsa = NULL;
472         k->rsa = NULL;
473         k->cert = NULL;
474         k->ed25519_sk = NULL;
475         k->ed25519_pk = NULL;
476         switch (k->type) {
477 #ifdef WITH_OPENSSL
478         case KEY_RSA1:
479         case KEY_RSA:
480         case KEY_RSA_CERT:
481                 if ((rsa = RSA_new()) == NULL ||
482                     (rsa->n = BN_new()) == NULL ||
483                     (rsa->e = BN_new()) == NULL) {
484                         if (rsa != NULL)
485                                 RSA_free(rsa);
486                         free(k);
487                         return NULL;
488                 }
489                 k->rsa = rsa;
490                 break;
491         case KEY_DSA:
492         case KEY_DSA_CERT:
493                 if ((dsa = DSA_new()) == NULL ||
494                     (dsa->p = BN_new()) == NULL ||
495                     (dsa->q = BN_new()) == NULL ||
496                     (dsa->g = BN_new()) == NULL ||
497                     (dsa->pub_key = BN_new()) == NULL) {
498                         if (dsa != NULL)
499                                 DSA_free(dsa);
500                         free(k);
501                         return NULL;
502                 }
503                 k->dsa = dsa;
504                 break;
505         case KEY_ECDSA:
506         case KEY_ECDSA_CERT:
507                 /* Cannot do anything until we know the group */
508                 break;
509 #endif /* WITH_OPENSSL */
510         case KEY_ED25519:
511         case KEY_ED25519_CERT:
512                 /* no need to prealloc */
513                 break;
514         case KEY_UNSPEC:
515                 break;
516         default:
517                 free(k);
518                 return NULL;
519                 break;
520         }
521
522         if (sshkey_is_cert(k)) {
523                 if ((k->cert = cert_new()) == NULL) {
524                         sshkey_free(k);
525                         return NULL;
526                 }
527         }
528
529         return k;
530 }
531
532 int
533 sshkey_add_private(struct sshkey *k)
534 {
535         switch (k->type) {
536 #ifdef WITH_OPENSSL
537         case KEY_RSA1:
538         case KEY_RSA:
539         case KEY_RSA_CERT:
540 #define bn_maybe_alloc_failed(p) (p == NULL && (p = BN_new()) == NULL)
541                 if (bn_maybe_alloc_failed(k->rsa->d) ||
542                     bn_maybe_alloc_failed(k->rsa->iqmp) ||
543                     bn_maybe_alloc_failed(k->rsa->q) ||
544                     bn_maybe_alloc_failed(k->rsa->p) ||
545                     bn_maybe_alloc_failed(k->rsa->dmq1) ||
546                     bn_maybe_alloc_failed(k->rsa->dmp1))
547                         return SSH_ERR_ALLOC_FAIL;
548                 break;
549         case KEY_DSA:
550         case KEY_DSA_CERT:
551                 if (bn_maybe_alloc_failed(k->dsa->priv_key))
552                         return SSH_ERR_ALLOC_FAIL;
553                 break;
554 #undef bn_maybe_alloc_failed
555         case KEY_ECDSA:
556         case KEY_ECDSA_CERT:
557                 /* Cannot do anything until we know the group */
558                 break;
559 #endif /* WITH_OPENSSL */
560         case KEY_ED25519:
561         case KEY_ED25519_CERT:
562                 /* no need to prealloc */
563                 break;
564         case KEY_UNSPEC:
565                 break;
566         default:
567                 return SSH_ERR_INVALID_ARGUMENT;
568         }
569         return 0;
570 }
571
572 struct sshkey *
573 sshkey_new_private(int type)
574 {
575         struct sshkey *k = sshkey_new(type);
576
577         if (k == NULL)
578                 return NULL;
579         if (sshkey_add_private(k) != 0) {
580                 sshkey_free(k);
581                 return NULL;
582         }
583         return k;
584 }
585
586 void
587 sshkey_free(struct sshkey *k)
588 {
589         if (k == NULL)
590                 return;
591         switch (k->type) {
592 #ifdef WITH_OPENSSL
593         case KEY_RSA1:
594         case KEY_RSA:
595         case KEY_RSA_CERT:
596                 if (k->rsa != NULL)
597                         RSA_free(k->rsa);
598                 k->rsa = NULL;
599                 break;
600         case KEY_DSA:
601         case KEY_DSA_CERT:
602                 if (k->dsa != NULL)
603                         DSA_free(k->dsa);
604                 k->dsa = NULL;
605                 break;
606 # ifdef OPENSSL_HAS_ECC
607         case KEY_ECDSA:
608         case KEY_ECDSA_CERT:
609                 if (k->ecdsa != NULL)
610                         EC_KEY_free(k->ecdsa);
611                 k->ecdsa = NULL;
612                 break;
613 # endif /* OPENSSL_HAS_ECC */
614 #endif /* WITH_OPENSSL */
615         case KEY_ED25519:
616         case KEY_ED25519_CERT:
617                 if (k->ed25519_pk) {
618                         explicit_bzero(k->ed25519_pk, ED25519_PK_SZ);
619                         free(k->ed25519_pk);
620                         k->ed25519_pk = NULL;
621                 }
622                 if (k->ed25519_sk) {
623                         explicit_bzero(k->ed25519_sk, ED25519_SK_SZ);
624                         free(k->ed25519_sk);
625                         k->ed25519_sk = NULL;
626                 }
627                 break;
628         case KEY_UNSPEC:
629                 break;
630         default:
631                 break;
632         }
633         if (sshkey_is_cert(k))
634                 cert_free(k->cert);
635         explicit_bzero(k, sizeof(*k));
636         free(k);
637 }
638
639 static int
640 cert_compare(struct sshkey_cert *a, struct sshkey_cert *b)
641 {
642         if (a == NULL && b == NULL)
643                 return 1;
644         if (a == NULL || b == NULL)
645                 return 0;
646         if (sshbuf_len(a->certblob) != sshbuf_len(b->certblob))
647                 return 0;
648         if (timingsafe_bcmp(sshbuf_ptr(a->certblob), sshbuf_ptr(b->certblob),
649             sshbuf_len(a->certblob)) != 0)
650                 return 0;
651         return 1;
652 }
653
654 /*
655  * Compare public portions of key only, allowing comparisons between
656  * certificates and plain keys too.
657  */
658 int
659 sshkey_equal_public(const struct sshkey *a, const struct sshkey *b)
660 {
661 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
662         BN_CTX *bnctx;
663 #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
664
665         if (a == NULL || b == NULL ||
666             sshkey_type_plain(a->type) != sshkey_type_plain(b->type))
667                 return 0;
668
669         switch (a->type) {
670 #ifdef WITH_OPENSSL
671         case KEY_RSA1:
672         case KEY_RSA_CERT:
673         case KEY_RSA:
674                 return a->rsa != NULL && b->rsa != NULL &&
675                     BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
676                     BN_cmp(a->rsa->n, b->rsa->n) == 0;
677         case KEY_DSA_CERT:
678         case KEY_DSA:
679                 return a->dsa != NULL && b->dsa != NULL &&
680                     BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
681                     BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
682                     BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
683                     BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
684 # ifdef OPENSSL_HAS_ECC
685         case KEY_ECDSA_CERT:
686         case KEY_ECDSA:
687                 if (a->ecdsa == NULL || b->ecdsa == NULL ||
688                     EC_KEY_get0_public_key(a->ecdsa) == NULL ||
689                     EC_KEY_get0_public_key(b->ecdsa) == NULL)
690                         return 0;
691                 if ((bnctx = BN_CTX_new()) == NULL)
692                         return 0;
693                 if (EC_GROUP_cmp(EC_KEY_get0_group(a->ecdsa),
694                     EC_KEY_get0_group(b->ecdsa), bnctx) != 0 ||
695                     EC_POINT_cmp(EC_KEY_get0_group(a->ecdsa),
696                     EC_KEY_get0_public_key(a->ecdsa),
697                     EC_KEY_get0_public_key(b->ecdsa), bnctx) != 0) {
698                         BN_CTX_free(bnctx);
699                         return 0;
700                 }
701                 BN_CTX_free(bnctx);
702                 return 1;
703 # endif /* OPENSSL_HAS_ECC */
704 #endif /* WITH_OPENSSL */
705         case KEY_ED25519:
706         case KEY_ED25519_CERT:
707                 return a->ed25519_pk != NULL && b->ed25519_pk != NULL &&
708                     memcmp(a->ed25519_pk, b->ed25519_pk, ED25519_PK_SZ) == 0;
709         default:
710                 return 0;
711         }
712         /* NOTREACHED */
713 }
714
715 int
716 sshkey_equal(const struct sshkey *a, const struct sshkey *b)
717 {
718         if (a == NULL || b == NULL || a->type != b->type)
719                 return 0;
720         if (sshkey_is_cert(a)) {
721                 if (!cert_compare(a->cert, b->cert))
722                         return 0;
723         }
724         return sshkey_equal_public(a, b);
725 }
726
727 static int
728 to_blob_buf(const struct sshkey *key, struct sshbuf *b, int force_plain)
729 {
730         int type, ret = SSH_ERR_INTERNAL_ERROR;
731         const char *typename;
732
733         if (key == NULL)
734                 return SSH_ERR_INVALID_ARGUMENT;
735
736         if (sshkey_is_cert(key)) {
737                 if (key->cert == NULL)
738                         return SSH_ERR_EXPECTED_CERT;
739                 if (sshbuf_len(key->cert->certblob) == 0)
740                         return SSH_ERR_KEY_LACKS_CERTBLOB;
741         }
742         type = force_plain ? sshkey_type_plain(key->type) : key->type;
743         typename = sshkey_ssh_name_from_type_nid(type, key->ecdsa_nid);
744
745         switch (type) {
746 #ifdef WITH_OPENSSL
747         case KEY_DSA_CERT:
748         case KEY_ECDSA_CERT:
749         case KEY_RSA_CERT:
750 #endif /* WITH_OPENSSL */
751         case KEY_ED25519_CERT:
752                 /* Use the existing blob */
753                 /* XXX modified flag? */
754                 if ((ret = sshbuf_putb(b, key->cert->certblob)) != 0)
755                         return ret;
756                 break;
757 #ifdef WITH_OPENSSL
758         case KEY_DSA:
759                 if (key->dsa == NULL)
760                         return SSH_ERR_INVALID_ARGUMENT;
761                 if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
762                     (ret = sshbuf_put_bignum2(b, key->dsa->p)) != 0 ||
763                     (ret = sshbuf_put_bignum2(b, key->dsa->q)) != 0 ||
764                     (ret = sshbuf_put_bignum2(b, key->dsa->g)) != 0 ||
765                     (ret = sshbuf_put_bignum2(b, key->dsa->pub_key)) != 0)
766                         return ret;
767                 break;
768 # ifdef OPENSSL_HAS_ECC
769         case KEY_ECDSA:
770                 if (key->ecdsa == NULL)
771                         return SSH_ERR_INVALID_ARGUMENT;
772                 if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
773                     (ret = sshbuf_put_cstring(b,
774                     sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
775                     (ret = sshbuf_put_eckey(b, key->ecdsa)) != 0)
776                         return ret;
777                 break;
778 # endif
779         case KEY_RSA:
780                 if (key->rsa == NULL)
781                         return SSH_ERR_INVALID_ARGUMENT;
782                 if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
783                     (ret = sshbuf_put_bignum2(b, key->rsa->e)) != 0 ||
784                     (ret = sshbuf_put_bignum2(b, key->rsa->n)) != 0)
785                         return ret;
786                 break;
787 #endif /* WITH_OPENSSL */
788         case KEY_ED25519:
789                 if (key->ed25519_pk == NULL)
790                         return SSH_ERR_INVALID_ARGUMENT;
791                 if ((ret = sshbuf_put_cstring(b, typename)) != 0 ||
792                     (ret = sshbuf_put_string(b,
793                     key->ed25519_pk, ED25519_PK_SZ)) != 0)
794                         return ret;
795                 break;
796         default:
797                 return SSH_ERR_KEY_TYPE_UNKNOWN;
798         }
799         return 0;
800 }
801
802 int
803 sshkey_putb(const struct sshkey *key, struct sshbuf *b)
804 {
805         return to_blob_buf(key, b, 0);
806 }
807
808 int
809 sshkey_puts(const struct sshkey *key, struct sshbuf *b)
810 {
811         struct sshbuf *tmp;
812         int r;
813
814         if ((tmp = sshbuf_new()) == NULL)
815                 return SSH_ERR_ALLOC_FAIL;
816         r = to_blob_buf(key, tmp, 0);
817         if (r == 0)
818                 r = sshbuf_put_stringb(b, tmp);
819         sshbuf_free(tmp);
820         return r;
821 }
822
823 int
824 sshkey_putb_plain(const struct sshkey *key, struct sshbuf *b)
825 {
826         return to_blob_buf(key, b, 1);
827 }
828
829 static int
830 to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp, int force_plain)
831 {
832         int ret = SSH_ERR_INTERNAL_ERROR;
833         size_t len;
834         struct sshbuf *b = NULL;
835
836         if (lenp != NULL)
837                 *lenp = 0;
838         if (blobp != NULL)
839                 *blobp = NULL;
840         if ((b = sshbuf_new()) == NULL)
841                 return SSH_ERR_ALLOC_FAIL;
842         if ((ret = to_blob_buf(key, b, force_plain)) != 0)
843                 goto out;
844         len = sshbuf_len(b);
845         if (lenp != NULL)
846                 *lenp = len;
847         if (blobp != NULL) {
848                 if ((*blobp = malloc(len)) == NULL) {
849                         ret = SSH_ERR_ALLOC_FAIL;
850                         goto out;
851                 }
852                 memcpy(*blobp, sshbuf_ptr(b), len);
853         }
854         ret = 0;
855  out:
856         sshbuf_free(b);
857         return ret;
858 }
859
860 int
861 sshkey_to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp)
862 {
863         return to_blob(key, blobp, lenp, 0);
864 }
865
866 int
867 sshkey_plain_to_blob(const struct sshkey *key, u_char **blobp, size_t *lenp)
868 {
869         return to_blob(key, blobp, lenp, 1);
870 }
871
872 int
873 sshkey_fingerprint_raw(const struct sshkey *k, int dgst_alg,
874     u_char **retp, size_t *lenp)
875 {
876         u_char *blob = NULL, *ret = NULL;
877         size_t blob_len = 0;
878         int r = SSH_ERR_INTERNAL_ERROR;
879
880         if (retp != NULL)
881                 *retp = NULL;
882         if (lenp != NULL)
883                 *lenp = 0;
884         if (ssh_digest_bytes(dgst_alg) == 0) {
885                 r = SSH_ERR_INVALID_ARGUMENT;
886                 goto out;
887         }
888
889         if (k->type == KEY_RSA1) {
890 #ifdef WITH_OPENSSL
891                 int nlen = BN_num_bytes(k->rsa->n);
892                 int elen = BN_num_bytes(k->rsa->e);
893
894                 blob_len = nlen + elen;
895                 if (nlen >= INT_MAX - elen ||
896                     (blob = malloc(blob_len)) == NULL) {
897                         r = SSH_ERR_ALLOC_FAIL;
898                         goto out;
899                 }
900                 BN_bn2bin(k->rsa->n, blob);
901                 BN_bn2bin(k->rsa->e, blob + nlen);
902 #endif /* WITH_OPENSSL */
903         } else if ((r = to_blob(k, &blob, &blob_len, 1)) != 0)
904                 goto out;
905         if ((ret = calloc(1, SSH_DIGEST_MAX_LENGTH)) == NULL) {
906                 r = SSH_ERR_ALLOC_FAIL;
907                 goto out;
908         }
909         if ((r = ssh_digest_memory(dgst_alg, blob, blob_len,
910             ret, SSH_DIGEST_MAX_LENGTH)) != 0)
911                 goto out;
912         /* success */
913         if (retp != NULL) {
914                 *retp = ret;
915                 ret = NULL;
916         }
917         if (lenp != NULL)
918                 *lenp = ssh_digest_bytes(dgst_alg);
919         r = 0;
920  out:
921         free(ret);
922         if (blob != NULL) {
923                 explicit_bzero(blob, blob_len);
924                 free(blob);
925         }
926         return r;
927 }
928
929 static char *
930 fingerprint_b64(const char *alg, u_char *dgst_raw, size_t dgst_raw_len)
931 {
932         char *ret;
933         size_t plen = strlen(alg) + 1;
934         size_t rlen = ((dgst_raw_len + 2) / 3) * 4 + plen + 1;
935         int r;
936
937         if (dgst_raw_len > 65536 || (ret = calloc(1, rlen)) == NULL)
938                 return NULL;
939         strlcpy(ret, alg, rlen);
940         strlcat(ret, ":", rlen);
941         if (dgst_raw_len == 0)
942                 return ret;
943         if ((r = b64_ntop(dgst_raw, dgst_raw_len,
944             ret + plen, rlen - plen)) == -1) {
945                 explicit_bzero(ret, rlen);
946                 free(ret);
947                 return NULL;
948         }
949         /* Trim padding characters from end */
950         ret[strcspn(ret, "=")] = '\0';
951         return ret;
952 }
953
954 static char *
955 fingerprint_hex(const char *alg, u_char *dgst_raw, size_t dgst_raw_len)
956 {
957         char *retval, hex[5];
958         size_t i, rlen = dgst_raw_len * 3 + strlen(alg) + 2;
959
960         if (dgst_raw_len > 65536 || (retval = calloc(1, rlen)) == NULL)
961                 return NULL;
962         strlcpy(retval, alg, rlen);
963         strlcat(retval, ":", rlen);
964         for (i = 0; i < dgst_raw_len; i++) {
965                 snprintf(hex, sizeof(hex), "%s%02x",
966                     i > 0 ? ":" : "", dgst_raw[i]);
967                 strlcat(retval, hex, rlen);
968         }
969         return retval;
970 }
971
972 static char *
973 fingerprint_bubblebabble(u_char *dgst_raw, size_t dgst_raw_len)
974 {
975         char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
976         char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
977             'n', 'p', 'r', 's', 't', 'v', 'z', 'x' };
978         u_int i, j = 0, rounds, seed = 1;
979         char *retval;
980
981         rounds = (dgst_raw_len / 2) + 1;
982         if ((retval = calloc(rounds, 6)) == NULL)
983                 return NULL;
984         retval[j++] = 'x';
985         for (i = 0; i < rounds; i++) {
986                 u_int idx0, idx1, idx2, idx3, idx4;
987                 if ((i + 1 < rounds) || (dgst_raw_len % 2 != 0)) {
988                         idx0 = (((((u_int)(dgst_raw[2 * i])) >> 6) & 3) +
989                             seed) % 6;
990                         idx1 = (((u_int)(dgst_raw[2 * i])) >> 2) & 15;
991                         idx2 = ((((u_int)(dgst_raw[2 * i])) & 3) +
992                             (seed / 6)) % 6;
993                         retval[j++] = vowels[idx0];
994                         retval[j++] = consonants[idx1];
995                         retval[j++] = vowels[idx2];
996                         if ((i + 1) < rounds) {
997                                 idx3 = (((u_int)(dgst_raw[(2 * i) + 1])) >> 4) & 15;
998                                 idx4 = (((u_int)(dgst_raw[(2 * i) + 1]))) & 15;
999                                 retval[j++] = consonants[idx3];
1000                                 retval[j++] = '-';
1001                                 retval[j++] = consonants[idx4];
1002                                 seed = ((seed * 5) +
1003                                     ((((u_int)(dgst_raw[2 * i])) * 7) +
1004                                     ((u_int)(dgst_raw[(2 * i) + 1])))) % 36;
1005                         }
1006                 } else {
1007                         idx0 = seed % 6;
1008                         idx1 = 16;
1009                         idx2 = seed / 6;
1010                         retval[j++] = vowels[idx0];
1011                         retval[j++] = consonants[idx1];
1012                         retval[j++] = vowels[idx2];
1013                 }
1014         }
1015         retval[j++] = 'x';
1016         retval[j++] = '\0';
1017         return retval;
1018 }
1019
1020 /*
1021  * Draw an ASCII-Art representing the fingerprint so human brain can
1022  * profit from its built-in pattern recognition ability.
1023  * This technique is called "random art" and can be found in some
1024  * scientific publications like this original paper:
1025  *
1026  * "Hash Visualization: a New Technique to improve Real-World Security",
1027  * Perrig A. and Song D., 1999, International Workshop on Cryptographic
1028  * Techniques and E-Commerce (CrypTEC '99)
1029  * sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
1030  *
1031  * The subject came up in a talk by Dan Kaminsky, too.
1032  *
1033  * If you see the picture is different, the key is different.
1034  * If the picture looks the same, you still know nothing.
1035  *
1036  * The algorithm used here is a worm crawling over a discrete plane,
1037  * leaving a trace (augmenting the field) everywhere it goes.
1038  * Movement is taken from dgst_raw 2bit-wise.  Bumping into walls
1039  * makes the respective movement vector be ignored for this turn.
1040  * Graphs are not unambiguous, because circles in graphs can be
1041  * walked in either direction.
1042  */
1043
1044 /*
1045  * Field sizes for the random art.  Have to be odd, so the starting point
1046  * can be in the exact middle of the picture, and FLDBASE should be >=8 .
1047  * Else pictures would be too dense, and drawing the frame would
1048  * fail, too, because the key type would not fit in anymore.
1049  */
1050 #define FLDBASE         8
1051 #define FLDSIZE_Y       (FLDBASE + 1)
1052 #define FLDSIZE_X       (FLDBASE * 2 + 1)
1053 static char *
1054 fingerprint_randomart(const char *alg, u_char *dgst_raw, size_t dgst_raw_len,
1055     const struct sshkey *k)
1056 {
1057         /*
1058          * Chars to be used after each other every time the worm
1059          * intersects with itself.  Matter of taste.
1060          */
1061         char    *augmentation_string = " .o+=*BOX@%&#/^SE";
1062         char    *retval, *p, title[FLDSIZE_X], hash[FLDSIZE_X];
1063         u_char   field[FLDSIZE_X][FLDSIZE_Y];
1064         size_t   i, tlen, hlen;
1065         u_int    b;
1066         int      x, y, r;
1067         size_t   len = strlen(augmentation_string) - 1;
1068
1069         if ((retval = calloc((FLDSIZE_X + 3), (FLDSIZE_Y + 2))) == NULL)
1070                 return NULL;
1071
1072         /* initialize field */
1073         memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
1074         x = FLDSIZE_X / 2;
1075         y = FLDSIZE_Y / 2;
1076
1077         /* process raw key */
1078         for (i = 0; i < dgst_raw_len; i++) {
1079                 int input;
1080                 /* each byte conveys four 2-bit move commands */
1081                 input = dgst_raw[i];
1082                 for (b = 0; b < 4; b++) {
1083                         /* evaluate 2 bit, rest is shifted later */
1084                         x += (input & 0x1) ? 1 : -1;
1085                         y += (input & 0x2) ? 1 : -1;
1086
1087                         /* assure we are still in bounds */
1088                         x = MAX(x, 0);
1089                         y = MAX(y, 0);
1090                         x = MIN(x, FLDSIZE_X - 1);
1091                         y = MIN(y, FLDSIZE_Y - 1);
1092
1093                         /* augment the field */
1094                         if (field[x][y] < len - 2)
1095                                 field[x][y]++;
1096                         input = input >> 2;
1097                 }
1098         }
1099
1100         /* mark starting point and end point*/
1101         field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
1102         field[x][y] = len;
1103
1104         /* assemble title */
1105         r = snprintf(title, sizeof(title), "[%s %u]",
1106                 sshkey_type(k), sshkey_size(k));
1107         /* If [type size] won't fit, then try [type]; fits "[ED25519-CERT]" */
1108         if (r < 0 || r > (int)sizeof(title))
1109                 r = snprintf(title, sizeof(title), "[%s]", sshkey_type(k));
1110         tlen = (r <= 0) ? 0 : strlen(title);
1111
1112         /* assemble hash ID. */
1113         r = snprintf(hash, sizeof(hash), "[%s]", alg);
1114         hlen = (r <= 0) ? 0 : strlen(hash);
1115
1116         /* output upper border */
1117         p = retval;
1118         *p++ = '+';
1119         for (i = 0; i < (FLDSIZE_X - tlen) / 2; i++)
1120                 *p++ = '-';
1121         memcpy(p, title, tlen);
1122         p += tlen;
1123         for (i += tlen; i < FLDSIZE_X; i++)
1124                 *p++ = '-';
1125         *p++ = '+';
1126         *p++ = '\n';
1127
1128         /* output content */
1129         for (y = 0; y < FLDSIZE_Y; y++) {
1130                 *p++ = '|';
1131                 for (x = 0; x < FLDSIZE_X; x++)
1132                         *p++ = augmentation_string[MIN(field[x][y], len)];
1133                 *p++ = '|';
1134                 *p++ = '\n';
1135         }
1136
1137         /* output lower border */
1138         *p++ = '+';
1139         for (i = 0; i < (FLDSIZE_X - hlen) / 2; i++)
1140                 *p++ = '-';
1141         memcpy(p, hash, hlen);
1142         p += hlen;
1143         for (i += hlen; i < FLDSIZE_X; i++)
1144                 *p++ = '-';
1145         *p++ = '+';
1146
1147         return retval;
1148 }
1149
1150 char *
1151 sshkey_fingerprint(const struct sshkey *k, int dgst_alg,
1152     enum sshkey_fp_rep dgst_rep)
1153 {
1154         char *retval = NULL;
1155         u_char *dgst_raw;
1156         size_t dgst_raw_len;
1157
1158         if (sshkey_fingerprint_raw(k, dgst_alg, &dgst_raw, &dgst_raw_len) != 0)
1159                 return NULL;
1160         switch (dgst_rep) {
1161         case SSH_FP_DEFAULT:
1162                 if (dgst_alg == SSH_DIGEST_MD5) {
1163                         retval = fingerprint_hex(ssh_digest_alg_name(dgst_alg),
1164                             dgst_raw, dgst_raw_len);
1165                 } else {
1166                         retval = fingerprint_b64(ssh_digest_alg_name(dgst_alg),
1167                             dgst_raw, dgst_raw_len);
1168                 }
1169                 break;
1170         case SSH_FP_HEX:
1171                 retval = fingerprint_hex(ssh_digest_alg_name(dgst_alg),
1172                     dgst_raw, dgst_raw_len);
1173                 break;
1174         case SSH_FP_BASE64:
1175                 retval = fingerprint_b64(ssh_digest_alg_name(dgst_alg),
1176                     dgst_raw, dgst_raw_len);
1177                 break;
1178         case SSH_FP_BUBBLEBABBLE:
1179                 retval = fingerprint_bubblebabble(dgst_raw, dgst_raw_len);
1180                 break;
1181         case SSH_FP_RANDOMART:
1182                 retval = fingerprint_randomart(ssh_digest_alg_name(dgst_alg),
1183                     dgst_raw, dgst_raw_len, k);
1184                 break;
1185         default:
1186                 explicit_bzero(dgst_raw, dgst_raw_len);
1187                 free(dgst_raw);
1188                 return NULL;
1189         }
1190         explicit_bzero(dgst_raw, dgst_raw_len);
1191         free(dgst_raw);
1192         return retval;
1193 }
1194
1195 #ifdef WITH_SSH1
1196 /*
1197  * Reads a multiple-precision integer in decimal from the buffer, and advances
1198  * the pointer.  The integer must already be initialized.  This function is
1199  * permitted to modify the buffer.  This leaves *cpp to point just beyond the
1200  * last processed character.
1201  */
1202 static int
1203 read_decimal_bignum(char **cpp, BIGNUM *v)
1204 {
1205         char *cp;
1206         size_t e;
1207         int skip = 1;   /* skip white space */
1208
1209         cp = *cpp;
1210         while (*cp == ' ' || *cp == '\t')
1211                 cp++;
1212         e = strspn(cp, "0123456789");
1213         if (e == 0)
1214                 return SSH_ERR_INVALID_FORMAT;
1215         if (e > SSHBUF_MAX_BIGNUM * 3)
1216                 return SSH_ERR_BIGNUM_TOO_LARGE;
1217         if (cp[e] == '\0')
1218                 skip = 0;
1219         else if (index(" \t\r\n", cp[e]) == NULL)
1220                 return SSH_ERR_INVALID_FORMAT;
1221         cp[e] = '\0';
1222         if (BN_dec2bn(&v, cp) <= 0)
1223                 return SSH_ERR_INVALID_FORMAT;
1224         *cpp = cp + e + skip;
1225         return 0;
1226 }
1227 #endif /* WITH_SSH1 */
1228
1229 /* returns 0 ok, and < 0 error */
1230 int
1231 sshkey_read(struct sshkey *ret, char **cpp)
1232 {
1233         struct sshkey *k;
1234         int retval = SSH_ERR_INVALID_FORMAT;
1235         char *cp, *space;
1236         int r, type, curve_nid = -1;
1237         struct sshbuf *blob;
1238 #ifdef WITH_SSH1
1239         char *ep;
1240         u_long bits;
1241 #endif /* WITH_SSH1 */
1242
1243         cp = *cpp;
1244
1245         switch (ret->type) {
1246         case KEY_RSA1:
1247 #ifdef WITH_SSH1
1248                 /* Get number of bits. */
1249                 bits = strtoul(cp, &ep, 10);
1250                 if (*cp == '\0' || index(" \t\r\n", *ep) == NULL ||
1251                     bits == 0 || bits > SSHBUF_MAX_BIGNUM * 8)
1252                         return SSH_ERR_INVALID_FORMAT;  /* Bad bit count... */
1253                 /* Get public exponent, public modulus. */
1254                 if ((r = read_decimal_bignum(&ep, ret->rsa->e)) < 0)
1255                         return r;
1256                 if ((r = read_decimal_bignum(&ep, ret->rsa->n)) < 0)
1257                         return r;
1258                 *cpp = ep;
1259                 /* validate the claimed number of bits */
1260                 if (BN_num_bits(ret->rsa->n) != (int)bits)
1261                         return SSH_ERR_KEY_BITS_MISMATCH;
1262                 retval = 0;
1263 #endif /* WITH_SSH1 */
1264                 break;
1265         case KEY_UNSPEC:
1266         case KEY_RSA:
1267         case KEY_DSA:
1268         case KEY_ECDSA:
1269         case KEY_ED25519:
1270         case KEY_DSA_CERT:
1271         case KEY_ECDSA_CERT:
1272         case KEY_RSA_CERT:
1273         case KEY_ED25519_CERT:
1274                 space = strchr(cp, ' ');
1275                 if (space == NULL)
1276                         return SSH_ERR_INVALID_FORMAT;
1277                 *space = '\0';
1278                 type = sshkey_type_from_name(cp);
1279                 if (sshkey_type_plain(type) == KEY_ECDSA &&
1280                     (curve_nid = sshkey_ecdsa_nid_from_name(cp)) == -1)
1281                         return SSH_ERR_EC_CURVE_INVALID;
1282                 *space = ' ';
1283                 if (type == KEY_UNSPEC)
1284                         return SSH_ERR_INVALID_FORMAT;
1285                 cp = space+1;
1286                 if (*cp == '\0')
1287                         return SSH_ERR_INVALID_FORMAT;
1288                 if (ret->type != KEY_UNSPEC && ret->type != type)
1289                         return SSH_ERR_KEY_TYPE_MISMATCH;
1290                 if ((blob = sshbuf_new()) == NULL)
1291                         return SSH_ERR_ALLOC_FAIL;
1292                 /* trim comment */
1293                 space = strchr(cp, ' ');
1294                 if (space) {
1295                         /* advance 'space': skip whitespace */
1296                         *space++ = '\0';
1297                         while (*space == ' ' || *space == '\t')
1298                                 space++;
1299                         *cpp = space;
1300                 } else
1301                         *cpp = cp + strlen(cp);
1302                 if ((r = sshbuf_b64tod(blob, cp)) != 0) {
1303                         sshbuf_free(blob);
1304                         return r;
1305                 }
1306                 if ((r = sshkey_from_blob(sshbuf_ptr(blob),
1307                     sshbuf_len(blob), &k)) != 0) {
1308                         sshbuf_free(blob);
1309                         return r;
1310                 }
1311                 sshbuf_free(blob);
1312                 if (k->type != type) {
1313                         sshkey_free(k);
1314                         return SSH_ERR_KEY_TYPE_MISMATCH;
1315                 }
1316                 if (sshkey_type_plain(type) == KEY_ECDSA &&
1317                     curve_nid != k->ecdsa_nid) {
1318                         sshkey_free(k);
1319                         return SSH_ERR_EC_CURVE_MISMATCH;
1320                 }
1321                 ret->type = type;
1322                 if (sshkey_is_cert(ret)) {
1323                         if (!sshkey_is_cert(k)) {
1324                                 sshkey_free(k);
1325                                 return SSH_ERR_EXPECTED_CERT;
1326                         }
1327                         if (ret->cert != NULL)
1328                                 cert_free(ret->cert);
1329                         ret->cert = k->cert;
1330                         k->cert = NULL;
1331                 }
1332 #ifdef WITH_OPENSSL
1333                 if (sshkey_type_plain(ret->type) == KEY_RSA) {
1334                         if (ret->rsa != NULL)
1335                                 RSA_free(ret->rsa);
1336                         ret->rsa = k->rsa;
1337                         k->rsa = NULL;
1338 #ifdef DEBUG_PK
1339                         RSA_print_fp(stderr, ret->rsa, 8);
1340 #endif
1341                 }
1342                 if (sshkey_type_plain(ret->type) == KEY_DSA) {
1343                         if (ret->dsa != NULL)
1344                                 DSA_free(ret->dsa);
1345                         ret->dsa = k->dsa;
1346                         k->dsa = NULL;
1347 #ifdef DEBUG_PK
1348                         DSA_print_fp(stderr, ret->dsa, 8);
1349 #endif
1350                 }
1351 # ifdef OPENSSL_HAS_ECC
1352                 if (sshkey_type_plain(ret->type) == KEY_ECDSA) {
1353                         if (ret->ecdsa != NULL)
1354                                 EC_KEY_free(ret->ecdsa);
1355                         ret->ecdsa = k->ecdsa;
1356                         ret->ecdsa_nid = k->ecdsa_nid;
1357                         k->ecdsa = NULL;
1358                         k->ecdsa_nid = -1;
1359 #ifdef DEBUG_PK
1360                         sshkey_dump_ec_key(ret->ecdsa);
1361 #endif
1362                 }
1363 # endif /* OPENSSL_HAS_ECC */
1364 #endif /* WITH_OPENSSL */
1365                 if (sshkey_type_plain(ret->type) == KEY_ED25519) {
1366                         free(ret->ed25519_pk);
1367                         ret->ed25519_pk = k->ed25519_pk;
1368                         k->ed25519_pk = NULL;
1369 #ifdef DEBUG_PK
1370                         /* XXX */
1371 #endif
1372                 }
1373                 retval = 0;
1374 /*XXXX*/
1375                 sshkey_free(k);
1376                 if (retval != 0)
1377                         break;
1378                 break;
1379         default:
1380                 return SSH_ERR_INVALID_ARGUMENT;
1381         }
1382         return retval;
1383 }
1384
1385 int
1386 sshkey_to_base64(const struct sshkey *key, char **b64p)
1387 {
1388         int r = SSH_ERR_INTERNAL_ERROR;
1389         struct sshbuf *b = NULL;
1390         char *uu = NULL;
1391
1392         if (b64p != NULL)
1393                 *b64p = NULL;
1394         if ((b = sshbuf_new()) == NULL)
1395                 return SSH_ERR_ALLOC_FAIL;
1396         if ((r = sshkey_putb(key, b)) != 0)
1397                 goto out;
1398         if ((uu = sshbuf_dtob64(b)) == NULL) {
1399                 r = SSH_ERR_ALLOC_FAIL;
1400                 goto out;
1401         }
1402         /* Success */
1403         if (b64p != NULL) {
1404                 *b64p = uu;
1405                 uu = NULL;
1406         }
1407         r = 0;
1408  out:
1409         sshbuf_free(b);
1410         free(uu);
1411         return r;
1412 }
1413
1414 static int
1415 sshkey_format_rsa1(const struct sshkey *key, struct sshbuf *b)
1416 {
1417         int r = SSH_ERR_INTERNAL_ERROR;
1418 #ifdef WITH_SSH1
1419         u_int bits = 0;
1420         char *dec_e = NULL, *dec_n = NULL;
1421
1422         if (key->rsa == NULL || key->rsa->e == NULL ||
1423             key->rsa->n == NULL) {
1424                 r = SSH_ERR_INVALID_ARGUMENT;
1425                 goto out;
1426         }
1427         if ((dec_e = BN_bn2dec(key->rsa->e)) == NULL ||
1428             (dec_n = BN_bn2dec(key->rsa->n)) == NULL) {
1429                 r = SSH_ERR_ALLOC_FAIL;
1430                 goto out;
1431         }
1432         /* size of modulus 'n' */
1433         if ((bits = BN_num_bits(key->rsa->n)) <= 0) {
1434                 r = SSH_ERR_INVALID_ARGUMENT;
1435                 goto out;
1436         }
1437         if ((r = sshbuf_putf(b, "%u %s %s", bits, dec_e, dec_n)) != 0)
1438                 goto out;
1439
1440         /* Success */
1441         r = 0;
1442  out:
1443         if (dec_e != NULL)
1444                 OPENSSL_free(dec_e);
1445         if (dec_n != NULL)
1446                 OPENSSL_free(dec_n);
1447 #endif /* WITH_SSH1 */
1448
1449         return r;
1450 }
1451
1452 static int
1453 sshkey_format_text(const struct sshkey *key, struct sshbuf *b)
1454 {
1455         int r = SSH_ERR_INTERNAL_ERROR;
1456         char *uu = NULL;
1457
1458         if (key->type == KEY_RSA1) {
1459                 if ((r = sshkey_format_rsa1(key, b)) != 0)
1460                         goto out;
1461         } else {
1462                 /* Unsupported key types handled in sshkey_to_base64() */
1463                 if ((r = sshkey_to_base64(key, &uu)) != 0)
1464                         goto out;
1465                 if ((r = sshbuf_putf(b, "%s %s",
1466                     sshkey_ssh_name(key), uu)) != 0)
1467                         goto out;
1468         }
1469         r = 0;
1470  out:
1471         free(uu);
1472         return r;
1473 }
1474
1475 int
1476 sshkey_write(const struct sshkey *key, FILE *f)
1477 {
1478         struct sshbuf *b = NULL;
1479         int r = SSH_ERR_INTERNAL_ERROR;
1480
1481         if ((b = sshbuf_new()) == NULL)
1482                 return SSH_ERR_ALLOC_FAIL;
1483         if ((r = sshkey_format_text(key, b)) != 0)
1484                 goto out;
1485         if (fwrite(sshbuf_ptr(b), sshbuf_len(b), 1, f) != 1) {
1486                 if (feof(f))
1487                         errno = EPIPE;
1488                 r = SSH_ERR_SYSTEM_ERROR;
1489                 goto out;
1490         }
1491         /* Success */
1492         r = 0;
1493  out:
1494         sshbuf_free(b);
1495         return r;
1496 }
1497
1498 const char *
1499 sshkey_cert_type(const struct sshkey *k)
1500 {
1501         switch (k->cert->type) {
1502         case SSH2_CERT_TYPE_USER:
1503                 return "user";
1504         case SSH2_CERT_TYPE_HOST:
1505                 return "host";
1506         default:
1507                 return "unknown";
1508         }
1509 }
1510
1511 #ifdef WITH_OPENSSL
1512 static int
1513 rsa_generate_private_key(u_int bits, RSA **rsap)
1514 {
1515         RSA *private = NULL;
1516         BIGNUM *f4 = NULL;
1517         int ret = SSH_ERR_INTERNAL_ERROR;
1518
1519         if (rsap == NULL ||
1520             bits < SSH_RSA_MINIMUM_MODULUS_SIZE ||
1521             bits > SSHBUF_MAX_BIGNUM * 8)
1522                 return SSH_ERR_INVALID_ARGUMENT;
1523         *rsap = NULL;
1524         if ((private = RSA_new()) == NULL || (f4 = BN_new()) == NULL) {
1525                 ret = SSH_ERR_ALLOC_FAIL;
1526                 goto out;
1527         }
1528         if (!BN_set_word(f4, RSA_F4) ||
1529             !RSA_generate_key_ex(private, bits, f4, NULL)) {
1530                 ret = SSH_ERR_LIBCRYPTO_ERROR;
1531                 goto out;
1532         }
1533         *rsap = private;
1534         private = NULL;
1535         ret = 0;
1536  out:
1537         if (private != NULL)
1538                 RSA_free(private);
1539         if (f4 != NULL)
1540                 BN_free(f4);
1541         return ret;
1542 }
1543
1544 static int
1545 dsa_generate_private_key(u_int bits, DSA **dsap)
1546 {
1547         DSA *private;
1548         int ret = SSH_ERR_INTERNAL_ERROR;
1549
1550         if (dsap == NULL || bits != 1024)
1551                 return SSH_ERR_INVALID_ARGUMENT;
1552         if ((private = DSA_new()) == NULL) {
1553                 ret = SSH_ERR_ALLOC_FAIL;
1554                 goto out;
1555         }
1556         *dsap = NULL;
1557         if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL,
1558             NULL, NULL) || !DSA_generate_key(private)) {
1559                 ret = SSH_ERR_LIBCRYPTO_ERROR;
1560                 goto out;
1561         }
1562         *dsap = private;
1563         private = NULL;
1564         ret = 0;
1565  out:
1566         if (private != NULL)
1567                 DSA_free(private);
1568         return ret;
1569 }
1570
1571 # ifdef OPENSSL_HAS_ECC
1572 int
1573 sshkey_ecdsa_key_to_nid(EC_KEY *k)
1574 {
1575         EC_GROUP *eg;
1576         int nids[] = {
1577                 NID_X9_62_prime256v1,
1578                 NID_secp384r1,
1579 #  ifdef OPENSSL_HAS_NISTP521
1580                 NID_secp521r1,
1581 #  endif /* OPENSSL_HAS_NISTP521 */
1582                 -1
1583         };
1584         int nid;
1585         u_int i;
1586         BN_CTX *bnctx;
1587         const EC_GROUP *g = EC_KEY_get0_group(k);
1588
1589         /*
1590          * The group may be stored in a ASN.1 encoded private key in one of two
1591          * ways: as a "named group", which is reconstituted by ASN.1 object ID
1592          * or explicit group parameters encoded into the key blob. Only the
1593          * "named group" case sets the group NID for us, but we can figure
1594          * it out for the other case by comparing against all the groups that
1595          * are supported.
1596          */
1597         if ((nid = EC_GROUP_get_curve_name(g)) > 0)
1598                 return nid;
1599         if ((bnctx = BN_CTX_new()) == NULL)
1600                 return -1;
1601         for (i = 0; nids[i] != -1; i++) {
1602                 if ((eg = EC_GROUP_new_by_curve_name(nids[i])) == NULL) {
1603                         BN_CTX_free(bnctx);
1604                         return -1;
1605                 }
1606                 if (EC_GROUP_cmp(g, eg, bnctx) == 0)
1607                         break;
1608                 EC_GROUP_free(eg);
1609         }
1610         BN_CTX_free(bnctx);
1611         if (nids[i] != -1) {
1612                 /* Use the group with the NID attached */
1613                 EC_GROUP_set_asn1_flag(eg, OPENSSL_EC_NAMED_CURVE);
1614                 if (EC_KEY_set_group(k, eg) != 1) {
1615                         EC_GROUP_free(eg);
1616                         return -1;
1617                 }
1618         }
1619         return nids[i];
1620 }
1621
1622 static int
1623 ecdsa_generate_private_key(u_int bits, int *nid, EC_KEY **ecdsap)
1624 {
1625         EC_KEY *private;
1626         int ret = SSH_ERR_INTERNAL_ERROR;
1627
1628         if (nid == NULL || ecdsap == NULL ||
1629             (*nid = sshkey_ecdsa_bits_to_nid(bits)) == -1)
1630                 return SSH_ERR_INVALID_ARGUMENT;
1631         *ecdsap = NULL;
1632         if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL) {
1633                 ret = SSH_ERR_ALLOC_FAIL;
1634                 goto out;
1635         }
1636         if (EC_KEY_generate_key(private) != 1) {
1637                 ret = SSH_ERR_LIBCRYPTO_ERROR;
1638                 goto out;
1639         }
1640         EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
1641         *ecdsap = private;
1642         private = NULL;
1643         ret = 0;
1644  out:
1645         if (private != NULL)
1646                 EC_KEY_free(private);
1647         return ret;
1648 }
1649 # endif /* OPENSSL_HAS_ECC */
1650 #endif /* WITH_OPENSSL */
1651
1652 int
1653 sshkey_generate(int type, u_int bits, struct sshkey **keyp)
1654 {
1655         struct sshkey *k;
1656         int ret = SSH_ERR_INTERNAL_ERROR;
1657
1658         if (keyp == NULL)
1659                 return SSH_ERR_INVALID_ARGUMENT;
1660         *keyp = NULL;
1661         if ((k = sshkey_new(KEY_UNSPEC)) == NULL)
1662                 return SSH_ERR_ALLOC_FAIL;
1663         switch (type) {
1664         case KEY_ED25519:
1665                 if ((k->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL ||
1666                     (k->ed25519_sk = malloc(ED25519_SK_SZ)) == NULL) {
1667                         ret = SSH_ERR_ALLOC_FAIL;
1668                         break;
1669                 }
1670                 crypto_sign_ed25519_keypair(k->ed25519_pk, k->ed25519_sk);
1671                 ret = 0;
1672                 break;
1673 #ifdef WITH_OPENSSL
1674         case KEY_DSA:
1675                 ret = dsa_generate_private_key(bits, &k->dsa);
1676                 break;
1677 # ifdef OPENSSL_HAS_ECC
1678         case KEY_ECDSA:
1679                 ret = ecdsa_generate_private_key(bits, &k->ecdsa_nid,
1680                     &k->ecdsa);
1681                 break;
1682 # endif /* OPENSSL_HAS_ECC */
1683         case KEY_RSA:
1684         case KEY_RSA1:
1685                 ret = rsa_generate_private_key(bits, &k->rsa);
1686                 break;
1687 #endif /* WITH_OPENSSL */
1688         default:
1689                 ret = SSH_ERR_INVALID_ARGUMENT;
1690         }
1691         if (ret == 0) {
1692                 k->type = type;
1693                 *keyp = k;
1694         } else
1695                 sshkey_free(k);
1696         return ret;
1697 }
1698
1699 int
1700 sshkey_cert_copy(const struct sshkey *from_key, struct sshkey *to_key)
1701 {
1702         u_int i;
1703         const struct sshkey_cert *from;
1704         struct sshkey_cert *to;
1705         int ret = SSH_ERR_INTERNAL_ERROR;
1706
1707         if (to_key->cert != NULL) {
1708                 cert_free(to_key->cert);
1709                 to_key->cert = NULL;
1710         }
1711
1712         if ((from = from_key->cert) == NULL)
1713                 return SSH_ERR_INVALID_ARGUMENT;
1714
1715         if ((to = to_key->cert = cert_new()) == NULL)
1716                 return SSH_ERR_ALLOC_FAIL;
1717
1718         if ((ret = sshbuf_putb(to->certblob, from->certblob)) != 0 ||
1719             (ret = sshbuf_putb(to->critical, from->critical)) != 0 ||
1720             (ret = sshbuf_putb(to->extensions, from->extensions) != 0))
1721                 return ret;
1722
1723         to->serial = from->serial;
1724         to->type = from->type;
1725         if (from->key_id == NULL)
1726                 to->key_id = NULL;
1727         else if ((to->key_id = strdup(from->key_id)) == NULL)
1728                 return SSH_ERR_ALLOC_FAIL;
1729         to->valid_after = from->valid_after;
1730         to->valid_before = from->valid_before;
1731         if (from->signature_key == NULL)
1732                 to->signature_key = NULL;
1733         else if ((ret = sshkey_from_private(from->signature_key,
1734             &to->signature_key)) != 0)
1735                 return ret;
1736
1737         if (from->nprincipals > SSHKEY_CERT_MAX_PRINCIPALS)
1738                 return SSH_ERR_INVALID_ARGUMENT;
1739         if (from->nprincipals > 0) {
1740                 if ((to->principals = calloc(from->nprincipals,
1741                     sizeof(*to->principals))) == NULL)
1742                         return SSH_ERR_ALLOC_FAIL;
1743                 for (i = 0; i < from->nprincipals; i++) {
1744                         to->principals[i] = strdup(from->principals[i]);
1745                         if (to->principals[i] == NULL) {
1746                                 to->nprincipals = i;
1747                                 return SSH_ERR_ALLOC_FAIL;
1748                         }
1749                 }
1750         }
1751         to->nprincipals = from->nprincipals;
1752         return 0;
1753 }
1754
1755 int
1756 sshkey_from_private(const struct sshkey *k, struct sshkey **pkp)
1757 {
1758         struct sshkey *n = NULL;
1759         int ret = SSH_ERR_INTERNAL_ERROR;
1760
1761         if (pkp != NULL)
1762                 *pkp = NULL;
1763
1764         switch (k->type) {
1765 #ifdef WITH_OPENSSL
1766         case KEY_DSA:
1767         case KEY_DSA_CERT:
1768                 if ((n = sshkey_new(k->type)) == NULL)
1769                         return SSH_ERR_ALLOC_FAIL;
1770                 if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
1771                     (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
1772                     (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
1773                     (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL)) {
1774                         sshkey_free(n);
1775                         return SSH_ERR_ALLOC_FAIL;
1776                 }
1777                 break;
1778 # ifdef OPENSSL_HAS_ECC
1779         case KEY_ECDSA:
1780         case KEY_ECDSA_CERT:
1781                 if ((n = sshkey_new(k->type)) == NULL)
1782                         return SSH_ERR_ALLOC_FAIL;
1783                 n->ecdsa_nid = k->ecdsa_nid;
1784                 n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
1785                 if (n->ecdsa == NULL) {
1786                         sshkey_free(n);
1787                         return SSH_ERR_ALLOC_FAIL;
1788                 }
1789                 if (EC_KEY_set_public_key(n->ecdsa,
1790                     EC_KEY_get0_public_key(k->ecdsa)) != 1) {
1791                         sshkey_free(n);
1792                         return SSH_ERR_LIBCRYPTO_ERROR;
1793                 }
1794                 break;
1795 # endif /* OPENSSL_HAS_ECC */
1796         case KEY_RSA:
1797         case KEY_RSA1:
1798         case KEY_RSA_CERT:
1799                 if ((n = sshkey_new(k->type)) == NULL)
1800                         return SSH_ERR_ALLOC_FAIL;
1801                 if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
1802                     (BN_copy(n->rsa->e, k->rsa->e) == NULL)) {
1803                         sshkey_free(n);
1804                         return SSH_ERR_ALLOC_FAIL;
1805                 }
1806                 break;
1807 #endif /* WITH_OPENSSL */
1808         case KEY_ED25519:
1809         case KEY_ED25519_CERT:
1810                 if ((n = sshkey_new(k->type)) == NULL)
1811                         return SSH_ERR_ALLOC_FAIL;
1812                 if (k->ed25519_pk != NULL) {
1813                         if ((n->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL) {
1814                                 sshkey_free(n);
1815                                 return SSH_ERR_ALLOC_FAIL;
1816                         }
1817                         memcpy(n->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
1818                 }
1819                 break;
1820         default:
1821                 return SSH_ERR_KEY_TYPE_UNKNOWN;
1822         }
1823         if (sshkey_is_cert(k)) {
1824                 if ((ret = sshkey_cert_copy(k, n)) != 0) {
1825                         sshkey_free(n);
1826                         return ret;
1827                 }
1828         }
1829         *pkp = n;
1830         return 0;
1831 }
1832
1833 static int
1834 cert_parse(struct sshbuf *b, struct sshkey *key, struct sshbuf *certbuf)
1835 {
1836         struct sshbuf *principals = NULL, *crit = NULL;
1837         struct sshbuf *exts = NULL, *ca = NULL;
1838         u_char *sig = NULL;
1839         size_t signed_len = 0, slen = 0, kidlen = 0;
1840         int ret = SSH_ERR_INTERNAL_ERROR;
1841
1842         /* Copy the entire key blob for verification and later serialisation */
1843         if ((ret = sshbuf_putb(key->cert->certblob, certbuf)) != 0)
1844                 return ret;
1845
1846         /* Parse body of certificate up to signature */
1847         if ((ret = sshbuf_get_u64(b, &key->cert->serial)) != 0 ||
1848             (ret = sshbuf_get_u32(b, &key->cert->type)) != 0 ||
1849             (ret = sshbuf_get_cstring(b, &key->cert->key_id, &kidlen)) != 0 ||
1850             (ret = sshbuf_froms(b, &principals)) != 0 ||
1851             (ret = sshbuf_get_u64(b, &key->cert->valid_after)) != 0 ||
1852             (ret = sshbuf_get_u64(b, &key->cert->valid_before)) != 0 ||
1853             (ret = sshbuf_froms(b, &crit)) != 0 ||
1854             (ret = sshbuf_froms(b, &exts)) != 0 ||
1855             (ret = sshbuf_get_string_direct(b, NULL, NULL)) != 0 ||
1856             (ret = sshbuf_froms(b, &ca)) != 0) {
1857                 /* XXX debug print error for ret */
1858                 ret = SSH_ERR_INVALID_FORMAT;
1859                 goto out;
1860         }
1861
1862         /* Signature is left in the buffer so we can calculate this length */
1863         signed_len = sshbuf_len(key->cert->certblob) - sshbuf_len(b);
1864
1865         if ((ret = sshbuf_get_string(b, &sig, &slen)) != 0) {
1866                 ret = SSH_ERR_INVALID_FORMAT;
1867                 goto out;
1868         }
1869
1870         if (key->cert->type != SSH2_CERT_TYPE_USER &&
1871             key->cert->type != SSH2_CERT_TYPE_HOST) {
1872                 ret = SSH_ERR_KEY_CERT_UNKNOWN_TYPE;
1873                 goto out;
1874         }
1875
1876         /* Parse principals section */
1877         while (sshbuf_len(principals) > 0) {
1878                 char *principal = NULL;
1879                 char **oprincipals = NULL;
1880
1881                 if (key->cert->nprincipals >= SSHKEY_CERT_MAX_PRINCIPALS) {
1882                         ret = SSH_ERR_INVALID_FORMAT;
1883                         goto out;
1884                 }
1885                 if ((ret = sshbuf_get_cstring(principals, &principal,
1886                     NULL)) != 0) {
1887                         ret = SSH_ERR_INVALID_FORMAT;
1888                         goto out;
1889                 }
1890                 oprincipals = key->cert->principals;
1891                 key->cert->principals = reallocarray(key->cert->principals,
1892                     key->cert->nprincipals + 1, sizeof(*key->cert->principals));
1893                 if (key->cert->principals == NULL) {
1894                         free(principal);
1895                         key->cert->principals = oprincipals;
1896                         ret = SSH_ERR_ALLOC_FAIL;
1897                         goto out;
1898                 }
1899                 key->cert->principals[key->cert->nprincipals++] = principal;
1900         }
1901
1902         /*
1903          * Stash a copies of the critical options and extensions sections
1904          * for later use.
1905          */
1906         if ((ret = sshbuf_putb(key->cert->critical, crit)) != 0 ||
1907             (exts != NULL &&
1908             (ret = sshbuf_putb(key->cert->extensions, exts)) != 0))
1909                 goto out;
1910
1911         /*
1912          * Validate critical options and extensions sections format.
1913          */
1914         while (sshbuf_len(crit) != 0) {
1915                 if ((ret = sshbuf_get_string_direct(crit, NULL, NULL)) != 0 ||
1916                     (ret = sshbuf_get_string_direct(crit, NULL, NULL)) != 0) {
1917                         sshbuf_reset(key->cert->critical);
1918                         ret = SSH_ERR_INVALID_FORMAT;
1919                         goto out;
1920                 }
1921         }
1922         while (exts != NULL && sshbuf_len(exts) != 0) {
1923                 if ((ret = sshbuf_get_string_direct(exts, NULL, NULL)) != 0 ||
1924                     (ret = sshbuf_get_string_direct(exts, NULL, NULL)) != 0) {
1925                         sshbuf_reset(key->cert->extensions);
1926                         ret = SSH_ERR_INVALID_FORMAT;
1927                         goto out;
1928                 }
1929         }
1930
1931         /* Parse CA key and check signature */
1932         if (sshkey_from_blob_internal(ca, &key->cert->signature_key, 0) != 0) {
1933                 ret = SSH_ERR_KEY_CERT_INVALID_SIGN_KEY;
1934                 goto out;
1935         }
1936         if (!sshkey_type_is_valid_ca(key->cert->signature_key->type)) {
1937                 ret = SSH_ERR_KEY_CERT_INVALID_SIGN_KEY;
1938                 goto out;
1939         }
1940         if ((ret = sshkey_verify(key->cert->signature_key, sig, slen,
1941             sshbuf_ptr(key->cert->certblob), signed_len, 0)) != 0)
1942                 goto out;
1943
1944         /* Success */
1945         ret = 0;
1946  out:
1947         sshbuf_free(ca);
1948         sshbuf_free(crit);
1949         sshbuf_free(exts);
1950         sshbuf_free(principals);
1951         free(sig);
1952         return ret;
1953 }
1954
1955 static int
1956 sshkey_from_blob_internal(struct sshbuf *b, struct sshkey **keyp,
1957     int allow_cert)
1958 {
1959         int type, ret = SSH_ERR_INTERNAL_ERROR;
1960         char *ktype = NULL, *curve = NULL;
1961         struct sshkey *key = NULL;
1962         size_t len;
1963         u_char *pk = NULL;
1964         struct sshbuf *copy;
1965 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
1966         EC_POINT *q = NULL;
1967 #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
1968
1969 #ifdef DEBUG_PK /* XXX */
1970         sshbuf_dump(b, stderr);
1971 #endif
1972         *keyp = NULL;
1973         if ((copy = sshbuf_fromb(b)) == NULL) {
1974                 ret = SSH_ERR_ALLOC_FAIL;
1975                 goto out;
1976         }
1977         if (sshbuf_get_cstring(b, &ktype, NULL) != 0) {
1978                 ret = SSH_ERR_INVALID_FORMAT;
1979                 goto out;
1980         }
1981
1982         type = sshkey_type_from_name(ktype);
1983         if (!allow_cert && sshkey_type_is_cert(type)) {
1984                 ret = SSH_ERR_KEY_CERT_INVALID_SIGN_KEY;
1985                 goto out;
1986         }
1987         switch (type) {
1988 #ifdef WITH_OPENSSL
1989         case KEY_RSA_CERT:
1990                 /* Skip nonce */
1991                 if (sshbuf_get_string_direct(b, NULL, NULL) != 0) {
1992                         ret = SSH_ERR_INVALID_FORMAT;
1993                         goto out;
1994                 }
1995                 /* FALLTHROUGH */
1996         case KEY_RSA:
1997                 if ((key = sshkey_new(type)) == NULL) {
1998                         ret = SSH_ERR_ALLOC_FAIL;
1999                         goto out;
2000                 }
2001                 if (sshbuf_get_bignum2(b, key->rsa->e) != 0 ||
2002                     sshbuf_get_bignum2(b, key->rsa->n) != 0) {
2003                         ret = SSH_ERR_INVALID_FORMAT;
2004                         goto out;
2005                 }
2006 #ifdef DEBUG_PK
2007                 RSA_print_fp(stderr, key->rsa, 8);
2008 #endif
2009                 break;
2010         case KEY_DSA_CERT:
2011                 /* Skip nonce */
2012                 if (sshbuf_get_string_direct(b, NULL, NULL) != 0) {
2013                         ret = SSH_ERR_INVALID_FORMAT;
2014                         goto out;
2015                 }
2016                 /* FALLTHROUGH */
2017         case KEY_DSA:
2018                 if ((key = sshkey_new(type)) == NULL) {
2019                         ret = SSH_ERR_ALLOC_FAIL;
2020                         goto out;
2021                 }
2022                 if (sshbuf_get_bignum2(b, key->dsa->p) != 0 ||
2023                     sshbuf_get_bignum2(b, key->dsa->q) != 0 ||
2024                     sshbuf_get_bignum2(b, key->dsa->g) != 0 ||
2025                     sshbuf_get_bignum2(b, key->dsa->pub_key) != 0) {
2026                         ret = SSH_ERR_INVALID_FORMAT;
2027                         goto out;
2028                 }
2029 #ifdef DEBUG_PK
2030                 DSA_print_fp(stderr, key->dsa, 8);
2031 #endif
2032                 break;
2033         case KEY_ECDSA_CERT:
2034                 /* Skip nonce */
2035                 if (sshbuf_get_string_direct(b, NULL, NULL) != 0) {
2036                         ret = SSH_ERR_INVALID_FORMAT;
2037                         goto out;
2038                 }
2039                 /* FALLTHROUGH */
2040 # ifdef OPENSSL_HAS_ECC
2041         case KEY_ECDSA:
2042                 if ((key = sshkey_new(type)) == NULL) {
2043                         ret = SSH_ERR_ALLOC_FAIL;
2044                         goto out;
2045                 }
2046                 key->ecdsa_nid = sshkey_ecdsa_nid_from_name(ktype);
2047                 if (sshbuf_get_cstring(b, &curve, NULL) != 0) {
2048                         ret = SSH_ERR_INVALID_FORMAT;
2049                         goto out;
2050                 }
2051                 if (key->ecdsa_nid != sshkey_curve_name_to_nid(curve)) {
2052                         ret = SSH_ERR_EC_CURVE_MISMATCH;
2053                         goto out;
2054                 }
2055                 if (key->ecdsa != NULL)
2056                         EC_KEY_free(key->ecdsa);
2057                 if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
2058                     == NULL) {
2059                         ret = SSH_ERR_EC_CURVE_INVALID;
2060                         goto out;
2061                 }
2062                 if ((q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL) {
2063                         ret = SSH_ERR_ALLOC_FAIL;
2064                         goto out;
2065                 }
2066                 if (sshbuf_get_ec(b, q, EC_KEY_get0_group(key->ecdsa)) != 0) {
2067                         ret = SSH_ERR_INVALID_FORMAT;
2068                         goto out;
2069                 }
2070                 if (sshkey_ec_validate_public(EC_KEY_get0_group(key->ecdsa),
2071                     q) != 0) {
2072                         ret = SSH_ERR_KEY_INVALID_EC_VALUE;
2073                         goto out;
2074                 }
2075                 if (EC_KEY_set_public_key(key->ecdsa, q) != 1) {
2076                         /* XXX assume it is a allocation error */
2077                         ret = SSH_ERR_ALLOC_FAIL;
2078                         goto out;
2079                 }
2080 #ifdef DEBUG_PK
2081                 sshkey_dump_ec_point(EC_KEY_get0_group(key->ecdsa), q);
2082 #endif
2083                 break;
2084 # endif /* OPENSSL_HAS_ECC */
2085 #endif /* WITH_OPENSSL */
2086         case KEY_ED25519_CERT:
2087                 /* Skip nonce */
2088                 if (sshbuf_get_string_direct(b, NULL, NULL) != 0) {
2089                         ret = SSH_ERR_INVALID_FORMAT;
2090                         goto out;
2091                 }
2092                 /* FALLTHROUGH */
2093         case KEY_ED25519:
2094                 if ((ret = sshbuf_get_string(b, &pk, &len)) != 0)
2095                         goto out;
2096                 if (len != ED25519_PK_SZ) {
2097                         ret = SSH_ERR_INVALID_FORMAT;
2098                         goto out;
2099                 }
2100                 if ((key = sshkey_new(type)) == NULL) {
2101                         ret = SSH_ERR_ALLOC_FAIL;
2102                         goto out;
2103                 }
2104                 key->ed25519_pk = pk;
2105                 pk = NULL;
2106                 break;
2107         case KEY_UNSPEC:
2108                 if ((key = sshkey_new(type)) == NULL) {
2109                         ret = SSH_ERR_ALLOC_FAIL;
2110                         goto out;
2111                 }
2112                 break;
2113         default:
2114                 ret = SSH_ERR_KEY_TYPE_UNKNOWN;
2115                 goto out;
2116         }
2117
2118         /* Parse certificate potion */
2119         if (sshkey_is_cert(key) && (ret = cert_parse(b, key, copy)) != 0)
2120                 goto out;
2121
2122         if (key != NULL && sshbuf_len(b) != 0) {
2123                 ret = SSH_ERR_INVALID_FORMAT;
2124                 goto out;
2125         }
2126         ret = 0;
2127         *keyp = key;
2128         key = NULL;
2129  out:
2130         sshbuf_free(copy);
2131         sshkey_free(key);
2132         free(ktype);
2133         free(curve);
2134         free(pk);
2135 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
2136         if (q != NULL)
2137                 EC_POINT_free(q);
2138 #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
2139         return ret;
2140 }
2141
2142 int
2143 sshkey_from_blob(const u_char *blob, size_t blen, struct sshkey **keyp)
2144 {
2145         struct sshbuf *b;
2146         int r;
2147
2148         if ((b = sshbuf_from(blob, blen)) == NULL)
2149                 return SSH_ERR_ALLOC_FAIL;
2150         r = sshkey_from_blob_internal(b, keyp, 1);
2151         sshbuf_free(b);
2152         return r;
2153 }
2154
2155 int
2156 sshkey_fromb(struct sshbuf *b, struct sshkey **keyp)
2157 {
2158         return sshkey_from_blob_internal(b, keyp, 1);
2159 }
2160
2161 int
2162 sshkey_froms(struct sshbuf *buf, struct sshkey **keyp)
2163 {
2164         struct sshbuf *b;
2165         int r;
2166
2167         if ((r = sshbuf_froms(buf, &b)) != 0)
2168                 return r;
2169         r = sshkey_from_blob_internal(b, keyp, 1);
2170         sshbuf_free(b);
2171         return r;
2172 }
2173
2174 int
2175 sshkey_sign(const struct sshkey *key,
2176     u_char **sigp, size_t *lenp,
2177     const u_char *data, size_t datalen, u_int compat)
2178 {
2179         if (sigp != NULL)
2180                 *sigp = NULL;
2181         if (lenp != NULL)
2182                 *lenp = 0;
2183         if (datalen > SSH_KEY_MAX_SIGN_DATA_SIZE)
2184                 return SSH_ERR_INVALID_ARGUMENT;
2185         switch (key->type) {
2186 #ifdef WITH_OPENSSL
2187         case KEY_DSA_CERT:
2188         case KEY_DSA:
2189                 return ssh_dss_sign(key, sigp, lenp, data, datalen, compat);
2190 # ifdef OPENSSL_HAS_ECC
2191         case KEY_ECDSA_CERT:
2192         case KEY_ECDSA:
2193                 return ssh_ecdsa_sign(key, sigp, lenp, data, datalen, compat);
2194 # endif /* OPENSSL_HAS_ECC */
2195         case KEY_RSA_CERT:
2196         case KEY_RSA:
2197                 return ssh_rsa_sign(key, sigp, lenp, data, datalen, compat);
2198 #endif /* WITH_OPENSSL */
2199         case KEY_ED25519:
2200         case KEY_ED25519_CERT:
2201                 return ssh_ed25519_sign(key, sigp, lenp, data, datalen, compat);
2202         default:
2203                 return SSH_ERR_KEY_TYPE_UNKNOWN;
2204         }
2205 }
2206
2207 /*
2208  * ssh_key_verify returns 0 for a correct signature  and < 0 on error.
2209  */
2210 int
2211 sshkey_verify(const struct sshkey *key,
2212     const u_char *sig, size_t siglen,
2213     const u_char *data, size_t dlen, u_int compat)
2214 {
2215         if (siglen == 0 || dlen > SSH_KEY_MAX_SIGN_DATA_SIZE)
2216                 return SSH_ERR_INVALID_ARGUMENT;
2217         switch (key->type) {
2218 #ifdef WITH_OPENSSL
2219         case KEY_DSA_CERT:
2220         case KEY_DSA:
2221                 return ssh_dss_verify(key, sig, siglen, data, dlen, compat);
2222 # ifdef OPENSSL_HAS_ECC
2223         case KEY_ECDSA_CERT:
2224         case KEY_ECDSA:
2225                 return ssh_ecdsa_verify(key, sig, siglen, data, dlen, compat);
2226 # endif /* OPENSSL_HAS_ECC */
2227         case KEY_RSA_CERT:
2228         case KEY_RSA:
2229                 return ssh_rsa_verify(key, sig, siglen, data, dlen, compat);
2230 #endif /* WITH_OPENSSL */
2231         case KEY_ED25519:
2232         case KEY_ED25519_CERT:
2233                 return ssh_ed25519_verify(key, sig, siglen, data, dlen, compat);
2234         default:
2235                 return SSH_ERR_KEY_TYPE_UNKNOWN;
2236         }
2237 }
2238
2239 /* Converts a private to a public key */
2240 int
2241 sshkey_demote(const struct sshkey *k, struct sshkey **dkp)
2242 {
2243         struct sshkey *pk;
2244         int ret = SSH_ERR_INTERNAL_ERROR;
2245
2246         if (dkp != NULL)
2247                 *dkp = NULL;
2248
2249         if ((pk = calloc(1, sizeof(*pk))) == NULL)
2250                 return SSH_ERR_ALLOC_FAIL;
2251         pk->type = k->type;
2252         pk->flags = k->flags;
2253         pk->ecdsa_nid = k->ecdsa_nid;
2254         pk->dsa = NULL;
2255         pk->ecdsa = NULL;
2256         pk->rsa = NULL;
2257         pk->ed25519_pk = NULL;
2258         pk->ed25519_sk = NULL;
2259
2260         switch (k->type) {
2261 #ifdef WITH_OPENSSL
2262         case KEY_RSA_CERT:
2263                 if ((ret = sshkey_cert_copy(k, pk)) != 0)
2264                         goto fail;
2265                 /* FALLTHROUGH */
2266         case KEY_RSA1:
2267         case KEY_RSA:
2268                 if ((pk->rsa = RSA_new()) == NULL ||
2269                     (pk->rsa->e = BN_dup(k->rsa->e)) == NULL ||
2270                     (pk->rsa->n = BN_dup(k->rsa->n)) == NULL) {
2271                         ret = SSH_ERR_ALLOC_FAIL;
2272                         goto fail;
2273                         }
2274                 break;
2275         case KEY_DSA_CERT:
2276                 if ((ret = sshkey_cert_copy(k, pk)) != 0)
2277                         goto fail;
2278                 /* FALLTHROUGH */
2279         case KEY_DSA:
2280                 if ((pk->dsa = DSA_new()) == NULL ||
2281                     (pk->dsa->p = BN_dup(k->dsa->p)) == NULL ||
2282                     (pk->dsa->q = BN_dup(k->dsa->q)) == NULL ||
2283                     (pk->dsa->g = BN_dup(k->dsa->g)) == NULL ||
2284                     (pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL) {
2285                         ret = SSH_ERR_ALLOC_FAIL;
2286                         goto fail;
2287                 }
2288                 break;
2289         case KEY_ECDSA_CERT:
2290                 if ((ret = sshkey_cert_copy(k, pk)) != 0)
2291                         goto fail;
2292                 /* FALLTHROUGH */
2293 # ifdef OPENSSL_HAS_ECC
2294         case KEY_ECDSA:
2295                 pk->ecdsa = EC_KEY_new_by_curve_name(pk->ecdsa_nid);
2296                 if (pk->ecdsa == NULL) {
2297                         ret = SSH_ERR_ALLOC_FAIL;
2298                         goto fail;
2299                 }
2300                 if (EC_KEY_set_public_key(pk->ecdsa,
2301                     EC_KEY_get0_public_key(k->ecdsa)) != 1) {
2302                         ret = SSH_ERR_LIBCRYPTO_ERROR;
2303                         goto fail;
2304                 }
2305                 break;
2306 # endif /* OPENSSL_HAS_ECC */
2307 #endif /* WITH_OPENSSL */
2308         case KEY_ED25519_CERT:
2309                 if ((ret = sshkey_cert_copy(k, pk)) != 0)
2310                         goto fail;
2311                 /* FALLTHROUGH */
2312         case KEY_ED25519:
2313                 if (k->ed25519_pk != NULL) {
2314                         if ((pk->ed25519_pk = malloc(ED25519_PK_SZ)) == NULL) {
2315                                 ret = SSH_ERR_ALLOC_FAIL;
2316                                 goto fail;
2317                         }
2318                         memcpy(pk->ed25519_pk, k->ed25519_pk, ED25519_PK_SZ);
2319                 }
2320                 break;
2321         default:
2322                 ret = SSH_ERR_KEY_TYPE_UNKNOWN;
2323  fail:
2324                 sshkey_free(pk);
2325                 return ret;
2326         }
2327         *dkp = pk;
2328         return 0;
2329 }
2330
2331 /* Convert a plain key to their _CERT equivalent */
2332 int
2333 sshkey_to_certified(struct sshkey *k)
2334 {
2335         int newtype;
2336
2337         switch (k->type) {
2338 #ifdef WITH_OPENSSL
2339         case KEY_RSA:
2340                 newtype = KEY_RSA_CERT;
2341                 break;
2342         case KEY_DSA:
2343                 newtype = KEY_DSA_CERT;
2344                 break;
2345         case KEY_ECDSA:
2346                 newtype = KEY_ECDSA_CERT;
2347                 break;
2348 #endif /* WITH_OPENSSL */
2349         case KEY_ED25519:
2350                 newtype = KEY_ED25519_CERT;
2351                 break;
2352         default:
2353                 return SSH_ERR_INVALID_ARGUMENT;
2354         }
2355         if ((k->cert = cert_new()) == NULL)
2356                 return SSH_ERR_ALLOC_FAIL;
2357         k->type = newtype;
2358         return 0;
2359 }
2360
2361 /* Convert a certificate to its raw key equivalent */
2362 int
2363 sshkey_drop_cert(struct sshkey *k)
2364 {
2365         if (!sshkey_type_is_cert(k->type))
2366                 return SSH_ERR_KEY_TYPE_UNKNOWN;
2367         cert_free(k->cert);
2368         k->cert = NULL;
2369         k->type = sshkey_type_plain(k->type);
2370         return 0;
2371 }
2372
2373 /* Sign a certified key, (re-)generating the signed certblob. */
2374 int
2375 sshkey_certify(struct sshkey *k, struct sshkey *ca)
2376 {
2377         struct sshbuf *principals = NULL;
2378         u_char *ca_blob = NULL, *sig_blob = NULL, nonce[32];
2379         size_t i, ca_len, sig_len;
2380         int ret = SSH_ERR_INTERNAL_ERROR;
2381         struct sshbuf *cert;
2382
2383         if (k == NULL || k->cert == NULL ||
2384             k->cert->certblob == NULL || ca == NULL)
2385                 return SSH_ERR_INVALID_ARGUMENT;
2386         if (!sshkey_is_cert(k))
2387                 return SSH_ERR_KEY_TYPE_UNKNOWN;
2388         if (!sshkey_type_is_valid_ca(ca->type))
2389                 return SSH_ERR_KEY_CERT_INVALID_SIGN_KEY;
2390
2391         if ((ret = sshkey_to_blob(ca, &ca_blob, &ca_len)) != 0)
2392                 return SSH_ERR_KEY_CERT_INVALID_SIGN_KEY;
2393
2394         cert = k->cert->certblob; /* for readability */
2395         sshbuf_reset(cert);
2396         if ((ret = sshbuf_put_cstring(cert, sshkey_ssh_name(k))) != 0)
2397                 goto out;
2398
2399         /* -v01 certs put nonce first */
2400         arc4random_buf(&nonce, sizeof(nonce));
2401         if ((ret = sshbuf_put_string(cert, nonce, sizeof(nonce))) != 0)
2402                 goto out;
2403
2404         /* XXX this substantially duplicates to_blob(); refactor */
2405         switch (k->type) {
2406 #ifdef WITH_OPENSSL
2407         case KEY_DSA_CERT:
2408                 if ((ret = sshbuf_put_bignum2(cert, k->dsa->p)) != 0 ||
2409                     (ret = sshbuf_put_bignum2(cert, k->dsa->q)) != 0 ||
2410                     (ret = sshbuf_put_bignum2(cert, k->dsa->g)) != 0 ||
2411                     (ret = sshbuf_put_bignum2(cert, k->dsa->pub_key)) != 0)
2412                         goto out;
2413                 break;
2414 # ifdef OPENSSL_HAS_ECC
2415         case KEY_ECDSA_CERT:
2416                 if ((ret = sshbuf_put_cstring(cert,
2417                     sshkey_curve_nid_to_name(k->ecdsa_nid))) != 0 ||
2418                     (ret = sshbuf_put_ec(cert,
2419                     EC_KEY_get0_public_key(k->ecdsa),
2420                     EC_KEY_get0_group(k->ecdsa))) != 0)
2421                         goto out;
2422                 break;
2423 # endif /* OPENSSL_HAS_ECC */
2424         case KEY_RSA_CERT:
2425                 if ((ret = sshbuf_put_bignum2(cert, k->rsa->e)) != 0 ||
2426                     (ret = sshbuf_put_bignum2(cert, k->rsa->n)) != 0)
2427                         goto out;
2428                 break;
2429 #endif /* WITH_OPENSSL */
2430         case KEY_ED25519_CERT:
2431                 if ((ret = sshbuf_put_string(cert,
2432                     k->ed25519_pk, ED25519_PK_SZ)) != 0)
2433                         goto out;
2434                 break;
2435         default:
2436                 ret = SSH_ERR_INVALID_ARGUMENT;
2437                 goto out;
2438         }
2439
2440         if ((ret = sshbuf_put_u64(cert, k->cert->serial)) != 0 ||
2441             (ret = sshbuf_put_u32(cert, k->cert->type)) != 0 ||
2442             (ret = sshbuf_put_cstring(cert, k->cert->key_id)) != 0)
2443                 goto out;
2444
2445         if ((principals = sshbuf_new()) == NULL) {
2446                 ret = SSH_ERR_ALLOC_FAIL;
2447                 goto out;
2448         }
2449         for (i = 0; i < k->cert->nprincipals; i++) {
2450                 if ((ret = sshbuf_put_cstring(principals,
2451                     k->cert->principals[i])) != 0)
2452                         goto out;
2453         }
2454         if ((ret = sshbuf_put_stringb(cert, principals)) != 0 ||
2455             (ret = sshbuf_put_u64(cert, k->cert->valid_after)) != 0 ||
2456             (ret = sshbuf_put_u64(cert, k->cert->valid_before)) != 0 ||
2457             (ret = sshbuf_put_stringb(cert, k->cert->critical)) != 0 ||
2458             (ret = sshbuf_put_stringb(cert, k->cert->extensions)) != 0 ||
2459             (ret = sshbuf_put_string(cert, NULL, 0)) != 0 || /* Reserved */
2460             (ret = sshbuf_put_string(cert, ca_blob, ca_len)) != 0)
2461                 goto out;
2462
2463         /* Sign the whole mess */
2464         if ((ret = sshkey_sign(ca, &sig_blob, &sig_len, sshbuf_ptr(cert),
2465             sshbuf_len(cert), 0)) != 0)
2466                 goto out;
2467
2468         /* Append signature and we are done */
2469         if ((ret = sshbuf_put_string(cert, sig_blob, sig_len)) != 0)
2470                 goto out;
2471         ret = 0;
2472  out:
2473         if (ret != 0)
2474                 sshbuf_reset(cert);
2475         if (sig_blob != NULL)
2476                 free(sig_blob);
2477         if (ca_blob != NULL)
2478                 free(ca_blob);
2479         if (principals != NULL)
2480                 sshbuf_free(principals);
2481         return ret;
2482 }
2483
2484 int
2485 sshkey_cert_check_authority(const struct sshkey *k,
2486     int want_host, int require_principal,
2487     const char *name, const char **reason)
2488 {
2489         u_int i, principal_matches;
2490         time_t now = time(NULL);
2491
2492         if (reason != NULL)
2493                 *reason = NULL;
2494
2495         if (want_host) {
2496                 if (k->cert->type != SSH2_CERT_TYPE_HOST) {
2497                         *reason = "Certificate invalid: not a host certificate";
2498                         return SSH_ERR_KEY_CERT_INVALID;
2499                 }
2500         } else {
2501                 if (k->cert->type != SSH2_CERT_TYPE_USER) {
2502                         *reason = "Certificate invalid: not a user certificate";
2503                         return SSH_ERR_KEY_CERT_INVALID;
2504                 }
2505         }
2506         if (now < 0) {
2507                 /* yikes - system clock before epoch! */
2508                 *reason = "Certificate invalid: not yet valid";
2509                 return SSH_ERR_KEY_CERT_INVALID;
2510         }
2511         if ((u_int64_t)now < k->cert->valid_after) {
2512                 *reason = "Certificate invalid: not yet valid";
2513                 return SSH_ERR_KEY_CERT_INVALID;
2514         }
2515         if ((u_int64_t)now >= k->cert->valid_before) {
2516                 *reason = "Certificate invalid: expired";
2517                 return SSH_ERR_KEY_CERT_INVALID;
2518         }
2519         if (k->cert->nprincipals == 0) {
2520                 if (require_principal) {
2521                         *reason = "Certificate lacks principal list";
2522                         return SSH_ERR_KEY_CERT_INVALID;
2523                 }
2524         } else if (name != NULL) {
2525                 principal_matches = 0;
2526                 for (i = 0; i < k->cert->nprincipals; i++) {
2527                         if (strcmp(name, k->cert->principals[i]) == 0) {
2528                                 principal_matches = 1;
2529                                 break;
2530                         }
2531                 }
2532                 if (!principal_matches) {
2533                         *reason = "Certificate invalid: name is not a listed "
2534                             "principal";
2535                         return SSH_ERR_KEY_CERT_INVALID;
2536                 }
2537         }
2538         return 0;
2539 }
2540
2541 int
2542 sshkey_private_serialize(const struct sshkey *key, struct sshbuf *b)
2543 {
2544         int r = SSH_ERR_INTERNAL_ERROR;
2545
2546         if ((r = sshbuf_put_cstring(b, sshkey_ssh_name(key))) != 0)
2547                 goto out;
2548         switch (key->type) {
2549 #ifdef WITH_OPENSSL
2550         case KEY_RSA:
2551                 if ((r = sshbuf_put_bignum2(b, key->rsa->n)) != 0 ||
2552                     (r = sshbuf_put_bignum2(b, key->rsa->e)) != 0 ||
2553                     (r = sshbuf_put_bignum2(b, key->rsa->d)) != 0 ||
2554                     (r = sshbuf_put_bignum2(b, key->rsa->iqmp)) != 0 ||
2555                     (r = sshbuf_put_bignum2(b, key->rsa->p)) != 0 ||
2556                     (r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
2557                         goto out;
2558                 break;
2559         case KEY_RSA_CERT:
2560                 if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
2561                         r = SSH_ERR_INVALID_ARGUMENT;
2562                         goto out;
2563                 }
2564                 if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2565                     (r = sshbuf_put_bignum2(b, key->rsa->d)) != 0 ||
2566                     (r = sshbuf_put_bignum2(b, key->rsa->iqmp)) != 0 ||
2567                     (r = sshbuf_put_bignum2(b, key->rsa->p)) != 0 ||
2568                     (r = sshbuf_put_bignum2(b, key->rsa->q)) != 0)
2569                         goto out;
2570                 break;
2571         case KEY_DSA:
2572                 if ((r = sshbuf_put_bignum2(b, key->dsa->p)) != 0 ||
2573                     (r = sshbuf_put_bignum2(b, key->dsa->q)) != 0 ||
2574                     (r = sshbuf_put_bignum2(b, key->dsa->g)) != 0 ||
2575                     (r = sshbuf_put_bignum2(b, key->dsa->pub_key)) != 0 ||
2576                     (r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
2577                         goto out;
2578                 break;
2579         case KEY_DSA_CERT:
2580                 if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
2581                         r = SSH_ERR_INVALID_ARGUMENT;
2582                         goto out;
2583                 }
2584                 if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2585                     (r = sshbuf_put_bignum2(b, key->dsa->priv_key)) != 0)
2586                         goto out;
2587                 break;
2588 # ifdef OPENSSL_HAS_ECC
2589         case KEY_ECDSA:
2590                 if ((r = sshbuf_put_cstring(b,
2591                     sshkey_curve_nid_to_name(key->ecdsa_nid))) != 0 ||
2592                     (r = sshbuf_put_eckey(b, key->ecdsa)) != 0 ||
2593                     (r = sshbuf_put_bignum2(b,
2594                     EC_KEY_get0_private_key(key->ecdsa))) != 0)
2595                         goto out;
2596                 break;
2597         case KEY_ECDSA_CERT:
2598                 if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
2599                         r = SSH_ERR_INVALID_ARGUMENT;
2600                         goto out;
2601                 }
2602                 if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2603                     (r = sshbuf_put_bignum2(b,
2604                     EC_KEY_get0_private_key(key->ecdsa))) != 0)
2605                         goto out;
2606                 break;
2607 # endif /* OPENSSL_HAS_ECC */
2608 #endif /* WITH_OPENSSL */
2609         case KEY_ED25519:
2610                 if ((r = sshbuf_put_string(b, key->ed25519_pk,
2611                     ED25519_PK_SZ)) != 0 ||
2612                     (r = sshbuf_put_string(b, key->ed25519_sk,
2613                     ED25519_SK_SZ)) != 0)
2614                         goto out;
2615                 break;
2616         case KEY_ED25519_CERT:
2617                 if (key->cert == NULL || sshbuf_len(key->cert->certblob) == 0) {
2618                         r = SSH_ERR_INVALID_ARGUMENT;
2619                         goto out;
2620                 }
2621                 if ((r = sshbuf_put_stringb(b, key->cert->certblob)) != 0 ||
2622                     (r = sshbuf_put_string(b, key->ed25519_pk,
2623                     ED25519_PK_SZ)) != 0 ||
2624                     (r = sshbuf_put_string(b, key->ed25519_sk,
2625                     ED25519_SK_SZ)) != 0)
2626                         goto out;
2627                 break;
2628         default:
2629                 r = SSH_ERR_INVALID_ARGUMENT;
2630                 goto out;
2631         }
2632         /* success */
2633         r = 0;
2634  out:
2635         return r;
2636 }
2637
2638 int
2639 sshkey_private_deserialize(struct sshbuf *buf, struct sshkey **kp)
2640 {
2641         char *tname = NULL, *curve = NULL;
2642         struct sshkey *k = NULL;
2643         size_t pklen = 0, sklen = 0;
2644         int type, r = SSH_ERR_INTERNAL_ERROR;
2645         u_char *ed25519_pk = NULL, *ed25519_sk = NULL;
2646 #ifdef WITH_OPENSSL
2647         BIGNUM *exponent = NULL;
2648 #endif /* WITH_OPENSSL */
2649
2650         if (kp != NULL)
2651                 *kp = NULL;
2652         if ((r = sshbuf_get_cstring(buf, &tname, NULL)) != 0)
2653                 goto out;
2654         type = sshkey_type_from_name(tname);
2655         switch (type) {
2656 #ifdef WITH_OPENSSL
2657         case KEY_DSA:
2658                 if ((k = sshkey_new_private(type)) == NULL) {
2659                         r = SSH_ERR_ALLOC_FAIL;
2660                         goto out;
2661                 }
2662                 if ((r = sshbuf_get_bignum2(buf, k->dsa->p)) != 0 ||
2663                     (r = sshbuf_get_bignum2(buf, k->dsa->q)) != 0 ||
2664                     (r = sshbuf_get_bignum2(buf, k->dsa->g)) != 0 ||
2665                     (r = sshbuf_get_bignum2(buf, k->dsa->pub_key)) != 0 ||
2666                     (r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
2667                         goto out;
2668                 break;
2669         case KEY_DSA_CERT:
2670                 if ((r = sshkey_froms(buf, &k)) != 0 ||
2671                     (r = sshkey_add_private(k)) != 0 ||
2672                     (r = sshbuf_get_bignum2(buf, k->dsa->priv_key)) != 0)
2673                         goto out;
2674                 break;
2675 # ifdef OPENSSL_HAS_ECC
2676         case KEY_ECDSA:
2677                 if ((k = sshkey_new_private(type)) == NULL) {
2678                         r = SSH_ERR_ALLOC_FAIL;
2679                         goto out;
2680                 }
2681                 if ((k->ecdsa_nid = sshkey_ecdsa_nid_from_name(tname)) == -1) {
2682                         r = SSH_ERR_INVALID_ARGUMENT;
2683                         goto out;
2684                 }
2685                 if ((r = sshbuf_get_cstring(buf, &curve, NULL)) != 0)
2686                         goto out;
2687                 if (k->ecdsa_nid != sshkey_curve_name_to_nid(curve)) {
2688                         r = SSH_ERR_EC_CURVE_MISMATCH;
2689                         goto out;
2690                 }
2691                 k->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid);
2692                 if (k->ecdsa  == NULL || (exponent = BN_new()) == NULL) {
2693                         r = SSH_ERR_LIBCRYPTO_ERROR;
2694                         goto out;
2695                 }
2696                 if ((r = sshbuf_get_eckey(buf, k->ecdsa)) != 0 ||
2697                     (r = sshbuf_get_bignum2(buf, exponent)))
2698                         goto out;
2699                 if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) {
2700                         r = SSH_ERR_LIBCRYPTO_ERROR;
2701                         goto out;
2702                 }
2703                 if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
2704                     EC_KEY_get0_public_key(k->ecdsa)) != 0) ||
2705                     (r = sshkey_ec_validate_private(k->ecdsa)) != 0)
2706                         goto out;
2707                 break;
2708         case KEY_ECDSA_CERT:
2709                 if ((exponent = BN_new()) == NULL) {
2710                         r = SSH_ERR_LIBCRYPTO_ERROR;
2711                         goto out;
2712                 }
2713                 if ((r = sshkey_froms(buf, &k)) != 0 ||
2714                     (r = sshkey_add_private(k)) != 0 ||
2715                     (r = sshbuf_get_bignum2(buf, exponent)) != 0)
2716                         goto out;
2717                 if (EC_KEY_set_private_key(k->ecdsa, exponent) != 1) {
2718                         r = SSH_ERR_LIBCRYPTO_ERROR;
2719                         goto out;
2720                 }
2721                 if ((r = sshkey_ec_validate_public(EC_KEY_get0_group(k->ecdsa),
2722                     EC_KEY_get0_public_key(k->ecdsa)) != 0) ||
2723                     (r = sshkey_ec_validate_private(k->ecdsa)) != 0)
2724                         goto out;
2725                 break;
2726 # endif /* OPENSSL_HAS_ECC */
2727         case KEY_RSA:
2728                 if ((k = sshkey_new_private(type)) == NULL) {
2729                         r = SSH_ERR_ALLOC_FAIL;
2730                         goto out;
2731                 }
2732                 if ((r = sshbuf_get_bignum2(buf, k->rsa->n)) != 0 ||
2733                     (r = sshbuf_get_bignum2(buf, k->rsa->e)) != 0 ||
2734                     (r = sshbuf_get_bignum2(buf, k->rsa->d)) != 0 ||
2735                     (r = sshbuf_get_bignum2(buf, k->rsa->iqmp)) != 0 ||
2736                     (r = sshbuf_get_bignum2(buf, k->rsa->p)) != 0 ||
2737                     (r = sshbuf_get_bignum2(buf, k->rsa->q)) != 0 ||
2738                     (r = rsa_generate_additional_parameters(k->rsa)) != 0)
2739                         goto out;
2740                 break;
2741         case KEY_RSA_CERT:
2742                 if ((r = sshkey_froms(buf, &k)) != 0 ||
2743                     (r = sshkey_add_private(k)) != 0 ||
2744                     (r = sshbuf_get_bignum2(buf, k->rsa->d) != 0) ||
2745                     (r = sshbuf_get_bignum2(buf, k->rsa->iqmp) != 0) ||
2746                     (r = sshbuf_get_bignum2(buf, k->rsa->p) != 0) ||
2747                     (r = sshbuf_get_bignum2(buf, k->rsa->q) != 0) ||
2748                     (r = rsa_generate_additional_parameters(k->rsa)) != 0)
2749                         goto out;
2750                 break;
2751 #endif /* WITH_OPENSSL */
2752         case KEY_ED25519:
2753                 if ((k = sshkey_new_private(type)) == NULL) {
2754                         r = SSH_ERR_ALLOC_FAIL;
2755                         goto out;
2756                 }
2757                 if ((r = sshbuf_get_string(buf, &ed25519_pk, &pklen)) != 0 ||
2758                     (r = sshbuf_get_string(buf, &ed25519_sk, &sklen)) != 0)
2759                         goto out;
2760                 if (pklen != ED25519_PK_SZ || sklen != ED25519_SK_SZ) {
2761                         r = SSH_ERR_INVALID_FORMAT;
2762                         goto out;
2763                 }
2764                 k->ed25519_pk = ed25519_pk;
2765                 k->ed25519_sk = ed25519_sk;
2766                 ed25519_pk = ed25519_sk = NULL;
2767                 break;
2768         case KEY_ED25519_CERT:
2769                 if ((r = sshkey_froms(buf, &k)) != 0 ||
2770                     (r = sshkey_add_private(k)) != 0 ||
2771                     (r = sshbuf_get_string(buf, &ed25519_pk, &pklen)) != 0 ||
2772                     (r = sshbuf_get_string(buf, &ed25519_sk, &sklen)) != 0)
2773                         goto out;
2774                 if (pklen != ED25519_PK_SZ || sklen != ED25519_SK_SZ) {
2775                         r = SSH_ERR_INVALID_FORMAT;
2776                         goto out;
2777                 }
2778                 k->ed25519_pk = ed25519_pk;
2779                 k->ed25519_sk = ed25519_sk;
2780                 ed25519_pk = ed25519_sk = NULL;
2781                 break;
2782         default:
2783                 r = SSH_ERR_KEY_TYPE_UNKNOWN;
2784                 goto out;
2785         }
2786 #ifdef WITH_OPENSSL
2787         /* enable blinding */
2788         switch (k->type) {
2789         case KEY_RSA:
2790         case KEY_RSA_CERT:
2791         case KEY_RSA1:
2792                 if (RSA_blinding_on(k->rsa, NULL) != 1) {
2793                         r = SSH_ERR_LIBCRYPTO_ERROR;
2794                         goto out;
2795                 }
2796                 break;
2797         }
2798 #endif /* WITH_OPENSSL */
2799         /* success */
2800         r = 0;
2801         if (kp != NULL) {
2802                 *kp = k;
2803                 k = NULL;
2804         }
2805  out:
2806         free(tname);
2807         free(curve);
2808 #ifdef WITH_OPENSSL
2809         if (exponent != NULL)
2810                 BN_clear_free(exponent);
2811 #endif /* WITH_OPENSSL */
2812         sshkey_free(k);
2813         if (ed25519_pk != NULL) {
2814                 explicit_bzero(ed25519_pk, pklen);
2815                 free(ed25519_pk);
2816         }
2817         if (ed25519_sk != NULL) {
2818                 explicit_bzero(ed25519_sk, sklen);
2819                 free(ed25519_sk);
2820         }
2821         return r;
2822 }
2823
2824 #if defined(WITH_OPENSSL) && defined(OPENSSL_HAS_ECC)
2825 int
2826 sshkey_ec_validate_public(const EC_GROUP *group, const EC_POINT *public)
2827 {
2828         BN_CTX *bnctx;
2829         EC_POINT *nq = NULL;
2830         BIGNUM *order, *x, *y, *tmp;
2831         int ret = SSH_ERR_KEY_INVALID_EC_VALUE;
2832
2833         if ((bnctx = BN_CTX_new()) == NULL)
2834                 return SSH_ERR_ALLOC_FAIL;
2835         BN_CTX_start(bnctx);
2836
2837         /*
2838          * We shouldn't ever hit this case because bignum_get_ecpoint()
2839          * refuses to load GF2m points.
2840          */
2841         if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
2842             NID_X9_62_prime_field)
2843                 goto out;
2844
2845         /* Q != infinity */
2846         if (EC_POINT_is_at_infinity(group, public))
2847                 goto out;
2848
2849         if ((x = BN_CTX_get(bnctx)) == NULL ||
2850             (y = BN_CTX_get(bnctx)) == NULL ||
2851             (order = BN_CTX_get(bnctx)) == NULL ||
2852             (tmp = BN_CTX_get(bnctx)) == NULL) {
2853                 ret = SSH_ERR_ALLOC_FAIL;
2854                 goto out;
2855         }
2856
2857         /* log2(x) > log2(order)/2, log2(y) > log2(order)/2 */
2858         if (EC_GROUP_get_order(group, order, bnctx) != 1 ||
2859             EC_POINT_get_affine_coordinates_GFp(group, public,
2860             x, y, bnctx) != 1) {
2861                 ret = SSH_ERR_LIBCRYPTO_ERROR;
2862                 goto out;
2863         }
2864         if (BN_num_bits(x) <= BN_num_bits(order) / 2 ||
2865             BN_num_bits(y) <= BN_num_bits(order) / 2)
2866                 goto out;
2867
2868         /* nQ == infinity (n == order of subgroup) */
2869         if ((nq = EC_POINT_new(group)) == NULL) {
2870                 ret = SSH_ERR_ALLOC_FAIL;
2871                 goto out;
2872         }
2873         if (EC_POINT_mul(group, nq, NULL, public, order, bnctx) != 1) {
2874                 ret = SSH_ERR_LIBCRYPTO_ERROR;
2875                 goto out;
2876         }
2877         if (EC_POINT_is_at_infinity(group, nq) != 1)
2878                 goto out;
2879
2880         /* x < order - 1, y < order - 1 */
2881         if (!BN_sub(tmp, order, BN_value_one())) {
2882                 ret = SSH_ERR_LIBCRYPTO_ERROR;
2883                 goto out;
2884         }
2885         if (BN_cmp(x, tmp) >= 0 || BN_cmp(y, tmp) >= 0)
2886                 goto out;
2887         ret = 0;
2888  out:
2889         BN_CTX_free(bnctx);
2890         if (nq != NULL)
2891                 EC_POINT_free(nq);
2892         return ret;
2893 }
2894
2895 int
2896 sshkey_ec_validate_private(const EC_KEY *key)
2897 {
2898         BN_CTX *bnctx;
2899         BIGNUM *order, *tmp;
2900         int ret = SSH_ERR_KEY_INVALID_EC_VALUE;
2901
2902         if ((bnctx = BN_CTX_new()) == NULL)
2903                 return SSH_ERR_ALLOC_FAIL;
2904         BN_CTX_start(bnctx);
2905
2906         if ((order = BN_CTX_get(bnctx)) == NULL ||
2907             (tmp = BN_CTX_get(bnctx)) == NULL) {
2908                 ret = SSH_ERR_ALLOC_FAIL;
2909                 goto out;
2910         }
2911
2912         /* log2(private) > log2(order)/2 */
2913         if (EC_GROUP_get_order(EC_KEY_get0_group(key), order, bnctx) != 1) {
2914                 ret = SSH_ERR_LIBCRYPTO_ERROR;
2915                 goto out;
2916         }
2917         if (BN_num_bits(EC_KEY_get0_private_key(key)) <=
2918             BN_num_bits(order) / 2)
2919                 goto out;
2920
2921         /* private < order - 1 */
2922         if (!BN_sub(tmp, order, BN_value_one())) {
2923                 ret = SSH_ERR_LIBCRYPTO_ERROR;
2924                 goto out;
2925         }
2926         if (BN_cmp(EC_KEY_get0_private_key(key), tmp) >= 0)
2927                 goto out;
2928         ret = 0;
2929  out:
2930         BN_CTX_free(bnctx);
2931         return ret;
2932 }
2933
2934 void
2935 sshkey_dump_ec_point(const EC_GROUP *group, const EC_POINT *point)
2936 {
2937         BIGNUM *x, *y;
2938         BN_CTX *bnctx;
2939
2940         if (point == NULL) {
2941                 fputs("point=(NULL)\n", stderr);
2942                 return;
2943         }
2944         if ((bnctx = BN_CTX_new()) == NULL) {
2945                 fprintf(stderr, "%s: BN_CTX_new failed\n", __func__);
2946                 return;
2947         }
2948         BN_CTX_start(bnctx);
2949         if ((x = BN_CTX_get(bnctx)) == NULL ||
2950             (y = BN_CTX_get(bnctx)) == NULL) {
2951                 fprintf(stderr, "%s: BN_CTX_get failed\n", __func__);
2952                 return;
2953         }
2954         if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
2955             NID_X9_62_prime_field) {
2956                 fprintf(stderr, "%s: group is not a prime field\n", __func__);
2957                 return;
2958         }
2959         if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y,
2960             bnctx) != 1) {
2961                 fprintf(stderr, "%s: EC_POINT_get_affine_coordinates_GFp\n",
2962                     __func__);
2963                 return;
2964         }
2965         fputs("x=", stderr);
2966         BN_print_fp(stderr, x);
2967         fputs("\ny=", stderr);
2968         BN_print_fp(stderr, y);
2969         fputs("\n", stderr);
2970         BN_CTX_free(bnctx);
2971 }
2972
2973 void
2974 sshkey_dump_ec_key(const EC_KEY *key)
2975 {
2976         const BIGNUM *exponent;
2977
2978         sshkey_dump_ec_point(EC_KEY_get0_group(key),
2979             EC_KEY_get0_public_key(key));
2980         fputs("exponent=", stderr);
2981         if ((exponent = EC_KEY_get0_private_key(key)) == NULL)
2982                 fputs("(NULL)", stderr);
2983         else
2984                 BN_print_fp(stderr, EC_KEY_get0_private_key(key));
2985         fputs("\n", stderr);
2986 }
2987 #endif /* WITH_OPENSSL && OPENSSL_HAS_ECC */
2988
2989 static int
2990 sshkey_private_to_blob2(const struct sshkey *prv, struct sshbuf *blob,
2991     const char *passphrase, const char *comment, const char *ciphername,
2992     int rounds)
2993 {
2994         u_char *cp, *key = NULL, *pubkeyblob = NULL;
2995         u_char salt[SALT_LEN];
2996         char *b64 = NULL;
2997         size_t i, pubkeylen, keylen, ivlen, blocksize, authlen;
2998         u_int check;
2999         int r = SSH_ERR_INTERNAL_ERROR;
3000         struct sshcipher_ctx ciphercontext;
3001         const struct sshcipher *cipher;
3002         const char *kdfname = KDFNAME;
3003         struct sshbuf *encoded = NULL, *encrypted = NULL, *kdf = NULL;
3004
3005         memset(&ciphercontext, 0, sizeof(ciphercontext));
3006
3007         if (rounds <= 0)
3008                 rounds = DEFAULT_ROUNDS;
3009         if (passphrase == NULL || !strlen(passphrase)) {
3010                 ciphername = "none";
3011                 kdfname = "none";
3012         } else if (ciphername == NULL)
3013                 ciphername = DEFAULT_CIPHERNAME;
3014         else if (cipher_number(ciphername) != SSH_CIPHER_SSH2) {
3015                 r = SSH_ERR_INVALID_ARGUMENT;
3016                 goto out;
3017         }
3018         if ((cipher = cipher_by_name(ciphername)) == NULL) {
3019                 r = SSH_ERR_INTERNAL_ERROR;
3020                 goto out;
3021         }
3022
3023         if ((kdf = sshbuf_new()) == NULL ||
3024             (encoded = sshbuf_new()) == NULL ||
3025             (encrypted = sshbuf_new()) == NULL) {
3026                 r = SSH_ERR_ALLOC_FAIL;
3027                 goto out;
3028         }
3029         blocksize = cipher_blocksize(cipher);
3030         keylen = cipher_keylen(cipher);
3031         ivlen = cipher_ivlen(cipher);
3032         authlen = cipher_authlen(cipher);
3033         if ((key = calloc(1, keylen + ivlen)) == NULL) {
3034                 r = SSH_ERR_ALLOC_FAIL;
3035                 goto out;
3036         }
3037         if (strcmp(kdfname, "bcrypt") == 0) {
3038                 arc4random_buf(salt, SALT_LEN);
3039                 if (bcrypt_pbkdf(passphrase, strlen(passphrase),
3040                     salt, SALT_LEN, key, keylen + ivlen, rounds) < 0) {
3041                         r = SSH_ERR_INVALID_ARGUMENT;
3042                         goto out;
3043                 }
3044                 if ((r = sshbuf_put_string(kdf, salt, SALT_LEN)) != 0 ||
3045                     (r = sshbuf_put_u32(kdf, rounds)) != 0)
3046                         goto out;
3047         } else if (strcmp(kdfname, "none") != 0) {
3048                 /* Unsupported KDF type */
3049                 r = SSH_ERR_KEY_UNKNOWN_CIPHER;
3050                 goto out;
3051         }
3052         if ((r = cipher_init(&ciphercontext, cipher, key, keylen,
3053             key + keylen, ivlen, 1)) != 0)
3054                 goto out;
3055
3056         if ((r = sshbuf_put(encoded, AUTH_MAGIC, sizeof(AUTH_MAGIC))) != 0 ||
3057             (r = sshbuf_put_cstring(encoded, ciphername)) != 0 ||
3058             (r = sshbuf_put_cstring(encoded, kdfname)) != 0 ||
3059             (r = sshbuf_put_stringb(encoded, kdf)) != 0 ||
3060             (r = sshbuf_put_u32(encoded, 1)) != 0 ||    /* number of keys */
3061             (r = sshkey_to_blob(prv, &pubkeyblob, &pubkeylen)) != 0 ||
3062             (r = sshbuf_put_string(encoded, pubkeyblob, pubkeylen)) != 0)
3063                 goto out;
3064
3065         /* set up the buffer that will be encrypted */
3066
3067         /* Random check bytes */
3068         check = arc4random();
3069         if ((r = sshbuf_put_u32(encrypted, check)) != 0 ||
3070             (r = sshbuf_put_u32(encrypted, check)) != 0)
3071                 goto out;
3072
3073         /* append private key and comment*/
3074         if ((r = sshkey_private_serialize(prv, encrypted)) != 0 ||
3075             (r = sshbuf_put_cstring(encrypted, comment)) != 0)
3076                 goto out;
3077
3078         /* padding */
3079         i = 0;
3080         while (sshbuf_len(encrypted) % blocksize) {
3081                 if ((r = sshbuf_put_u8(encrypted, ++i & 0xff)) != 0)
3082                         goto out;
3083         }
3084
3085         /* length in destination buffer */
3086         if ((r = sshbuf_put_u32(encoded, sshbuf_len(encrypted))) != 0)
3087                 goto out;
3088
3089         /* encrypt */
3090         if ((r = sshbuf_reserve(encoded,
3091             sshbuf_len(encrypted) + authlen, &cp)) != 0)
3092                 goto out;
3093         if ((r = cipher_crypt(&ciphercontext, 0, cp,
3094             sshbuf_ptr(encrypted), sshbuf_len(encrypted), 0, authlen)) != 0)
3095                 goto out;
3096
3097         /* uuencode */
3098         if ((b64 = sshbuf_dtob64(encoded)) == NULL) {
3099                 r = SSH_ERR_ALLOC_FAIL;
3100                 goto out;
3101         }
3102
3103         sshbuf_reset(blob);
3104         if ((r = sshbuf_put(blob, MARK_BEGIN, MARK_BEGIN_LEN)) != 0)
3105                 goto out;
3106         for (i = 0; i < strlen(b64); i++) {
3107                 if ((r = sshbuf_put_u8(blob, b64[i])) != 0)
3108                         goto out;
3109                 /* insert line breaks */
3110                 if (i % 70 == 69 && (r = sshbuf_put_u8(blob, '\n')) != 0)
3111                         goto out;
3112         }
3113         if (i % 70 != 69 && (r = sshbuf_put_u8(blob, '\n')) != 0)
3114                 goto out;
3115         if ((r = sshbuf_put(blob, MARK_END, MARK_END_LEN)) != 0)
3116                 goto out;
3117
3118         /* success */
3119         r = 0;
3120
3121  out:
3122         sshbuf_free(kdf);
3123         sshbuf_free(encoded);
3124         sshbuf_free(encrypted);
3125         cipher_cleanup(&ciphercontext);
3126         explicit_bzero(salt, sizeof(salt));
3127         if (key != NULL) {
3128                 explicit_bzero(key, keylen + ivlen);
3129                 free(key);
3130         }
3131         if (pubkeyblob != NULL) {
3132                 explicit_bzero(pubkeyblob, pubkeylen);
3133                 free(pubkeyblob);
3134         }
3135         if (b64 != NULL) {
3136                 explicit_bzero(b64, strlen(b64));
3137                 free(b64);
3138         }
3139         return r;
3140 }
3141
3142 static int
3143 sshkey_parse_private2(struct sshbuf *blob, int type, const char *passphrase,
3144     struct sshkey **keyp, char **commentp)
3145 {
3146         char *comment = NULL, *ciphername = NULL, *kdfname = NULL;
3147         const struct sshcipher *cipher = NULL;
3148         const u_char *cp;
3149         int r = SSH_ERR_INTERNAL_ERROR;
3150         size_t encoded_len;
3151         size_t i, keylen = 0, ivlen = 0, authlen = 0, slen = 0;
3152         struct sshbuf *encoded = NULL, *decoded = NULL;
3153         struct sshbuf *kdf = NULL, *decrypted = NULL;
3154         struct sshcipher_ctx ciphercontext;
3155         struct sshkey *k = NULL;
3156         u_char *key = NULL, *salt = NULL, *dp, pad, last;
3157         u_int blocksize, rounds, nkeys, encrypted_len, check1, check2;
3158
3159         memset(&ciphercontext, 0, sizeof(ciphercontext));
3160         if (keyp != NULL)
3161                 *keyp = NULL;
3162         if (commentp != NULL)
3163                 *commentp = NULL;
3164
3165         if ((encoded = sshbuf_new()) == NULL ||
3166             (decoded = sshbuf_new()) == NULL ||
3167             (decrypted = sshbuf_new()) == NULL) {
3168                 r = SSH_ERR_ALLOC_FAIL;
3169                 goto out;
3170         }
3171
3172         /* check preamble */
3173         cp = sshbuf_ptr(blob);
3174         encoded_len = sshbuf_len(blob);
3175         if (encoded_len < (MARK_BEGIN_LEN + MARK_END_LEN) ||
3176             memcmp(cp, MARK_BEGIN, MARK_BEGIN_LEN) != 0) {
3177                 r = SSH_ERR_INVALID_FORMAT;
3178                 goto out;
3179         }
3180         cp += MARK_BEGIN_LEN;
3181         encoded_len -= MARK_BEGIN_LEN;
3182
3183         /* Look for end marker, removing whitespace as we go */
3184         while (encoded_len > 0) {
3185                 if (*cp != '\n' && *cp != '\r') {
3186                         if ((r = sshbuf_put_u8(encoded, *cp)) != 0)
3187                                 goto out;
3188                 }
3189                 last = *cp;
3190                 encoded_len--;
3191                 cp++;
3192                 if (last == '\n') {
3193                         if (encoded_len >= MARK_END_LEN &&
3194                             memcmp(cp, MARK_END, MARK_END_LEN) == 0) {
3195                                 /* \0 terminate */
3196                                 if ((r = sshbuf_put_u8(encoded, 0)) != 0)
3197                                         goto out;
3198                                 break;
3199                         }
3200                 }
3201         }
3202         if (encoded_len == 0) {
3203                 r = SSH_ERR_INVALID_FORMAT;
3204                 goto out;
3205         }
3206
3207         /* decode base64 */
3208         if ((r = sshbuf_b64tod(decoded, (char *)sshbuf_ptr(encoded))) != 0)
3209                 goto out;
3210
3211         /* check magic */
3212         if (sshbuf_len(decoded) < sizeof(AUTH_MAGIC) ||
3213             memcmp(sshbuf_ptr(decoded), AUTH_MAGIC, sizeof(AUTH_MAGIC))) {
3214                 r = SSH_ERR_INVALID_FORMAT;
3215                 goto out;
3216         }
3217         /* parse public portion of key */
3218         if ((r = sshbuf_consume(decoded, sizeof(AUTH_MAGIC))) != 0 ||
3219             (r = sshbuf_get_cstring(decoded, &ciphername, NULL)) != 0 ||
3220             (r = sshbuf_get_cstring(decoded, &kdfname, NULL)) != 0 ||
3221             (r = sshbuf_froms(decoded, &kdf)) != 0 ||
3222             (r = sshbuf_get_u32(decoded, &nkeys)) != 0 ||
3223             (r = sshbuf_skip_string(decoded)) != 0 || /* pubkey */
3224             (r = sshbuf_get_u32(decoded, &encrypted_len)) != 0)
3225                 goto out;
3226
3227         if ((cipher = cipher_by_name(ciphername)) == NULL) {
3228                 r = SSH_ERR_KEY_UNKNOWN_CIPHER;
3229                 goto out;
3230         }
3231         if ((passphrase == NULL || strlen(passphrase) == 0) &&
3232             strcmp(ciphername, "none") != 0) {
3233                 /* passphrase required */
3234                 r = SSH_ERR_KEY_WRONG_PASSPHRASE;
3235                 goto out;
3236         }
3237         if (strcmp(kdfname, "none") != 0 && strcmp(kdfname, "bcrypt") != 0) {
3238                 r = SSH_ERR_KEY_UNKNOWN_CIPHER;
3239                 goto out;
3240         }
3241         if (!strcmp(kdfname, "none") && strcmp(ciphername, "none") != 0) {
3242                 r = SSH_ERR_INVALID_FORMAT;
3243                 goto out;
3244         }
3245         if (nkeys != 1) {
3246                 /* XXX only one key supported */
3247                 r = SSH_ERR_INVALID_FORMAT;
3248                 goto out;
3249         }
3250
3251         /* check size of encrypted key blob */
3252         blocksize = cipher_blocksize(cipher);
3253         if (encrypted_len < blocksize || (encrypted_len % blocksize) != 0) {
3254                 r = SSH_ERR_INVALID_FORMAT;
3255                 goto out;
3256         }
3257
3258         /* setup key */
3259         keylen = cipher_keylen(cipher);
3260         ivlen = cipher_ivlen(cipher);
3261         authlen = cipher_authlen(cipher);
3262         if ((key = calloc(1, keylen + ivlen)) == NULL) {
3263                 r = SSH_ERR_ALLOC_FAIL;
3264                 goto out;
3265         }
3266         if (strcmp(kdfname, "bcrypt") == 0) {
3267                 if ((r = sshbuf_get_string(kdf, &salt, &slen)) != 0 ||
3268                     (r = sshbuf_get_u32(kdf, &rounds)) != 0)
3269                         goto out;
3270                 if (bcrypt_pbkdf(passphrase, strlen(passphrase), salt, slen,
3271                     key, keylen + ivlen, rounds) < 0) {
3272                         r = SSH_ERR_INVALID_FORMAT;
3273                         goto out;
3274                 }
3275         }
3276
3277         /* check that an appropriate amount of auth data is present */
3278         if (sshbuf_len(decoded) < encrypted_len + authlen) {
3279                 r = SSH_ERR_INVALID_FORMAT;
3280                 goto out;
3281         }
3282
3283         /* decrypt private portion of key */
3284         if ((r = sshbuf_reserve(decrypted, encrypted_len, &dp)) != 0 ||
3285             (r = cipher_init(&ciphercontext, cipher, key, keylen,
3286             key + keylen, ivlen, 0)) != 0)
3287                 goto out;
3288         if ((r = cipher_crypt(&ciphercontext, 0, dp, sshbuf_ptr(decoded),
3289             encrypted_len, 0, authlen)) != 0) {
3290                 /* an integrity error here indicates an incorrect passphrase */
3291                 if (r == SSH_ERR_MAC_INVALID)
3292                         r = SSH_ERR_KEY_WRONG_PASSPHRASE;
3293                 goto out;
3294         }
3295         if ((r = sshbuf_consume(decoded, encrypted_len + authlen)) != 0)
3296                 goto out;
3297         /* there should be no trailing data */
3298         if (sshbuf_len(decoded) != 0) {
3299                 r = SSH_ERR_INVALID_FORMAT;
3300                 goto out;
3301         }
3302
3303         /* check check bytes */
3304         if ((r = sshbuf_get_u32(decrypted, &check1)) != 0 ||
3305             (r = sshbuf_get_u32(decrypted, &check2)) != 0)
3306                 goto out;
3307         if (check1 != check2) {
3308                 r = SSH_ERR_KEY_WRONG_PASSPHRASE;
3309                 goto out;
3310         }
3311
3312         /* Load the private key and comment */
3313         if ((r = sshkey_private_deserialize(decrypted, &k)) != 0 ||
3314             (r = sshbuf_get_cstring(decrypted, &comment, NULL)) != 0)
3315                 goto out;
3316
3317         /* Check deterministic padding */
3318         i = 0;
3319         while (sshbuf_len(decrypted)) {
3320                 if ((r = sshbuf_get_u8(decrypted, &pad)) != 0)
3321                         goto out;
3322                 if (pad != (++i & 0xff)) {
3323                         r = SSH_ERR_INVALID_FORMAT;
3324                         goto out;
3325                 }
3326         }
3327
3328         /* XXX decode pubkey and check against private */
3329
3330         /* success */
3331         r = 0;
3332         if (keyp != NULL) {
3333                 *keyp = k;
3334                 k = NULL;
3335         }
3336         if (commentp != NULL) {
3337                 *commentp = comment;
3338                 comment = NULL;
3339         }
3340  out:
3341         pad = 0;
3342         cipher_cleanup(&ciphercontext);
3343         free(ciphername);
3344         free(kdfname);
3345         free(comment);
3346         if (salt != NULL) {
3347                 explicit_bzero(salt, slen);
3348                 free(salt);
3349         }
3350         if (key != NULL) {
3351                 explicit_bzero(key, keylen + ivlen);
3352                 free(key);
3353         }
3354         sshbuf_free(encoded);
3355         sshbuf_free(decoded);
3356         sshbuf_free(kdf);
3357         sshbuf_free(decrypted);
3358         sshkey_free(k);
3359         return r;
3360 }
3361
3362 #if WITH_SSH1
3363 /*
3364  * Serialises the authentication (private) key to a blob, encrypting it with
3365  * passphrase.  The identification of the blob (lowest 64 bits of n) will
3366  * precede the key to provide identification of the key without needing a
3367  * passphrase.
3368  */
3369 static int
3370 sshkey_private_rsa1_to_blob(struct sshkey *key, struct sshbuf *blob,
3371     const char *passphrase, const char *comment)
3372 {
3373         struct sshbuf *buffer = NULL, *encrypted = NULL;
3374         u_char buf[8];
3375         int r, cipher_num;
3376         struct sshcipher_ctx ciphercontext;
3377         const struct sshcipher *cipher;
3378         u_char *cp;
3379
3380         /*
3381          * If the passphrase is empty, use SSH_CIPHER_NONE to ease converting
3382          * to another cipher; otherwise use SSH_AUTHFILE_CIPHER.
3383          */
3384         cipher_num = (strcmp(passphrase, "") == 0) ?
3385             SSH_CIPHER_NONE : SSH_CIPHER_3DES;
3386         if ((cipher = cipher_by_number(cipher_num)) == NULL)
3387                 return SSH_ERR_INTERNAL_ERROR;
3388
3389         /* This buffer is used to build the secret part of the private key. */
3390         if ((buffer = sshbuf_new()) == NULL)
3391                 return SSH_ERR_ALLOC_FAIL;
3392
3393         /* Put checkbytes for checking passphrase validity. */
3394         if ((r = sshbuf_reserve(buffer, 4, &cp)) != 0)
3395                 goto out;
3396         arc4random_buf(cp, 2);
3397         memcpy(cp + 2, cp, 2);
3398
3399         /*
3400          * Store the private key (n and e will not be stored because they
3401          * will be stored in plain text, and storing them also in encrypted
3402          * format would just give known plaintext).
3403          * Note: q and p are stored in reverse order to SSL.
3404          */
3405         if ((r = sshbuf_put_bignum1(buffer, key->rsa->d)) != 0 ||
3406             (r = sshbuf_put_bignum1(buffer, key->rsa->iqmp)) != 0 ||
3407             (r = sshbuf_put_bignum1(buffer, key->rsa->q)) != 0 ||
3408             (r = sshbuf_put_bignum1(buffer, key->rsa->p)) != 0)
3409                 goto out;
3410
3411         /* Pad the part to be encrypted to a size that is a multiple of 8. */
3412         explicit_bzero(buf, 8);
3413         if ((r = sshbuf_put(buffer, buf, 8 - (sshbuf_len(buffer) % 8))) != 0)
3414                 goto out;
3415
3416         /* This buffer will be used to contain the data in the file. */
3417         if ((encrypted = sshbuf_new()) == NULL) {
3418                 r = SSH_ERR_ALLOC_FAIL;
3419                 goto out;
3420         }
3421
3422         /* First store keyfile id string. */
3423         if ((r = sshbuf_put(encrypted, LEGACY_BEGIN,
3424             sizeof(LEGACY_BEGIN))) != 0)
3425                 goto out;
3426
3427         /* Store cipher type and "reserved" field. */
3428         if ((r = sshbuf_put_u8(encrypted, cipher_num)) != 0 ||
3429             (r = sshbuf_put_u32(encrypted, 0)) != 0)
3430                 goto out;
3431
3432         /* Store public key.  This will be in plain text. */
3433         if ((r = sshbuf_put_u32(encrypted, BN_num_bits(key->rsa->n))) != 0 ||
3434             (r = sshbuf_put_bignum1(encrypted, key->rsa->n) != 0) ||
3435             (r = sshbuf_put_bignum1(encrypted, key->rsa->e) != 0) ||
3436             (r = sshbuf_put_cstring(encrypted, comment) != 0))
3437                 goto out;
3438
3439         /* Allocate space for the private part of the key in the buffer. */
3440         if ((r = sshbuf_reserve(encrypted, sshbuf_len(buffer), &cp)) != 0)
3441                 goto out;
3442
3443         if ((r = cipher_set_key_string(&ciphercontext, cipher, passphrase,
3444             CIPHER_ENCRYPT)) != 0)
3445                 goto out;
3446         if ((r = cipher_crypt(&ciphercontext, 0, cp,
3447             sshbuf_ptr(buffer), sshbuf_len(buffer), 0, 0)) != 0)
3448                 goto out;
3449         if ((r = cipher_cleanup(&ciphercontext)) != 0)
3450                 goto out;
3451
3452         r = sshbuf_putb(blob, encrypted);
3453
3454  out:
3455         explicit_bzero(&ciphercontext, sizeof(ciphercontext));
3456         explicit_bzero(buf, sizeof(buf));
3457         if (buffer != NULL)
3458                 sshbuf_free(buffer);
3459         if (encrypted != NULL)
3460                 sshbuf_free(encrypted);
3461
3462         return r;
3463 }
3464 #endif /* WITH_SSH1 */
3465
3466 #ifdef WITH_OPENSSL
3467 /* convert SSH v2 key in OpenSSL PEM format */
3468 static int
3469 sshkey_private_pem_to_blob(struct sshkey *key, struct sshbuf *blob,
3470     const char *_passphrase, const char *comment)
3471 {
3472         int success, r;
3473         int blen, len = strlen(_passphrase);
3474         u_char *passphrase = (len > 0) ? (u_char *)_passphrase : NULL;
3475 #if (OPENSSL_VERSION_NUMBER < 0x00907000L)
3476         const EVP_CIPHER *cipher = (len > 0) ? EVP_des_ede3_cbc() : NULL;
3477 #else
3478         const EVP_CIPHER *cipher = (len > 0) ? EVP_aes_128_cbc() : NULL;
3479 #endif
3480         const u_char *bptr;
3481         BIO *bio = NULL;
3482
3483         if (len > 0 && len <= 4)
3484                 return SSH_ERR_PASSPHRASE_TOO_SHORT;
3485         if ((bio = BIO_new(BIO_s_mem())) == NULL)
3486                 return SSH_ERR_ALLOC_FAIL;
3487
3488         switch (key->type) {
3489         case KEY_DSA:
3490                 success = PEM_write_bio_DSAPrivateKey(bio, key->dsa,
3491                     cipher, passphrase, len, NULL, NULL);
3492                 break;
3493 #ifdef OPENSSL_HAS_ECC
3494         case KEY_ECDSA:
3495                 success = PEM_write_bio_ECPrivateKey(bio, key->ecdsa,
3496                     cipher, passphrase, len, NULL, NULL);
3497                 break;
3498 #endif
3499         case KEY_RSA:
3500                 success = PEM_write_bio_RSAPrivateKey(bio, key->rsa,
3501                     cipher, passphrase, len, NULL, NULL);
3502                 break;
3503         default:
3504                 success = 0;
3505                 break;
3506         }
3507         if (success == 0) {
3508                 r = SSH_ERR_LIBCRYPTO_ERROR;
3509                 goto out;
3510         }
3511         if ((blen = BIO_get_mem_data(bio, &bptr)) <= 0) {
3512                 r = SSH_ERR_INTERNAL_ERROR;
3513                 goto out;
3514         }
3515         if ((r = sshbuf_put(blob, bptr, blen)) != 0)
3516                 goto out;
3517         r = 0;
3518  out:
3519         BIO_free(bio);
3520         return r;
3521 }
3522 #endif /* WITH_OPENSSL */
3523
3524 /* Serialise "key" to buffer "blob" */
3525 int
3526 sshkey_private_to_fileblob(struct sshkey *key, struct sshbuf *blob,
3527     const char *passphrase, const char *comment,
3528     int force_new_format, const char *new_format_cipher, int new_format_rounds)
3529 {
3530         switch (key->type) {
3531 #ifdef WITH_SSH1
3532         case KEY_RSA1:
3533                 return sshkey_private_rsa1_to_blob(key, blob,
3534                     passphrase, comment);
3535 #endif /* WITH_SSH1 */
3536 #ifdef WITH_OPENSSL
3537         case KEY_DSA:
3538         case KEY_ECDSA:
3539         case KEY_RSA:
3540                 if (force_new_format) {
3541                         return sshkey_private_to_blob2(key, blob, passphrase,
3542                             comment, new_format_cipher, new_format_rounds);
3543                 }
3544                 return sshkey_private_pem_to_blob(key, blob,
3545                     passphrase, comment);
3546 #endif /* WITH_OPENSSL */
3547         case KEY_ED25519:
3548                 return sshkey_private_to_blob2(key, blob, passphrase,
3549                     comment, new_format_cipher, new_format_rounds);
3550         default:
3551                 return SSH_ERR_KEY_TYPE_UNKNOWN;
3552         }
3553 }
3554
3555 #ifdef WITH_SSH1
3556 /*
3557  * Parse the public, unencrypted portion of a RSA1 key.
3558  */
3559 int
3560 sshkey_parse_public_rsa1_fileblob(struct sshbuf *blob,
3561     struct sshkey **keyp, char **commentp)
3562 {
3563         int r;
3564         struct sshkey *pub = NULL;
3565         struct sshbuf *copy = NULL;
3566
3567         if (keyp != NULL)
3568                 *keyp = NULL;
3569         if (commentp != NULL)
3570                 *commentp = NULL;
3571
3572         /* Check that it is at least big enough to contain the ID string. */
3573         if (sshbuf_len(blob) < sizeof(LEGACY_BEGIN))
3574                 return SSH_ERR_INVALID_FORMAT;
3575
3576         /*
3577          * Make sure it begins with the id string.  Consume the id string
3578          * from the buffer.
3579          */
3580         if (memcmp(sshbuf_ptr(blob), LEGACY_BEGIN, sizeof(LEGACY_BEGIN)) != 0)
3581                 return SSH_ERR_INVALID_FORMAT;
3582         /* Make a working copy of the keyblob and skip past the magic */
3583         if ((copy = sshbuf_fromb(blob)) == NULL)
3584                 return SSH_ERR_ALLOC_FAIL;
3585         if ((r = sshbuf_consume(copy, sizeof(LEGACY_BEGIN))) != 0)
3586                 goto out;
3587
3588         /* Skip cipher type, reserved data and key bits. */
3589         if ((r = sshbuf_get_u8(copy, NULL)) != 0 ||     /* cipher type */
3590             (r = sshbuf_get_u32(copy, NULL)) != 0 ||    /* reserved */
3591             (r = sshbuf_get_u32(copy, NULL)) != 0)      /* key bits */
3592                 goto out;
3593
3594         /* Read the public key from the buffer. */
3595         if ((pub = sshkey_new(KEY_RSA1)) == NULL ||
3596             (r = sshbuf_get_bignum1(copy, pub->rsa->n)) != 0 ||
3597             (r = sshbuf_get_bignum1(copy, pub->rsa->e)) != 0)
3598                 goto out;
3599
3600         /* Finally, the comment */
3601         if ((r = sshbuf_get_string(copy, (u_char**)commentp, NULL)) != 0)
3602                 goto out;
3603
3604         /* The encrypted private part is not parsed by this function. */
3605
3606         r = 0;
3607         if (keyp != NULL)
3608                 *keyp = pub;
3609         else
3610                 sshkey_free(pub);
3611         pub = NULL;
3612
3613  out:
3614         if (copy != NULL)
3615                 sshbuf_free(copy);
3616         if (pub != NULL)
3617                 sshkey_free(pub);
3618         return r;
3619 }
3620
3621 static int
3622 sshkey_parse_private_rsa1(struct sshbuf *blob, const char *passphrase,
3623     struct sshkey **keyp, char **commentp)
3624 {
3625         int r;
3626         u_int16_t check1, check2;
3627         u_int8_t cipher_type;
3628         struct sshbuf *decrypted = NULL, *copy = NULL;
3629         u_char *cp;
3630         char *comment = NULL;
3631         struct sshcipher_ctx ciphercontext;
3632         const struct sshcipher *cipher;
3633         struct sshkey *prv = NULL;
3634
3635         *keyp = NULL;
3636         if (commentp != NULL)
3637                 *commentp = NULL;
3638
3639         /* Check that it is at least big enough to contain the ID string. */
3640         if (sshbuf_len(blob) < sizeof(LEGACY_BEGIN))
3641                 return SSH_ERR_INVALID_FORMAT;
3642
3643         /*
3644          * Make sure it begins with the id string.  Consume the id string
3645          * from the buffer.
3646          */
3647         if (memcmp(sshbuf_ptr(blob), LEGACY_BEGIN, sizeof(LEGACY_BEGIN)) != 0)
3648                 return SSH_ERR_INVALID_FORMAT;
3649
3650         if ((prv = sshkey_new_private(KEY_RSA1)) == NULL) {
3651                 r = SSH_ERR_ALLOC_FAIL;
3652                 goto out;
3653         }
3654         if ((copy = sshbuf_fromb(blob)) == NULL ||
3655             (decrypted = sshbuf_new()) == NULL) {
3656                 r = SSH_ERR_ALLOC_FAIL;
3657                 goto out;
3658         }
3659         if ((r = sshbuf_consume(copy, sizeof(LEGACY_BEGIN))) != 0)
3660                 goto out;
3661
3662         /* Read cipher type. */
3663         if ((r = sshbuf_get_u8(copy, &cipher_type)) != 0 ||
3664             (r = sshbuf_get_u32(copy, NULL)) != 0)      /* reserved */
3665                 goto out;
3666
3667         /* Read the public key and comment from the buffer. */
3668         if ((r = sshbuf_get_u32(copy, NULL)) != 0 ||    /* key bits */
3669             (r = sshbuf_get_bignum1(copy, prv->rsa->n)) != 0 ||
3670             (r = sshbuf_get_bignum1(copy, prv->rsa->e)) != 0 ||
3671             (r = sshbuf_get_cstring(copy, &comment, NULL)) != 0)
3672                 goto out;
3673
3674         /* Check that it is a supported cipher. */
3675         cipher = cipher_by_number(cipher_type);
3676         if (cipher == NULL) {
3677                 r = SSH_ERR_KEY_UNKNOWN_CIPHER;
3678                 goto out;
3679         }
3680         /* Initialize space for decrypted data. */
3681         if ((r = sshbuf_reserve(decrypted, sshbuf_len(copy), &cp)) != 0)
3682                 goto out;
3683
3684         /* Rest of the buffer is encrypted.  Decrypt it using the passphrase. */
3685         if ((r = cipher_set_key_string(&ciphercontext, cipher, passphrase,
3686             CIPHER_DECRYPT)) != 0)
3687                 goto out;
3688         if ((r = cipher_crypt(&ciphercontext, 0, cp,
3689             sshbuf_ptr(copy), sshbuf_len(copy), 0, 0)) != 0) {
3690                 cipher_cleanup(&ciphercontext);
3691                 goto out;
3692         }
3693         if ((r = cipher_cleanup(&ciphercontext)) != 0)
3694                 goto out;
3695
3696         if ((r = sshbuf_get_u16(decrypted, &check1)) != 0 ||
3697             (r = sshbuf_get_u16(decrypted, &check2)) != 0)
3698                 goto out;
3699         if (check1 != check2) {
3700                 r = SSH_ERR_KEY_WRONG_PASSPHRASE;
3701                 goto out;
3702         }
3703
3704         /* Read the rest of the private key. */
3705         if ((r = sshbuf_get_bignum1(decrypted, prv->rsa->d)) != 0 ||
3706             (r = sshbuf_get_bignum1(decrypted, prv->rsa->iqmp)) != 0 ||
3707             (r = sshbuf_get_bignum1(decrypted, prv->rsa->q)) != 0 ||
3708             (r = sshbuf_get_bignum1(decrypted, prv->rsa->p)) != 0)
3709                 goto out;
3710
3711         /* calculate p-1 and q-1 */
3712         if ((r = rsa_generate_additional_parameters(prv->rsa)) != 0)
3713                 goto out;
3714
3715         /* enable blinding */
3716         if (RSA_blinding_on(prv->rsa, NULL) != 1) {
3717                 r = SSH_ERR_LIBCRYPTO_ERROR;
3718                 goto out;
3719         }
3720         r = 0;
3721         *keyp = prv;
3722         prv = NULL;
3723         if (commentp != NULL) {
3724                 *commentp = comment;
3725                 comment = NULL;
3726         }
3727  out:
3728         explicit_bzero(&ciphercontext, sizeof(ciphercontext));
3729         if (comment != NULL)
3730                 free(comment);
3731         if (prv != NULL)
3732                 sshkey_free(prv);
3733         if (copy != NULL)
3734                 sshbuf_free(copy);
3735         if (decrypted != NULL)
3736                 sshbuf_free(decrypted);
3737         return r;
3738 }
3739 #endif /* WITH_SSH1 */
3740
3741 #ifdef WITH_OPENSSL
3742 static int
3743 sshkey_parse_private_pem_fileblob(struct sshbuf *blob, int type,
3744     const char *passphrase, struct sshkey **keyp)
3745 {
3746         EVP_PKEY *pk = NULL;
3747         struct sshkey *prv = NULL;
3748         BIO *bio = NULL;
3749         int r;
3750
3751         *keyp = NULL;
3752
3753         if ((bio = BIO_new(BIO_s_mem())) == NULL || sshbuf_len(blob) > INT_MAX)
3754                 return SSH_ERR_ALLOC_FAIL;
3755         if (BIO_write(bio, sshbuf_ptr(blob), sshbuf_len(blob)) !=
3756             (int)sshbuf_len(blob)) {
3757                 r = SSH_ERR_ALLOC_FAIL;
3758                 goto out;
3759         }
3760
3761         if ((pk = PEM_read_bio_PrivateKey(bio, NULL, NULL,
3762             (char *)passphrase)) == NULL) {
3763                 r = SSH_ERR_KEY_WRONG_PASSPHRASE;
3764                 goto out;
3765         }
3766         if (pk->type == EVP_PKEY_RSA &&
3767             (type == KEY_UNSPEC || type == KEY_RSA)) {
3768                 if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
3769                         r = SSH_ERR_ALLOC_FAIL;
3770                         goto out;
3771                 }
3772                 prv->rsa = EVP_PKEY_get1_RSA(pk);
3773                 prv->type = KEY_RSA;
3774 #ifdef DEBUG_PK
3775                 RSA_print_fp(stderr, prv->rsa, 8);
3776 #endif
3777                 if (RSA_blinding_on(prv->rsa, NULL) != 1) {
3778                         r = SSH_ERR_LIBCRYPTO_ERROR;
3779                         goto out;
3780                 }
3781         } else if (pk->type == EVP_PKEY_DSA &&
3782             (type == KEY_UNSPEC || type == KEY_DSA)) {
3783                 if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
3784                         r = SSH_ERR_ALLOC_FAIL;
3785                         goto out;
3786                 }
3787                 prv->dsa = EVP_PKEY_get1_DSA(pk);
3788                 prv->type = KEY_DSA;
3789 #ifdef DEBUG_PK
3790                 DSA_print_fp(stderr, prv->dsa, 8);
3791 #endif
3792 #ifdef OPENSSL_HAS_ECC
3793         } else if (pk->type == EVP_PKEY_EC &&
3794             (type == KEY_UNSPEC || type == KEY_ECDSA)) {
3795                 if ((prv = sshkey_new(KEY_UNSPEC)) == NULL) {
3796                         r = SSH_ERR_ALLOC_FAIL;
3797                         goto out;
3798                 }
3799                 prv->ecdsa = EVP_PKEY_get1_EC_KEY(pk);
3800                 prv->type = KEY_ECDSA;
3801                 prv->ecdsa_nid = sshkey_ecdsa_key_to_nid(prv->ecdsa);
3802                 if (prv->ecdsa_nid == -1 ||
3803                     sshkey_curve_nid_to_name(prv->ecdsa_nid) == NULL ||
3804                     sshkey_ec_validate_public(EC_KEY_get0_group(prv->ecdsa),
3805                     EC_KEY_get0_public_key(prv->ecdsa)) != 0 ||
3806                     sshkey_ec_validate_private(prv->ecdsa) != 0) {
3807                         r = SSH_ERR_INVALID_FORMAT;
3808                         goto out;
3809                 }
3810 # ifdef DEBUG_PK
3811                 if (prv != NULL && prv->ecdsa != NULL)
3812                         sshkey_dump_ec_key(prv->ecdsa);
3813 # endif
3814 #endif /* OPENSSL_HAS_ECC */
3815         } else {
3816                 r = SSH_ERR_INVALID_FORMAT;
3817                 goto out;
3818         }
3819         r = 0;
3820         *keyp = prv;
3821         prv = NULL;
3822  out:
3823         BIO_free(bio);
3824         if (pk != NULL)
3825                 EVP_PKEY_free(pk);
3826         if (prv != NULL)
3827                 sshkey_free(prv);
3828         return r;
3829 }
3830 #endif /* WITH_OPENSSL */
3831
3832 int
3833 sshkey_parse_private_fileblob_type(struct sshbuf *blob, int type,
3834     const char *passphrase, struct sshkey **keyp, char **commentp)
3835 {
3836         int r;
3837
3838         *keyp = NULL;
3839         if (commentp != NULL)
3840                 *commentp = NULL;
3841
3842         switch (type) {
3843 #ifdef WITH_SSH1
3844         case KEY_RSA1:
3845                 return sshkey_parse_private_rsa1(blob, passphrase,
3846                     keyp, commentp);
3847 #endif /* WITH_SSH1 */
3848 #ifdef WITH_OPENSSL
3849         case KEY_DSA:
3850         case KEY_ECDSA:
3851         case KEY_RSA:
3852                 return sshkey_parse_private_pem_fileblob(blob, type,
3853                     passphrase, keyp);
3854 #endif /* WITH_OPENSSL */
3855         case KEY_ED25519:
3856                 return sshkey_parse_private2(blob, type, passphrase,
3857                     keyp, commentp);
3858         case KEY_UNSPEC:
3859                 if ((r = sshkey_parse_private2(blob, type, passphrase, keyp,
3860                     commentp)) == 0)
3861                         return 0;
3862 #ifdef WITH_OPENSSL
3863                 return sshkey_parse_private_pem_fileblob(blob, type,
3864                     passphrase, keyp);
3865 #else
3866                 return SSH_ERR_INVALID_FORMAT;
3867 #endif /* WITH_OPENSSL */
3868         default:
3869                 return SSH_ERR_KEY_TYPE_UNKNOWN;
3870         }
3871 }
3872
3873 int
3874 sshkey_parse_private_fileblob(struct sshbuf *buffer, const char *passphrase,
3875     const char *filename, struct sshkey **keyp, char **commentp)
3876 {
3877         int r;
3878
3879         if (keyp != NULL)
3880                 *keyp = NULL;
3881         if (commentp != NULL)
3882                 *commentp = NULL;
3883
3884 #ifdef WITH_SSH1
3885         /* it's a SSH v1 key if the public key part is readable */
3886         if ((r = sshkey_parse_public_rsa1_fileblob(buffer, NULL, NULL)) == 0) {
3887                 return sshkey_parse_private_fileblob_type(buffer, KEY_RSA1,
3888                     passphrase, keyp, commentp);
3889         }
3890 #endif /* WITH_SSH1 */
3891         if ((r = sshkey_parse_private_fileblob_type(buffer, KEY_UNSPEC,
3892             passphrase, keyp, commentp)) == 0)
3893                 return 0;
3894         return r;
3895 }