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