Home | History | Annotate | Download | only in openssh
      1 /* $OpenBSD: key.c,v 1.97 2011/05/17 07:13:31 djm Exp $ */
      2 /*
      3  * read_bignum():
      4  * Copyright (c) 1995 Tatu Ylonen <ylo (at) cs.hut.fi>, Espoo, Finland
      5  *
      6  * As far as I am concerned, the code I have written for this software
      7  * can be used freely for any purpose.  Any derived versions of this
      8  * software must be clearly marked as such, and if the derived work is
      9  * incompatible with the protocol description in the RFC file, it must be
     10  * called by a name other than "ssh" or "Secure Shell".
     11  *
     12  *
     13  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
     14  * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
     15  *
     16  * Redistribution and use in source and binary forms, with or without
     17  * modification, are permitted provided that the following conditions
     18  * are met:
     19  * 1. Redistributions of source code must retain the above copyright
     20  *    notice, this list of conditions and the following disclaimer.
     21  * 2. Redistributions in binary form must reproduce the above copyright
     22  *    notice, this list of conditions and the following disclaimer in the
     23  *    documentation and/or other materials provided with the distribution.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     26  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     27  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     28  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     29  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
     30  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     31  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     32  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     33  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
     34  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     35  */
     36 
     37 #include "includes.h"
     38 
     39 #include <sys/param.h>
     40 #include <sys/types.h>
     41 
     42 #include <openssl/evp.h>
     43 #include <openbsd-compat/openssl-compat.h>
     44 
     45 #include <stdarg.h>
     46 #include <stdio.h>
     47 #include <string.h>
     48 
     49 #include "xmalloc.h"
     50 #include "key.h"
     51 #include "rsa.h"
     52 #include "uuencode.h"
     53 #include "buffer.h"
     54 #include "log.h"
     55 #include "misc.h"
     56 #include "ssh2.h"
     57 
     58 static struct KeyCert *
     59 cert_new(void)
     60 {
     61 	struct KeyCert *cert;
     62 
     63 	cert = xcalloc(1, sizeof(*cert));
     64 	buffer_init(&cert->certblob);
     65 	buffer_init(&cert->critical);
     66 	buffer_init(&cert->extensions);
     67 	cert->key_id = NULL;
     68 	cert->principals = NULL;
     69 	cert->signature_key = NULL;
     70 	return cert;
     71 }
     72 
     73 Key *
     74 key_new(int type)
     75 {
     76 	Key *k;
     77 	RSA *rsa;
     78 	DSA *dsa;
     79 	k = xcalloc(1, sizeof(*k));
     80 	k->type = type;
     81 	k->ecdsa = NULL;
     82 	k->ecdsa_nid = -1;
     83 	k->dsa = NULL;
     84 	k->rsa = NULL;
     85 	k->cert = NULL;
     86 	switch (k->type) {
     87 	case KEY_RSA1:
     88 	case KEY_RSA:
     89 	case KEY_RSA_CERT_V00:
     90 	case KEY_RSA_CERT:
     91 		if ((rsa = RSA_new()) == NULL)
     92 			fatal("key_new: RSA_new failed");
     93 		if ((rsa->n = BN_new()) == NULL)
     94 			fatal("key_new: BN_new failed");
     95 		if ((rsa->e = BN_new()) == NULL)
     96 			fatal("key_new: BN_new failed");
     97 		k->rsa = rsa;
     98 		break;
     99 	case KEY_DSA:
    100 	case KEY_DSA_CERT_V00:
    101 	case KEY_DSA_CERT:
    102 		if ((dsa = DSA_new()) == NULL)
    103 			fatal("key_new: DSA_new failed");
    104 		if ((dsa->p = BN_new()) == NULL)
    105 			fatal("key_new: BN_new failed");
    106 		if ((dsa->q = BN_new()) == NULL)
    107 			fatal("key_new: BN_new failed");
    108 		if ((dsa->g = BN_new()) == NULL)
    109 			fatal("key_new: BN_new failed");
    110 		if ((dsa->pub_key = BN_new()) == NULL)
    111 			fatal("key_new: BN_new failed");
    112 		k->dsa = dsa;
    113 		break;
    114 #ifdef OPENSSL_HAS_ECC
    115 	case KEY_ECDSA:
    116 	case KEY_ECDSA_CERT:
    117 		/* Cannot do anything until we know the group */
    118 		break;
    119 #endif
    120 	case KEY_UNSPEC:
    121 		break;
    122 	default:
    123 		fatal("key_new: bad key type %d", k->type);
    124 		break;
    125 	}
    126 
    127 	if (key_is_cert(k))
    128 		k->cert = cert_new();
    129 
    130 	return k;
    131 }
    132 
    133 void
    134 key_add_private(Key *k)
    135 {
    136 	switch (k->type) {
    137 	case KEY_RSA1:
    138 	case KEY_RSA:
    139 	case KEY_RSA_CERT_V00:
    140 	case KEY_RSA_CERT:
    141 		if ((k->rsa->d = BN_new()) == NULL)
    142 			fatal("key_new_private: BN_new failed");
    143 		if ((k->rsa->iqmp = BN_new()) == NULL)
    144 			fatal("key_new_private: BN_new failed");
    145 		if ((k->rsa->q = BN_new()) == NULL)
    146 			fatal("key_new_private: BN_new failed");
    147 		if ((k->rsa->p = BN_new()) == NULL)
    148 			fatal("key_new_private: BN_new failed");
    149 		if ((k->rsa->dmq1 = BN_new()) == NULL)
    150 			fatal("key_new_private: BN_new failed");
    151 		if ((k->rsa->dmp1 = BN_new()) == NULL)
    152 			fatal("key_new_private: BN_new failed");
    153 		break;
    154 	case KEY_DSA:
    155 	case KEY_DSA_CERT_V00:
    156 	case KEY_DSA_CERT:
    157 		if ((k->dsa->priv_key = BN_new()) == NULL)
    158 			fatal("key_new_private: BN_new failed");
    159 		break;
    160 	case KEY_ECDSA:
    161 	case KEY_ECDSA_CERT:
    162 		/* Cannot do anything until we know the group */
    163 		break;
    164 	case KEY_UNSPEC:
    165 		break;
    166 	default:
    167 		break;
    168 	}
    169 }
    170 
    171 Key *
    172 key_new_private(int type)
    173 {
    174 	Key *k = key_new(type);
    175 
    176 	key_add_private(k);
    177 	return k;
    178 }
    179 
    180 static void
    181 cert_free(struct KeyCert *cert)
    182 {
    183 	u_int i;
    184 
    185 	buffer_free(&cert->certblob);
    186 	buffer_free(&cert->critical);
    187 	buffer_free(&cert->extensions);
    188 	if (cert->key_id != NULL)
    189 		xfree(cert->key_id);
    190 	for (i = 0; i < cert->nprincipals; i++)
    191 		xfree(cert->principals[i]);
    192 	if (cert->principals != NULL)
    193 		xfree(cert->principals);
    194 	if (cert->signature_key != NULL)
    195 		key_free(cert->signature_key);
    196 }
    197 
    198 void
    199 key_free(Key *k)
    200 {
    201 	if (k == NULL)
    202 		fatal("key_free: key is NULL");
    203 	switch (k->type) {
    204 	case KEY_RSA1:
    205 	case KEY_RSA:
    206 	case KEY_RSA_CERT_V00:
    207 	case KEY_RSA_CERT:
    208 		if (k->rsa != NULL)
    209 			RSA_free(k->rsa);
    210 		k->rsa = NULL;
    211 		break;
    212 	case KEY_DSA:
    213 	case KEY_DSA_CERT_V00:
    214 	case KEY_DSA_CERT:
    215 		if (k->dsa != NULL)
    216 			DSA_free(k->dsa);
    217 		k->dsa = NULL;
    218 		break;
    219 #ifdef OPENSSL_HAS_ECC
    220 	case KEY_ECDSA:
    221 	case KEY_ECDSA_CERT:
    222 		if (k->ecdsa != NULL)
    223 			EC_KEY_free(k->ecdsa);
    224 		k->ecdsa = NULL;
    225 		break;
    226 #endif
    227 	case KEY_UNSPEC:
    228 		break;
    229 	default:
    230 		fatal("key_free: bad key type %d", k->type);
    231 		break;
    232 	}
    233 	if (key_is_cert(k)) {
    234 		if (k->cert != NULL)
    235 			cert_free(k->cert);
    236 		k->cert = NULL;
    237 	}
    238 
    239 	xfree(k);
    240 }
    241 
    242 static int
    243 cert_compare(struct KeyCert *a, struct KeyCert *b)
    244 {
    245 	if (a == NULL && b == NULL)
    246 		return 1;
    247 	if (a == NULL || b == NULL)
    248 		return 0;
    249 	if (buffer_len(&a->certblob) != buffer_len(&b->certblob))
    250 		return 0;
    251 	if (timingsafe_bcmp(buffer_ptr(&a->certblob), buffer_ptr(&b->certblob),
    252 	    buffer_len(&a->certblob)) != 0)
    253 		return 0;
    254 	return 1;
    255 }
    256 
    257 /*
    258  * Compare public portions of key only, allowing comparisons between
    259  * certificates and plain keys too.
    260  */
    261 int
    262 key_equal_public(const Key *a, const Key *b)
    263 {
    264 #ifdef OPENSSL_HAS_ECC
    265 	BN_CTX *bnctx;
    266 #endif
    267 
    268 	if (a == NULL || b == NULL ||
    269 	    key_type_plain(a->type) != key_type_plain(b->type))
    270 		return 0;
    271 
    272 	switch (a->type) {
    273 	case KEY_RSA1:
    274 	case KEY_RSA_CERT_V00:
    275 	case KEY_RSA_CERT:
    276 	case KEY_RSA:
    277 		return a->rsa != NULL && b->rsa != NULL &&
    278 		    BN_cmp(a->rsa->e, b->rsa->e) == 0 &&
    279 		    BN_cmp(a->rsa->n, b->rsa->n) == 0;
    280 	case KEY_DSA_CERT_V00:
    281 	case KEY_DSA_CERT:
    282 	case KEY_DSA:
    283 		return a->dsa != NULL && b->dsa != NULL &&
    284 		    BN_cmp(a->dsa->p, b->dsa->p) == 0 &&
    285 		    BN_cmp(a->dsa->q, b->dsa->q) == 0 &&
    286 		    BN_cmp(a->dsa->g, b->dsa->g) == 0 &&
    287 		    BN_cmp(a->dsa->pub_key, b->dsa->pub_key) == 0;
    288 #ifdef OPENSSL_HAS_ECC
    289 	case KEY_ECDSA_CERT:
    290 	case KEY_ECDSA:
    291 		if (a->ecdsa == NULL || b->ecdsa == NULL ||
    292 		    EC_KEY_get0_public_key(a->ecdsa) == NULL ||
    293 		    EC_KEY_get0_public_key(b->ecdsa) == NULL)
    294 			return 0;
    295 		if ((bnctx = BN_CTX_new()) == NULL)
    296 			fatal("%s: BN_CTX_new failed", __func__);
    297 		if (EC_GROUP_cmp(EC_KEY_get0_group(a->ecdsa),
    298 		    EC_KEY_get0_group(b->ecdsa), bnctx) != 0 ||
    299 		    EC_POINT_cmp(EC_KEY_get0_group(a->ecdsa),
    300 		    EC_KEY_get0_public_key(a->ecdsa),
    301 		    EC_KEY_get0_public_key(b->ecdsa), bnctx) != 0) {
    302 			BN_CTX_free(bnctx);
    303 			return 0;
    304 		}
    305 		BN_CTX_free(bnctx);
    306 		return 1;
    307 #endif /* OPENSSL_HAS_ECC */
    308 	default:
    309 		fatal("key_equal: bad key type %d", a->type);
    310 	}
    311 	/* NOTREACHED */
    312 }
    313 
    314 int
    315 key_equal(const Key *a, const Key *b)
    316 {
    317 	if (a == NULL || b == NULL || a->type != b->type)
    318 		return 0;
    319 	if (key_is_cert(a)) {
    320 		if (!cert_compare(a->cert, b->cert))
    321 			return 0;
    322 	}
    323 	return key_equal_public(a, b);
    324 }
    325 
    326 u_char*
    327 key_fingerprint_raw(Key *k, enum fp_type dgst_type, u_int *dgst_raw_length)
    328 {
    329 	const EVP_MD *md = NULL;
    330 	EVP_MD_CTX ctx;
    331 	u_char *blob = NULL;
    332 	u_char *retval = NULL;
    333 	u_int len = 0;
    334 	int nlen, elen, otype;
    335 
    336 	*dgst_raw_length = 0;
    337 
    338 	switch (dgst_type) {
    339 	case SSH_FP_MD5:
    340 		md = EVP_md5();
    341 		break;
    342 	case SSH_FP_SHA1:
    343 		md = EVP_sha1();
    344 		break;
    345 	default:
    346 		fatal("key_fingerprint_raw: bad digest type %d",
    347 		    dgst_type);
    348 	}
    349 	switch (k->type) {
    350 	case KEY_RSA1:
    351 		nlen = BN_num_bytes(k->rsa->n);
    352 		elen = BN_num_bytes(k->rsa->e);
    353 		len = nlen + elen;
    354 		blob = xmalloc(len);
    355 		BN_bn2bin(k->rsa->n, blob);
    356 		BN_bn2bin(k->rsa->e, blob + nlen);
    357 		break;
    358 	case KEY_DSA:
    359 	case KEY_ECDSA:
    360 	case KEY_RSA:
    361 		key_to_blob(k, &blob, &len);
    362 		break;
    363 	case KEY_DSA_CERT_V00:
    364 	case KEY_RSA_CERT_V00:
    365 	case KEY_DSA_CERT:
    366 	case KEY_ECDSA_CERT:
    367 	case KEY_RSA_CERT:
    368 		/* We want a fingerprint of the _key_ not of the cert */
    369 		otype = k->type;
    370 		k->type = key_type_plain(k->type);
    371 		key_to_blob(k, &blob, &len);
    372 		k->type = otype;
    373 		break;
    374 	case KEY_UNSPEC:
    375 		return retval;
    376 	default:
    377 		fatal("key_fingerprint_raw: bad key type %d", k->type);
    378 		break;
    379 	}
    380 	if (blob != NULL) {
    381 		retval = xmalloc(EVP_MAX_MD_SIZE);
    382 		EVP_DigestInit(&ctx, md);
    383 		EVP_DigestUpdate(&ctx, blob, len);
    384 		EVP_DigestFinal(&ctx, retval, dgst_raw_length);
    385 		memset(blob, 0, len);
    386 		xfree(blob);
    387 	} else {
    388 		fatal("key_fingerprint_raw: blob is null");
    389 	}
    390 	return retval;
    391 }
    392 
    393 static char *
    394 key_fingerprint_hex(u_char *dgst_raw, u_int dgst_raw_len)
    395 {
    396 	char *retval;
    397 	u_int i;
    398 
    399 	retval = xcalloc(1, dgst_raw_len * 3 + 1);
    400 	for (i = 0; i < dgst_raw_len; i++) {
    401 		char hex[4];
    402 		snprintf(hex, sizeof(hex), "%02x:", dgst_raw[i]);
    403 		strlcat(retval, hex, dgst_raw_len * 3 + 1);
    404 	}
    405 
    406 	/* Remove the trailing ':' character */
    407 	retval[(dgst_raw_len * 3) - 1] = '\0';
    408 	return retval;
    409 }
    410 
    411 static char *
    412 key_fingerprint_bubblebabble(u_char *dgst_raw, u_int dgst_raw_len)
    413 {
    414 	char vowels[] = { 'a', 'e', 'i', 'o', 'u', 'y' };
    415 	char consonants[] = { 'b', 'c', 'd', 'f', 'g', 'h', 'k', 'l', 'm',
    416 	    'n', 'p', 'r', 's', 't', 'v', 'z', 'x' };
    417 	u_int i, j = 0, rounds, seed = 1;
    418 	char *retval;
    419 
    420 	rounds = (dgst_raw_len / 2) + 1;
    421 	retval = xcalloc((rounds * 6), sizeof(char));
    422 	retval[j++] = 'x';
    423 	for (i = 0; i < rounds; i++) {
    424 		u_int idx0, idx1, idx2, idx3, idx4;
    425 		if ((i + 1 < rounds) || (dgst_raw_len % 2 != 0)) {
    426 			idx0 = (((((u_int)(dgst_raw[2 * i])) >> 6) & 3) +
    427 			    seed) % 6;
    428 			idx1 = (((u_int)(dgst_raw[2 * i])) >> 2) & 15;
    429 			idx2 = ((((u_int)(dgst_raw[2 * i])) & 3) +
    430 			    (seed / 6)) % 6;
    431 			retval[j++] = vowels[idx0];
    432 			retval[j++] = consonants[idx1];
    433 			retval[j++] = vowels[idx2];
    434 			if ((i + 1) < rounds) {
    435 				idx3 = (((u_int)(dgst_raw[(2 * i) + 1])) >> 4) & 15;
    436 				idx4 = (((u_int)(dgst_raw[(2 * i) + 1]))) & 15;
    437 				retval[j++] = consonants[idx3];
    438 				retval[j++] = '-';
    439 				retval[j++] = consonants[idx4];
    440 				seed = ((seed * 5) +
    441 				    ((((u_int)(dgst_raw[2 * i])) * 7) +
    442 				    ((u_int)(dgst_raw[(2 * i) + 1])))) % 36;
    443 			}
    444 		} else {
    445 			idx0 = seed % 6;
    446 			idx1 = 16;
    447 			idx2 = seed / 6;
    448 			retval[j++] = vowels[idx0];
    449 			retval[j++] = consonants[idx1];
    450 			retval[j++] = vowels[idx2];
    451 		}
    452 	}
    453 	retval[j++] = 'x';
    454 	retval[j++] = '\0';
    455 	return retval;
    456 }
    457 
    458 /*
    459  * Draw an ASCII-Art representing the fingerprint so human brain can
    460  * profit from its built-in pattern recognition ability.
    461  * This technique is called "random art" and can be found in some
    462  * scientific publications like this original paper:
    463  *
    464  * "Hash Visualization: a New Technique to improve Real-World Security",
    465  * Perrig A. and Song D., 1999, International Workshop on Cryptographic
    466  * Techniques and E-Commerce (CrypTEC '99)
    467  * sparrow.ece.cmu.edu/~adrian/projects/validation/validation.pdf
    468  *
    469  * The subject came up in a talk by Dan Kaminsky, too.
    470  *
    471  * If you see the picture is different, the key is different.
    472  * If the picture looks the same, you still know nothing.
    473  *
    474  * The algorithm used here is a worm crawling over a discrete plane,
    475  * leaving a trace (augmenting the field) everywhere it goes.
    476  * Movement is taken from dgst_raw 2bit-wise.  Bumping into walls
    477  * makes the respective movement vector be ignored for this turn.
    478  * Graphs are not unambiguous, because circles in graphs can be
    479  * walked in either direction.
    480  */
    481 
    482 /*
    483  * Field sizes for the random art.  Have to be odd, so the starting point
    484  * can be in the exact middle of the picture, and FLDBASE should be >=8 .
    485  * Else pictures would be too dense, and drawing the frame would
    486  * fail, too, because the key type would not fit in anymore.
    487  */
    488 #define	FLDBASE		8
    489 #define	FLDSIZE_Y	(FLDBASE + 1)
    490 #define	FLDSIZE_X	(FLDBASE * 2 + 1)
    491 static char *
    492 key_fingerprint_randomart(u_char *dgst_raw, u_int dgst_raw_len, const Key *k)
    493 {
    494 	/*
    495 	 * Chars to be used after each other every time the worm
    496 	 * intersects with itself.  Matter of taste.
    497 	 */
    498 	char	*augmentation_string = " .o+=*BOX@%&#/^SE";
    499 	char	*retval, *p;
    500 	u_char	 field[FLDSIZE_X][FLDSIZE_Y];
    501 	u_int	 i, b;
    502 	int	 x, y;
    503 	size_t	 len = strlen(augmentation_string) - 1;
    504 
    505 	retval = xcalloc(1, (FLDSIZE_X + 3) * (FLDSIZE_Y + 2));
    506 
    507 	/* initialize field */
    508 	memset(field, 0, FLDSIZE_X * FLDSIZE_Y * sizeof(char));
    509 	x = FLDSIZE_X / 2;
    510 	y = FLDSIZE_Y / 2;
    511 
    512 	/* process raw key */
    513 	for (i = 0; i < dgst_raw_len; i++) {
    514 		int input;
    515 		/* each byte conveys four 2-bit move commands */
    516 		input = dgst_raw[i];
    517 		for (b = 0; b < 4; b++) {
    518 			/* evaluate 2 bit, rest is shifted later */
    519 			x += (input & 0x1) ? 1 : -1;
    520 			y += (input & 0x2) ? 1 : -1;
    521 
    522 			/* assure we are still in bounds */
    523 			x = MAX(x, 0);
    524 			y = MAX(y, 0);
    525 			x = MIN(x, FLDSIZE_X - 1);
    526 			y = MIN(y, FLDSIZE_Y - 1);
    527 
    528 			/* augment the field */
    529 			if (field[x][y] < len - 2)
    530 				field[x][y]++;
    531 			input = input >> 2;
    532 		}
    533 	}
    534 
    535 	/* mark starting point and end point*/
    536 	field[FLDSIZE_X / 2][FLDSIZE_Y / 2] = len - 1;
    537 	field[x][y] = len;
    538 
    539 	/* fill in retval */
    540 	snprintf(retval, FLDSIZE_X, "+--[%4s %4u]", key_type(k), key_size(k));
    541 	p = strchr(retval, '\0');
    542 
    543 	/* output upper border */
    544 	for (i = p - retval - 1; i < FLDSIZE_X; i++)
    545 		*p++ = '-';
    546 	*p++ = '+';
    547 	*p++ = '\n';
    548 
    549 	/* output content */
    550 	for (y = 0; y < FLDSIZE_Y; y++) {
    551 		*p++ = '|';
    552 		for (x = 0; x < FLDSIZE_X; x++)
    553 			*p++ = augmentation_string[MIN(field[x][y], len)];
    554 		*p++ = '|';
    555 		*p++ = '\n';
    556 	}
    557 
    558 	/* output lower border */
    559 	*p++ = '+';
    560 	for (i = 0; i < FLDSIZE_X; i++)
    561 		*p++ = '-';
    562 	*p++ = '+';
    563 
    564 	return retval;
    565 }
    566 
    567 char *
    568 key_fingerprint(Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
    569 {
    570 	char *retval = NULL;
    571 	u_char *dgst_raw;
    572 	u_int dgst_raw_len;
    573 
    574 	dgst_raw = key_fingerprint_raw(k, dgst_type, &dgst_raw_len);
    575 	if (!dgst_raw)
    576 		fatal("key_fingerprint: null from key_fingerprint_raw()");
    577 	switch (dgst_rep) {
    578 	case SSH_FP_HEX:
    579 		retval = key_fingerprint_hex(dgst_raw, dgst_raw_len);
    580 		break;
    581 	case SSH_FP_BUBBLEBABBLE:
    582 		retval = key_fingerprint_bubblebabble(dgst_raw, dgst_raw_len);
    583 		break;
    584 	case SSH_FP_RANDOMART:
    585 		retval = key_fingerprint_randomart(dgst_raw, dgst_raw_len, k);
    586 		break;
    587 	default:
    588 		fatal("key_fingerprint: bad digest representation %d",
    589 		    dgst_rep);
    590 		break;
    591 	}
    592 	memset(dgst_raw, 0, dgst_raw_len);
    593 	xfree(dgst_raw);
    594 	return retval;
    595 }
    596 
    597 /*
    598  * Reads a multiple-precision integer in decimal from the buffer, and advances
    599  * the pointer.  The integer must already be initialized.  This function is
    600  * permitted to modify the buffer.  This leaves *cpp to point just beyond the
    601  * last processed (and maybe modified) character.  Note that this may modify
    602  * the buffer containing the number.
    603  */
    604 static int
    605 read_bignum(char **cpp, BIGNUM * value)
    606 {
    607 	char *cp = *cpp;
    608 	int old;
    609 
    610 	/* Skip any leading whitespace. */
    611 	for (; *cp == ' ' || *cp == '\t'; cp++)
    612 		;
    613 
    614 	/* Check that it begins with a decimal digit. */
    615 	if (*cp < '0' || *cp > '9')
    616 		return 0;
    617 
    618 	/* Save starting position. */
    619 	*cpp = cp;
    620 
    621 	/* Move forward until all decimal digits skipped. */
    622 	for (; *cp >= '0' && *cp <= '9'; cp++)
    623 		;
    624 
    625 	/* Save the old terminating character, and replace it by \0. */
    626 	old = *cp;
    627 	*cp = 0;
    628 
    629 	/* Parse the number. */
    630 	if (BN_dec2bn(&value, *cpp) == 0)
    631 		return 0;
    632 
    633 	/* Restore old terminating character. */
    634 	*cp = old;
    635 
    636 	/* Move beyond the number and return success. */
    637 	*cpp = cp;
    638 	return 1;
    639 }
    640 
    641 static int
    642 write_bignum(FILE *f, BIGNUM *num)
    643 {
    644 	char *buf = BN_bn2dec(num);
    645 	if (buf == NULL) {
    646 		error("write_bignum: BN_bn2dec() failed");
    647 		return 0;
    648 	}
    649 	fprintf(f, " %s", buf);
    650 	OPENSSL_free(buf);
    651 	return 1;
    652 }
    653 
    654 /* returns 1 ok, -1 error */
    655 int
    656 key_read(Key *ret, char **cpp)
    657 {
    658 	Key *k;
    659 	int success = -1;
    660 	char *cp, *space;
    661 	int len, n, type;
    662 	u_int bits;
    663 	u_char *blob;
    664 #ifdef OPENSSL_HAS_ECC
    665 	int curve_nid = -1;
    666 #endif
    667 
    668 	cp = *cpp;
    669 
    670 	switch (ret->type) {
    671 	case KEY_RSA1:
    672 		/* Get number of bits. */
    673 		if (*cp < '0' || *cp > '9')
    674 			return -1;	/* Bad bit count... */
    675 		for (bits = 0; *cp >= '0' && *cp <= '9'; cp++)
    676 			bits = 10 * bits + *cp - '0';
    677 		if (bits == 0)
    678 			return -1;
    679 		*cpp = cp;
    680 		/* Get public exponent, public modulus. */
    681 		if (!read_bignum(cpp, ret->rsa->e))
    682 			return -1;
    683 		if (!read_bignum(cpp, ret->rsa->n))
    684 			return -1;
    685 		/* validate the claimed number of bits */
    686 		if ((u_int)BN_num_bits(ret->rsa->n) != bits) {
    687 			verbose("key_read: claimed key size %d does not match "
    688 			   "actual %d", bits, BN_num_bits(ret->rsa->n));
    689 			return -1;
    690 		}
    691 		success = 1;
    692 		break;
    693 	case KEY_UNSPEC:
    694 	case KEY_RSA:
    695 	case KEY_DSA:
    696 	case KEY_ECDSA:
    697 	case KEY_DSA_CERT_V00:
    698 	case KEY_RSA_CERT_V00:
    699 	case KEY_DSA_CERT:
    700 	case KEY_ECDSA_CERT:
    701 	case KEY_RSA_CERT:
    702 		space = strchr(cp, ' ');
    703 		if (space == NULL) {
    704 			debug3("key_read: missing whitespace");
    705 			return -1;
    706 		}
    707 		*space = '\0';
    708 		type = key_type_from_name(cp);
    709 #ifdef OPENSSL_HAS_ECC
    710 		if (key_type_plain(type) == KEY_ECDSA &&
    711 		    (curve_nid = key_ecdsa_nid_from_name(cp)) == -1) {
    712 			debug("key_read: invalid curve");
    713 			return -1;
    714 		}
    715 #endif
    716 		*space = ' ';
    717 		if (type == KEY_UNSPEC) {
    718 			debug3("key_read: missing keytype");
    719 			return -1;
    720 		}
    721 		cp = space+1;
    722 		if (*cp == '\0') {
    723 			debug3("key_read: short string");
    724 			return -1;
    725 		}
    726 		if (ret->type == KEY_UNSPEC) {
    727 			ret->type = type;
    728 		} else if (ret->type != type) {
    729 			/* is a key, but different type */
    730 			debug3("key_read: type mismatch");
    731 			return -1;
    732 		}
    733 		len = 2*strlen(cp);
    734 		blob = xmalloc(len);
    735 		n = uudecode(cp, blob, len);
    736 		if (n < 0) {
    737 			error("key_read: uudecode %s failed", cp);
    738 			xfree(blob);
    739 			return -1;
    740 		}
    741 		k = key_from_blob(blob, (u_int)n);
    742 		xfree(blob);
    743 		if (k == NULL) {
    744 			error("key_read: key_from_blob %s failed", cp);
    745 			return -1;
    746 		}
    747 		if (k->type != type) {
    748 			error("key_read: type mismatch: encoding error");
    749 			key_free(k);
    750 			return -1;
    751 		}
    752 #ifdef OPENSSL_HAS_ECC
    753 		if (key_type_plain(type) == KEY_ECDSA &&
    754 		    curve_nid != k->ecdsa_nid) {
    755 			error("key_read: type mismatch: EC curve mismatch");
    756 			key_free(k);
    757 			return -1;
    758 		}
    759 #endif
    760 /*XXXX*/
    761 		if (key_is_cert(ret)) {
    762 			if (!key_is_cert(k)) {
    763 				error("key_read: loaded key is not a cert");
    764 				key_free(k);
    765 				return -1;
    766 			}
    767 			if (ret->cert != NULL)
    768 				cert_free(ret->cert);
    769 			ret->cert = k->cert;
    770 			k->cert = NULL;
    771 		}
    772 		if (key_type_plain(ret->type) == KEY_RSA) {
    773 			if (ret->rsa != NULL)
    774 				RSA_free(ret->rsa);
    775 			ret->rsa = k->rsa;
    776 			k->rsa = NULL;
    777 #ifdef DEBUG_PK
    778 			RSA_print_fp(stderr, ret->rsa, 8);
    779 #endif
    780 		}
    781 		if (key_type_plain(ret->type) == KEY_DSA) {
    782 			if (ret->dsa != NULL)
    783 				DSA_free(ret->dsa);
    784 			ret->dsa = k->dsa;
    785 			k->dsa = NULL;
    786 #ifdef DEBUG_PK
    787 			DSA_print_fp(stderr, ret->dsa, 8);
    788 #endif
    789 		}
    790 #ifdef OPENSSL_HAS_ECC
    791 		if (key_type_plain(ret->type) == KEY_ECDSA) {
    792 			if (ret->ecdsa != NULL)
    793 				EC_KEY_free(ret->ecdsa);
    794 			ret->ecdsa = k->ecdsa;
    795 			ret->ecdsa_nid = k->ecdsa_nid;
    796 			k->ecdsa = NULL;
    797 			k->ecdsa_nid = -1;
    798 #ifdef DEBUG_PK
    799 			key_dump_ec_key(ret->ecdsa);
    800 #endif
    801 		}
    802 #endif
    803 		success = 1;
    804 /*XXXX*/
    805 		key_free(k);
    806 		if (success != 1)
    807 			break;
    808 		/* advance cp: skip whitespace and data */
    809 		while (*cp == ' ' || *cp == '\t')
    810 			cp++;
    811 		while (*cp != '\0' && *cp != ' ' && *cp != '\t')
    812 			cp++;
    813 		*cpp = cp;
    814 		break;
    815 	default:
    816 		fatal("key_read: bad key type: %d", ret->type);
    817 		break;
    818 	}
    819 	return success;
    820 }
    821 
    822 int
    823 key_write(const Key *key, FILE *f)
    824 {
    825 	int n, success = 0;
    826 	u_int len, bits = 0;
    827 	u_char *blob;
    828 	char *uu;
    829 
    830 	if (key_is_cert(key)) {
    831 		if (key->cert == NULL) {
    832 			error("%s: no cert data", __func__);
    833 			return 0;
    834 		}
    835 		if (buffer_len(&key->cert->certblob) == 0) {
    836 			error("%s: no signed certificate blob", __func__);
    837 			return 0;
    838 		}
    839 	}
    840 
    841 	switch (key->type) {
    842 	case KEY_RSA1:
    843 		if (key->rsa == NULL)
    844 			return 0;
    845 		/* size of modulus 'n' */
    846 		bits = BN_num_bits(key->rsa->n);
    847 		fprintf(f, "%u", bits);
    848 		if (write_bignum(f, key->rsa->e) &&
    849 		    write_bignum(f, key->rsa->n))
    850 			return 1;
    851 		error("key_write: failed for RSA key");
    852 		return 0;
    853 	case KEY_DSA:
    854 	case KEY_DSA_CERT_V00:
    855 	case KEY_DSA_CERT:
    856 		if (key->dsa == NULL)
    857 			return 0;
    858 		break;
    859 #ifdef OPENSSL_HAS_ECC
    860 	case KEY_ECDSA:
    861 	case KEY_ECDSA_CERT:
    862 		if (key->ecdsa == NULL)
    863 			return 0;
    864 		break;
    865 #endif
    866 	case KEY_RSA:
    867 	case KEY_RSA_CERT_V00:
    868 	case KEY_RSA_CERT:
    869 		if (key->rsa == NULL)
    870 			return 0;
    871 		break;
    872 	default:
    873 		return 0;
    874 	}
    875 
    876 	key_to_blob(key, &blob, &len);
    877 	uu = xmalloc(2*len);
    878 	n = uuencode(blob, len, uu, 2*len);
    879 	if (n > 0) {
    880 		fprintf(f, "%s %s", key_ssh_name(key), uu);
    881 		success = 1;
    882 	}
    883 	xfree(blob);
    884 	xfree(uu);
    885 
    886 	return success;
    887 }
    888 
    889 const char *
    890 key_type(const Key *k)
    891 {
    892 	switch (k->type) {
    893 	case KEY_RSA1:
    894 		return "RSA1";
    895 	case KEY_RSA:
    896 		return "RSA";
    897 	case KEY_DSA:
    898 		return "DSA";
    899 #ifdef OPENSSL_HAS_ECC
    900 	case KEY_ECDSA:
    901 		return "ECDSA";
    902 #endif
    903 	case KEY_RSA_CERT_V00:
    904 		return "RSA-CERT-V00";
    905 	case KEY_DSA_CERT_V00:
    906 		return "DSA-CERT-V00";
    907 	case KEY_RSA_CERT:
    908 		return "RSA-CERT";
    909 	case KEY_DSA_CERT:
    910 		return "DSA-CERT";
    911 #ifdef OPENSSL_HAS_ECC
    912 	case KEY_ECDSA_CERT:
    913 		return "ECDSA-CERT";
    914 #endif
    915 	}
    916 	return "unknown";
    917 }
    918 
    919 const char *
    920 key_cert_type(const Key *k)
    921 {
    922 	switch (k->cert->type) {
    923 	case SSH2_CERT_TYPE_USER:
    924 		return "user";
    925 	case SSH2_CERT_TYPE_HOST:
    926 		return "host";
    927 	default:
    928 		return "unknown";
    929 	}
    930 }
    931 
    932 static const char *
    933 key_ssh_name_from_type_nid(int type, int nid)
    934 {
    935 	switch (type) {
    936 	case KEY_RSA:
    937 		return "ssh-rsa";
    938 	case KEY_DSA:
    939 		return "ssh-dss";
    940 	case KEY_RSA_CERT_V00:
    941 		return "ssh-rsa-cert-v00 (at) openssh.com";
    942 	case KEY_DSA_CERT_V00:
    943 		return "ssh-dss-cert-v00 (at) openssh.com";
    944 	case KEY_RSA_CERT:
    945 		return "ssh-rsa-cert-v01 (at) openssh.com";
    946 	case KEY_DSA_CERT:
    947 		return "ssh-dss-cert-v01 (at) openssh.com";
    948 #ifdef OPENSSL_HAS_ECC
    949 	case KEY_ECDSA:
    950 		switch (nid) {
    951 		case NID_X9_62_prime256v1:
    952 			return "ecdsa-sha2-nistp256";
    953 		case NID_secp384r1:
    954 			return "ecdsa-sha2-nistp384";
    955 		case NID_secp521r1:
    956 			return "ecdsa-sha2-nistp521";
    957 		default:
    958 			break;
    959 		}
    960 		break;
    961 	case KEY_ECDSA_CERT:
    962 		switch (nid) {
    963 		case NID_X9_62_prime256v1:
    964 			return "ecdsa-sha2-nistp256-cert-v01 (at) openssh.com";
    965 		case NID_secp384r1:
    966 			return "ecdsa-sha2-nistp384-cert-v01 (at) openssh.com";
    967 		case NID_secp521r1:
    968 			return "ecdsa-sha2-nistp521-cert-v01 (at) openssh.com";
    969 		default:
    970 			break;
    971 		}
    972 		break;
    973 #endif /* OPENSSL_HAS_ECC */
    974 	}
    975 	return "ssh-unknown";
    976 }
    977 
    978 const char *
    979 key_ssh_name(const Key *k)
    980 {
    981 	return key_ssh_name_from_type_nid(k->type, k->ecdsa_nid);
    982 }
    983 
    984 const char *
    985 key_ssh_name_plain(const Key *k)
    986 {
    987 	return key_ssh_name_from_type_nid(key_type_plain(k->type),
    988 	    k->ecdsa_nid);
    989 }
    990 
    991 u_int
    992 key_size(const Key *k)
    993 {
    994 	switch (k->type) {
    995 	case KEY_RSA1:
    996 	case KEY_RSA:
    997 	case KEY_RSA_CERT_V00:
    998 	case KEY_RSA_CERT:
    999 		return BN_num_bits(k->rsa->n);
   1000 	case KEY_DSA:
   1001 	case KEY_DSA_CERT_V00:
   1002 	case KEY_DSA_CERT:
   1003 		return BN_num_bits(k->dsa->p);
   1004 #ifdef OPENSSL_HAS_ECC
   1005 	case KEY_ECDSA:
   1006 	case KEY_ECDSA_CERT:
   1007 		return key_curve_nid_to_bits(k->ecdsa_nid);
   1008 #endif
   1009 	}
   1010 	return 0;
   1011 }
   1012 
   1013 static RSA *
   1014 rsa_generate_private_key(u_int bits)
   1015 {
   1016 	RSA *private = RSA_new();
   1017 	BIGNUM *f4 = BN_new();
   1018 
   1019 	if (private == NULL)
   1020 		fatal("%s: RSA_new failed", __func__);
   1021 	if (f4 == NULL)
   1022 		fatal("%s: BN_new failed", __func__);
   1023 	if (!BN_set_word(f4, RSA_F4))
   1024 		fatal("%s: BN_new failed", __func__);
   1025 	if (!RSA_generate_key_ex(private, bits, f4, NULL))
   1026 		fatal("%s: key generation failed.", __func__);
   1027 	BN_free(f4);
   1028 	return private;
   1029 }
   1030 
   1031 static DSA*
   1032 dsa_generate_private_key(u_int bits)
   1033 {
   1034 	DSA *private = DSA_new();
   1035 
   1036 	if (private == NULL)
   1037 		fatal("%s: DSA_new failed", __func__);
   1038 	if (!DSA_generate_parameters_ex(private, bits, NULL, 0, NULL,
   1039 	    NULL, NULL))
   1040 		fatal("%s: DSA_generate_parameters failed", __func__);
   1041 	if (!DSA_generate_key(private))
   1042 		fatal("%s: DSA_generate_key failed.", __func__);
   1043 	return private;
   1044 }
   1045 
   1046 int
   1047 key_ecdsa_bits_to_nid(int bits)
   1048 {
   1049 	switch (bits) {
   1050 #ifdef OPENSSL_HAS_ECC
   1051 	case 256:
   1052 		return NID_X9_62_prime256v1;
   1053 	case 384:
   1054 		return NID_secp384r1;
   1055 	case 521:
   1056 		return NID_secp521r1;
   1057 #endif
   1058 	default:
   1059 		return -1;
   1060 	}
   1061 }
   1062 
   1063 #ifdef OPENSSL_HAS_ECC
   1064 int
   1065 key_ecdsa_key_to_nid(EC_KEY *k)
   1066 {
   1067 	EC_GROUP *eg;
   1068 	int nids[] = {
   1069 		NID_X9_62_prime256v1,
   1070 		NID_secp384r1,
   1071 		NID_secp521r1,
   1072 		-1
   1073 	};
   1074 	int nid;
   1075 	u_int i;
   1076 	BN_CTX *bnctx;
   1077 	const EC_GROUP *g = EC_KEY_get0_group(k);
   1078 
   1079 	/*
   1080 	 * The group may be stored in a ASN.1 encoded private key in one of two
   1081 	 * ways: as a "named group", which is reconstituted by ASN.1 object ID
   1082 	 * or explicit group parameters encoded into the key blob. Only the
   1083 	 * "named group" case sets the group NID for us, but we can figure
   1084 	 * it out for the other case by comparing against all the groups that
   1085 	 * are supported.
   1086 	 */
   1087 	if ((nid = EC_GROUP_get_curve_name(g)) > 0)
   1088 		return nid;
   1089 	if ((bnctx = BN_CTX_new()) == NULL)
   1090 		fatal("%s: BN_CTX_new() failed", __func__);
   1091 	for (i = 0; nids[i] != -1; i++) {
   1092 		if ((eg = EC_GROUP_new_by_curve_name(nids[i])) == NULL)
   1093 			fatal("%s: EC_GROUP_new_by_curve_name failed",
   1094 			    __func__);
   1095 		if (EC_GROUP_cmp(g, eg, bnctx) == 0)
   1096 			break;
   1097 		EC_GROUP_free(eg);
   1098 	}
   1099 	BN_CTX_free(bnctx);
   1100 	debug3("%s: nid = %d", __func__, nids[i]);
   1101 	if (nids[i] != -1) {
   1102 		/* Use the group with the NID attached */
   1103 		EC_GROUP_set_asn1_flag(eg, OPENSSL_EC_NAMED_CURVE);
   1104 		if (EC_KEY_set_group(k, eg) != 1)
   1105 			fatal("%s: EC_KEY_set_group", __func__);
   1106 	}
   1107 	return nids[i];
   1108 }
   1109 
   1110 static EC_KEY*
   1111 ecdsa_generate_private_key(u_int bits, int *nid)
   1112 {
   1113 	EC_KEY *private;
   1114 
   1115 	if ((*nid = key_ecdsa_bits_to_nid(bits)) == -1)
   1116 		fatal("%s: invalid key length", __func__);
   1117 	if ((private = EC_KEY_new_by_curve_name(*nid)) == NULL)
   1118 		fatal("%s: EC_KEY_new_by_curve_name failed", __func__);
   1119 	if (EC_KEY_generate_key(private) != 1)
   1120 		fatal("%s: EC_KEY_generate_key failed", __func__);
   1121 	EC_KEY_set_asn1_flag(private, OPENSSL_EC_NAMED_CURVE);
   1122 	return private;
   1123 }
   1124 #endif /* OPENSSL_HAS_ECC */
   1125 
   1126 Key *
   1127 key_generate(int type, u_int bits)
   1128 {
   1129 	Key *k = key_new(KEY_UNSPEC);
   1130 	switch (type) {
   1131 	case KEY_DSA:
   1132 		k->dsa = dsa_generate_private_key(bits);
   1133 		break;
   1134 #ifdef OPENSSL_HAS_ECC
   1135 	case KEY_ECDSA:
   1136 		k->ecdsa = ecdsa_generate_private_key(bits, &k->ecdsa_nid);
   1137 		break;
   1138 #endif
   1139 	case KEY_RSA:
   1140 	case KEY_RSA1:
   1141 		k->rsa = rsa_generate_private_key(bits);
   1142 		break;
   1143 	case KEY_RSA_CERT_V00:
   1144 	case KEY_DSA_CERT_V00:
   1145 	case KEY_RSA_CERT:
   1146 	case KEY_DSA_CERT:
   1147 		fatal("key_generate: cert keys cannot be generated directly");
   1148 	default:
   1149 		fatal("key_generate: unknown type %d", type);
   1150 	}
   1151 	k->type = type;
   1152 	return k;
   1153 }
   1154 
   1155 void
   1156 key_cert_copy(const Key *from_key, struct Key *to_key)
   1157 {
   1158 	u_int i;
   1159 	const struct KeyCert *from;
   1160 	struct KeyCert *to;
   1161 
   1162 	if (to_key->cert != NULL) {
   1163 		cert_free(to_key->cert);
   1164 		to_key->cert = NULL;
   1165 	}
   1166 
   1167 	if ((from = from_key->cert) == NULL)
   1168 		return;
   1169 
   1170 	to = to_key->cert = cert_new();
   1171 
   1172 	buffer_append(&to->certblob, buffer_ptr(&from->certblob),
   1173 	    buffer_len(&from->certblob));
   1174 
   1175 	buffer_append(&to->critical,
   1176 	    buffer_ptr(&from->critical), buffer_len(&from->critical));
   1177 	buffer_append(&to->extensions,
   1178 	    buffer_ptr(&from->extensions), buffer_len(&from->extensions));
   1179 
   1180 	to->serial = from->serial;
   1181 	to->type = from->type;
   1182 	to->key_id = from->key_id == NULL ? NULL : xstrdup(from->key_id);
   1183 	to->valid_after = from->valid_after;
   1184 	to->valid_before = from->valid_before;
   1185 	to->signature_key = from->signature_key == NULL ?
   1186 	    NULL : key_from_private(from->signature_key);
   1187 
   1188 	to->nprincipals = from->nprincipals;
   1189 	if (to->nprincipals > CERT_MAX_PRINCIPALS)
   1190 		fatal("%s: nprincipals (%u) > CERT_MAX_PRINCIPALS (%u)",
   1191 		    __func__, to->nprincipals, CERT_MAX_PRINCIPALS);
   1192 	if (to->nprincipals > 0) {
   1193 		to->principals = xcalloc(from->nprincipals,
   1194 		    sizeof(*to->principals));
   1195 		for (i = 0; i < to->nprincipals; i++)
   1196 			to->principals[i] = xstrdup(from->principals[i]);
   1197 	}
   1198 }
   1199 
   1200 Key *
   1201 key_from_private(const Key *k)
   1202 {
   1203 	Key *n = NULL;
   1204 	switch (k->type) {
   1205 	case KEY_DSA:
   1206 	case KEY_DSA_CERT_V00:
   1207 	case KEY_DSA_CERT:
   1208 		n = key_new(k->type);
   1209 		if ((BN_copy(n->dsa->p, k->dsa->p) == NULL) ||
   1210 		    (BN_copy(n->dsa->q, k->dsa->q) == NULL) ||
   1211 		    (BN_copy(n->dsa->g, k->dsa->g) == NULL) ||
   1212 		    (BN_copy(n->dsa->pub_key, k->dsa->pub_key) == NULL))
   1213 			fatal("key_from_private: BN_copy failed");
   1214 		break;
   1215 #ifdef OPENSSL_HAS_ECC
   1216 	case KEY_ECDSA:
   1217 	case KEY_ECDSA_CERT:
   1218 		n = key_new(k->type);
   1219 		n->ecdsa_nid = k->ecdsa_nid;
   1220 		if ((n->ecdsa = EC_KEY_new_by_curve_name(k->ecdsa_nid)) == NULL)
   1221 			fatal("%s: EC_KEY_new_by_curve_name failed", __func__);
   1222 		if (EC_KEY_set_public_key(n->ecdsa,
   1223 		    EC_KEY_get0_public_key(k->ecdsa)) != 1)
   1224 			fatal("%s: EC_KEY_set_public_key failed", __func__);
   1225 		break;
   1226 #endif
   1227 	case KEY_RSA:
   1228 	case KEY_RSA1:
   1229 	case KEY_RSA_CERT_V00:
   1230 	case KEY_RSA_CERT:
   1231 		n = key_new(k->type);
   1232 		if ((BN_copy(n->rsa->n, k->rsa->n) == NULL) ||
   1233 		    (BN_copy(n->rsa->e, k->rsa->e) == NULL))
   1234 			fatal("key_from_private: BN_copy failed");
   1235 		break;
   1236 	default:
   1237 		fatal("key_from_private: unknown type %d", k->type);
   1238 		break;
   1239 	}
   1240 	if (key_is_cert(k))
   1241 		key_cert_copy(k, n);
   1242 	return n;
   1243 }
   1244 
   1245 int
   1246 key_type_from_name(char *name)
   1247 {
   1248 	if (strcmp(name, "rsa1") == 0) {
   1249 		return KEY_RSA1;
   1250 	} else if (strcmp(name, "rsa") == 0) {
   1251 		return KEY_RSA;
   1252 	} else if (strcmp(name, "dsa") == 0) {
   1253 		return KEY_DSA;
   1254 	} else if (strcmp(name, "ssh-rsa") == 0) {
   1255 		return KEY_RSA;
   1256 	} else if (strcmp(name, "ssh-dss") == 0) {
   1257 		return KEY_DSA;
   1258 #ifdef OPENSSL_HAS_ECC
   1259 	} else if (strcmp(name, "ecdsa") == 0 ||
   1260 	    strcmp(name, "ecdsa-sha2-nistp256") == 0 ||
   1261 	    strcmp(name, "ecdsa-sha2-nistp384") == 0 ||
   1262 	    strcmp(name, "ecdsa-sha2-nistp521") == 0) {
   1263 		return KEY_ECDSA;
   1264 #endif
   1265 	} else if (strcmp(name, "ssh-rsa-cert-v00 (at) openssh.com") == 0) {
   1266 		return KEY_RSA_CERT_V00;
   1267 	} else if (strcmp(name, "ssh-dss-cert-v00 (at) openssh.com") == 0) {
   1268 		return KEY_DSA_CERT_V00;
   1269 	} else if (strcmp(name, "ssh-rsa-cert-v01 (at) openssh.com") == 0) {
   1270 		return KEY_RSA_CERT;
   1271 	} else if (strcmp(name, "ssh-dss-cert-v01 (at) openssh.com") == 0) {
   1272 		return KEY_DSA_CERT;
   1273 #ifdef OPENSSL_HAS_ECC
   1274 	} else if (strcmp(name, "ecdsa-sha2-nistp256-cert-v01 (at) openssh.com") == 0 ||
   1275 	    strcmp(name, "ecdsa-sha2-nistp384-cert-v01 (at) openssh.com") == 0 ||
   1276 	    strcmp(name, "ecdsa-sha2-nistp521-cert-v01 (at) openssh.com") == 0) {
   1277 		return KEY_ECDSA_CERT;
   1278 #endif
   1279 	}
   1280 
   1281 	debug2("key_type_from_name: unknown key type '%s'", name);
   1282 	return KEY_UNSPEC;
   1283 }
   1284 
   1285 int
   1286 key_ecdsa_nid_from_name(const char *name)
   1287 {
   1288 #ifdef OPENSSL_HAS_ECC
   1289 	if (strcmp(name, "ecdsa-sha2-nistp256") == 0 ||
   1290 	    strcmp(name, "ecdsa-sha2-nistp256-cert-v01 (at) openssh.com") == 0)
   1291 		return NID_X9_62_prime256v1;
   1292 	if (strcmp(name, "ecdsa-sha2-nistp384") == 0 ||
   1293 	    strcmp(name, "ecdsa-sha2-nistp384-cert-v01 (at) openssh.com") == 0)
   1294 		return NID_secp384r1;
   1295 	if (strcmp(name, "ecdsa-sha2-nistp521") == 0 ||
   1296 	    strcmp(name, "ecdsa-sha2-nistp521-cert-v01 (at) openssh.com") == 0)
   1297 		return NID_secp521r1;
   1298 #endif /* OPENSSL_HAS_ECC */
   1299 
   1300 	debug2("%s: unknown/non-ECDSA key type '%s'", __func__, name);
   1301 	return -1;
   1302 }
   1303 
   1304 int
   1305 key_names_valid2(const char *names)
   1306 {
   1307 	char *s, *cp, *p;
   1308 
   1309 	if (names == NULL || strcmp(names, "") == 0)
   1310 		return 0;
   1311 	s = cp = xstrdup(names);
   1312 	for ((p = strsep(&cp, ",")); p && *p != '\0';
   1313 	    (p = strsep(&cp, ","))) {
   1314 		switch (key_type_from_name(p)) {
   1315 		case KEY_RSA1:
   1316 		case KEY_UNSPEC:
   1317 			xfree(s);
   1318 			return 0;
   1319 		}
   1320 	}
   1321 	debug3("key names ok: [%s]", names);
   1322 	xfree(s);
   1323 	return 1;
   1324 }
   1325 
   1326 static int
   1327 cert_parse(Buffer *b, Key *key, const u_char *blob, u_int blen)
   1328 {
   1329 	u_char *principals, *critical, *exts, *sig_key, *sig;
   1330 	u_int signed_len, plen, clen, sklen, slen, kidlen, elen;
   1331 	Buffer tmp;
   1332 	char *principal;
   1333 	int ret = -1;
   1334 	int v00 = key->type == KEY_DSA_CERT_V00 ||
   1335 	    key->type == KEY_RSA_CERT_V00;
   1336 
   1337 	buffer_init(&tmp);
   1338 
   1339 	/* Copy the entire key blob for verification and later serialisation */
   1340 	buffer_append(&key->cert->certblob, blob, blen);
   1341 
   1342 	elen = 0; /* Not touched for v00 certs */
   1343 	principals = exts = critical = sig_key = sig = NULL;
   1344 	if ((!v00 && buffer_get_int64_ret(&key->cert->serial, b) != 0) ||
   1345 	    buffer_get_int_ret(&key->cert->type, b) != 0 ||
   1346 	    (key->cert->key_id = buffer_get_cstring_ret(b, &kidlen)) == NULL ||
   1347 	    (principals = buffer_get_string_ret(b, &plen)) == NULL ||
   1348 	    buffer_get_int64_ret(&key->cert->valid_after, b) != 0 ||
   1349 	    buffer_get_int64_ret(&key->cert->valid_before, b) != 0 ||
   1350 	    (critical = buffer_get_string_ret(b, &clen)) == NULL ||
   1351 	    (!v00 && (exts = buffer_get_string_ret(b, &elen)) == NULL) ||
   1352 	    (v00 && buffer_get_string_ptr_ret(b, NULL) == NULL) || /* nonce */
   1353 	    buffer_get_string_ptr_ret(b, NULL) == NULL || /* reserved */
   1354 	    (sig_key = buffer_get_string_ret(b, &sklen)) == NULL) {
   1355 		error("%s: parse error", __func__);
   1356 		goto out;
   1357 	}
   1358 
   1359 	if (kidlen != strlen(key->cert->key_id)) {
   1360 		error("%s: key ID contains \\0 character", __func__);
   1361 		goto out;
   1362 	}
   1363 
   1364 	/* Signature is left in the buffer so we can calculate this length */
   1365 	signed_len = buffer_len(&key->cert->certblob) - buffer_len(b);
   1366 
   1367 	if ((sig = buffer_get_string_ret(b, &slen)) == NULL) {
   1368 		error("%s: parse error", __func__);
   1369 		goto out;
   1370 	}
   1371 
   1372 	if (key->cert->type != SSH2_CERT_TYPE_USER &&
   1373 	    key->cert->type != SSH2_CERT_TYPE_HOST) {
   1374 		error("Unknown certificate type %u", key->cert->type);
   1375 		goto out;
   1376 	}
   1377 
   1378 	buffer_append(&tmp, principals, plen);
   1379 	while (buffer_len(&tmp) > 0) {
   1380 		if (key->cert->nprincipals >= CERT_MAX_PRINCIPALS) {
   1381 			error("%s: Too many principals", __func__);
   1382 			goto out;
   1383 		}
   1384 		if ((principal = buffer_get_cstring_ret(&tmp, &plen)) == NULL) {
   1385 			error("%s: Principals data invalid", __func__);
   1386 			goto out;
   1387 		}
   1388 		key->cert->principals = xrealloc(key->cert->principals,
   1389 		    key->cert->nprincipals + 1, sizeof(*key->cert->principals));
   1390 		key->cert->principals[key->cert->nprincipals++] = principal;
   1391 	}
   1392 
   1393 	buffer_clear(&tmp);
   1394 
   1395 	buffer_append(&key->cert->critical, critical, clen);
   1396 	buffer_append(&tmp, critical, clen);
   1397 	/* validate structure */
   1398 	while (buffer_len(&tmp) != 0) {
   1399 		if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
   1400 		    buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
   1401 			error("%s: critical option data invalid", __func__);
   1402 			goto out;
   1403 		}
   1404 	}
   1405 	buffer_clear(&tmp);
   1406 
   1407 	buffer_append(&key->cert->extensions, exts, elen);
   1408 	buffer_append(&tmp, exts, elen);
   1409 	/* validate structure */
   1410 	while (buffer_len(&tmp) != 0) {
   1411 		if (buffer_get_string_ptr_ret(&tmp, NULL) == NULL ||
   1412 		    buffer_get_string_ptr_ret(&tmp, NULL) == NULL) {
   1413 			error("%s: extension data invalid", __func__);
   1414 			goto out;
   1415 		}
   1416 	}
   1417 	buffer_clear(&tmp);
   1418 
   1419 	if ((key->cert->signature_key = key_from_blob(sig_key,
   1420 	    sklen)) == NULL) {
   1421 		error("%s: Signature key invalid", __func__);
   1422 		goto out;
   1423 	}
   1424 	if (key->cert->signature_key->type != KEY_RSA &&
   1425 	    key->cert->signature_key->type != KEY_DSA &&
   1426 	    key->cert->signature_key->type != KEY_ECDSA) {
   1427 		error("%s: Invalid signature key type %s (%d)", __func__,
   1428 		    key_type(key->cert->signature_key),
   1429 		    key->cert->signature_key->type);
   1430 		goto out;
   1431 	}
   1432 
   1433 	switch (key_verify(key->cert->signature_key, sig, slen,
   1434 	    buffer_ptr(&key->cert->certblob), signed_len)) {
   1435 	case 1:
   1436 		ret = 0;
   1437 		break; /* Good signature */
   1438 	case 0:
   1439 		error("%s: Invalid signature on certificate", __func__);
   1440 		goto out;
   1441 	case -1:
   1442 		error("%s: Certificate signature verification failed",
   1443 		    __func__);
   1444 		goto out;
   1445 	}
   1446 
   1447  out:
   1448 	buffer_free(&tmp);
   1449 	if (principals != NULL)
   1450 		xfree(principals);
   1451 	if (critical != NULL)
   1452 		xfree(critical);
   1453 	if (exts != NULL)
   1454 		xfree(exts);
   1455 	if (sig_key != NULL)
   1456 		xfree(sig_key);
   1457 	if (sig != NULL)
   1458 		xfree(sig);
   1459 	return ret;
   1460 }
   1461 
   1462 Key *
   1463 key_from_blob(const u_char *blob, u_int blen)
   1464 {
   1465 	Buffer b;
   1466 	int rlen, type;
   1467 	char *ktype = NULL, *curve = NULL;
   1468 	Key *key = NULL;
   1469 #ifdef OPENSSL_HAS_ECC
   1470 	EC_POINT *q = NULL;
   1471 	int nid = -1;
   1472 #endif
   1473 
   1474 #ifdef DEBUG_PK
   1475 	dump_base64(stderr, blob, blen);
   1476 #endif
   1477 	buffer_init(&b);
   1478 	buffer_append(&b, blob, blen);
   1479 	if ((ktype = buffer_get_cstring_ret(&b, NULL)) == NULL) {
   1480 		error("key_from_blob: can't read key type");
   1481 		goto out;
   1482 	}
   1483 
   1484 	type = key_type_from_name(ktype);
   1485 #ifdef OPENSSL_HAS_ECC
   1486 	if (key_type_plain(type) == KEY_ECDSA)
   1487 		nid = key_ecdsa_nid_from_name(ktype);
   1488 #endif
   1489 
   1490 	switch (type) {
   1491 	case KEY_RSA_CERT:
   1492 		(void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
   1493 		/* FALLTHROUGH */
   1494 	case KEY_RSA:
   1495 	case KEY_RSA_CERT_V00:
   1496 		key = key_new(type);
   1497 		if (buffer_get_bignum2_ret(&b, key->rsa->e) == -1 ||
   1498 		    buffer_get_bignum2_ret(&b, key->rsa->n) == -1) {
   1499 			error("key_from_blob: can't read rsa key");
   1500  badkey:
   1501 			key_free(key);
   1502 			key = NULL;
   1503 			goto out;
   1504 		}
   1505 #ifdef DEBUG_PK
   1506 		RSA_print_fp(stderr, key->rsa, 8);
   1507 #endif
   1508 		break;
   1509 	case KEY_DSA_CERT:
   1510 		(void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
   1511 		/* FALLTHROUGH */
   1512 	case KEY_DSA:
   1513 	case KEY_DSA_CERT_V00:
   1514 		key = key_new(type);
   1515 		if (buffer_get_bignum2_ret(&b, key->dsa->p) == -1 ||
   1516 		    buffer_get_bignum2_ret(&b, key->dsa->q) == -1 ||
   1517 		    buffer_get_bignum2_ret(&b, key->dsa->g) == -1 ||
   1518 		    buffer_get_bignum2_ret(&b, key->dsa->pub_key) == -1) {
   1519 			error("key_from_blob: can't read dsa key");
   1520 			goto badkey;
   1521 		}
   1522 #ifdef DEBUG_PK
   1523 		DSA_print_fp(stderr, key->dsa, 8);
   1524 #endif
   1525 		break;
   1526 #ifdef OPENSSL_HAS_ECC
   1527 	case KEY_ECDSA_CERT:
   1528 		(void)buffer_get_string_ptr_ret(&b, NULL); /* Skip nonce */
   1529 		/* FALLTHROUGH */
   1530 	case KEY_ECDSA:
   1531 		key = key_new(type);
   1532 		key->ecdsa_nid = nid;
   1533 		if ((curve = buffer_get_string_ret(&b, NULL)) == NULL) {
   1534 			error("key_from_blob: can't read ecdsa curve");
   1535 			goto badkey;
   1536 		}
   1537 		if (key->ecdsa_nid != key_curve_name_to_nid(curve)) {
   1538 			error("key_from_blob: ecdsa curve doesn't match type");
   1539 			goto badkey;
   1540 		}
   1541 		if (key->ecdsa != NULL)
   1542 			EC_KEY_free(key->ecdsa);
   1543 		if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid))
   1544 		    == NULL)
   1545 			fatal("key_from_blob: EC_KEY_new_by_curve_name failed");
   1546 		if ((q = EC_POINT_new(EC_KEY_get0_group(key->ecdsa))) == NULL)
   1547 			fatal("key_from_blob: EC_POINT_new failed");
   1548 		if (buffer_get_ecpoint_ret(&b, EC_KEY_get0_group(key->ecdsa),
   1549 		    q) == -1) {
   1550 			error("key_from_blob: can't read ecdsa key point");
   1551 			goto badkey;
   1552 		}
   1553 		if (key_ec_validate_public(EC_KEY_get0_group(key->ecdsa),
   1554 		    q) != 0)
   1555 			goto badkey;
   1556 		if (EC_KEY_set_public_key(key->ecdsa, q) != 1)
   1557 			fatal("key_from_blob: EC_KEY_set_public_key failed");
   1558 #ifdef DEBUG_PK
   1559 		key_dump_ec_point(EC_KEY_get0_group(key->ecdsa), q);
   1560 #endif
   1561 		break;
   1562 #endif /* OPENSSL_HAS_ECC */
   1563 	case KEY_UNSPEC:
   1564 		key = key_new(type);
   1565 		break;
   1566 	default:
   1567 		error("key_from_blob: cannot handle type %s", ktype);
   1568 		goto out;
   1569 	}
   1570 	if (key_is_cert(key) && cert_parse(&b, key, blob, blen) == -1) {
   1571 		error("key_from_blob: can't parse cert data");
   1572 		goto badkey;
   1573 	}
   1574 	rlen = buffer_len(&b);
   1575 	if (key != NULL && rlen != 0)
   1576 		error("key_from_blob: remaining bytes in key blob %d", rlen);
   1577  out:
   1578 	if (ktype != NULL)
   1579 		xfree(ktype);
   1580 	if (curve != NULL)
   1581 		xfree(curve);
   1582 #ifdef OPENSSL_HAS_ECC
   1583 	if (q != NULL)
   1584 		EC_POINT_free(q);
   1585 #endif
   1586 	buffer_free(&b);
   1587 	return key;
   1588 }
   1589 
   1590 int
   1591 key_to_blob(const Key *key, u_char **blobp, u_int *lenp)
   1592 {
   1593 	Buffer b;
   1594 	int len;
   1595 
   1596 	if (key == NULL) {
   1597 		error("key_to_blob: key == NULL");
   1598 		return 0;
   1599 	}
   1600 	buffer_init(&b);
   1601 	switch (key->type) {
   1602 	case KEY_DSA_CERT_V00:
   1603 	case KEY_RSA_CERT_V00:
   1604 	case KEY_DSA_CERT:
   1605 	case KEY_ECDSA_CERT:
   1606 	case KEY_RSA_CERT:
   1607 		/* Use the existing blob */
   1608 		buffer_append(&b, buffer_ptr(&key->cert->certblob),
   1609 		    buffer_len(&key->cert->certblob));
   1610 		break;
   1611 	case KEY_DSA:
   1612 		buffer_put_cstring(&b, key_ssh_name(key));
   1613 		buffer_put_bignum2(&b, key->dsa->p);
   1614 		buffer_put_bignum2(&b, key->dsa->q);
   1615 		buffer_put_bignum2(&b, key->dsa->g);
   1616 		buffer_put_bignum2(&b, key->dsa->pub_key);
   1617 		break;
   1618 #ifdef OPENSSL_HAS_ECC
   1619 	case KEY_ECDSA:
   1620 		buffer_put_cstring(&b, key_ssh_name(key));
   1621 		buffer_put_cstring(&b, key_curve_nid_to_name(key->ecdsa_nid));
   1622 		buffer_put_ecpoint(&b, EC_KEY_get0_group(key->ecdsa),
   1623 		    EC_KEY_get0_public_key(key->ecdsa));
   1624 		break;
   1625 #endif
   1626 	case KEY_RSA:
   1627 		buffer_put_cstring(&b, key_ssh_name(key));
   1628 		buffer_put_bignum2(&b, key->rsa->e);
   1629 		buffer_put_bignum2(&b, key->rsa->n);
   1630 		break;
   1631 	default:
   1632 		error("key_to_blob: unsupported key type %d", key->type);
   1633 		buffer_free(&b);
   1634 		return 0;
   1635 	}
   1636 	len = buffer_len(&b);
   1637 	if (lenp != NULL)
   1638 		*lenp = len;
   1639 	if (blobp != NULL) {
   1640 		*blobp = xmalloc(len);
   1641 		memcpy(*blobp, buffer_ptr(&b), len);
   1642 	}
   1643 	memset(buffer_ptr(&b), 0, len);
   1644 	buffer_free(&b);
   1645 	return len;
   1646 }
   1647 
   1648 int
   1649 key_sign(
   1650     const Key *key,
   1651     u_char **sigp, u_int *lenp,
   1652     const u_char *data, u_int datalen)
   1653 {
   1654 	switch (key->type) {
   1655 	case KEY_DSA_CERT_V00:
   1656 	case KEY_DSA_CERT:
   1657 	case KEY_DSA:
   1658 		return ssh_dss_sign(key, sigp, lenp, data, datalen);
   1659 #ifdef OPENSSL_HAS_ECC
   1660 	case KEY_ECDSA_CERT:
   1661 	case KEY_ECDSA:
   1662 		return ssh_ecdsa_sign(key, sigp, lenp, data, datalen);
   1663 #endif
   1664 	case KEY_RSA_CERT_V00:
   1665 	case KEY_RSA_CERT:
   1666 	case KEY_RSA:
   1667 		return ssh_rsa_sign(key, sigp, lenp, data, datalen);
   1668 	default:
   1669 		error("key_sign: invalid key type %d", key->type);
   1670 		return -1;
   1671 	}
   1672 }
   1673 
   1674 /*
   1675  * key_verify returns 1 for a correct signature, 0 for an incorrect signature
   1676  * and -1 on error.
   1677  */
   1678 int
   1679 key_verify(
   1680     const Key *key,
   1681     const u_char *signature, u_int signaturelen,
   1682     const u_char *data, u_int datalen)
   1683 {
   1684 	if (signaturelen == 0)
   1685 		return -1;
   1686 
   1687 	switch (key->type) {
   1688 	case KEY_DSA_CERT_V00:
   1689 	case KEY_DSA_CERT:
   1690 	case KEY_DSA:
   1691 		return ssh_dss_verify(key, signature, signaturelen, data, datalen);
   1692 #ifdef OPENSSL_HAS_ECC
   1693 	case KEY_ECDSA_CERT:
   1694 	case KEY_ECDSA:
   1695 		return ssh_ecdsa_verify(key, signature, signaturelen, data, datalen);
   1696 #endif
   1697 	case KEY_RSA_CERT_V00:
   1698 	case KEY_RSA_CERT:
   1699 	case KEY_RSA:
   1700 		return ssh_rsa_verify(key, signature, signaturelen, data, datalen);
   1701 	default:
   1702 		error("key_verify: invalid key type %d", key->type);
   1703 		return -1;
   1704 	}
   1705 }
   1706 
   1707 /* Converts a private to a public key */
   1708 Key *
   1709 key_demote(const Key *k)
   1710 {
   1711 	Key *pk;
   1712 
   1713 	pk = xcalloc(1, sizeof(*pk));
   1714 	pk->type = k->type;
   1715 	pk->flags = k->flags;
   1716 	pk->ecdsa_nid = k->ecdsa_nid;
   1717 	pk->dsa = NULL;
   1718 	pk->ecdsa = NULL;
   1719 	pk->rsa = NULL;
   1720 
   1721 	switch (k->type) {
   1722 	case KEY_RSA_CERT_V00:
   1723 	case KEY_RSA_CERT:
   1724 		key_cert_copy(k, pk);
   1725 		/* FALLTHROUGH */
   1726 	case KEY_RSA1:
   1727 	case KEY_RSA:
   1728 		if ((pk->rsa = RSA_new()) == NULL)
   1729 			fatal("key_demote: RSA_new failed");
   1730 		if ((pk->rsa->e = BN_dup(k->rsa->e)) == NULL)
   1731 			fatal("key_demote: BN_dup failed");
   1732 		if ((pk->rsa->n = BN_dup(k->rsa->n)) == NULL)
   1733 			fatal("key_demote: BN_dup failed");
   1734 		break;
   1735 	case KEY_DSA_CERT_V00:
   1736 	case KEY_DSA_CERT:
   1737 		key_cert_copy(k, pk);
   1738 		/* FALLTHROUGH */
   1739 	case KEY_DSA:
   1740 		if ((pk->dsa = DSA_new()) == NULL)
   1741 			fatal("key_demote: DSA_new failed");
   1742 		if ((pk->dsa->p = BN_dup(k->dsa->p)) == NULL)
   1743 			fatal("key_demote: BN_dup failed");
   1744 		if ((pk->dsa->q = BN_dup(k->dsa->q)) == NULL)
   1745 			fatal("key_demote: BN_dup failed");
   1746 		if ((pk->dsa->g = BN_dup(k->dsa->g)) == NULL)
   1747 			fatal("key_demote: BN_dup failed");
   1748 		if ((pk->dsa->pub_key = BN_dup(k->dsa->pub_key)) == NULL)
   1749 			fatal("key_demote: BN_dup failed");
   1750 		break;
   1751 #ifdef OPENSSL_HAS_ECC
   1752 	case KEY_ECDSA_CERT:
   1753 		key_cert_copy(k, pk);
   1754 		/* FALLTHROUGH */
   1755 	case KEY_ECDSA:
   1756 		if ((pk->ecdsa = EC_KEY_new_by_curve_name(pk->ecdsa_nid)) == NULL)
   1757 			fatal("key_demote: EC_KEY_new_by_curve_name failed");
   1758 		if (EC_KEY_set_public_key(pk->ecdsa,
   1759 		    EC_KEY_get0_public_key(k->ecdsa)) != 1)
   1760 			fatal("key_demote: EC_KEY_set_public_key failed");
   1761 		break;
   1762 #endif
   1763 	default:
   1764 		fatal("key_free: bad key type %d", k->type);
   1765 		break;
   1766 	}
   1767 
   1768 	return (pk);
   1769 }
   1770 
   1771 int
   1772 key_is_cert(const Key *k)
   1773 {
   1774 	if (k == NULL)
   1775 		return 0;
   1776 	switch (k->type) {
   1777 	case KEY_RSA_CERT_V00:
   1778 	case KEY_DSA_CERT_V00:
   1779 	case KEY_RSA_CERT:
   1780 	case KEY_DSA_CERT:
   1781 	case KEY_ECDSA_CERT:
   1782 		return 1;
   1783 	default:
   1784 		return 0;
   1785 	}
   1786 }
   1787 
   1788 /* Return the cert-less equivalent to a certified key type */
   1789 int
   1790 key_type_plain(int type)
   1791 {
   1792 	switch (type) {
   1793 	case KEY_RSA_CERT_V00:
   1794 	case KEY_RSA_CERT:
   1795 		return KEY_RSA;
   1796 	case KEY_DSA_CERT_V00:
   1797 	case KEY_DSA_CERT:
   1798 		return KEY_DSA;
   1799 	case KEY_ECDSA_CERT:
   1800 		return KEY_ECDSA;
   1801 	default:
   1802 		return type;
   1803 	}
   1804 }
   1805 
   1806 /* Convert a KEY_RSA or KEY_DSA to their _CERT equivalent */
   1807 int
   1808 key_to_certified(Key *k, int legacy)
   1809 {
   1810 	switch (k->type) {
   1811 	case KEY_RSA:
   1812 		k->cert = cert_new();
   1813 		k->type = legacy ? KEY_RSA_CERT_V00 : KEY_RSA_CERT;
   1814 		return 0;
   1815 	case KEY_DSA:
   1816 		k->cert = cert_new();
   1817 		k->type = legacy ? KEY_DSA_CERT_V00 : KEY_DSA_CERT;
   1818 		return 0;
   1819 	case KEY_ECDSA:
   1820 		if (legacy)
   1821 			fatal("%s: legacy ECDSA certificates are not supported",
   1822 			    __func__);
   1823 		k->cert = cert_new();
   1824 		k->type = KEY_ECDSA_CERT;
   1825 		return 0;
   1826 	default:
   1827 		error("%s: key has incorrect type %s", __func__, key_type(k));
   1828 		return -1;
   1829 	}
   1830 }
   1831 
   1832 /* Convert a KEY_RSA_CERT or KEY_DSA_CERT to their raw key equivalent */
   1833 int
   1834 key_drop_cert(Key *k)
   1835 {
   1836 	switch (k->type) {
   1837 	case KEY_RSA_CERT_V00:
   1838 	case KEY_RSA_CERT:
   1839 		cert_free(k->cert);
   1840 		k->type = KEY_RSA;
   1841 		return 0;
   1842 	case KEY_DSA_CERT_V00:
   1843 	case KEY_DSA_CERT:
   1844 		cert_free(k->cert);
   1845 		k->type = KEY_DSA;
   1846 		return 0;
   1847 	case KEY_ECDSA_CERT:
   1848 		cert_free(k->cert);
   1849 		k->type = KEY_ECDSA;
   1850 		return 0;
   1851 	default:
   1852 		error("%s: key has incorrect type %s", __func__, key_type(k));
   1853 		return -1;
   1854 	}
   1855 }
   1856 
   1857 /*
   1858  * Sign a KEY_RSA_CERT, KEY_DSA_CERT or KEY_ECDSA_CERT, (re-)generating
   1859  * the signed certblob
   1860  */
   1861 int
   1862 key_certify(Key *k, Key *ca)
   1863 {
   1864 	Buffer principals;
   1865 	u_char *ca_blob, *sig_blob, nonce[32];
   1866 	u_int i, ca_len, sig_len;
   1867 
   1868 	if (k->cert == NULL) {
   1869 		error("%s: key lacks cert info", __func__);
   1870 		return -1;
   1871 	}
   1872 
   1873 	if (!key_is_cert(k)) {
   1874 		error("%s: certificate has unknown type %d", __func__,
   1875 		    k->cert->type);
   1876 		return -1;
   1877 	}
   1878 
   1879 	if (ca->type != KEY_RSA && ca->type != KEY_DSA &&
   1880 	    ca->type != KEY_ECDSA) {
   1881 		error("%s: CA key has unsupported type %s", __func__,
   1882 		    key_type(ca));
   1883 		return -1;
   1884 	}
   1885 
   1886 	key_to_blob(ca, &ca_blob, &ca_len);
   1887 
   1888 	buffer_clear(&k->cert->certblob);
   1889 	buffer_put_cstring(&k->cert->certblob, key_ssh_name(k));
   1890 
   1891 	/* -v01 certs put nonce first */
   1892 	arc4random_buf(&nonce, sizeof(nonce));
   1893 	if (!key_cert_is_legacy(k))
   1894 		buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
   1895 
   1896 	switch (k->type) {
   1897 	case KEY_DSA_CERT_V00:
   1898 	case KEY_DSA_CERT:
   1899 		buffer_put_bignum2(&k->cert->certblob, k->dsa->p);
   1900 		buffer_put_bignum2(&k->cert->certblob, k->dsa->q);
   1901 		buffer_put_bignum2(&k->cert->certblob, k->dsa->g);
   1902 		buffer_put_bignum2(&k->cert->certblob, k->dsa->pub_key);
   1903 		break;
   1904 #ifdef OPENSSL_HAS_ECC
   1905 	case KEY_ECDSA_CERT:
   1906 		buffer_put_cstring(&k->cert->certblob,
   1907 		    key_curve_nid_to_name(k->ecdsa_nid));
   1908 		buffer_put_ecpoint(&k->cert->certblob,
   1909 		    EC_KEY_get0_group(k->ecdsa),
   1910 		    EC_KEY_get0_public_key(k->ecdsa));
   1911 		break;
   1912 #endif
   1913 	case KEY_RSA_CERT_V00:
   1914 	case KEY_RSA_CERT:
   1915 		buffer_put_bignum2(&k->cert->certblob, k->rsa->e);
   1916 		buffer_put_bignum2(&k->cert->certblob, k->rsa->n);
   1917 		break;
   1918 	default:
   1919 		error("%s: key has incorrect type %s", __func__, key_type(k));
   1920 		buffer_clear(&k->cert->certblob);
   1921 		xfree(ca_blob);
   1922 		return -1;
   1923 	}
   1924 
   1925 	/* -v01 certs have a serial number next */
   1926 	if (!key_cert_is_legacy(k))
   1927 		buffer_put_int64(&k->cert->certblob, k->cert->serial);
   1928 
   1929 	buffer_put_int(&k->cert->certblob, k->cert->type);
   1930 	buffer_put_cstring(&k->cert->certblob, k->cert->key_id);
   1931 
   1932 	buffer_init(&principals);
   1933 	for (i = 0; i < k->cert->nprincipals; i++)
   1934 		buffer_put_cstring(&principals, k->cert->principals[i]);
   1935 	buffer_put_string(&k->cert->certblob, buffer_ptr(&principals),
   1936 	    buffer_len(&principals));
   1937 	buffer_free(&principals);
   1938 
   1939 	buffer_put_int64(&k->cert->certblob, k->cert->valid_after);
   1940 	buffer_put_int64(&k->cert->certblob, k->cert->valid_before);
   1941 	buffer_put_string(&k->cert->certblob,
   1942 	    buffer_ptr(&k->cert->critical), buffer_len(&k->cert->critical));
   1943 
   1944 	/* -v01 certs have non-critical options here */
   1945 	if (!key_cert_is_legacy(k)) {
   1946 		buffer_put_string(&k->cert->certblob,
   1947 		    buffer_ptr(&k->cert->extensions),
   1948 		    buffer_len(&k->cert->extensions));
   1949 	}
   1950 
   1951 	/* -v00 certs put the nonce at the end */
   1952 	if (key_cert_is_legacy(k))
   1953 		buffer_put_string(&k->cert->certblob, nonce, sizeof(nonce));
   1954 
   1955 	buffer_put_string(&k->cert->certblob, NULL, 0); /* reserved */
   1956 	buffer_put_string(&k->cert->certblob, ca_blob, ca_len);
   1957 	xfree(ca_blob);
   1958 
   1959 	/* Sign the whole mess */
   1960 	if (key_sign(ca, &sig_blob, &sig_len, buffer_ptr(&k->cert->certblob),
   1961 	    buffer_len(&k->cert->certblob)) != 0) {
   1962 		error("%s: signature operation failed", __func__);
   1963 		buffer_clear(&k->cert->certblob);
   1964 		return -1;
   1965 	}
   1966 	/* Append signature and we are done */
   1967 	buffer_put_string(&k->cert->certblob, sig_blob, sig_len);
   1968 	xfree(sig_blob);
   1969 
   1970 	return 0;
   1971 }
   1972 
   1973 int
   1974 key_cert_check_authority(const Key *k, int want_host, int require_principal,
   1975     const char *name, const char **reason)
   1976 {
   1977 	u_int i, principal_matches;
   1978 	time_t now = time(NULL);
   1979 
   1980 	if (want_host) {
   1981 		if (k->cert->type != SSH2_CERT_TYPE_HOST) {
   1982 			*reason = "Certificate invalid: not a host certificate";
   1983 			return -1;
   1984 		}
   1985 	} else {
   1986 		if (k->cert->type != SSH2_CERT_TYPE_USER) {
   1987 			*reason = "Certificate invalid: not a user certificate";
   1988 			return -1;
   1989 		}
   1990 	}
   1991 	if (now < 0) {
   1992 		error("%s: system clock lies before epoch", __func__);
   1993 		*reason = "Certificate invalid: not yet valid";
   1994 		return -1;
   1995 	}
   1996 	if ((u_int64_t)now < k->cert->valid_after) {
   1997 		*reason = "Certificate invalid: not yet valid";
   1998 		return -1;
   1999 	}
   2000 	if ((u_int64_t)now >= k->cert->valid_before) {
   2001 		*reason = "Certificate invalid: expired";
   2002 		return -1;
   2003 	}
   2004 	if (k->cert->nprincipals == 0) {
   2005 		if (require_principal) {
   2006 			*reason = "Certificate lacks principal list";
   2007 			return -1;
   2008 		}
   2009 	} else if (name != NULL) {
   2010 		principal_matches = 0;
   2011 		for (i = 0; i < k->cert->nprincipals; i++) {
   2012 			if (strcmp(name, k->cert->principals[i]) == 0) {
   2013 				principal_matches = 1;
   2014 				break;
   2015 			}
   2016 		}
   2017 		if (!principal_matches) {
   2018 			*reason = "Certificate invalid: name is not a listed "
   2019 			    "principal";
   2020 			return -1;
   2021 		}
   2022 	}
   2023 	return 0;
   2024 }
   2025 
   2026 int
   2027 key_cert_is_legacy(Key *k)
   2028 {
   2029 	switch (k->type) {
   2030 	case KEY_DSA_CERT_V00:
   2031 	case KEY_RSA_CERT_V00:
   2032 		return 1;
   2033 	default:
   2034 		return 0;
   2035 	}
   2036 }
   2037 
   2038 /* XXX: these are really begging for a table-driven approach */
   2039 int
   2040 key_curve_name_to_nid(const char *name)
   2041 {
   2042 #ifdef OPENSSL_HAS_ECC
   2043 	if (strcmp(name, "nistp256") == 0)
   2044 		return NID_X9_62_prime256v1;
   2045 	else if (strcmp(name, "nistp384") == 0)
   2046 		return NID_secp384r1;
   2047 	else if (strcmp(name, "nistp521") == 0)
   2048 		return NID_secp521r1;
   2049 #endif
   2050 
   2051 	debug("%s: unsupported EC curve name \"%.100s\"", __func__, name);
   2052 	return -1;
   2053 }
   2054 
   2055 u_int
   2056 key_curve_nid_to_bits(int nid)
   2057 {
   2058 	switch (nid) {
   2059 #ifdef OPENSSL_HAS_ECC
   2060 	case NID_X9_62_prime256v1:
   2061 		return 256;
   2062 	case NID_secp384r1:
   2063 		return 384;
   2064 	case NID_secp521r1:
   2065 		return 521;
   2066 #endif
   2067 	default:
   2068 		error("%s: unsupported EC curve nid %d", __func__, nid);
   2069 		return 0;
   2070 	}
   2071 }
   2072 
   2073 const char *
   2074 key_curve_nid_to_name(int nid)
   2075 {
   2076 #ifdef OPENSSL_HAS_ECC
   2077 	if (nid == NID_X9_62_prime256v1)
   2078 		return "nistp256";
   2079 	else if (nid == NID_secp384r1)
   2080 		return "nistp384";
   2081 	else if (nid == NID_secp521r1)
   2082 		return "nistp521";
   2083 #endif
   2084 	error("%s: unsupported EC curve nid %d", __func__, nid);
   2085 	return NULL;
   2086 }
   2087 
   2088 #ifdef OPENSSL_HAS_ECC
   2089 const EVP_MD *
   2090 key_ec_nid_to_evpmd(int nid)
   2091 {
   2092 	int kbits = key_curve_nid_to_bits(nid);
   2093 
   2094 	if (kbits == 0)
   2095 		fatal("%s: invalid nid %d", __func__, nid);
   2096 	/* RFC5656 section 6.2.1 */
   2097 	if (kbits <= 256)
   2098 		return EVP_sha256();
   2099 	else if (kbits <= 384)
   2100 		return EVP_sha384();
   2101 	else
   2102 		return EVP_sha512();
   2103 }
   2104 
   2105 int
   2106 key_ec_validate_public(const EC_GROUP *group, const EC_POINT *public)
   2107 {
   2108 	BN_CTX *bnctx;
   2109 	EC_POINT *nq = NULL;
   2110 	BIGNUM *order, *x, *y, *tmp;
   2111 	int ret = -1;
   2112 
   2113 	if ((bnctx = BN_CTX_new()) == NULL)
   2114 		fatal("%s: BN_CTX_new failed", __func__);
   2115 	BN_CTX_start(bnctx);
   2116 
   2117 	/*
   2118 	 * We shouldn't ever hit this case because bignum_get_ecpoint()
   2119 	 * refuses to load GF2m points.
   2120 	 */
   2121 	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
   2122 	    NID_X9_62_prime_field) {
   2123 		error("%s: group is not a prime field", __func__);
   2124 		goto out;
   2125 	}
   2126 
   2127 	/* Q != infinity */
   2128 	if (EC_POINT_is_at_infinity(group, public)) {
   2129 		error("%s: received degenerate public key (infinity)",
   2130 		    __func__);
   2131 		goto out;
   2132 	}
   2133 
   2134 	if ((x = BN_CTX_get(bnctx)) == NULL ||
   2135 	    (y = BN_CTX_get(bnctx)) == NULL ||
   2136 	    (order = BN_CTX_get(bnctx)) == NULL ||
   2137 	    (tmp = BN_CTX_get(bnctx)) == NULL)
   2138 		fatal("%s: BN_CTX_get failed", __func__);
   2139 
   2140 	/* log2(x) > log2(order)/2, log2(y) > log2(order)/2 */
   2141 	if (EC_GROUP_get_order(group, order, bnctx) != 1)
   2142 		fatal("%s: EC_GROUP_get_order failed", __func__);
   2143 	if (EC_POINT_get_affine_coordinates_GFp(group, public,
   2144 	    x, y, bnctx) != 1)
   2145 		fatal("%s: EC_POINT_get_affine_coordinates_GFp", __func__);
   2146 	if (BN_num_bits(x) <= BN_num_bits(order) / 2) {
   2147 		error("%s: public key x coordinate too small: "
   2148 		    "bits(x) = %d, bits(order)/2 = %d", __func__,
   2149 		    BN_num_bits(x), BN_num_bits(order) / 2);
   2150 		goto out;
   2151 	}
   2152 	if (BN_num_bits(y) <= BN_num_bits(order) / 2) {
   2153 		error("%s: public key y coordinate too small: "
   2154 		    "bits(y) = %d, bits(order)/2 = %d", __func__,
   2155 		    BN_num_bits(x), BN_num_bits(order) / 2);
   2156 		goto out;
   2157 	}
   2158 
   2159 	/* nQ == infinity (n == order of subgroup) */
   2160 	if ((nq = EC_POINT_new(group)) == NULL)
   2161 		fatal("%s: BN_CTX_tmp failed", __func__);
   2162 	if (EC_POINT_mul(group, nq, NULL, public, order, bnctx) != 1)
   2163 		fatal("%s: EC_GROUP_mul failed", __func__);
   2164 	if (EC_POINT_is_at_infinity(group, nq) != 1) {
   2165 		error("%s: received degenerate public key (nQ != infinity)",
   2166 		    __func__);
   2167 		goto out;
   2168 	}
   2169 
   2170 	/* x < order - 1, y < order - 1 */
   2171 	if (!BN_sub(tmp, order, BN_value_one()))
   2172 		fatal("%s: BN_sub failed", __func__);
   2173 	if (BN_cmp(x, tmp) >= 0) {
   2174 		error("%s: public key x coordinate >= group order - 1",
   2175 		    __func__);
   2176 		goto out;
   2177 	}
   2178 	if (BN_cmp(y, tmp) >= 0) {
   2179 		error("%s: public key y coordinate >= group order - 1",
   2180 		    __func__);
   2181 		goto out;
   2182 	}
   2183 	ret = 0;
   2184  out:
   2185 	BN_CTX_free(bnctx);
   2186 	EC_POINT_free(nq);
   2187 	return ret;
   2188 }
   2189 
   2190 int
   2191 key_ec_validate_private(const EC_KEY *key)
   2192 {
   2193 	BN_CTX *bnctx;
   2194 	BIGNUM *order, *tmp;
   2195 	int ret = -1;
   2196 
   2197 	if ((bnctx = BN_CTX_new()) == NULL)
   2198 		fatal("%s: BN_CTX_new failed", __func__);
   2199 	BN_CTX_start(bnctx);
   2200 
   2201 	if ((order = BN_CTX_get(bnctx)) == NULL ||
   2202 	    (tmp = BN_CTX_get(bnctx)) == NULL)
   2203 		fatal("%s: BN_CTX_get failed", __func__);
   2204 
   2205 	/* log2(private) > log2(order)/2 */
   2206 	if (EC_GROUP_get_order(EC_KEY_get0_group(key), order, bnctx) != 1)
   2207 		fatal("%s: EC_GROUP_get_order failed", __func__);
   2208 	if (BN_num_bits(EC_KEY_get0_private_key(key)) <=
   2209 	    BN_num_bits(order) / 2) {
   2210 		error("%s: private key too small: "
   2211 		    "bits(y) = %d, bits(order)/2 = %d", __func__,
   2212 		    BN_num_bits(EC_KEY_get0_private_key(key)),
   2213 		    BN_num_bits(order) / 2);
   2214 		goto out;
   2215 	}
   2216 
   2217 	/* private < order - 1 */
   2218 	if (!BN_sub(tmp, order, BN_value_one()))
   2219 		fatal("%s: BN_sub failed", __func__);
   2220 	if (BN_cmp(EC_KEY_get0_private_key(key), tmp) >= 0) {
   2221 		error("%s: private key >= group order - 1", __func__);
   2222 		goto out;
   2223 	}
   2224 	ret = 0;
   2225  out:
   2226 	BN_CTX_free(bnctx);
   2227 	return ret;
   2228 }
   2229 
   2230 #if defined(DEBUG_KEXECDH) || defined(DEBUG_PK)
   2231 void
   2232 key_dump_ec_point(const EC_GROUP *group, const EC_POINT *point)
   2233 {
   2234 	BIGNUM *x, *y;
   2235 	BN_CTX *bnctx;
   2236 
   2237 	if (point == NULL) {
   2238 		fputs("point=(NULL)\n", stderr);
   2239 		return;
   2240 	}
   2241 	if ((bnctx = BN_CTX_new()) == NULL)
   2242 		fatal("%s: BN_CTX_new failed", __func__);
   2243 	BN_CTX_start(bnctx);
   2244 	if ((x = BN_CTX_get(bnctx)) == NULL || (y = BN_CTX_get(bnctx)) == NULL)
   2245 		fatal("%s: BN_CTX_get failed", __func__);
   2246 	if (EC_METHOD_get_field_type(EC_GROUP_method_of(group)) !=
   2247 	    NID_X9_62_prime_field)
   2248 		fatal("%s: group is not a prime field", __func__);
   2249 	if (EC_POINT_get_affine_coordinates_GFp(group, point, x, y, bnctx) != 1)
   2250 		fatal("%s: EC_POINT_get_affine_coordinates_GFp", __func__);
   2251 	fputs("x=", stderr);
   2252 	BN_print_fp(stderr, x);
   2253 	fputs("\ny=", stderr);
   2254 	BN_print_fp(stderr, y);
   2255 	fputs("\n", stderr);
   2256 	BN_CTX_free(bnctx);
   2257 }
   2258 
   2259 void
   2260 key_dump_ec_key(const EC_KEY *key)
   2261 {
   2262 	const BIGNUM *exponent;
   2263 
   2264 	key_dump_ec_point(EC_KEY_get0_group(key), EC_KEY_get0_public_key(key));
   2265 	fputs("exponent=", stderr);
   2266 	if ((exponent = EC_KEY_get0_private_key(key)) == NULL)
   2267 		fputs("(NULL)", stderr);
   2268 	else
   2269 		BN_print_fp(stderr, EC_KEY_get0_private_key(key));
   2270 	fputs("\n", stderr);
   2271 }
   2272 #endif /* defined(DEBUG_KEXECDH) || defined(DEBUG_PK) */
   2273 #endif /* OPENSSL_HAS_ECC */
   2274