]> andersk Git - openssh.git/blobdiff - ssh-keygen.c
- (djm) Bug #461: ssh-copy-id fails with no arguments. Patch from
[openssh.git] / ssh-keygen.c
index 7d36293659098fd87b8a5c18b24d562d91087b86..6a872bcfd2085f9041c2944417a6b1546c0a33fd 100644 (file)
@@ -12,7 +12,7 @@
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: ssh-keygen.c,v 1.96 2002/03/21 21:54:34 rees Exp $");
+RCSID("$OpenBSD: ssh-keygen.c,v 1.102 2002/11/26 00:45:03 wcobb Exp $");
 
 #include <openssl/evp.h>
 #include <openssl/pem.h>
@@ -109,7 +109,6 @@ ask_filename(struct passwd *pw, const char *prompt)
 
        snprintf(identity_file, sizeof(identity_file), "%s/%s", pw->pw_dir, name);
        fprintf(stderr, "%s (%s): ", prompt, identity_file);
-       fflush(stderr);
        if (fgets(buf, sizeof(buf), stdin) == NULL)
                exit(1);
        if (strchr(buf, '\n'))
@@ -140,7 +139,7 @@ load_identity(char *filename)
 }
 
 #define SSH_COM_PUBLIC_BEGIN           "---- BEGIN SSH2 PUBLIC KEY ----"
-#define SSH_COM_PUBLIC_END             "---- END SSH2 PUBLIC KEY ----"
+#define SSH_COM_PUBLIC_END             "---- END SSH2 PUBLIC KEY ----"
 #define SSH_COM_PRIVATE_BEGIN          "---- BEGIN SSH2 ENCRYPTED PRIVATE KEY ----"
 #define        SSH_COM_PRIVATE_KEY_MAGIC       0x3f6ff9eb
 
@@ -170,7 +169,7 @@ do_convert_to_ssh2(struct passwd *pw)
        }
        fprintf(stdout, "%s\n", SSH_COM_PUBLIC_BEGIN);
        fprintf(stdout,
-           "Comment: \"%d-bit %s, converted from OpenSSH by %s@%s\"\n",
+           "Comment: \"%u-bit %s, converted from OpenSSH by %s@%s\"\n",
            key_size(k), key_type(k),
            pw->pw_name, hostname);
        dump_base64(stdout, blob, len);
@@ -290,6 +289,7 @@ do_convert_from_ssh2(struct passwd *pw)
 {
        Key *k;
        int blen;
+       u_int len;
        char line[1024], *p;
        u_char blob[8096];
        char encoded[8096];
@@ -334,6 +334,12 @@ do_convert_from_ssh2(struct passwd *pw)
                *p = '\0';
                strlcat(encoded, line, sizeof(encoded));
        }
+       len = strlen(encoded);
+       if (((len % 4) == 3) &&
+           (encoded[len-1] == '=') &&
+           (encoded[len-2] == '=') &&
+           (encoded[len-3] == '='))
+               encoded[len-3] = '\0';
        blen = uudecode(encoded, blob, sizeof(blob));
        if (blen < 0) {
                fprintf(stderr, "uudecode failed.\n");
@@ -409,21 +415,25 @@ do_upload(struct passwd *pw, const char *sc_reader_id)
        key_free(prv);
        if (ret < 0)
                exit(1);
-        log("loading key done");
+       log("loading key done");
        exit(0);
 }
 
 static void
 do_download(struct passwd *pw, const char *sc_reader_id)
 {
-       Key *pub = NULL;
+       Key **keys = NULL;
+       int i;
 
-       pub = sc_get_key(sc_reader_id, NULL);
-       if (pub == NULL)
+       keys = sc_get_keys(sc_reader_id, NULL);
+       if (keys == NULL)
                fatal("cannot read public key from smartcard");
-       key_write(pub, stdout);
-       key_free(pub);
-       fprintf(stdout, "\n");
+       for (i = 0; keys[i]; i++) {
+               key_write(keys[i], stdout);
+               key_free(keys[i]);
+               fprintf(stdout, "\n");
+       }
+       xfree(keys);
        exit(0);
 }
 #endif /* SMARTCARD */
@@ -451,7 +461,7 @@ do_fingerprint(struct passwd *pw)
        public = key_load_public(identity_file, &comment);
        if (public != NULL) {
                fp = key_fingerprint(public, fptype, rep);
-               printf("%d %s %s\n", key_size(public), fp, comment);
+               printf("%u %s %s\n", key_size(public), fp, comment);
                key_free(public);
                xfree(comment);
                xfree(fp);
@@ -485,7 +495,8 @@ do_fingerprint(struct passwd *pw)
                        if (i == 0 || ep == NULL || (*ep != ' ' && *ep != '\t')) {
                                int quoted = 0;
                                comment = cp;
-                               for (; *cp && (quoted || (*cp != ' ' && *cp != '\t')); cp++) {
+                               for (; *cp && (quoted || (*cp != ' ' &&
+                                   *cp != '\t')); cp++) {
                                        if (*cp == '\\' && cp[1] == '"')
                                                cp++;   /* Skip both */
                                        else if (*cp == '"')
@@ -508,7 +519,7 @@ do_fingerprint(struct passwd *pw)
                        }
                        comment = *cp ? cp : comment;
                        fp = key_fingerprint(public, fptype, rep);
-                       printf("%d %s %s\n", key_size(public), fp,
+                       printf("%u %s %s\n", key_size(public), fp,
                            comment ? comment : "no comment");
                        xfree(fp);
                        key_free(public);
@@ -749,6 +760,8 @@ main(int ac, char **av)
        __progname = get_progname(av[0]);
 
        SSLeay_add_all_algorithms();
+       init_rng();
+       seed_rng();
 
        /* we need this for the home * directory.  */
        pw = getpwuid(getuid());
@@ -843,10 +856,12 @@ main(int ac, char **av)
                do_fingerprint(pw);
        if (change_passphrase)
                do_change_passphrase(pw);
-       if (convert_to_ssh2)
-               do_convert_to_ssh2(pw);
        if (change_comment)
                do_change_comment(pw);
+       if (convert_to_ssh2)
+               do_convert_to_ssh2(pw);
+       if (convert_from_ssh2)
+               do_convert_from_ssh2(pw);
        if (print_public)
                do_print_public(pw);
        if (reader_id != NULL) {
@@ -860,13 +875,8 @@ main(int ac, char **av)
 #endif /* SMARTCARD */
        }
 
-       init_rng();
-       seed_rng();
        arc4random_stir();
 
-       if (convert_from_ssh2)
-               do_convert_from_ssh2(pw);
-
        if (key_type_name == NULL) {
                printf("You must specify a key type (-t).\n");
                usage();
This page took 0.108899 seconds and 4 git commands to generate.