=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/ssh-keygen.c,v retrieving revision 1.128.2.2 retrieving revision 1.134 diff -u -r1.128.2.2 -r1.134 --- src/usr.bin/ssh/ssh-keygen.c 2006/10/06 03:19:33 1.128.2.2 +++ src/usr.bin/ssh/ssh-keygen.c 2005/11/28 05:16:53 1.134 @@ -1,4 +1,3 @@ -/* $OpenBSD: ssh-keygen.c,v 1.128.2.2 2006/10/06 03:19:33 brad Exp $ */ /* * Author: Tatu Ylonen * Copyright (c) 1994 Tatu Ylonen , Espoo, Finland @@ -12,38 +11,29 @@ * called by a name other than "ssh" or "Secure Shell". */ -#include -#include -#include -#include +#include "includes.h" +RCSID("$OpenBSD: ssh-keygen.c,v 1.134 2005/11/28 05:16:53 dtucker Exp $"); #include #include -#include -#include -#include -#include -#include -#include -#include - #include "xmalloc.h" #include "key.h" #include "rsa.h" #include "authfile.h" #include "uuencode.h" #include "buffer.h" +#include "bufaux.h" #include "pathnames.h" #include "log.h" #include "misc.h" #include "match.h" #include "hostfile.h" -#include "dns.h" #ifdef SMARTCARD #include "scard.h" #endif +#include "dns.h" /* Number of bits in the RSA/DSA key. This value can be set on the command line. */ #define DEFAULT_BITS 2048 @@ -113,7 +103,7 @@ if (key_type_name == NULL) name = _PATH_SSH_CLIENT_ID_RSA; - else { + else switch (key_type_from_name(key_type_name)) { case KEY_RSA1: name = _PATH_SSH_CLIENT_IDENTITY; @@ -129,7 +119,7 @@ exit(1); break; } - } + snprintf(identity_file, sizeof(identity_file), "%s/%s", pw->pw_dir, name); fprintf(stderr, "%s (%s): ", prompt, identity_file); if (fgets(buf, sizeof(buf), stdin) == NULL) @@ -312,44 +302,13 @@ return key; } -static int -get_line(FILE *fp, char *line, size_t len) -{ - int c; - size_t pos = 0; - - line[0] = '\0'; - while ((c = fgetc(fp)) != EOF) { - if (pos >= len - 1) { - fprintf(stderr, "input line too long.\n"); - exit(1); - } - switch (c) { - case '\r': - c = fgetc(fp); - if (c != EOF && c != '\n' && ungetc(c, fp) == EOF) { - fprintf(stderr, "unget: %s\n", strerror(errno)); - exit(1); - } - return pos; - case '\n': - return pos; - } - line[pos++] = c; - line[pos] = '\0'; - } - if (c == EOF) - return -1; - return pos; -} - static void do_convert_from_ssh2(struct passwd *pw) { Key *k; int blen; u_int len; - char line[1024]; + char line[1024], *p; u_char blob[8096]; char encoded[8096]; struct stat st; @@ -368,8 +327,12 @@ exit(1); } encoded[0] = '\0'; - while ((blen = get_line(fp, line, sizeof(line))) != -1) { - if (line[blen - 1] == '\\') + while (fgets(line, sizeof(line), fp)) { + if (!(p = strchr(line, '\n'))) { + fprintf(stderr, "input line too long.\n"); + exit(1); + } + if (p > line && p[-1] == '\\') escaped++; if (strncmp(line, "----", 4) == 0 || strstr(line, ": ") != NULL) { @@ -386,6 +349,7 @@ /* fprintf(stderr, "escaped: %s", line); */ continue; } + *p = '\0'; strlcat(encoded, line, sizeof(encoded)); } len = strlen(encoded); @@ -521,10 +485,8 @@ xfree(fp); exit(0); } - if (comment) { + if (comment) xfree(comment); - comment = NULL; - } f = fopen(identity_file, "r"); if (f != NULL) { @@ -870,32 +832,30 @@ /* * Print the SSHFP RR. */ -static int -do_print_resource_record(struct passwd *pw, char *fname, char *hname) +static void +do_print_resource_record(struct passwd *pw, char *hname) { Key *public; char *comment = NULL; struct stat st; - if (fname == NULL) + if (!have_identity) ask_filename(pw, "Enter file in which the key is"); - if (stat(fname, &st) < 0) { - if (errno == ENOENT) - return 0; - perror(fname); + if (stat(identity_file, &st) < 0) { + perror(identity_file); exit(1); } - public = key_load_public(fname, &comment); + public = key_load_public(identity_file, &comment); if (public != NULL) { export_dns_rr(hname, public, stdout, print_generic); key_free(public); xfree(comment); - return 1; + exit(0); } if (comment) xfree(comment); - printf("failed to read v2 public key from %s.\n", fname); + printf("failed to read v2 public key from %s.\n", identity_file); exit(1); } @@ -1081,7 +1041,7 @@ "degiqpclBHvxXyF:b:f:t:U:D:P:N:C:r:g:R:T:G:M:S:a:W:")) != -1) { switch (opt) { case 'b': - bits = (u_int32_t)strtonum(optarg, 768, 32768, &errstr); + bits = strtonum(optarg, 768, 32768, &errstr); if (errstr) fatal("Bits has bad value %s (%s)", optarg, errstr); @@ -1151,7 +1111,6 @@ break; case 'D': download = 1; - /*FALLTHROUGH*/ case 'U': reader_id = optarg; break; @@ -1168,20 +1127,19 @@ rr_hostname = optarg; break; case 'W': - generator_wanted = (u_int32_t)strtonum(optarg, 1, - UINT_MAX, &errstr); + generator_wanted = strtonum(optarg, 1, UINT_MAX, &errstr); if (errstr) fatal("Desired generator has bad value: %s (%s)", optarg, errstr); break; case 'a': - trials = (u_int32_t)strtonum(optarg, 1, UINT_MAX, &errstr); + trials = strtonum(optarg, 1, UINT_MAX, &errstr); if (errstr) fatal("Invalid number of trials: %s (%s)", optarg, errstr); break; case 'M': - memory = (u_int32_t)strtonum(optarg, 1, UINT_MAX, &errstr); + memory = strtonum(optarg, 1, UINT_MAX, &errstr); if (errstr) { fatal("Memory limit is %s: %s", errstr, optarg); } @@ -1235,27 +1193,7 @@ if (print_public) do_print_public(pw); if (rr_hostname != NULL) { - unsigned int n = 0; - - if (have_identity) { - n = do_print_resource_record(pw, - identity_file, rr_hostname); - if (n == 0) { - perror(identity_file); - exit(1); - } - exit(0); - } else { - - n += do_print_resource_record(pw, - _PATH_HOST_RSA_KEY_FILE, rr_hostname); - n += do_print_resource_record(pw, - _PATH_HOST_DSA_KEY_FILE, rr_hostname); - - if (n == 0) - fatal("no keys found."); - exit(0); - } + do_print_resource_record(pw, rr_hostname); } if (reader_id != NULL) { #ifdef SMARTCARD @@ -1316,12 +1254,12 @@ fprintf(stderr, "unknown key type %s\n", key_type_name); exit(1); } - if (bits == 0) - bits = (type == KEY_DSA) ? DEFAULT_BITS_DSA : DEFAULT_BITS; if (type == KEY_DSA && bits != 1024) fatal("DSA keys must be 1024 bits"); if (!quiet) printf("Generating public/private %s key pair.\n", key_type_name); + if (bits == 0) + bits = (type == KEY_DSA) ? DEFAULT_BITS_DSA : DEFAULT_BITS; private = key_generate(type, bits); if (private == NULL) { fprintf(stderr, "key_generate failed");