xref: /freebsd/crypto/openssh/ssh-keygen.c (revision bc5531debefeb54993d01d4f3c8b33ccbe0b4d95)
1 /* $OpenBSD: ssh-keygen.c,v 1.266 2015/02/26 20:45:47 djm Exp $ */
2 /*
3  * Author: Tatu Ylonen <ylo@cs.hut.fi>
4  * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
5  *                    All rights reserved
6  * Identity and host key generation and maintenance.
7  *
8  * As far as I am concerned, the code I have written for this software
9  * can be used freely for any purpose.  Any derived versions of this
10  * software must be clearly marked as such, and if the derived work is
11  * incompatible with the protocol description in the RFC file, it must be
12  * called by a name other than "ssh" or "Secure Shell".
13  */
14 
15 #include "includes.h"
16 
17 #include <sys/types.h>
18 #include <sys/socket.h>
19 #include <sys/stat.h>
20 
21 #ifdef WITH_OPENSSL
22 #include <openssl/evp.h>
23 #include <openssl/pem.h>
24 #include "openbsd-compat/openssl-compat.h"
25 #endif
26 
27 #include <errno.h>
28 #include <fcntl.h>
29 #include <netdb.h>
30 #ifdef HAVE_PATHS_H
31 # include <paths.h>
32 #endif
33 #include <pwd.h>
34 #include <stdarg.h>
35 #include <stdio.h>
36 #include <stdlib.h>
37 #include <string.h>
38 #include <unistd.h>
39 #include <limits.h>
40 
41 #include "xmalloc.h"
42 #include "sshkey.h"
43 #include "rsa.h"
44 #include "authfile.h"
45 #include "uuencode.h"
46 #include "sshbuf.h"
47 #include "pathnames.h"
48 #include "log.h"
49 #include "misc.h"
50 #include "match.h"
51 #include "hostfile.h"
52 #include "dns.h"
53 #include "ssh.h"
54 #include "ssh2.h"
55 #include "ssherr.h"
56 #include "ssh-pkcs11.h"
57 #include "atomicio.h"
58 #include "krl.h"
59 #include "digest.h"
60 
61 /* Number of bits in the RSA/DSA key.  This value can be set on the command line. */
62 #define DEFAULT_BITS		2048
63 #define DEFAULT_BITS_DSA	1024
64 #define DEFAULT_BITS_ECDSA	256
65 u_int32_t bits = 0;
66 
67 /*
68  * Flag indicating that we just want to change the passphrase.  This can be
69  * set on the command line.
70  */
71 int change_passphrase = 0;
72 
73 /*
74  * Flag indicating that we just want to change the comment.  This can be set
75  * on the command line.
76  */
77 int change_comment = 0;
78 
79 int quiet = 0;
80 
81 int log_level = SYSLOG_LEVEL_INFO;
82 
83 /* Flag indicating that we want to hash a known_hosts file */
84 int hash_hosts = 0;
85 /* Flag indicating that we want lookup a host in known_hosts file */
86 int find_host = 0;
87 /* Flag indicating that we want to delete a host from a known_hosts file */
88 int delete_host = 0;
89 
90 /* Flag indicating that we want to show the contents of a certificate */
91 int show_cert = 0;
92 
93 /* Flag indicating that we just want to see the key fingerprint */
94 int print_fingerprint = 0;
95 int print_bubblebabble = 0;
96 
97 /* Hash algorithm to use for fingerprints. */
98 int fingerprint_hash = SSH_FP_HASH_DEFAULT;
99 
100 /* The identity file name, given on the command line or entered by the user. */
101 char identity_file[1024];
102 int have_identity = 0;
103 
104 /* This is set to the passphrase if given on the command line. */
105 char *identity_passphrase = NULL;
106 
107 /* This is set to the new passphrase if given on the command line. */
108 char *identity_new_passphrase = NULL;
109 
110 /* This is set to the new comment if given on the command line. */
111 char *identity_comment = NULL;
112 
113 /* Path to CA key when certifying keys. */
114 char *ca_key_path = NULL;
115 
116 /* Certificate serial number */
117 unsigned long long cert_serial = 0;
118 
119 /* Key type when certifying */
120 u_int cert_key_type = SSH2_CERT_TYPE_USER;
121 
122 /* "key ID" of signed key */
123 char *cert_key_id = NULL;
124 
125 /* Comma-separated list of principal names for certifying keys */
126 char *cert_principals = NULL;
127 
128 /* Validity period for certificates */
129 u_int64_t cert_valid_from = 0;
130 u_int64_t cert_valid_to = ~0ULL;
131 
132 /* Certificate options */
133 #define CERTOPT_X_FWD	(1)
134 #define CERTOPT_AGENT_FWD	(1<<1)
135 #define CERTOPT_PORT_FWD	(1<<2)
136 #define CERTOPT_PTY		(1<<3)
137 #define CERTOPT_USER_RC	(1<<4)
138 #define CERTOPT_DEFAULT	(CERTOPT_X_FWD|CERTOPT_AGENT_FWD| \
139 			 CERTOPT_PORT_FWD|CERTOPT_PTY|CERTOPT_USER_RC)
140 u_int32_t certflags_flags = CERTOPT_DEFAULT;
141 char *certflags_command = NULL;
142 char *certflags_src_addr = NULL;
143 
144 /* Conversion to/from various formats */
145 int convert_to = 0;
146 int convert_from = 0;
147 enum {
148 	FMT_RFC4716,
149 	FMT_PKCS8,
150 	FMT_PEM
151 } convert_format = FMT_RFC4716;
152 int print_public = 0;
153 int print_generic = 0;
154 
155 char *key_type_name = NULL;
156 
157 /* Load key from this PKCS#11 provider */
158 char *pkcs11provider = NULL;
159 
160 /* Use new OpenSSH private key format when writing SSH2 keys instead of PEM */
161 int use_new_format = 0;
162 
163 /* Cipher for new-format private keys */
164 char *new_format_cipher = NULL;
165 
166 /*
167  * Number of KDF rounds to derive new format keys /
168  * number of primality trials when screening moduli.
169  */
170 int rounds = 0;
171 
172 /* argv0 */
173 extern char *__progname;
174 
175 char hostname[NI_MAXHOST];
176 
177 /* moduli.c */
178 int gen_candidates(FILE *, u_int32_t, u_int32_t, BIGNUM *);
179 int prime_test(FILE *, FILE *, u_int32_t, u_int32_t, char *, unsigned long,
180     unsigned long);
181 
182 static void
183 type_bits_valid(int type, const char *name, u_int32_t *bitsp)
184 {
185 #ifdef WITH_OPENSSL
186 	u_int maxbits;
187 	int nid;
188 #endif
189 
190 	if (type == KEY_UNSPEC) {
191 		fprintf(stderr, "unknown key type %s\n", key_type_name);
192 		exit(1);
193 	}
194 	if (*bitsp == 0) {
195 #ifdef WITH_OPENSSL
196 		if (type == KEY_DSA)
197 			*bitsp = DEFAULT_BITS_DSA;
198 		else if (type == KEY_ECDSA) {
199 			if (name != NULL &&
200 			    (nid = sshkey_ecdsa_nid_from_name(name)) > 0)
201 				*bitsp = sshkey_curve_nid_to_bits(nid);
202 			if (*bitsp == 0)
203 				*bitsp = DEFAULT_BITS_ECDSA;
204 		} else
205 #endif
206 			*bitsp = DEFAULT_BITS;
207 	}
208 #ifdef WITH_OPENSSL
209 	maxbits = (type == KEY_DSA) ?
210 	    OPENSSL_DSA_MAX_MODULUS_BITS : OPENSSL_RSA_MAX_MODULUS_BITS;
211 	if (*bitsp > maxbits) {
212 		fprintf(stderr, "key bits exceeds maximum %d\n", maxbits);
213 		exit(1);
214 	}
215 	if (type == KEY_DSA && *bitsp != 1024)
216 		fatal("DSA keys must be 1024 bits");
217 	else if (type != KEY_ECDSA && type != KEY_ED25519 && *bitsp < 768)
218 		fatal("Key must at least be 768 bits");
219 	else if (type == KEY_ECDSA && sshkey_ecdsa_bits_to_nid(*bitsp) == -1)
220 		fatal("Invalid ECDSA key length - valid lengths are "
221 		    "256, 384 or 521 bits");
222 #endif
223 }
224 
225 static void
226 ask_filename(struct passwd *pw, const char *prompt)
227 {
228 	char buf[1024];
229 	char *name = NULL;
230 
231 	if (key_type_name == NULL)
232 		name = _PATH_SSH_CLIENT_ID_RSA;
233 	else {
234 		switch (sshkey_type_from_name(key_type_name)) {
235 		case KEY_RSA1:
236 			name = _PATH_SSH_CLIENT_IDENTITY;
237 			break;
238 		case KEY_DSA_CERT:
239 		case KEY_DSA_CERT_V00:
240 		case KEY_DSA:
241 			name = _PATH_SSH_CLIENT_ID_DSA;
242 			break;
243 #ifdef OPENSSL_HAS_ECC
244 		case KEY_ECDSA_CERT:
245 		case KEY_ECDSA:
246 			name = _PATH_SSH_CLIENT_ID_ECDSA;
247 			break;
248 #endif
249 		case KEY_RSA_CERT:
250 		case KEY_RSA_CERT_V00:
251 		case KEY_RSA:
252 			name = _PATH_SSH_CLIENT_ID_RSA;
253 			break;
254 		case KEY_ED25519:
255 		case KEY_ED25519_CERT:
256 			name = _PATH_SSH_CLIENT_ID_ED25519;
257 			break;
258 		default:
259 			fprintf(stderr, "bad key type\n");
260 			exit(1);
261 			break;
262 		}
263 	}
264 	snprintf(identity_file, sizeof(identity_file), "%s/%s", pw->pw_dir, name);
265 	fprintf(stderr, "%s (%s): ", prompt, identity_file);
266 	if (fgets(buf, sizeof(buf), stdin) == NULL)
267 		exit(1);
268 	buf[strcspn(buf, "\n")] = '\0';
269 	if (strcmp(buf, "") != 0)
270 		strlcpy(identity_file, buf, sizeof(identity_file));
271 	have_identity = 1;
272 }
273 
274 static struct sshkey *
275 load_identity(char *filename)
276 {
277 	char *pass;
278 	struct sshkey *prv;
279 	int r;
280 
281 	if ((r = sshkey_load_private(filename, "", &prv, NULL)) == 0)
282 		return prv;
283 	if (r != SSH_ERR_KEY_WRONG_PASSPHRASE)
284 		fatal("Load key \"%s\": %s", filename, ssh_err(r));
285 	if (identity_passphrase)
286 		pass = xstrdup(identity_passphrase);
287 	else
288 		pass = read_passphrase("Enter passphrase: ", RP_ALLOW_STDIN);
289 	r = sshkey_load_private(filename, pass, &prv, NULL);
290 	explicit_bzero(pass, strlen(pass));
291 	free(pass);
292 	if (r != 0)
293 		fatal("Load key \"%s\": %s", filename, ssh_err(r));
294 	return prv;
295 }
296 
297 #define SSH_COM_PUBLIC_BEGIN		"---- BEGIN SSH2 PUBLIC KEY ----"
298 #define SSH_COM_PUBLIC_END		"---- END SSH2 PUBLIC KEY ----"
299 #define SSH_COM_PRIVATE_BEGIN		"---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----"
300 #define	SSH_COM_PRIVATE_KEY_MAGIC	0x3f6ff9eb
301 
302 #ifdef WITH_OPENSSL
303 static void
304 do_convert_to_ssh2(struct passwd *pw, struct sshkey *k)
305 {
306 	size_t len;
307 	u_char *blob;
308 	char comment[61];
309 	int r;
310 
311 	if (k->type == KEY_RSA1) {
312 		fprintf(stderr, "version 1 keys are not supported\n");
313 		exit(1);
314 	}
315 	if ((r = sshkey_to_blob(k, &blob, &len)) != 0) {
316 		fprintf(stderr, "key_to_blob failed: %s\n", ssh_err(r));
317 		exit(1);
318 	}
319 	/* Comment + surrounds must fit into 72 chars (RFC 4716 sec 3.3) */
320 	snprintf(comment, sizeof(comment),
321 	    "%u-bit %s, converted by %s@%s from OpenSSH",
322 	    sshkey_size(k), sshkey_type(k),
323 	    pw->pw_name, hostname);
324 
325 	fprintf(stdout, "%s\n", SSH_COM_PUBLIC_BEGIN);
326 	fprintf(stdout, "Comment: \"%s\"\n", comment);
327 	dump_base64(stdout, blob, len);
328 	fprintf(stdout, "%s\n", SSH_COM_PUBLIC_END);
329 	sshkey_free(k);
330 	free(blob);
331 	exit(0);
332 }
333 
334 static void
335 do_convert_to_pkcs8(struct sshkey *k)
336 {
337 	switch (sshkey_type_plain(k->type)) {
338 	case KEY_RSA1:
339 	case KEY_RSA:
340 		if (!PEM_write_RSA_PUBKEY(stdout, k->rsa))
341 			fatal("PEM_write_RSA_PUBKEY failed");
342 		break;
343 	case KEY_DSA:
344 		if (!PEM_write_DSA_PUBKEY(stdout, k->dsa))
345 			fatal("PEM_write_DSA_PUBKEY failed");
346 		break;
347 #ifdef OPENSSL_HAS_ECC
348 	case KEY_ECDSA:
349 		if (!PEM_write_EC_PUBKEY(stdout, k->ecdsa))
350 			fatal("PEM_write_EC_PUBKEY failed");
351 		break;
352 #endif
353 	default:
354 		fatal("%s: unsupported key type %s", __func__, sshkey_type(k));
355 	}
356 	exit(0);
357 }
358 
359 static void
360 do_convert_to_pem(struct sshkey *k)
361 {
362 	switch (sshkey_type_plain(k->type)) {
363 	case KEY_RSA1:
364 	case KEY_RSA:
365 		if (!PEM_write_RSAPublicKey(stdout, k->rsa))
366 			fatal("PEM_write_RSAPublicKey failed");
367 		break;
368 #if notyet /* OpenSSH 0.9.8 lacks this function */
369 	case KEY_DSA:
370 		if (!PEM_write_DSAPublicKey(stdout, k->dsa))
371 			fatal("PEM_write_DSAPublicKey failed");
372 		break;
373 #endif
374 	/* XXX ECDSA? */
375 	default:
376 		fatal("%s: unsupported key type %s", __func__, sshkey_type(k));
377 	}
378 	exit(0);
379 }
380 
381 static void
382 do_convert_to(struct passwd *pw)
383 {
384 	struct sshkey *k;
385 	struct stat st;
386 	int r;
387 
388 	if (!have_identity)
389 		ask_filename(pw, "Enter file in which the key is");
390 	if (stat(identity_file, &st) < 0)
391 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
392 	if ((r = sshkey_load_public(identity_file, &k, NULL)) != 0)
393 		k = load_identity(identity_file);
394 	switch (convert_format) {
395 	case FMT_RFC4716:
396 		do_convert_to_ssh2(pw, k);
397 		break;
398 	case FMT_PKCS8:
399 		do_convert_to_pkcs8(k);
400 		break;
401 	case FMT_PEM:
402 		do_convert_to_pem(k);
403 		break;
404 	default:
405 		fatal("%s: unknown key format %d", __func__, convert_format);
406 	}
407 	exit(0);
408 }
409 
410 /*
411  * This is almost exactly the bignum1 encoding, but with 32 bit for length
412  * instead of 16.
413  */
414 static void
415 buffer_get_bignum_bits(struct sshbuf *b, BIGNUM *value)
416 {
417 	u_int bytes, bignum_bits;
418 	int r;
419 
420 	if ((r = sshbuf_get_u32(b, &bignum_bits)) != 0)
421 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
422 	bytes = (bignum_bits + 7) / 8;
423 	if (sshbuf_len(b) < bytes)
424 		fatal("%s: input buffer too small: need %d have %zu",
425 		    __func__, bytes, sshbuf_len(b));
426 	if (BN_bin2bn(sshbuf_ptr(b), bytes, value) == NULL)
427 		fatal("%s: BN_bin2bn failed", __func__);
428 	if ((r = sshbuf_consume(b, bytes)) != 0)
429 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
430 }
431 
432 static struct sshkey *
433 do_convert_private_ssh2_from_blob(u_char *blob, u_int blen)
434 {
435 	struct sshbuf *b;
436 	struct sshkey *key = NULL;
437 	char *type, *cipher;
438 	u_char e1, e2, e3, *sig = NULL, data[] = "abcde12345";
439 	int r, rlen, ktype;
440 	u_int magic, i1, i2, i3, i4;
441 	size_t slen;
442 	u_long e;
443 
444 	if ((b = sshbuf_from(blob, blen)) == NULL)
445 		fatal("%s: sshbuf_from failed", __func__);
446 	if ((r = sshbuf_get_u32(b, &magic)) != 0)
447 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
448 
449 	if (magic != SSH_COM_PRIVATE_KEY_MAGIC) {
450 		error("bad magic 0x%x != 0x%x", magic,
451 		    SSH_COM_PRIVATE_KEY_MAGIC);
452 		sshbuf_free(b);
453 		return NULL;
454 	}
455 	if ((r = sshbuf_get_u32(b, &i1)) != 0 ||
456 	    (r = sshbuf_get_cstring(b, &type, NULL)) != 0 ||
457 	    (r = sshbuf_get_cstring(b, &cipher, NULL)) != 0 ||
458 	    (r = sshbuf_get_u32(b, &i2)) != 0 ||
459 	    (r = sshbuf_get_u32(b, &i3)) != 0 ||
460 	    (r = sshbuf_get_u32(b, &i4)) != 0)
461 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
462 	debug("ignore (%d %d %d %d)", i1, i2, i3, i4);
463 	if (strcmp(cipher, "none") != 0) {
464 		error("unsupported cipher %s", cipher);
465 		free(cipher);
466 		sshbuf_free(b);
467 		free(type);
468 		return NULL;
469 	}
470 	free(cipher);
471 
472 	if (strstr(type, "dsa")) {
473 		ktype = KEY_DSA;
474 	} else if (strstr(type, "rsa")) {
475 		ktype = KEY_RSA;
476 	} else {
477 		sshbuf_free(b);
478 		free(type);
479 		return NULL;
480 	}
481 	if ((key = sshkey_new_private(ktype)) == NULL)
482 		fatal("key_new_private failed");
483 	free(type);
484 
485 	switch (key->type) {
486 	case KEY_DSA:
487 		buffer_get_bignum_bits(b, key->dsa->p);
488 		buffer_get_bignum_bits(b, key->dsa->g);
489 		buffer_get_bignum_bits(b, key->dsa->q);
490 		buffer_get_bignum_bits(b, key->dsa->pub_key);
491 		buffer_get_bignum_bits(b, key->dsa->priv_key);
492 		break;
493 	case KEY_RSA:
494 		if ((r = sshbuf_get_u8(b, &e1)) != 0 ||
495 		    (e1 < 30 && (r = sshbuf_get_u8(b, &e2)) != 0) ||
496 		    (e1 < 30 && (r = sshbuf_get_u8(b, &e3)) != 0))
497 			fatal("%s: buffer error: %s", __func__, ssh_err(r));
498 		e = e1;
499 		debug("e %lx", e);
500 		if (e < 30) {
501 			e <<= 8;
502 			e += e2;
503 			debug("e %lx", e);
504 			e <<= 8;
505 			e += e3;
506 			debug("e %lx", e);
507 		}
508 		if (!BN_set_word(key->rsa->e, e)) {
509 			sshbuf_free(b);
510 			sshkey_free(key);
511 			return NULL;
512 		}
513 		buffer_get_bignum_bits(b, key->rsa->d);
514 		buffer_get_bignum_bits(b, key->rsa->n);
515 		buffer_get_bignum_bits(b, key->rsa->iqmp);
516 		buffer_get_bignum_bits(b, key->rsa->q);
517 		buffer_get_bignum_bits(b, key->rsa->p);
518 		if ((r = rsa_generate_additional_parameters(key->rsa)) != 0)
519 			fatal("generate RSA parameters failed: %s", ssh_err(r));
520 		break;
521 	}
522 	rlen = sshbuf_len(b);
523 	if (rlen != 0)
524 		error("do_convert_private_ssh2_from_blob: "
525 		    "remaining bytes in key blob %d", rlen);
526 	sshbuf_free(b);
527 
528 	/* try the key */
529 	if (sshkey_sign(key, &sig, &slen, data, sizeof(data), 0) != 0 ||
530 	    sshkey_verify(key, sig, slen, data, sizeof(data), 0) != 0) {
531 		sshkey_free(key);
532 		free(sig);
533 		return NULL;
534 	}
535 	free(sig);
536 	return key;
537 }
538 
539 static int
540 get_line(FILE *fp, char *line, size_t len)
541 {
542 	int c;
543 	size_t pos = 0;
544 
545 	line[0] = '\0';
546 	while ((c = fgetc(fp)) != EOF) {
547 		if (pos >= len - 1) {
548 			fprintf(stderr, "input line too long.\n");
549 			exit(1);
550 		}
551 		switch (c) {
552 		case '\r':
553 			c = fgetc(fp);
554 			if (c != EOF && c != '\n' && ungetc(c, fp) == EOF) {
555 				fprintf(stderr, "unget: %s\n", strerror(errno));
556 				exit(1);
557 			}
558 			return pos;
559 		case '\n':
560 			return pos;
561 		}
562 		line[pos++] = c;
563 		line[pos] = '\0';
564 	}
565 	/* We reached EOF */
566 	return -1;
567 }
568 
569 static void
570 do_convert_from_ssh2(struct passwd *pw, struct sshkey **k, int *private)
571 {
572 	int r, blen, escaped = 0;
573 	u_int len;
574 	char line[1024];
575 	u_char blob[8096];
576 	char encoded[8096];
577 	FILE *fp;
578 
579 	if ((fp = fopen(identity_file, "r")) == NULL)
580 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
581 	encoded[0] = '\0';
582 	while ((blen = get_line(fp, line, sizeof(line))) != -1) {
583 		if (blen > 0 && line[blen - 1] == '\\')
584 			escaped++;
585 		if (strncmp(line, "----", 4) == 0 ||
586 		    strstr(line, ": ") != NULL) {
587 			if (strstr(line, SSH_COM_PRIVATE_BEGIN) != NULL)
588 				*private = 1;
589 			if (strstr(line, " END ") != NULL) {
590 				break;
591 			}
592 			/* fprintf(stderr, "ignore: %s", line); */
593 			continue;
594 		}
595 		if (escaped) {
596 			escaped--;
597 			/* fprintf(stderr, "escaped: %s", line); */
598 			continue;
599 		}
600 		strlcat(encoded, line, sizeof(encoded));
601 	}
602 	len = strlen(encoded);
603 	if (((len % 4) == 3) &&
604 	    (encoded[len-1] == '=') &&
605 	    (encoded[len-2] == '=') &&
606 	    (encoded[len-3] == '='))
607 		encoded[len-3] = '\0';
608 	blen = uudecode(encoded, blob, sizeof(blob));
609 	if (blen < 0) {
610 		fprintf(stderr, "uudecode failed.\n");
611 		exit(1);
612 	}
613 	if (*private)
614 		*k = do_convert_private_ssh2_from_blob(blob, blen);
615 	else if ((r = sshkey_from_blob(blob, blen, k)) != 0) {
616 		fprintf(stderr, "decode blob failed: %s\n", ssh_err(r));
617 		exit(1);
618 	}
619 	fclose(fp);
620 }
621 
622 static void
623 do_convert_from_pkcs8(struct sshkey **k, int *private)
624 {
625 	EVP_PKEY *pubkey;
626 	FILE *fp;
627 
628 	if ((fp = fopen(identity_file, "r")) == NULL)
629 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
630 	if ((pubkey = PEM_read_PUBKEY(fp, NULL, NULL, NULL)) == NULL) {
631 		fatal("%s: %s is not a recognised public key format", __func__,
632 		    identity_file);
633 	}
634 	fclose(fp);
635 	switch (EVP_PKEY_type(pubkey->type)) {
636 	case EVP_PKEY_RSA:
637 		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
638 			fatal("sshkey_new failed");
639 		(*k)->type = KEY_RSA;
640 		(*k)->rsa = EVP_PKEY_get1_RSA(pubkey);
641 		break;
642 	case EVP_PKEY_DSA:
643 		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
644 			fatal("sshkey_new failed");
645 		(*k)->type = KEY_DSA;
646 		(*k)->dsa = EVP_PKEY_get1_DSA(pubkey);
647 		break;
648 #ifdef OPENSSL_HAS_ECC
649 	case EVP_PKEY_EC:
650 		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
651 			fatal("sshkey_new failed");
652 		(*k)->type = KEY_ECDSA;
653 		(*k)->ecdsa = EVP_PKEY_get1_EC_KEY(pubkey);
654 		(*k)->ecdsa_nid = sshkey_ecdsa_key_to_nid((*k)->ecdsa);
655 		break;
656 #endif
657 	default:
658 		fatal("%s: unsupported pubkey type %d", __func__,
659 		    EVP_PKEY_type(pubkey->type));
660 	}
661 	EVP_PKEY_free(pubkey);
662 	return;
663 }
664 
665 static void
666 do_convert_from_pem(struct sshkey **k, int *private)
667 {
668 	FILE *fp;
669 	RSA *rsa;
670 #ifdef notyet
671 	DSA *dsa;
672 #endif
673 
674 	if ((fp = fopen(identity_file, "r")) == NULL)
675 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
676 	if ((rsa = PEM_read_RSAPublicKey(fp, NULL, NULL, NULL)) != NULL) {
677 		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
678 			fatal("sshkey_new failed");
679 		(*k)->type = KEY_RSA;
680 		(*k)->rsa = rsa;
681 		fclose(fp);
682 		return;
683 	}
684 #if notyet /* OpenSSH 0.9.8 lacks this function */
685 	rewind(fp);
686 	if ((dsa = PEM_read_DSAPublicKey(fp, NULL, NULL, NULL)) != NULL) {
687 		if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
688 			fatal("sshkey_new failed");
689 		(*k)->type = KEY_DSA;
690 		(*k)->dsa = dsa;
691 		fclose(fp);
692 		return;
693 	}
694 	/* XXX ECDSA */
695 #endif
696 	fatal("%s: unrecognised raw private key format", __func__);
697 }
698 
699 static void
700 do_convert_from(struct passwd *pw)
701 {
702 	struct sshkey *k = NULL;
703 	int r, private = 0, ok = 0;
704 	struct stat st;
705 
706 	if (!have_identity)
707 		ask_filename(pw, "Enter file in which the key is");
708 	if (stat(identity_file, &st) < 0)
709 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
710 
711 	switch (convert_format) {
712 	case FMT_RFC4716:
713 		do_convert_from_ssh2(pw, &k, &private);
714 		break;
715 	case FMT_PKCS8:
716 		do_convert_from_pkcs8(&k, &private);
717 		break;
718 	case FMT_PEM:
719 		do_convert_from_pem(&k, &private);
720 		break;
721 	default:
722 		fatal("%s: unknown key format %d", __func__, convert_format);
723 	}
724 
725 	if (!private) {
726 		if ((r = sshkey_write(k, stdout)) == 0)
727 			ok = 1;
728 		if (ok)
729 			fprintf(stdout, "\n");
730 	} else {
731 		switch (k->type) {
732 		case KEY_DSA:
733 			ok = PEM_write_DSAPrivateKey(stdout, k->dsa, NULL,
734 			    NULL, 0, NULL, NULL);
735 			break;
736 #ifdef OPENSSL_HAS_ECC
737 		case KEY_ECDSA:
738 			ok = PEM_write_ECPrivateKey(stdout, k->ecdsa, NULL,
739 			    NULL, 0, NULL, NULL);
740 			break;
741 #endif
742 		case KEY_RSA:
743 			ok = PEM_write_RSAPrivateKey(stdout, k->rsa, NULL,
744 			    NULL, 0, NULL, NULL);
745 			break;
746 		default:
747 			fatal("%s: unsupported key type %s", __func__,
748 			    sshkey_type(k));
749 		}
750 	}
751 
752 	if (!ok) {
753 		fprintf(stderr, "key write failed\n");
754 		exit(1);
755 	}
756 	sshkey_free(k);
757 	exit(0);
758 }
759 #endif
760 
761 static void
762 do_print_public(struct passwd *pw)
763 {
764 	struct sshkey *prv;
765 	struct stat st;
766 	int r;
767 
768 	if (!have_identity)
769 		ask_filename(pw, "Enter file in which the key is");
770 	if (stat(identity_file, &st) < 0) {
771 		perror(identity_file);
772 		exit(1);
773 	}
774 	prv = load_identity(identity_file);
775 	if ((r = sshkey_write(prv, stdout)) != 0)
776 		fprintf(stderr, "key_write failed: %s", ssh_err(r));
777 	sshkey_free(prv);
778 	fprintf(stdout, "\n");
779 	exit(0);
780 }
781 
782 static void
783 do_download(struct passwd *pw)
784 {
785 #ifdef ENABLE_PKCS11
786 	struct sshkey **keys = NULL;
787 	int i, nkeys;
788 	enum sshkey_fp_rep rep;
789 	int fptype;
790 	char *fp, *ra;
791 
792 	fptype = print_bubblebabble ? SSH_DIGEST_SHA1 : fingerprint_hash;
793 	rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_DEFAULT;
794 
795 	pkcs11_init(0);
796 	nkeys = pkcs11_add_provider(pkcs11provider, NULL, &keys);
797 	if (nkeys <= 0)
798 		fatal("cannot read public key from pkcs11");
799 	for (i = 0; i < nkeys; i++) {
800 		if (print_fingerprint) {
801 			fp = sshkey_fingerprint(keys[i], fptype, rep);
802 			ra = sshkey_fingerprint(keys[i], fingerprint_hash,
803 			    SSH_FP_RANDOMART);
804 			if (fp == NULL || ra == NULL)
805 				fatal("%s: sshkey_fingerprint fail", __func__);
806 			printf("%u %s %s (PKCS11 key)\n", sshkey_size(keys[i]),
807 			    fp, sshkey_type(keys[i]));
808 			if (log_level >= SYSLOG_LEVEL_VERBOSE)
809 				printf("%s\n", ra);
810 			free(ra);
811 			free(fp);
812 		} else {
813 			(void) sshkey_write(keys[i], stdout); /* XXX check */
814 			fprintf(stdout, "\n");
815 		}
816 		sshkey_free(keys[i]);
817 	}
818 	free(keys);
819 	pkcs11_terminate();
820 	exit(0);
821 #else
822 	fatal("no pkcs11 support");
823 #endif /* ENABLE_PKCS11 */
824 }
825 
826 static void
827 do_fingerprint(struct passwd *pw)
828 {
829 	FILE *f;
830 	struct sshkey *public;
831 	char *comment = NULL, *cp, *ep, line[16*1024], *fp, *ra;
832 	int r, i, skip = 0, num = 0, invalid = 1;
833 	enum sshkey_fp_rep rep;
834 	int fptype;
835 	struct stat st;
836 
837 	fptype = print_bubblebabble ? SSH_DIGEST_SHA1 : fingerprint_hash;
838 	rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_DEFAULT;
839 	if (!have_identity)
840 		ask_filename(pw, "Enter file in which the key is");
841 	if (stat(identity_file, &st) < 0) {
842 		perror(identity_file);
843 		exit(1);
844 	}
845 	if ((r = sshkey_load_public(identity_file, &public, &comment)) != 0)
846 		debug2("Error loading public key \"%s\": %s",
847 		    identity_file, ssh_err(r));
848 	else {
849 		fp = sshkey_fingerprint(public, fptype, rep);
850 		ra = sshkey_fingerprint(public, fingerprint_hash,
851 		    SSH_FP_RANDOMART);
852 		if (fp == NULL || ra == NULL)
853 			fatal("%s: sshkey_fingerprint fail", __func__);
854 		printf("%u %s %s (%s)\n", sshkey_size(public), fp, comment,
855 		    sshkey_type(public));
856 		if (log_level >= SYSLOG_LEVEL_VERBOSE)
857 			printf("%s\n", ra);
858 		sshkey_free(public);
859 		free(comment);
860 		free(ra);
861 		free(fp);
862 		exit(0);
863 	}
864 	if (comment) {
865 		free(comment);
866 		comment = NULL;
867 	}
868 
869 	if ((f = fopen(identity_file, "r")) == NULL)
870 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
871 
872 	while (fgets(line, sizeof(line), f)) {
873 		if ((cp = strchr(line, '\n')) == NULL) {
874 			error("line %d too long: %.40s...",
875 			    num + 1, line);
876 			skip = 1;
877 			continue;
878 		}
879 		num++;
880 		if (skip) {
881 			skip = 0;
882 			continue;
883 		}
884 		*cp = '\0';
885 
886 		/* Skip leading whitespace, empty and comment lines. */
887 		for (cp = line; *cp == ' ' || *cp == '\t'; cp++)
888 			;
889 		if (!*cp || *cp == '\n' || *cp == '#')
890 			continue;
891 		i = strtol(cp, &ep, 10);
892 		if (i == 0 || ep == NULL || (*ep != ' ' && *ep != '\t')) {
893 			int quoted = 0;
894 			comment = cp;
895 			for (; *cp && (quoted || (*cp != ' ' &&
896 			    *cp != '\t')); cp++) {
897 				if (*cp == '\\' && cp[1] == '"')
898 					cp++;	/* Skip both */
899 				else if (*cp == '"')
900 					quoted = !quoted;
901 			}
902 			if (!*cp)
903 				continue;
904 			*cp++ = '\0';
905 		}
906 		ep = cp;
907 		if ((public = sshkey_new(KEY_RSA1)) == NULL)
908 			fatal("sshkey_new failed");
909 		if ((r = sshkey_read(public, &cp)) != 0) {
910 			cp = ep;
911 			sshkey_free(public);
912 			if ((public = sshkey_new(KEY_UNSPEC)) == NULL)
913 				fatal("sshkey_new failed");
914 			if ((r = sshkey_read(public, &cp)) != 0) {
915 				sshkey_free(public);
916 				continue;
917 			}
918 		}
919 		comment = *cp ? cp : comment;
920 		fp = sshkey_fingerprint(public, fptype, rep);
921 		ra = sshkey_fingerprint(public, fingerprint_hash,
922 		    SSH_FP_RANDOMART);
923 		if (fp == NULL || ra == NULL)
924 			fatal("%s: sshkey_fingerprint fail", __func__);
925 		printf("%u %s %s (%s)\n", sshkey_size(public), fp,
926 		    comment ? comment : "no comment", sshkey_type(public));
927 		if (log_level >= SYSLOG_LEVEL_VERBOSE)
928 			printf("%s\n", ra);
929 		free(ra);
930 		free(fp);
931 		sshkey_free(public);
932 		invalid = 0;
933 	}
934 	fclose(f);
935 
936 	if (invalid) {
937 		printf("%s is not a public key file.\n", identity_file);
938 		exit(1);
939 	}
940 	exit(0);
941 }
942 
943 static void
944 do_gen_all_hostkeys(struct passwd *pw)
945 {
946 	struct {
947 		char *key_type;
948 		char *key_type_display;
949 		char *path;
950 	} key_types[] = {
951 		{ "rsa1", "RSA1", _PATH_HOST_KEY_FILE },
952 		{ "rsa", "RSA" ,_PATH_HOST_RSA_KEY_FILE },
953 		{ "dsa", "DSA", _PATH_HOST_DSA_KEY_FILE },
954 #ifdef OPENSSL_HAS_ECC
955 		{ "ecdsa", "ECDSA",_PATH_HOST_ECDSA_KEY_FILE },
956 #endif
957 		{ "ed25519", "ED25519",_PATH_HOST_ED25519_KEY_FILE },
958 		{ NULL, NULL, NULL }
959 	};
960 
961 	int first = 0;
962 	struct stat st;
963 	struct sshkey *private, *public;
964 	char comment[1024];
965 	int i, type, fd, r;
966 	FILE *f;
967 
968 	for (i = 0; key_types[i].key_type; i++) {
969 		if (stat(key_types[i].path, &st) == 0)
970 			continue;
971 		if (errno != ENOENT) {
972 			printf("Could not stat %s: %s", key_types[i].path,
973 			    strerror(errno));
974 			first = 0;
975 			continue;
976 		}
977 
978 		if (first == 0) {
979 			first = 1;
980 			printf("%s: generating new host keys: ", __progname);
981 		}
982 		printf("%s ", key_types[i].key_type_display);
983 		fflush(stdout);
984 		type = sshkey_type_from_name(key_types[i].key_type);
985 		strlcpy(identity_file, key_types[i].path, sizeof(identity_file));
986 		bits = 0;
987 		type_bits_valid(type, NULL, &bits);
988 		if ((r = sshkey_generate(type, bits, &private)) != 0) {
989 			fprintf(stderr, "key_generate failed: %s\n",
990 			    ssh_err(r));
991 			first = 0;
992 			continue;
993 		}
994 		if ((r = sshkey_from_private(private, &public)) != 0)
995 			fatal("sshkey_from_private failed: %s", ssh_err(r));
996 		snprintf(comment, sizeof comment, "%s@%s", pw->pw_name,
997 		    hostname);
998 		if ((r = sshkey_save_private(private, identity_file, "",
999 		    comment, use_new_format, new_format_cipher, rounds)) != 0) {
1000 			printf("Saving key \"%s\" failed: %s\n", identity_file,
1001 			    ssh_err(r));
1002 			sshkey_free(private);
1003 			sshkey_free(public);
1004 			first = 0;
1005 			continue;
1006 		}
1007 		sshkey_free(private);
1008 		strlcat(identity_file, ".pub", sizeof(identity_file));
1009 		fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
1010 		if (fd == -1) {
1011 			printf("Could not save your public key in %s\n",
1012 			    identity_file);
1013 			sshkey_free(public);
1014 			first = 0;
1015 			continue;
1016 		}
1017 		f = fdopen(fd, "w");
1018 		if (f == NULL) {
1019 			printf("fdopen %s failed\n", identity_file);
1020 			close(fd);
1021 			sshkey_free(public);
1022 			first = 0;
1023 			continue;
1024 		}
1025 		if ((r = sshkey_write(public, f)) != 0) {
1026 			fprintf(stderr, "write key failed: %s\n", ssh_err(r));
1027 			fclose(f);
1028 			sshkey_free(public);
1029 			first = 0;
1030 			continue;
1031 		}
1032 		fprintf(f, " %s\n", comment);
1033 		fclose(f);
1034 		sshkey_free(public);
1035 
1036 	}
1037 	if (first != 0)
1038 		printf("\n");
1039 }
1040 
1041 struct known_hosts_ctx {
1042 	const char *host;	/* Hostname searched for in find/delete case */
1043 	FILE *out;		/* Output file, stdout for find_hosts case */
1044 	int has_unhashed;	/* When hashing, original had unhashed hosts */
1045 	int found_key;		/* For find/delete, host was found */
1046 	int invalid;		/* File contained invalid items; don't delete */
1047 };
1048 
1049 static int
1050 known_hosts_hash(struct hostkey_foreach_line *l, void *_ctx)
1051 {
1052 	struct known_hosts_ctx *ctx = (struct known_hosts_ctx *)_ctx;
1053 	char *hashed, *cp, *hosts, *ohosts;
1054 	int has_wild = l->hosts && strcspn(l->hosts, "*?!") != strlen(l->hosts);
1055 
1056 	switch (l->status) {
1057 	case HKF_STATUS_OK:
1058 	case HKF_STATUS_MATCHED:
1059 		/*
1060 		 * Don't hash hosts already already hashed, with wildcard
1061 		 * characters or a CA/revocation marker.
1062 		 */
1063 		if ((l->match & HKF_MATCH_HOST_HASHED) != 0 ||
1064 		    has_wild || l->marker != MRK_NONE) {
1065 			fprintf(ctx->out, "%s\n", l->line);
1066 			if (has_wild && !find_host) {
1067 				fprintf(stderr, "%s:%ld: ignoring host name "
1068 				    "with wildcard: %.64s\n", l->path,
1069 				    l->linenum, l->hosts);
1070 			}
1071 			return 0;
1072 		}
1073 		/*
1074 		 * Split any comma-separated hostnames from the host list,
1075 		 * hash and store separately.
1076 		 */
1077 		ohosts = hosts = xstrdup(l->hosts);
1078 		while ((cp = strsep(&hosts, ",")) != NULL && *cp != '\0') {
1079 			if ((hashed = host_hash(cp, NULL, 0)) == NULL)
1080 				fatal("hash_host failed");
1081 			fprintf(ctx->out, "%s %s\n", hashed, l->rawkey);
1082 			ctx->has_unhashed = 1;
1083 		}
1084 		free(ohosts);
1085 		return 0;
1086 	case HKF_STATUS_INVALID:
1087 		/* Retain invalid lines, but mark file as invalid. */
1088 		ctx->invalid = 1;
1089 		fprintf(stderr, "%s:%ld: invalid line\n", l->path, l->linenum);
1090 		/* FALLTHROUGH */
1091 	default:
1092 		fprintf(ctx->out, "%s\n", l->line);
1093 		return 0;
1094 	}
1095 	/* NOTREACHED */
1096 	return -1;
1097 }
1098 
1099 static int
1100 known_hosts_find_delete(struct hostkey_foreach_line *l, void *_ctx)
1101 {
1102 	struct known_hosts_ctx *ctx = (struct known_hosts_ctx *)_ctx;
1103 
1104 	if (l->status == HKF_STATUS_MATCHED) {
1105 		if (delete_host) {
1106 			if (l->marker != MRK_NONE) {
1107 				/* Don't remove CA and revocation lines */
1108 				fprintf(ctx->out, "%s\n", l->line);
1109 			} else {
1110 				/*
1111 				 * Hostname matches and has no CA/revoke
1112 				 * marker, delete it by *not* writing the
1113 				 * line to ctx->out.
1114 				 */
1115 				ctx->found_key = 1;
1116 				if (!quiet)
1117 					printf("# Host %s found: line %ld\n",
1118 					    ctx->host, l->linenum);
1119 			}
1120 			return 0;
1121 		} else if (find_host) {
1122 			ctx->found_key = 1;
1123 			if (!quiet) {
1124 				printf("# Host %s found: line %ld %s\n",
1125 				    ctx->host,
1126 				    l->linenum, l->marker == MRK_CA ? "CA" :
1127 				    (l->marker == MRK_REVOKE ? "REVOKED" : ""));
1128 			}
1129 			if (hash_hosts)
1130 				known_hosts_hash(l, ctx);
1131 			else
1132 				fprintf(ctx->out, "%s\n", l->line);
1133 			return 0;
1134 		}
1135 	} else if (delete_host) {
1136 		/* Retain non-matching hosts when deleting */
1137 		if (l->status == HKF_STATUS_INVALID) {
1138 			ctx->invalid = 1;
1139 			fprintf(stderr, "%s:%ld: invalid line\n",
1140 			    l->path, l->linenum);
1141 		}
1142 		fprintf(ctx->out, "%s\n", l->line);
1143 	}
1144 	return 0;
1145 }
1146 
1147 static void
1148 do_known_hosts(struct passwd *pw, const char *name)
1149 {
1150 	char *cp, tmp[PATH_MAX], old[PATH_MAX];
1151 	int r, fd, oerrno, inplace = 0;
1152 	struct known_hosts_ctx ctx;
1153 
1154 	if (!have_identity) {
1155 		cp = tilde_expand_filename(_PATH_SSH_USER_HOSTFILE, pw->pw_uid);
1156 		if (strlcpy(identity_file, cp, sizeof(identity_file)) >=
1157 		    sizeof(identity_file))
1158 			fatal("Specified known hosts path too long");
1159 		free(cp);
1160 		have_identity = 1;
1161 	}
1162 
1163 	memset(&ctx, 0, sizeof(ctx));
1164 	ctx.out = stdout;
1165 	ctx.host = name;
1166 
1167 	/*
1168 	 * Find hosts goes to stdout, hash and deletions happen in-place
1169 	 * A corner case is ssh-keygen -HF foo, which should go to stdout
1170 	 */
1171 	if (!find_host && (hash_hosts || delete_host)) {
1172 		if (strlcpy(tmp, identity_file, sizeof(tmp)) >= sizeof(tmp) ||
1173 		    strlcat(tmp, ".XXXXXXXXXX", sizeof(tmp)) >= sizeof(tmp) ||
1174 		    strlcpy(old, identity_file, sizeof(old)) >= sizeof(old) ||
1175 		    strlcat(old, ".old", sizeof(old)) >= sizeof(old))
1176 			fatal("known_hosts path too long");
1177 		umask(077);
1178 		if ((fd = mkstemp(tmp)) == -1)
1179 			fatal("mkstemp: %s", strerror(errno));
1180 		if ((ctx.out = fdopen(fd, "w")) == NULL) {
1181 			oerrno = errno;
1182 			unlink(tmp);
1183 			fatal("fdopen: %s", strerror(oerrno));
1184 		}
1185 		inplace = 1;
1186 	}
1187 
1188 	/* XXX support identity_file == "-" for stdin */
1189 	if ((r = hostkeys_foreach(identity_file,
1190 	    hash_hosts ? known_hosts_hash : known_hosts_find_delete, &ctx,
1191 	    name, NULL, find_host ? HKF_WANT_MATCH : 0)) != 0)
1192 		fatal("%s: hostkeys_foreach failed: %s", __func__, ssh_err(r));
1193 
1194 	if (inplace)
1195 		fclose(ctx.out);
1196 
1197 	if (ctx.invalid) {
1198 		fprintf(stderr, "%s is not a valid known_hosts file.\n",
1199 		    identity_file);
1200 		if (inplace) {
1201 			fprintf(stderr, "Not replacing existing known_hosts "
1202 			    "file because of errors\n");
1203 			unlink(tmp);
1204 		}
1205 		exit(1);
1206 	} else if (delete_host && !ctx.found_key) {
1207 		fprintf(stderr, "Host %s not found in %s\n",
1208 		    name, identity_file);
1209 		unlink(tmp);
1210 	} else if (inplace) {
1211 		/* Backup existing file */
1212 		if (unlink(old) == -1 && errno != ENOENT)
1213 			fatal("unlink %.100s: %s", old, strerror(errno));
1214 		if (link(identity_file, old) == -1)
1215 			fatal("link %.100s to %.100s: %s", identity_file, old,
1216 			    strerror(errno));
1217 		/* Move new one into place */
1218 		if (rename(tmp, identity_file) == -1) {
1219 			error("rename\"%s\" to \"%s\": %s", tmp, identity_file,
1220 			    strerror(errno));
1221 			unlink(tmp);
1222 			unlink(old);
1223 			exit(1);
1224 		}
1225 
1226 		fprintf(stderr, "%s updated.\n", identity_file);
1227 		fprintf(stderr, "Original contents retained as %s\n", old);
1228 		if (ctx.has_unhashed) {
1229 			fprintf(stderr, "WARNING: %s contains unhashed "
1230 			    "entries\n", old);
1231 			fprintf(stderr, "Delete this file to ensure privacy "
1232 			    "of hostnames\n");
1233 		}
1234 	}
1235 
1236 	exit (find_host && !ctx.found_key);
1237 }
1238 
1239 /*
1240  * Perform changing a passphrase.  The argument is the passwd structure
1241  * for the current user.
1242  */
1243 static void
1244 do_change_passphrase(struct passwd *pw)
1245 {
1246 	char *comment;
1247 	char *old_passphrase, *passphrase1, *passphrase2;
1248 	struct stat st;
1249 	struct sshkey *private;
1250 	int r;
1251 
1252 	if (!have_identity)
1253 		ask_filename(pw, "Enter file in which the key is");
1254 	if (stat(identity_file, &st) < 0) {
1255 		perror(identity_file);
1256 		exit(1);
1257 	}
1258 	/* Try to load the file with empty passphrase. */
1259 	r = sshkey_load_private(identity_file, "", &private, &comment);
1260 	if (r == SSH_ERR_KEY_WRONG_PASSPHRASE) {
1261 		if (identity_passphrase)
1262 			old_passphrase = xstrdup(identity_passphrase);
1263 		else
1264 			old_passphrase =
1265 			    read_passphrase("Enter old passphrase: ",
1266 			    RP_ALLOW_STDIN);
1267 		r = sshkey_load_private(identity_file, old_passphrase,
1268 		    &private, &comment);
1269 		explicit_bzero(old_passphrase, strlen(old_passphrase));
1270 		free(old_passphrase);
1271 		if (r != 0)
1272 			goto badkey;
1273 	} else if (r != 0) {
1274  badkey:
1275 		fprintf(stderr, "Failed to load key \"%s\": %s\n",
1276 		    identity_file, ssh_err(r));
1277 		exit(1);
1278 	}
1279 	if (comment)
1280 		printf("Key has comment '%s'\n", comment);
1281 
1282 	/* Ask the new passphrase (twice). */
1283 	if (identity_new_passphrase) {
1284 		passphrase1 = xstrdup(identity_new_passphrase);
1285 		passphrase2 = NULL;
1286 	} else {
1287 		passphrase1 =
1288 			read_passphrase("Enter new passphrase (empty for no "
1289 			    "passphrase): ", RP_ALLOW_STDIN);
1290 		passphrase2 = read_passphrase("Enter same passphrase again: ",
1291 		    RP_ALLOW_STDIN);
1292 
1293 		/* Verify that they are the same. */
1294 		if (strcmp(passphrase1, passphrase2) != 0) {
1295 			explicit_bzero(passphrase1, strlen(passphrase1));
1296 			explicit_bzero(passphrase2, strlen(passphrase2));
1297 			free(passphrase1);
1298 			free(passphrase2);
1299 			printf("Pass phrases do not match.  Try again.\n");
1300 			exit(1);
1301 		}
1302 		/* Destroy the other copy. */
1303 		explicit_bzero(passphrase2, strlen(passphrase2));
1304 		free(passphrase2);
1305 	}
1306 
1307 	/* Save the file using the new passphrase. */
1308 	if ((r = sshkey_save_private(private, identity_file, passphrase1,
1309 	    comment, use_new_format, new_format_cipher, rounds)) != 0) {
1310 		printf("Saving key \"%s\" failed: %s.\n",
1311 		    identity_file, ssh_err(r));
1312 		explicit_bzero(passphrase1, strlen(passphrase1));
1313 		free(passphrase1);
1314 		sshkey_free(private);
1315 		free(comment);
1316 		exit(1);
1317 	}
1318 	/* Destroy the passphrase and the copy of the key in memory. */
1319 	explicit_bzero(passphrase1, strlen(passphrase1));
1320 	free(passphrase1);
1321 	sshkey_free(private);		 /* Destroys contents */
1322 	free(comment);
1323 
1324 	printf("Your identification has been saved with the new passphrase.\n");
1325 	exit(0);
1326 }
1327 
1328 /*
1329  * Print the SSHFP RR.
1330  */
1331 static int
1332 do_print_resource_record(struct passwd *pw, char *fname, char *hname)
1333 {
1334 	struct sshkey *public;
1335 	char *comment = NULL;
1336 	struct stat st;
1337 	int r;
1338 
1339 	if (fname == NULL)
1340 		fatal("%s: no filename", __func__);
1341 	if (stat(fname, &st) < 0) {
1342 		if (errno == ENOENT)
1343 			return 0;
1344 		perror(fname);
1345 		exit(1);
1346 	}
1347 	if ((r = sshkey_load_public(fname, &public, &comment)) != 0) {
1348 		printf("Failed to read v2 public key from \"%s\": %s.\n",
1349 		    fname, ssh_err(r));
1350 		exit(1);
1351 	}
1352 	export_dns_rr(hname, public, stdout, print_generic);
1353 	sshkey_free(public);
1354 	free(comment);
1355 	return 1;
1356 }
1357 
1358 /*
1359  * Change the comment of a private key file.
1360  */
1361 static void
1362 do_change_comment(struct passwd *pw)
1363 {
1364 	char new_comment[1024], *comment, *passphrase;
1365 	struct sshkey *private;
1366 	struct sshkey *public;
1367 	struct stat st;
1368 	FILE *f;
1369 	int r, fd;
1370 
1371 	if (!have_identity)
1372 		ask_filename(pw, "Enter file in which the key is");
1373 	if (stat(identity_file, &st) < 0) {
1374 		perror(identity_file);
1375 		exit(1);
1376 	}
1377 	if ((r = sshkey_load_private(identity_file, "",
1378 	    &private, &comment)) == 0)
1379 		passphrase = xstrdup("");
1380 	else if (r != SSH_ERR_KEY_WRONG_PASSPHRASE) {
1381 		printf("Cannot load private key \"%s\": %s.\n",
1382 		    identity_file, ssh_err(r));
1383 		exit(1);
1384 	} else {
1385 		if (identity_passphrase)
1386 			passphrase = xstrdup(identity_passphrase);
1387 		else if (identity_new_passphrase)
1388 			passphrase = xstrdup(identity_new_passphrase);
1389 		else
1390 			passphrase = read_passphrase("Enter passphrase: ",
1391 			    RP_ALLOW_STDIN);
1392 		/* Try to load using the passphrase. */
1393 		if ((r = sshkey_load_private(identity_file, passphrase,
1394 		    &private, &comment)) != 0) {
1395 			explicit_bzero(passphrase, strlen(passphrase));
1396 			free(passphrase);
1397 			printf("Cannot load private key \"%s\": %s.\n",
1398 			    identity_file, ssh_err(r));
1399 			exit(1);
1400 		}
1401 	}
1402 	if (private->type != KEY_RSA1) {
1403 		fprintf(stderr, "Comments are only supported for RSA1 keys.\n");
1404 		sshkey_free(private);
1405 		exit(1);
1406 	}
1407 	printf("Key now has comment '%s'\n", comment);
1408 
1409 	if (identity_comment) {
1410 		strlcpy(new_comment, identity_comment, sizeof(new_comment));
1411 	} else {
1412 		printf("Enter new comment: ");
1413 		fflush(stdout);
1414 		if (!fgets(new_comment, sizeof(new_comment), stdin)) {
1415 			explicit_bzero(passphrase, strlen(passphrase));
1416 			sshkey_free(private);
1417 			exit(1);
1418 		}
1419 		new_comment[strcspn(new_comment, "\n")] = '\0';
1420 	}
1421 
1422 	/* Save the file using the new passphrase. */
1423 	if ((r = sshkey_save_private(private, identity_file, passphrase,
1424 	    new_comment, use_new_format, new_format_cipher, rounds)) != 0) {
1425 		printf("Saving key \"%s\" failed: %s\n",
1426 		    identity_file, ssh_err(r));
1427 		explicit_bzero(passphrase, strlen(passphrase));
1428 		free(passphrase);
1429 		sshkey_free(private);
1430 		free(comment);
1431 		exit(1);
1432 	}
1433 	explicit_bzero(passphrase, strlen(passphrase));
1434 	free(passphrase);
1435 	if ((r = sshkey_from_private(private, &public)) != 0)
1436 		fatal("key_from_private failed: %s", ssh_err(r));
1437 	sshkey_free(private);
1438 
1439 	strlcat(identity_file, ".pub", sizeof(identity_file));
1440 	fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
1441 	if (fd == -1) {
1442 		printf("Could not save your public key in %s\n", identity_file);
1443 		exit(1);
1444 	}
1445 	f = fdopen(fd, "w");
1446 	if (f == NULL) {
1447 		printf("fdopen %s failed\n", identity_file);
1448 		exit(1);
1449 	}
1450 	if ((r = sshkey_write(public, f)) != 0)
1451 		fprintf(stderr, "write key failed: %s\n", ssh_err(r));
1452 	sshkey_free(public);
1453 	fprintf(f, " %s\n", new_comment);
1454 	fclose(f);
1455 
1456 	free(comment);
1457 
1458 	printf("The comment in your key file has been changed.\n");
1459 	exit(0);
1460 }
1461 
1462 static const char *
1463 fmt_validity(u_int64_t valid_from, u_int64_t valid_to)
1464 {
1465 	char from[32], to[32];
1466 	static char ret[64];
1467 	time_t tt;
1468 	struct tm *tm;
1469 
1470 	*from = *to = '\0';
1471 	if (valid_from == 0 && valid_to == 0xffffffffffffffffULL)
1472 		return "forever";
1473 
1474 	if (valid_from != 0) {
1475 		/* XXX revisit INT_MAX in 2038 :) */
1476 		tt = valid_from > INT_MAX ? INT_MAX : valid_from;
1477 		tm = localtime(&tt);
1478 		strftime(from, sizeof(from), "%Y-%m-%dT%H:%M:%S", tm);
1479 	}
1480 	if (valid_to != 0xffffffffffffffffULL) {
1481 		/* XXX revisit INT_MAX in 2038 :) */
1482 		tt = valid_to > INT_MAX ? INT_MAX : valid_to;
1483 		tm = localtime(&tt);
1484 		strftime(to, sizeof(to), "%Y-%m-%dT%H:%M:%S", tm);
1485 	}
1486 
1487 	if (valid_from == 0) {
1488 		snprintf(ret, sizeof(ret), "before %s", to);
1489 		return ret;
1490 	}
1491 	if (valid_to == 0xffffffffffffffffULL) {
1492 		snprintf(ret, sizeof(ret), "after %s", from);
1493 		return ret;
1494 	}
1495 
1496 	snprintf(ret, sizeof(ret), "from %s to %s", from, to);
1497 	return ret;
1498 }
1499 
1500 static void
1501 add_flag_option(struct sshbuf *c, const char *name)
1502 {
1503 	int r;
1504 
1505 	debug3("%s: %s", __func__, name);
1506 	if ((r = sshbuf_put_cstring(c, name)) != 0 ||
1507 	    (r = sshbuf_put_string(c, NULL, 0)) != 0)
1508 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
1509 }
1510 
1511 static void
1512 add_string_option(struct sshbuf *c, const char *name, const char *value)
1513 {
1514 	struct sshbuf *b;
1515 	int r;
1516 
1517 	debug3("%s: %s=%s", __func__, name, value);
1518 	if ((b = sshbuf_new()) == NULL)
1519 		fatal("%s: sshbuf_new failed", __func__);
1520 	if ((r = sshbuf_put_cstring(b, value)) != 0 ||
1521 	    (r = sshbuf_put_cstring(c, name)) != 0 ||
1522 	    (r = sshbuf_put_stringb(c, b)) != 0)
1523 		fatal("%s: buffer error: %s", __func__, ssh_err(r));
1524 
1525 	sshbuf_free(b);
1526 }
1527 
1528 #define OPTIONS_CRITICAL	1
1529 #define OPTIONS_EXTENSIONS	2
1530 static void
1531 prepare_options_buf(struct sshbuf *c, int which)
1532 {
1533 	sshbuf_reset(c);
1534 	if ((which & OPTIONS_CRITICAL) != 0 &&
1535 	    certflags_command != NULL)
1536 		add_string_option(c, "force-command", certflags_command);
1537 	if ((which & OPTIONS_EXTENSIONS) != 0 &&
1538 	    (certflags_flags & CERTOPT_X_FWD) != 0)
1539 		add_flag_option(c, "permit-X11-forwarding");
1540 	if ((which & OPTIONS_EXTENSIONS) != 0 &&
1541 	    (certflags_flags & CERTOPT_AGENT_FWD) != 0)
1542 		add_flag_option(c, "permit-agent-forwarding");
1543 	if ((which & OPTIONS_EXTENSIONS) != 0 &&
1544 	    (certflags_flags & CERTOPT_PORT_FWD) != 0)
1545 		add_flag_option(c, "permit-port-forwarding");
1546 	if ((which & OPTIONS_EXTENSIONS) != 0 &&
1547 	    (certflags_flags & CERTOPT_PTY) != 0)
1548 		add_flag_option(c, "permit-pty");
1549 	if ((which & OPTIONS_EXTENSIONS) != 0 &&
1550 	    (certflags_flags & CERTOPT_USER_RC) != 0)
1551 		add_flag_option(c, "permit-user-rc");
1552 	if ((which & OPTIONS_CRITICAL) != 0 &&
1553 	    certflags_src_addr != NULL)
1554 		add_string_option(c, "source-address", certflags_src_addr);
1555 }
1556 
1557 static struct sshkey *
1558 load_pkcs11_key(char *path)
1559 {
1560 #ifdef ENABLE_PKCS11
1561 	struct sshkey **keys = NULL, *public, *private = NULL;
1562 	int r, i, nkeys;
1563 
1564 	if ((r = sshkey_load_public(path, &public, NULL)) != 0)
1565 		fatal("Couldn't load CA public key \"%s\": %s",
1566 		    path, ssh_err(r));
1567 
1568 	nkeys = pkcs11_add_provider(pkcs11provider, identity_passphrase, &keys);
1569 	debug3("%s: %d keys", __func__, nkeys);
1570 	if (nkeys <= 0)
1571 		fatal("cannot read public key from pkcs11");
1572 	for (i = 0; i < nkeys; i++) {
1573 		if (sshkey_equal_public(public, keys[i])) {
1574 			private = keys[i];
1575 			continue;
1576 		}
1577 		sshkey_free(keys[i]);
1578 	}
1579 	free(keys);
1580 	sshkey_free(public);
1581 	return private;
1582 #else
1583 	fatal("no pkcs11 support");
1584 #endif /* ENABLE_PKCS11 */
1585 }
1586 
1587 static void
1588 do_ca_sign(struct passwd *pw, int argc, char **argv)
1589 {
1590 	int r, i, fd;
1591 	u_int n;
1592 	struct sshkey *ca, *public;
1593 	char *otmp, *tmp, *cp, *out, *comment, **plist = NULL;
1594 	FILE *f;
1595 	int v00 = 0; /* legacy keys */
1596 
1597 	if (key_type_name != NULL) {
1598 		switch (sshkey_type_from_name(key_type_name)) {
1599 		case KEY_RSA_CERT_V00:
1600 		case KEY_DSA_CERT_V00:
1601 			v00 = 1;
1602 			break;
1603 		case KEY_UNSPEC:
1604 			if (strcasecmp(key_type_name, "v00") == 0) {
1605 				v00 = 1;
1606 				break;
1607 			} else if (strcasecmp(key_type_name, "v01") == 0)
1608 				break;
1609 			/* FALLTHROUGH */
1610 		default:
1611 			fprintf(stderr, "unknown key type %s\n", key_type_name);
1612 			exit(1);
1613 		}
1614 	}
1615 
1616 #ifdef ENABLE_PKCS11
1617 	pkcs11_init(1);
1618 #endif
1619 	tmp = tilde_expand_filename(ca_key_path, pw->pw_uid);
1620 	if (pkcs11provider != NULL) {
1621 		if ((ca = load_pkcs11_key(tmp)) == NULL)
1622 			fatal("No PKCS#11 key matching %s found", ca_key_path);
1623 	} else
1624 		ca = load_identity(tmp);
1625 	free(tmp);
1626 
1627 	for (i = 0; i < argc; i++) {
1628 		/* Split list of principals */
1629 		n = 0;
1630 		if (cert_principals != NULL) {
1631 			otmp = tmp = xstrdup(cert_principals);
1632 			plist = NULL;
1633 			for (; (cp = strsep(&tmp, ",")) != NULL; n++) {
1634 				plist = xrealloc(plist, n + 1, sizeof(*plist));
1635 				if (*(plist[n] = xstrdup(cp)) == '\0')
1636 					fatal("Empty principal name");
1637 			}
1638 			free(otmp);
1639 		}
1640 
1641 		tmp = tilde_expand_filename(argv[i], pw->pw_uid);
1642 		if ((r = sshkey_load_public(tmp, &public, &comment)) != 0)
1643 			fatal("%s: unable to open \"%s\": %s",
1644 			    __func__, tmp, ssh_err(r));
1645 		if (public->type != KEY_RSA && public->type != KEY_DSA &&
1646 		    public->type != KEY_ECDSA && public->type != KEY_ED25519)
1647 			fatal("%s: key \"%s\" type %s cannot be certified",
1648 			    __func__, tmp, sshkey_type(public));
1649 
1650 		/* Prepare certificate to sign */
1651 		if ((r = sshkey_to_certified(public, v00)) != 0)
1652 			fatal("Could not upgrade key %s to certificate: %s",
1653 			    tmp, ssh_err(r));
1654 		public->cert->type = cert_key_type;
1655 		public->cert->serial = (u_int64_t)cert_serial;
1656 		public->cert->key_id = xstrdup(cert_key_id);
1657 		public->cert->nprincipals = n;
1658 		public->cert->principals = plist;
1659 		public->cert->valid_after = cert_valid_from;
1660 		public->cert->valid_before = cert_valid_to;
1661 		if (v00) {
1662 			prepare_options_buf(public->cert->critical,
1663 			    OPTIONS_CRITICAL|OPTIONS_EXTENSIONS);
1664 		} else {
1665 			prepare_options_buf(public->cert->critical,
1666 			    OPTIONS_CRITICAL);
1667 			prepare_options_buf(public->cert->extensions,
1668 			    OPTIONS_EXTENSIONS);
1669 		}
1670 		if ((r = sshkey_from_private(ca,
1671 		    &public->cert->signature_key)) != 0)
1672 			fatal("key_from_private (ca key): %s", ssh_err(r));
1673 
1674 		if (sshkey_certify(public, ca) != 0)
1675 			fatal("Couldn't not certify key %s", tmp);
1676 
1677 		if ((cp = strrchr(tmp, '.')) != NULL && strcmp(cp, ".pub") == 0)
1678 			*cp = '\0';
1679 		xasprintf(&out, "%s-cert.pub", tmp);
1680 		free(tmp);
1681 
1682 		if ((fd = open(out, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
1683 			fatal("Could not open \"%s\" for writing: %s", out,
1684 			    strerror(errno));
1685 		if ((f = fdopen(fd, "w")) == NULL)
1686 			fatal("%s: fdopen: %s", __func__, strerror(errno));
1687 		if ((r = sshkey_write(public, f)) != 0)
1688 			fatal("Could not write certified key to %s: %s",
1689 			    out, ssh_err(r));
1690 		fprintf(f, " %s\n", comment);
1691 		fclose(f);
1692 
1693 		if (!quiet) {
1694 			logit("Signed %s key %s: id \"%s\" serial %llu%s%s "
1695 			    "valid %s", sshkey_cert_type(public),
1696 			    out, public->cert->key_id,
1697 			    (unsigned long long)public->cert->serial,
1698 			    cert_principals != NULL ? " for " : "",
1699 			    cert_principals != NULL ? cert_principals : "",
1700 			    fmt_validity(cert_valid_from, cert_valid_to));
1701 		}
1702 
1703 		sshkey_free(public);
1704 		free(out);
1705 	}
1706 #ifdef ENABLE_PKCS11
1707 	pkcs11_terminate();
1708 #endif
1709 	exit(0);
1710 }
1711 
1712 static u_int64_t
1713 parse_relative_time(const char *s, time_t now)
1714 {
1715 	int64_t mul, secs;
1716 
1717 	mul = *s == '-' ? -1 : 1;
1718 
1719 	if ((secs = convtime(s + 1)) == -1)
1720 		fatal("Invalid relative certificate time %s", s);
1721 	if (mul == -1 && secs > now)
1722 		fatal("Certificate time %s cannot be represented", s);
1723 	return now + (u_int64_t)(secs * mul);
1724 }
1725 
1726 static u_int64_t
1727 parse_absolute_time(const char *s)
1728 {
1729 	struct tm tm;
1730 	time_t tt;
1731 	char buf[32], *fmt;
1732 
1733 	/*
1734 	 * POSIX strptime says "The application shall ensure that there
1735 	 * is white-space or other non-alphanumeric characters between
1736 	 * any two conversion specifications" so arrange things this way.
1737 	 */
1738 	switch (strlen(s)) {
1739 	case 8:
1740 		fmt = "%Y-%m-%d";
1741 		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2s", s, s + 4, s + 6);
1742 		break;
1743 	case 14:
1744 		fmt = "%Y-%m-%dT%H:%M:%S";
1745 		snprintf(buf, sizeof(buf), "%.4s-%.2s-%.2sT%.2s:%.2s:%.2s",
1746 		    s, s + 4, s + 6, s + 8, s + 10, s + 12);
1747 		break;
1748 	default:
1749 		fatal("Invalid certificate time format %s", s);
1750 	}
1751 
1752 	memset(&tm, 0, sizeof(tm));
1753 	if (strptime(buf, fmt, &tm) == NULL)
1754 		fatal("Invalid certificate time %s", s);
1755 	if ((tt = mktime(&tm)) < 0)
1756 		fatal("Certificate time %s cannot be represented", s);
1757 	return (u_int64_t)tt;
1758 }
1759 
1760 static void
1761 parse_cert_times(char *timespec)
1762 {
1763 	char *from, *to;
1764 	time_t now = time(NULL);
1765 	int64_t secs;
1766 
1767 	/* +timespec relative to now */
1768 	if (*timespec == '+' && strchr(timespec, ':') == NULL) {
1769 		if ((secs = convtime(timespec + 1)) == -1)
1770 			fatal("Invalid relative certificate life %s", timespec);
1771 		cert_valid_to = now + secs;
1772 		/*
1773 		 * Backdate certificate one minute to avoid problems on hosts
1774 		 * with poorly-synchronised clocks.
1775 		 */
1776 		cert_valid_from = ((now - 59)/ 60) * 60;
1777 		return;
1778 	}
1779 
1780 	/*
1781 	 * from:to, where
1782 	 * from := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS
1783 	 *   to := [+-]timespec | YYYYMMDD | YYYYMMDDHHMMSS
1784 	 */
1785 	from = xstrdup(timespec);
1786 	to = strchr(from, ':');
1787 	if (to == NULL || from == to || *(to + 1) == '\0')
1788 		fatal("Invalid certificate life specification %s", timespec);
1789 	*to++ = '\0';
1790 
1791 	if (*from == '-' || *from == '+')
1792 		cert_valid_from = parse_relative_time(from, now);
1793 	else
1794 		cert_valid_from = parse_absolute_time(from);
1795 
1796 	if (*to == '-' || *to == '+')
1797 		cert_valid_to = parse_relative_time(to, now);
1798 	else
1799 		cert_valid_to = parse_absolute_time(to);
1800 
1801 	if (cert_valid_to <= cert_valid_from)
1802 		fatal("Empty certificate validity interval");
1803 	free(from);
1804 }
1805 
1806 static void
1807 add_cert_option(char *opt)
1808 {
1809 	char *val;
1810 
1811 	if (strcasecmp(opt, "clear") == 0)
1812 		certflags_flags = 0;
1813 	else if (strcasecmp(opt, "no-x11-forwarding") == 0)
1814 		certflags_flags &= ~CERTOPT_X_FWD;
1815 	else if (strcasecmp(opt, "permit-x11-forwarding") == 0)
1816 		certflags_flags |= CERTOPT_X_FWD;
1817 	else if (strcasecmp(opt, "no-agent-forwarding") == 0)
1818 		certflags_flags &= ~CERTOPT_AGENT_FWD;
1819 	else if (strcasecmp(opt, "permit-agent-forwarding") == 0)
1820 		certflags_flags |= CERTOPT_AGENT_FWD;
1821 	else if (strcasecmp(opt, "no-port-forwarding") == 0)
1822 		certflags_flags &= ~CERTOPT_PORT_FWD;
1823 	else if (strcasecmp(opt, "permit-port-forwarding") == 0)
1824 		certflags_flags |= CERTOPT_PORT_FWD;
1825 	else if (strcasecmp(opt, "no-pty") == 0)
1826 		certflags_flags &= ~CERTOPT_PTY;
1827 	else if (strcasecmp(opt, "permit-pty") == 0)
1828 		certflags_flags |= CERTOPT_PTY;
1829 	else if (strcasecmp(opt, "no-user-rc") == 0)
1830 		certflags_flags &= ~CERTOPT_USER_RC;
1831 	else if (strcasecmp(opt, "permit-user-rc") == 0)
1832 		certflags_flags |= CERTOPT_USER_RC;
1833 	else if (strncasecmp(opt, "force-command=", 14) == 0) {
1834 		val = opt + 14;
1835 		if (*val == '\0')
1836 			fatal("Empty force-command option");
1837 		if (certflags_command != NULL)
1838 			fatal("force-command already specified");
1839 		certflags_command = xstrdup(val);
1840 	} else if (strncasecmp(opt, "source-address=", 15) == 0) {
1841 		val = opt + 15;
1842 		if (*val == '\0')
1843 			fatal("Empty source-address option");
1844 		if (certflags_src_addr != NULL)
1845 			fatal("source-address already specified");
1846 		if (addr_match_cidr_list(NULL, val) != 0)
1847 			fatal("Invalid source-address list");
1848 		certflags_src_addr = xstrdup(val);
1849 	} else
1850 		fatal("Unsupported certificate option \"%s\"", opt);
1851 }
1852 
1853 static void
1854 show_options(struct sshbuf *optbuf, int v00, int in_critical)
1855 {
1856 	char *name, *arg;
1857 	struct sshbuf *options, *option = NULL;
1858 	int r;
1859 
1860 	if ((options = sshbuf_fromb(optbuf)) == NULL)
1861 		fatal("%s: sshbuf_fromb failed", __func__);
1862 	while (sshbuf_len(options) != 0) {
1863 		sshbuf_free(option);
1864 		option = NULL;
1865 		if ((r = sshbuf_get_cstring(options, &name, NULL)) != 0 ||
1866 		    (r = sshbuf_froms(options, &option)) != 0)
1867 			fatal("%s: buffer error: %s", __func__, ssh_err(r));
1868 		printf("                %s", name);
1869 		if ((v00 || !in_critical) &&
1870 		    (strcmp(name, "permit-X11-forwarding") == 0 ||
1871 		    strcmp(name, "permit-agent-forwarding") == 0 ||
1872 		    strcmp(name, "permit-port-forwarding") == 0 ||
1873 		    strcmp(name, "permit-pty") == 0 ||
1874 		    strcmp(name, "permit-user-rc") == 0))
1875 			printf("\n");
1876 		else if ((v00 || in_critical) &&
1877 		    (strcmp(name, "force-command") == 0 ||
1878 		    strcmp(name, "source-address") == 0)) {
1879 			if ((r = sshbuf_get_cstring(option, &arg, NULL)) != 0)
1880 				fatal("%s: buffer error: %s",
1881 				    __func__, ssh_err(r));
1882 			printf(" %s\n", arg);
1883 			free(arg);
1884 		} else {
1885 			printf(" UNKNOWN OPTION (len %zu)\n",
1886 			    sshbuf_len(option));
1887 			sshbuf_reset(option);
1888 		}
1889 		free(name);
1890 		if (sshbuf_len(option) != 0)
1891 			fatal("Option corrupt: extra data at end");
1892 	}
1893 	sshbuf_free(option);
1894 	sshbuf_free(options);
1895 }
1896 
1897 static void
1898 do_show_cert(struct passwd *pw)
1899 {
1900 	struct sshkey *key;
1901 	struct stat st;
1902 	char *key_fp, *ca_fp;
1903 	u_int i, v00;
1904 	int r;
1905 
1906 	if (!have_identity)
1907 		ask_filename(pw, "Enter file in which the key is");
1908 	if (stat(identity_file, &st) < 0)
1909 		fatal("%s: %s: %s", __progname, identity_file, strerror(errno));
1910 	if ((r = sshkey_load_public(identity_file, &key, NULL)) != 0)
1911 		fatal("Cannot load public key \"%s\": %s",
1912 		    identity_file, ssh_err(r));
1913 	if (!sshkey_is_cert(key))
1914 		fatal("%s is not a certificate", identity_file);
1915 	v00 = key->type == KEY_RSA_CERT_V00 || key->type == KEY_DSA_CERT_V00;
1916 
1917 	key_fp = sshkey_fingerprint(key, fingerprint_hash, SSH_FP_DEFAULT);
1918 	ca_fp = sshkey_fingerprint(key->cert->signature_key,
1919 	    fingerprint_hash, SSH_FP_DEFAULT);
1920 	if (key_fp == NULL || ca_fp == NULL)
1921 		fatal("%s: sshkey_fingerprint fail", __func__);
1922 
1923 	printf("%s:\n", identity_file);
1924 	printf("        Type: %s %s certificate\n", sshkey_ssh_name(key),
1925 	    sshkey_cert_type(key));
1926 	printf("        Public key: %s %s\n", sshkey_type(key), key_fp);
1927 	printf("        Signing CA: %s %s\n",
1928 	    sshkey_type(key->cert->signature_key), ca_fp);
1929 	printf("        Key ID: \"%s\"\n", key->cert->key_id);
1930 	if (!v00) {
1931 		printf("        Serial: %llu\n",
1932 		    (unsigned long long)key->cert->serial);
1933 	}
1934 	printf("        Valid: %s\n",
1935 	    fmt_validity(key->cert->valid_after, key->cert->valid_before));
1936 	printf("        Principals: ");
1937 	if (key->cert->nprincipals == 0)
1938 		printf("(none)\n");
1939 	else {
1940 		for (i = 0; i < key->cert->nprincipals; i++)
1941 			printf("\n                %s",
1942 			    key->cert->principals[i]);
1943 		printf("\n");
1944 	}
1945 	printf("        Critical Options: ");
1946 	if (sshbuf_len(key->cert->critical) == 0)
1947 		printf("(none)\n");
1948 	else {
1949 		printf("\n");
1950 		show_options(key->cert->critical, v00, 1);
1951 	}
1952 	if (!v00) {
1953 		printf("        Extensions: ");
1954 		if (sshbuf_len(key->cert->extensions) == 0)
1955 			printf("(none)\n");
1956 		else {
1957 			printf("\n");
1958 			show_options(key->cert->extensions, v00, 0);
1959 		}
1960 	}
1961 	exit(0);
1962 }
1963 
1964 static void
1965 load_krl(const char *path, struct ssh_krl **krlp)
1966 {
1967 	struct sshbuf *krlbuf;
1968 	int r, fd;
1969 
1970 	if ((krlbuf = sshbuf_new()) == NULL)
1971 		fatal("sshbuf_new failed");
1972 	if ((fd = open(path, O_RDONLY)) == -1)
1973 		fatal("open %s: %s", path, strerror(errno));
1974 	if ((r = sshkey_load_file(fd, krlbuf)) != 0)
1975 		fatal("Unable to load KRL: %s", ssh_err(r));
1976 	close(fd);
1977 	/* XXX check sigs */
1978 	if ((r = ssh_krl_from_blob(krlbuf, krlp, NULL, 0)) != 0 ||
1979 	    *krlp == NULL)
1980 		fatal("Invalid KRL file: %s", ssh_err(r));
1981 	sshbuf_free(krlbuf);
1982 }
1983 
1984 static void
1985 update_krl_from_file(struct passwd *pw, const char *file, int wild_ca,
1986     const struct sshkey *ca, struct ssh_krl *krl)
1987 {
1988 	struct sshkey *key = NULL;
1989 	u_long lnum = 0;
1990 	char *path, *cp, *ep, line[SSH_MAX_PUBKEY_BYTES];
1991 	unsigned long long serial, serial2;
1992 	int i, was_explicit_key, was_sha1, r;
1993 	FILE *krl_spec;
1994 
1995 	path = tilde_expand_filename(file, pw->pw_uid);
1996 	if (strcmp(path, "-") == 0) {
1997 		krl_spec = stdin;
1998 		free(path);
1999 		path = xstrdup("(standard input)");
2000 	} else if ((krl_spec = fopen(path, "r")) == NULL)
2001 		fatal("fopen %s: %s", path, strerror(errno));
2002 
2003 	if (!quiet)
2004 		printf("Revoking from %s\n", path);
2005 	while (read_keyfile_line(krl_spec, path, line, sizeof(line),
2006 	    &lnum) == 0) {
2007 		was_explicit_key = was_sha1 = 0;
2008 		cp = line + strspn(line, " \t");
2009 		/* Trim trailing space, comments and strip \n */
2010 		for (i = 0, r = -1; cp[i] != '\0'; i++) {
2011 			if (cp[i] == '#' || cp[i] == '\n') {
2012 				cp[i] = '\0';
2013 				break;
2014 			}
2015 			if (cp[i] == ' ' || cp[i] == '\t') {
2016 				/* Remember the start of a span of whitespace */
2017 				if (r == -1)
2018 					r = i;
2019 			} else
2020 				r = -1;
2021 		}
2022 		if (r != -1)
2023 			cp[r] = '\0';
2024 		if (*cp == '\0')
2025 			continue;
2026 		if (strncasecmp(cp, "serial:", 7) == 0) {
2027 			if (ca == NULL && !wild_ca) {
2028 				fatal("revoking certificates by serial number "
2029 				    "requires specification of a CA key");
2030 			}
2031 			cp += 7;
2032 			cp = cp + strspn(cp, " \t");
2033 			errno = 0;
2034 			serial = strtoull(cp, &ep, 0);
2035 			if (*cp == '\0' || (*ep != '\0' && *ep != '-'))
2036 				fatal("%s:%lu: invalid serial \"%s\"",
2037 				    path, lnum, cp);
2038 			if (errno == ERANGE && serial == ULLONG_MAX)
2039 				fatal("%s:%lu: serial out of range",
2040 				    path, lnum);
2041 			serial2 = serial;
2042 			if (*ep == '-') {
2043 				cp = ep + 1;
2044 				errno = 0;
2045 				serial2 = strtoull(cp, &ep, 0);
2046 				if (*cp == '\0' || *ep != '\0')
2047 					fatal("%s:%lu: invalid serial \"%s\"",
2048 					    path, lnum, cp);
2049 				if (errno == ERANGE && serial2 == ULLONG_MAX)
2050 					fatal("%s:%lu: serial out of range",
2051 					    path, lnum);
2052 				if (serial2 <= serial)
2053 					fatal("%s:%lu: invalid serial range "
2054 					    "%llu:%llu", path, lnum,
2055 					    (unsigned long long)serial,
2056 					    (unsigned long long)serial2);
2057 			}
2058 			if (ssh_krl_revoke_cert_by_serial_range(krl,
2059 			    ca, serial, serial2) != 0) {
2060 				fatal("%s: revoke serial failed",
2061 				    __func__);
2062 			}
2063 		} else if (strncasecmp(cp, "id:", 3) == 0) {
2064 			if (ca == NULL && !wild_ca) {
2065 				fatal("revoking certificates by key ID "
2066 				    "requires specification of a CA key");
2067 			}
2068 			cp += 3;
2069 			cp = cp + strspn(cp, " \t");
2070 			if (ssh_krl_revoke_cert_by_key_id(krl, ca, cp) != 0)
2071 				fatal("%s: revoke key ID failed", __func__);
2072 		} else {
2073 			if (strncasecmp(cp, "key:", 4) == 0) {
2074 				cp += 4;
2075 				cp = cp + strspn(cp, " \t");
2076 				was_explicit_key = 1;
2077 			} else if (strncasecmp(cp, "sha1:", 5) == 0) {
2078 				cp += 5;
2079 				cp = cp + strspn(cp, " \t");
2080 				was_sha1 = 1;
2081 			} else {
2082 				/*
2083 				 * Just try to process the line as a key.
2084 				 * Parsing will fail if it isn't.
2085 				 */
2086 			}
2087 			if ((key = sshkey_new(KEY_UNSPEC)) == NULL)
2088 				fatal("key_new");
2089 			if ((r = sshkey_read(key, &cp)) != 0)
2090 				fatal("%s:%lu: invalid key: %s",
2091 				    path, lnum, ssh_err(r));
2092 			if (was_explicit_key)
2093 				r = ssh_krl_revoke_key_explicit(krl, key);
2094 			else if (was_sha1)
2095 				r = ssh_krl_revoke_key_sha1(krl, key);
2096 			else
2097 				r = ssh_krl_revoke_key(krl, key);
2098 			if (r != 0)
2099 				fatal("%s: revoke key failed: %s",
2100 				    __func__, ssh_err(r));
2101 			sshkey_free(key);
2102 		}
2103 	}
2104 	if (strcmp(path, "-") != 0)
2105 		fclose(krl_spec);
2106 	free(path);
2107 }
2108 
2109 static void
2110 do_gen_krl(struct passwd *pw, int updating, int argc, char **argv)
2111 {
2112 	struct ssh_krl *krl;
2113 	struct stat sb;
2114 	struct sshkey *ca = NULL;
2115 	int fd, i, r, wild_ca = 0;
2116 	char *tmp;
2117 	struct sshbuf *kbuf;
2118 
2119 	if (*identity_file == '\0')
2120 		fatal("KRL generation requires an output file");
2121 	if (stat(identity_file, &sb) == -1) {
2122 		if (errno != ENOENT)
2123 			fatal("Cannot access KRL \"%s\": %s",
2124 			    identity_file, strerror(errno));
2125 		if (updating)
2126 			fatal("KRL \"%s\" does not exist", identity_file);
2127 	}
2128 	if (ca_key_path != NULL) {
2129 		if (strcasecmp(ca_key_path, "none") == 0)
2130 			wild_ca = 1;
2131 		else {
2132 			tmp = tilde_expand_filename(ca_key_path, pw->pw_uid);
2133 			if ((r = sshkey_load_public(tmp, &ca, NULL)) != 0)
2134 				fatal("Cannot load CA public key %s: %s",
2135 				    tmp, ssh_err(r));
2136 			free(tmp);
2137 		}
2138 	}
2139 
2140 	if (updating)
2141 		load_krl(identity_file, &krl);
2142 	else if ((krl = ssh_krl_init()) == NULL)
2143 		fatal("couldn't create KRL");
2144 
2145 	if (cert_serial != 0)
2146 		ssh_krl_set_version(krl, cert_serial);
2147 	if (identity_comment != NULL)
2148 		ssh_krl_set_comment(krl, identity_comment);
2149 
2150 	for (i = 0; i < argc; i++)
2151 		update_krl_from_file(pw, argv[i], wild_ca, ca, krl);
2152 
2153 	if ((kbuf = sshbuf_new()) == NULL)
2154 		fatal("sshbuf_new failed");
2155 	if (ssh_krl_to_blob(krl, kbuf, NULL, 0) != 0)
2156 		fatal("Couldn't generate KRL");
2157 	if ((fd = open(identity_file, O_WRONLY|O_CREAT|O_TRUNC, 0644)) == -1)
2158 		fatal("open %s: %s", identity_file, strerror(errno));
2159 	if (atomicio(vwrite, fd, (void *)sshbuf_ptr(kbuf), sshbuf_len(kbuf)) !=
2160 	    sshbuf_len(kbuf))
2161 		fatal("write %s: %s", identity_file, strerror(errno));
2162 	close(fd);
2163 	sshbuf_free(kbuf);
2164 	ssh_krl_free(krl);
2165 	if (ca != NULL)
2166 		sshkey_free(ca);
2167 }
2168 
2169 static void
2170 do_check_krl(struct passwd *pw, int argc, char **argv)
2171 {
2172 	int i, r, ret = 0;
2173 	char *comment;
2174 	struct ssh_krl *krl;
2175 	struct sshkey *k;
2176 
2177 	if (*identity_file == '\0')
2178 		fatal("KRL checking requires an input file");
2179 	load_krl(identity_file, &krl);
2180 	for (i = 0; i < argc; i++) {
2181 		if ((r = sshkey_load_public(argv[i], &k, &comment)) != 0)
2182 			fatal("Cannot load public key %s: %s",
2183 			    argv[i], ssh_err(r));
2184 		r = ssh_krl_check_key(krl, k);
2185 		printf("%s%s%s%s: %s\n", argv[i],
2186 		    *comment ? " (" : "", comment, *comment ? ")" : "",
2187 		    r == 0 ? "ok" : "REVOKED");
2188 		if (r != 0)
2189 			ret = 1;
2190 		sshkey_free(k);
2191 		free(comment);
2192 	}
2193 	ssh_krl_free(krl);
2194 	exit(ret);
2195 }
2196 
2197 static void
2198 usage(void)
2199 {
2200 	fprintf(stderr,
2201 	    "usage: ssh-keygen [-q] [-b bits] [-t dsa | ecdsa | ed25519 | rsa | rsa1]\n"
2202 	    "                  [-N new_passphrase] [-C comment] [-f output_keyfile]\n"
2203 	    "       ssh-keygen -p [-P old_passphrase] [-N new_passphrase] [-f keyfile]\n"
2204 	    "       ssh-keygen -i [-m key_format] [-f input_keyfile]\n"
2205 	    "       ssh-keygen -e [-m key_format] [-f input_keyfile]\n"
2206 	    "       ssh-keygen -y [-f input_keyfile]\n"
2207 	    "       ssh-keygen -c [-P passphrase] [-C comment] [-f keyfile]\n"
2208 	    "       ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]\n"
2209 	    "       ssh-keygen -B [-f input_keyfile]\n");
2210 #ifdef ENABLE_PKCS11
2211 	fprintf(stderr,
2212 	    "       ssh-keygen -D pkcs11\n");
2213 #endif
2214 	fprintf(stderr,
2215 	    "       ssh-keygen -F hostname [-f known_hosts_file] [-l]\n"
2216 	    "       ssh-keygen -H [-f known_hosts_file]\n"
2217 	    "       ssh-keygen -R hostname [-f known_hosts_file]\n"
2218 	    "       ssh-keygen -r hostname [-f input_keyfile] [-g]\n"
2219 	    "       ssh-keygen -G output_file [-v] [-b bits] [-M memory] [-S start_point]\n"
2220 	    "       ssh-keygen -T output_file -f input_file [-v] [-a rounds] [-J num_lines]\n"
2221 	    "                  [-j start_line] [-K checkpt] [-W generator]\n"
2222 	    "       ssh-keygen -s ca_key -I certificate_identity [-h] [-n principals]\n"
2223 	    "                  [-O option] [-V validity_interval] [-z serial_number] file ...\n"
2224 	    "       ssh-keygen -L [-f input_keyfile]\n"
2225 	    "       ssh-keygen -A\n"
2226 	    "       ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]\n"
2227 	    "                  file ...\n"
2228 	    "       ssh-keygen -Q -f krl_file file ...\n");
2229 	exit(1);
2230 }
2231 
2232 /*
2233  * Main program for key management.
2234  */
2235 int
2236 main(int argc, char **argv)
2237 {
2238 	char dotsshdir[PATH_MAX], comment[1024], *passphrase1, *passphrase2;
2239 	char *checkpoint = NULL;
2240 	char out_file[PATH_MAX], *rr_hostname = NULL, *ep, *fp, *ra;
2241 	struct sshkey *private, *public;
2242 	struct passwd *pw;
2243 	struct stat st;
2244 	int r, opt, type, fd;
2245 	u_int32_t memory = 0, generator_wanted = 0;
2246 	int do_gen_candidates = 0, do_screen_candidates = 0;
2247 	int gen_all_hostkeys = 0, gen_krl = 0, update_krl = 0, check_krl = 0;
2248 	unsigned long start_lineno = 0, lines_to_process = 0;
2249 	BIGNUM *start = NULL;
2250 	FILE *f;
2251 	const char *errstr;
2252 
2253 	extern int optind;
2254 	extern char *optarg;
2255 
2256 	/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */
2257 	sanitise_stdfd();
2258 
2259 	__progname = ssh_get_progname(argv[0]);
2260 
2261 #ifdef WITH_OPENSSL
2262 	OpenSSL_add_all_algorithms();
2263 #endif
2264 	log_init(argv[0], SYSLOG_LEVEL_INFO, SYSLOG_FACILITY_USER, 1);
2265 
2266 	seed_rng();
2267 
2268 	/* we need this for the home * directory.  */
2269 	pw = getpwuid(getuid());
2270 	if (!pw) {
2271 		printf("No user exists for uid %lu\n", (u_long)getuid());
2272 		exit(1);
2273 	}
2274 	if (gethostname(hostname, sizeof(hostname)) < 0) {
2275 		perror("gethostname");
2276 		exit(1);
2277 	}
2278 
2279 	/* Remaining characters: UYdw */
2280 	while ((opt = getopt(argc, argv, "ABHLQXceghiklopquvxy"
2281 	    "C:D:E:F:G:I:J:K:M:N:O:P:R:S:T:V:W:Z:"
2282 	    "a:b:f:g:j:m:n:r:s:t:z:")) != -1) {
2283 		switch (opt) {
2284 		case 'A':
2285 			gen_all_hostkeys = 1;
2286 			break;
2287 		case 'b':
2288 			bits = (u_int32_t)strtonum(optarg, 256, 32768, &errstr);
2289 			if (errstr)
2290 				fatal("Bits has bad value %s (%s)",
2291 					optarg, errstr);
2292 			break;
2293 		case 'E':
2294 			fingerprint_hash = ssh_digest_alg_by_name(optarg);
2295 			if (fingerprint_hash == -1)
2296 				fatal("Invalid hash algorithm \"%s\"", optarg);
2297 			break;
2298 		case 'F':
2299 			find_host = 1;
2300 			rr_hostname = optarg;
2301 			break;
2302 		case 'H':
2303 			hash_hosts = 1;
2304 			break;
2305 		case 'I':
2306 			cert_key_id = optarg;
2307 			break;
2308 		case 'J':
2309 			lines_to_process = strtoul(optarg, NULL, 10);
2310                         break;
2311 		case 'j':
2312 			start_lineno = strtoul(optarg, NULL, 10);
2313                         break;
2314 		case 'R':
2315 			delete_host = 1;
2316 			rr_hostname = optarg;
2317 			break;
2318 		case 'L':
2319 			show_cert = 1;
2320 			break;
2321 		case 'l':
2322 			print_fingerprint = 1;
2323 			break;
2324 		case 'B':
2325 			print_bubblebabble = 1;
2326 			break;
2327 		case 'm':
2328 			if (strcasecmp(optarg, "RFC4716") == 0 ||
2329 			    strcasecmp(optarg, "ssh2") == 0) {
2330 				convert_format = FMT_RFC4716;
2331 				break;
2332 			}
2333 			if (strcasecmp(optarg, "PKCS8") == 0) {
2334 				convert_format = FMT_PKCS8;
2335 				break;
2336 			}
2337 			if (strcasecmp(optarg, "PEM") == 0) {
2338 				convert_format = FMT_PEM;
2339 				break;
2340 			}
2341 			fatal("Unsupported conversion format \"%s\"", optarg);
2342 		case 'n':
2343 			cert_principals = optarg;
2344 			break;
2345 		case 'o':
2346 			use_new_format = 1;
2347 			break;
2348 		case 'p':
2349 			change_passphrase = 1;
2350 			break;
2351 		case 'c':
2352 			change_comment = 1;
2353 			break;
2354 		case 'f':
2355 			if (strlcpy(identity_file, optarg, sizeof(identity_file)) >=
2356 			    sizeof(identity_file))
2357 				fatal("Identity filename too long");
2358 			have_identity = 1;
2359 			break;
2360 		case 'g':
2361 			print_generic = 1;
2362 			break;
2363 		case 'P':
2364 			identity_passphrase = optarg;
2365 			break;
2366 		case 'N':
2367 			identity_new_passphrase = optarg;
2368 			break;
2369 		case 'Q':
2370 			check_krl = 1;
2371 			break;
2372 		case 'O':
2373 			add_cert_option(optarg);
2374 			break;
2375 		case 'Z':
2376 			new_format_cipher = optarg;
2377 			break;
2378 		case 'C':
2379 			identity_comment = optarg;
2380 			break;
2381 		case 'q':
2382 			quiet = 1;
2383 			break;
2384 		case 'e':
2385 		case 'x':
2386 			/* export key */
2387 			convert_to = 1;
2388 			break;
2389 		case 'h':
2390 			cert_key_type = SSH2_CERT_TYPE_HOST;
2391 			certflags_flags = 0;
2392 			break;
2393 		case 'k':
2394 			gen_krl = 1;
2395 			break;
2396 		case 'i':
2397 		case 'X':
2398 			/* import key */
2399 			convert_from = 1;
2400 			break;
2401 		case 'y':
2402 			print_public = 1;
2403 			break;
2404 		case 's':
2405 			ca_key_path = optarg;
2406 			break;
2407 		case 't':
2408 			key_type_name = optarg;
2409 			break;
2410 		case 'D':
2411 			pkcs11provider = optarg;
2412 			break;
2413 		case 'u':
2414 			update_krl = 1;
2415 			break;
2416 		case 'v':
2417 			if (log_level == SYSLOG_LEVEL_INFO)
2418 				log_level = SYSLOG_LEVEL_DEBUG1;
2419 			else {
2420 				if (log_level >= SYSLOG_LEVEL_DEBUG1 &&
2421 				    log_level < SYSLOG_LEVEL_DEBUG3)
2422 					log_level++;
2423 			}
2424 			break;
2425 		case 'r':
2426 			rr_hostname = optarg;
2427 			break;
2428 		case 'W':
2429 			generator_wanted = (u_int32_t)strtonum(optarg, 1,
2430 			    UINT_MAX, &errstr);
2431 			if (errstr)
2432 				fatal("Desired generator has bad value: %s (%s)",
2433 					optarg, errstr);
2434 			break;
2435 		case 'a':
2436 			rounds = (int)strtonum(optarg, 1, INT_MAX, &errstr);
2437 			if (errstr)
2438 				fatal("Invalid number: %s (%s)",
2439 					optarg, errstr);
2440 			break;
2441 #ifdef WITH_OPENSSL
2442 		case 'M':
2443 			memory = (u_int32_t)strtonum(optarg, 1, UINT_MAX, &errstr);
2444 			if (errstr)
2445 				fatal("Memory limit is %s: %s", errstr, optarg);
2446 			break;
2447 		case 'G':
2448 			do_gen_candidates = 1;
2449 			if (strlcpy(out_file, optarg, sizeof(out_file)) >=
2450 			    sizeof(out_file))
2451 				fatal("Output filename too long");
2452 			break;
2453 		case 'T':
2454 			do_screen_candidates = 1;
2455 			if (strlcpy(out_file, optarg, sizeof(out_file)) >=
2456 			    sizeof(out_file))
2457 				fatal("Output filename too long");
2458 			break;
2459 		case 'K':
2460 			if (strlen(optarg) >= PATH_MAX)
2461 				fatal("Checkpoint filename too long");
2462 			checkpoint = xstrdup(optarg);
2463 			break;
2464 		case 'S':
2465 			/* XXX - also compare length against bits */
2466 			if (BN_hex2bn(&start, optarg) == 0)
2467 				fatal("Invalid start point.");
2468 			break;
2469 #endif /* WITH_OPENSSL */
2470 		case 'V':
2471 			parse_cert_times(optarg);
2472 			break;
2473 		case 'z':
2474 			errno = 0;
2475 			cert_serial = strtoull(optarg, &ep, 10);
2476 			if (*optarg < '0' || *optarg > '9' || *ep != '\0' ||
2477 			    (errno == ERANGE && cert_serial == ULLONG_MAX))
2478 				fatal("Invalid serial number \"%s\"", optarg);
2479 			break;
2480 		case '?':
2481 		default:
2482 			usage();
2483 		}
2484 	}
2485 
2486 	/* reinit */
2487 	log_init(argv[0], log_level, SYSLOG_FACILITY_USER, 1);
2488 
2489 	argv += optind;
2490 	argc -= optind;
2491 
2492 	if (ca_key_path != NULL) {
2493 		if (argc < 1 && !gen_krl) {
2494 			printf("Too few arguments.\n");
2495 			usage();
2496 		}
2497 	} else if (argc > 0 && !gen_krl && !check_krl) {
2498 		printf("Too many arguments.\n");
2499 		usage();
2500 	}
2501 	if (change_passphrase && change_comment) {
2502 		printf("Can only have one of -p and -c.\n");
2503 		usage();
2504 	}
2505 	if (print_fingerprint && (delete_host || hash_hosts)) {
2506 		printf("Cannot use -l with -H or -R.\n");
2507 		usage();
2508 	}
2509 	if (gen_krl) {
2510 		do_gen_krl(pw, update_krl, argc, argv);
2511 		return (0);
2512 	}
2513 	if (check_krl) {
2514 		do_check_krl(pw, argc, argv);
2515 		return (0);
2516 	}
2517 	if (ca_key_path != NULL) {
2518 		if (cert_key_id == NULL)
2519 			fatal("Must specify key id (-I) when certifying");
2520 		do_ca_sign(pw, argc, argv);
2521 	}
2522 	if (show_cert)
2523 		do_show_cert(pw);
2524 	if (delete_host || hash_hosts || find_host)
2525 		do_known_hosts(pw, rr_hostname);
2526 	if (pkcs11provider != NULL)
2527 		do_download(pw);
2528 	if (print_fingerprint || print_bubblebabble)
2529 		do_fingerprint(pw);
2530 	if (change_passphrase)
2531 		do_change_passphrase(pw);
2532 	if (change_comment)
2533 		do_change_comment(pw);
2534 #ifdef WITH_OPENSSL
2535 	if (convert_to)
2536 		do_convert_to(pw);
2537 	if (convert_from)
2538 		do_convert_from(pw);
2539 #endif
2540 	if (print_public)
2541 		do_print_public(pw);
2542 	if (rr_hostname != NULL) {
2543 		unsigned int n = 0;
2544 
2545 		if (have_identity) {
2546 			n = do_print_resource_record(pw,
2547 			    identity_file, rr_hostname);
2548 			if (n == 0) {
2549 				perror(identity_file);
2550 				exit(1);
2551 			}
2552 			exit(0);
2553 		} else {
2554 
2555 			n += do_print_resource_record(pw,
2556 			    _PATH_HOST_RSA_KEY_FILE, rr_hostname);
2557 			n += do_print_resource_record(pw,
2558 			    _PATH_HOST_DSA_KEY_FILE, rr_hostname);
2559 			n += do_print_resource_record(pw,
2560 			    _PATH_HOST_ECDSA_KEY_FILE, rr_hostname);
2561 			n += do_print_resource_record(pw,
2562 			    _PATH_HOST_ED25519_KEY_FILE, rr_hostname);
2563 			if (n == 0)
2564 				fatal("no keys found.");
2565 			exit(0);
2566 		}
2567 	}
2568 
2569 	if (do_gen_candidates) {
2570 		FILE *out = fopen(out_file, "w");
2571 
2572 		if (out == NULL) {
2573 			error("Couldn't open modulus candidate file \"%s\": %s",
2574 			    out_file, strerror(errno));
2575 			return (1);
2576 		}
2577 		if (bits == 0)
2578 			bits = DEFAULT_BITS;
2579 		if (gen_candidates(out, memory, bits, start) != 0)
2580 			fatal("modulus candidate generation failed");
2581 
2582 		return (0);
2583 	}
2584 
2585 	if (do_screen_candidates) {
2586 		FILE *in;
2587 		FILE *out = fopen(out_file, "a");
2588 
2589 		if (have_identity && strcmp(identity_file, "-") != 0) {
2590 			if ((in = fopen(identity_file, "r")) == NULL) {
2591 				fatal("Couldn't open modulus candidate "
2592 				    "file \"%s\": %s", identity_file,
2593 				    strerror(errno));
2594 			}
2595 		} else
2596 			in = stdin;
2597 
2598 		if (out == NULL) {
2599 			fatal("Couldn't open moduli file \"%s\": %s",
2600 			    out_file, strerror(errno));
2601 		}
2602 		if (prime_test(in, out, rounds == 0 ? 100 : rounds,
2603 		    generator_wanted, checkpoint,
2604 		    start_lineno, lines_to_process) != 0)
2605 			fatal("modulus screening failed");
2606 		return (0);
2607 	}
2608 
2609 	if (gen_all_hostkeys) {
2610 		do_gen_all_hostkeys(pw);
2611 		return (0);
2612 	}
2613 
2614 	if (key_type_name == NULL)
2615 		key_type_name = "rsa";
2616 
2617 	type = sshkey_type_from_name(key_type_name);
2618 	type_bits_valid(type, key_type_name, &bits);
2619 
2620 	if (!quiet)
2621 		printf("Generating public/private %s key pair.\n",
2622 		    key_type_name);
2623 	if ((r = sshkey_generate(type, bits, &private)) != 0) {
2624 		fprintf(stderr, "key_generate failed\n");
2625 		exit(1);
2626 	}
2627 	if ((r = sshkey_from_private(private, &public)) != 0) {
2628 		fprintf(stderr, "key_from_private failed: %s\n", ssh_err(r));
2629 		exit(1);
2630 	}
2631 
2632 	if (!have_identity)
2633 		ask_filename(pw, "Enter file in which to save the key");
2634 
2635 	/* Create ~/.ssh directory if it doesn't already exist. */
2636 	snprintf(dotsshdir, sizeof dotsshdir, "%s/%s",
2637 	    pw->pw_dir, _PATH_SSH_USER_DIR);
2638 	if (strstr(identity_file, dotsshdir) != NULL) {
2639 		if (stat(dotsshdir, &st) < 0) {
2640 			if (errno != ENOENT) {
2641 				error("Could not stat %s: %s", dotsshdir,
2642 				    strerror(errno));
2643 			} else if (mkdir(dotsshdir, 0700) < 0) {
2644 				error("Could not create directory '%s': %s",
2645 				    dotsshdir, strerror(errno));
2646 			} else if (!quiet)
2647 				printf("Created directory '%s'.\n", dotsshdir);
2648 		}
2649 	}
2650 	/* If the file already exists, ask the user to confirm. */
2651 	if (stat(identity_file, &st) >= 0) {
2652 		char yesno[3];
2653 		printf("%s already exists.\n", identity_file);
2654 		printf("Overwrite (y/n)? ");
2655 		fflush(stdout);
2656 		if (fgets(yesno, sizeof(yesno), stdin) == NULL)
2657 			exit(1);
2658 		if (yesno[0] != 'y' && yesno[0] != 'Y')
2659 			exit(1);
2660 	}
2661 	/* Ask for a passphrase (twice). */
2662 	if (identity_passphrase)
2663 		passphrase1 = xstrdup(identity_passphrase);
2664 	else if (identity_new_passphrase)
2665 		passphrase1 = xstrdup(identity_new_passphrase);
2666 	else {
2667 passphrase_again:
2668 		passphrase1 =
2669 			read_passphrase("Enter passphrase (empty for no "
2670 			    "passphrase): ", RP_ALLOW_STDIN);
2671 		passphrase2 = read_passphrase("Enter same passphrase again: ",
2672 		    RP_ALLOW_STDIN);
2673 		if (strcmp(passphrase1, passphrase2) != 0) {
2674 			/*
2675 			 * The passphrases do not match.  Clear them and
2676 			 * retry.
2677 			 */
2678 			explicit_bzero(passphrase1, strlen(passphrase1));
2679 			explicit_bzero(passphrase2, strlen(passphrase2));
2680 			free(passphrase1);
2681 			free(passphrase2);
2682 			printf("Passphrases do not match.  Try again.\n");
2683 			goto passphrase_again;
2684 		}
2685 		/* Clear the other copy of the passphrase. */
2686 		explicit_bzero(passphrase2, strlen(passphrase2));
2687 		free(passphrase2);
2688 	}
2689 
2690 	if (identity_comment) {
2691 		strlcpy(comment, identity_comment, sizeof(comment));
2692 	} else {
2693 		/* Create default comment field for the passphrase. */
2694 		snprintf(comment, sizeof comment, "%s@%s", pw->pw_name, hostname);
2695 	}
2696 
2697 	/* Save the key with the given passphrase and comment. */
2698 	if ((r = sshkey_save_private(private, identity_file, passphrase1,
2699 	    comment, use_new_format, new_format_cipher, rounds)) != 0) {
2700 		printf("Saving key \"%s\" failed: %s\n",
2701 		    identity_file, ssh_err(r));
2702 		explicit_bzero(passphrase1, strlen(passphrase1));
2703 		free(passphrase1);
2704 		exit(1);
2705 	}
2706 	/* Clear the passphrase. */
2707 	explicit_bzero(passphrase1, strlen(passphrase1));
2708 	free(passphrase1);
2709 
2710 	/* Clear the private key and the random number generator. */
2711 	sshkey_free(private);
2712 
2713 	if (!quiet)
2714 		printf("Your identification has been saved in %s.\n", identity_file);
2715 
2716 	strlcat(identity_file, ".pub", sizeof(identity_file));
2717 	fd = open(identity_file, O_WRONLY | O_CREAT | O_TRUNC, 0644);
2718 	if (fd == -1) {
2719 		printf("Could not save your public key in %s\n", identity_file);
2720 		exit(1);
2721 	}
2722 	f = fdopen(fd, "w");
2723 	if (f == NULL) {
2724 		printf("fdopen %s failed\n", identity_file);
2725 		exit(1);
2726 	}
2727 	if ((r = sshkey_write(public, f)) != 0)
2728 		fprintf(stderr, "write key failed: %s\n", ssh_err(r));
2729 	fprintf(f, " %s\n", comment);
2730 	fclose(f);
2731 
2732 	if (!quiet) {
2733 		fp = sshkey_fingerprint(public, fingerprint_hash,
2734 		    SSH_FP_DEFAULT);
2735 		ra = sshkey_fingerprint(public, fingerprint_hash,
2736 		    SSH_FP_RANDOMART);
2737 		if (fp == NULL || ra == NULL)
2738 			fatal("sshkey_fingerprint failed");
2739 		printf("Your public key has been saved in %s.\n",
2740 		    identity_file);
2741 		printf("The key fingerprint is:\n");
2742 		printf("%s %s\n", fp, comment);
2743 		printf("The key's randomart image is:\n");
2744 		printf("%s\n", ra);
2745 		free(ra);
2746 		free(fp);
2747 	}
2748 
2749 	sshkey_free(public);
2750 	exit(0);
2751 }
2752