[BACK]Return to ssh-keygen.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/ssh-keygen.c between version 1.66 and 1.77

version 1.66, 2001/06/26 02:47:07 version 1.77, 2001/08/02 15:06:52
Line 17 
Line 17 
 #include <openssl/evp.h>  #include <openssl/evp.h>
 #include <openssl/pem.h>  #include <openssl/pem.h>
   
 #ifdef SMARTCARD  
 #include <sectok.h>  
 #endif  
   
 #include "xmalloc.h"  #include "xmalloc.h"
 #include "key.h"  #include "key.h"
 #include "rsa.h"  #include "rsa.h"
Line 32 
Line 28 
 #include "log.h"  #include "log.h"
 #include "readpass.h"  #include "readpass.h"
   
   #ifdef SMARTCARD
   #include <sectok.h>
   #include <openssl/engine.h>
   #include "scard.h"
   #endif
   
 /* Number of bits in the RSA/DSA key.  This value can be changed on the command line. */  /* Number of bits in the RSA/DSA key.  This value can be changed on the command line. */
 int bits = 1024;  int bits = 1024;
Line 190 
Line 191 
         Buffer b;          Buffer b;
         Key *key = NULL;          Key *key = NULL;
         char *type, *cipher;          char *type, *cipher;
         u_char *sig, data[10] = "abcde12345";          u_char *sig, data[] = "abcde12345";
         int magic, rlen, ktype, i1, i2, i3, i4;          int magic, rlen, ktype, i1, i2, i3, i4;
         u_int slen;          u_int slen;
         u_long e;          u_long e;
Line 260 
Line 261 
                 buffer_get_bignum_bits(&b, key->rsa->iqmp);                  buffer_get_bignum_bits(&b, key->rsa->iqmp);
                 buffer_get_bignum_bits(&b, key->rsa->q);                  buffer_get_bignum_bits(&b, key->rsa->q);
                 buffer_get_bignum_bits(&b, key->rsa->p);                  buffer_get_bignum_bits(&b, key->rsa->p);
                 generate_additional_parameters(key->rsa);                  rsa_generate_additional_parameters(key->rsa);
                 break;                  break;
         }          }
         rlen = buffer_len(&b);          rlen = buffer_len(&b);
Line 376 
Line 377 
         exit(0);          exit(0);
 }  }
   
   #ifdef SMARTCARD
 #define NUM_RSA_KEY_ELEMENTS 5+1  #define NUM_RSA_KEY_ELEMENTS 5+1
 #define COPY_RSA_KEY(x, i) \  #define COPY_RSA_KEY(x, i) \
         do { \          do { \
                 len = BN_num_bytes(prv->rsa->x); \                  len = BN_num_bytes(prv->rsa->x); \
                 elements[i] = xmalloc(len); \                  elements[i] = xmalloc(len); \
 error("#bytes %d", len); \                  debug("#bytes %d", len); \
                 if (BN_bn2bin(prv->rsa->x, elements[i]) < 0) \                  if (BN_bn2bin(prv->rsa->x, elements[i]) < 0) \
                         goto done; \                          goto done; \
         } while(0)          } while(0)
   
   static int
   get_AUT0(char *aut0)
   {
           EVP_MD *evp_md = EVP_sha1();
           EVP_MD_CTX md;
           char *pass;
   
           pass = read_passphrase("Enter passphrase for smartcard: ", RP_ALLOW_STDIN);
           if (pass == NULL)
                   return -1;
           EVP_DigestInit(&md, evp_md);
           EVP_DigestUpdate(&md, pass, strlen(pass));
           EVP_DigestFinal(&md, aut0, NULL);
           memset(pass, 0, strlen(pass));
           xfree(pass);
           return 0;
   }
   
 static void  static void
 do_upload(struct passwd *pw, int reader)  do_upload(struct passwd *pw, const char *sc_reader_id)
 {  {
 #ifndef SMARTCARD  
         fatal("no support for smartcards.");  
 #else  
         Key *prv = NULL;          Key *prv = NULL;
         struct stat st;          struct stat st;
         u_char *elements[NUM_RSA_KEY_ELEMENTS];          u_char *elements[NUM_RSA_KEY_ELEMENTS];
         u_char key_fid[2];          u_char key_fid[2];
         u_char atr[256];          u_char DEFAUT0[] = {0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63};
         u_char AUT0[] = {0xad, 0x9f, 0x61, 0xfe, 0xfa, 0x20, 0xce, 0x63};          u_char AUT0[EVP_MAX_MD_SIZE];
         int len, status = 1, i, fd = -1, ret;          int len, status = 1, i, fd = -1, ret;
         int cla = 0x00;          int sw = 0, cla = 0x00;
   
           for (i = 0; i < NUM_RSA_KEY_ELEMENTS; i++)
                   elements[i] = NULL;
         if (!have_identity)          if (!have_identity)
                 ask_filename(pw, "Enter file in which the key is");                  ask_filename(pw, "Enter file in which the key is");
         if (stat(identity_file, &st) < 0) {          if (stat(identity_file, &st) < 0) {
Line 412 
Line 431 
                 error("load failed");                  error("load failed");
                 goto done;                  goto done;
         }          }
 {  
         prv->type = KEY_RSA;  
         key_write(prv, stderr);  
 }  
         for (i = 0; i < NUM_RSA_KEY_ELEMENTS; i++)  
                 elements[i] = NULL;  
         COPY_RSA_KEY(q, 0);          COPY_RSA_KEY(q, 0);
         COPY_RSA_KEY(p, 1);          COPY_RSA_KEY(p, 1);
         COPY_RSA_KEY(iqmp, 2);          COPY_RSA_KEY(iqmp, 2);
Line 425 
Line 438 
         COPY_RSA_KEY(dmp1, 4);          COPY_RSA_KEY(dmp1, 4);
         COPY_RSA_KEY(n, 5);          COPY_RSA_KEY(n, 5);
         len = BN_num_bytes(prv->rsa->n);          len = BN_num_bytes(prv->rsa->n);
         fd = scopen(reader, 0, NULL);          fd = sectok_friendly_open(sc_reader_id, STONOWAIT, &sw);
         if (fd < 0) {          if (fd < 0) {
                 error("scopen failed %d.", fd);                  error("sectok_open failed: %s", sectok_get_sw(sw));
                 goto done;                  goto done;
         }          }
         ret = screset(fd, atr, NULL);          if (! sectok_cardpresent(fd)) {
         if (ret <= 0) {                  error("smartcard in reader %s not present",
                 error("screset failed.");                      sc_reader_id);
                 goto done;                  goto done;
         }          }
         if (cyberflex_verify_AUT0(fd, cla, AUT0, sizeof(AUT0)) < 0) {          ret = sectok_reset(fd, 0, NULL, &sw);
                 error("cyberflex_verify_AUT0 failed");          if (ret <= 0) {
                   error("sectok_reset failed: %s", sectok_get_sw(sw));
                 goto done;                  goto done;
         }          }
           if ((cla = cyberflex_inq_class(fd)) < 0) {
                   error("cyberflex_inq_class failed");
                   goto done;
           }
           memcpy(AUT0, DEFAUT0, sizeof(DEFAUT0));
           if (cyberflex_verify_AUT0(fd, cla, AUT0, sizeof(DEFAUT0)) < 0) {
                   if (get_AUT0(AUT0) < 0 ||
                       cyberflex_verify_AUT0(fd, cla, AUT0, sizeof(DEFAUT0)) < 0) {
                           error("cyberflex_verify_AUT0 failed");
                           goto done;
                   }
           }
         key_fid[0] = 0x00;          key_fid[0] = 0x00;
         key_fid[1] = 0x12;          key_fid[1] = 0x12;
         if (cyberflex_load_rsa_priv(fd, cla, key_fid, 5, 8*len, elements) < 0)          if (cyberflex_load_rsa_priv(fd, cla, key_fid, 5, 8*len, elements,
               &sw) < 0) {
                   error("cyberflex_load_rsa_priv failed: %s", sectok_get_sw(sw));
                 goto done;                  goto done;
           }
           if (!sectok_swOK(sw))
                   goto done;
         log("cyberflex_load_rsa_priv done");          log("cyberflex_load_rsa_priv done");
         key_fid[0] = 0x73;          key_fid[0] = 0x73;
         key_fid[1] = 0x68;          key_fid[1] = 0x68;
         if (cyberflex_load_rsa_pub(fd, cla, key_fid, len, elements[5]) < 0)          if (cyberflex_load_rsa_pub(fd, cla, key_fid, len, elements[5],
               &sw) < 0) {
                   error("cyberflex_load_rsa_pub failed: %s", sectok_get_sw(sw));
                 goto done;                  goto done;
           }
           if (!sectok_swOK(sw))
                   goto done;
         log("cyberflex_load_rsa_pub done");          log("cyberflex_load_rsa_pub done");
         status = 0;          status = 0;
         log("loading key done");          log("loading key done");
Line 455 
Line 491 
         if (prv)          if (prv)
                 key_free(prv);                  key_free(prv);
         for (i = 0; i < NUM_RSA_KEY_ELEMENTS; i++)          for (i = 0; i < NUM_RSA_KEY_ELEMENTS; i++)
                 xfree(elements[i]);                  if (elements[i])
                           xfree(elements[i]);
         if (fd != -1)          if (fd != -1)
                 scclose(fd);                  sectok_close(fd);
         exit(status);          exit(status);
 #endif  
 }  }
   
 static void  static void
   do_download(struct passwd *pw, const char *sc_reader_id)
   {
           Key *pub = NULL;
   
           pub = sc_get_key(sc_reader_id);
           if (pub == NULL)
                   fatal("cannot read public key from smartcard");
           key_write(pub, stdout);
           key_free(pub);
           fprintf(stdout, "\n");
           exit(0);
   }
   #endif
   
   static void
 do_fingerprint(struct passwd *pw)  do_fingerprint(struct passwd *pw)
 {  {
         FILE *f;          FILE *f;
Line 737 
Line 788 
 static void  static void
 usage(void)  usage(void)
 {  {
         printf("Usage: %s [-ceilpqyB] [-t type] [-b bits] [-f file] [-C comment] "          fprintf(stderr, "Usage: %s [options]\n", __progname);
             "[-N new-pass] [-P pass]\n", __progname);          fprintf(stderr, "Options:\n");
           fprintf(stderr, "  -b bits     Number of bits in the key to create.\n");
           fprintf(stderr, "  -c          Change comment in private and public key files.\n");
           fprintf(stderr, "  -e          Convert OpenSSH to IETF SECSH key file.\n");
           fprintf(stderr, "  -f filename Filename of the key file.\n");
           fprintf(stderr, "  -i          Convert IETF SECSH to OpenSSH key file.\n");
           fprintf(stderr, "  -l          Show fingerprint of key file.\n");
           fprintf(stderr, "  -p          Change passphrase of private key file.\n");
           fprintf(stderr, "  -q          Quiet.\n");
           fprintf(stderr, "  -y          Read private key file and print public key.\n");
           fprintf(stderr, "  -t type     Specify type of key to create.\n");
           fprintf(stderr, "  -B          Show bubblebabble digest of key file.\n");
           fprintf(stderr, "  -C comment  Provide new comment.\n");
           fprintf(stderr, "  -N phrase   Provide new passphrase.\n");
           fprintf(stderr, "  -P phrase   Provide old passphrase.\n");
   #ifdef SMARTCARD
           fprintf(stderr, "  -D reader   Download public key from smartcard.\n");
           fprintf(stderr, "  -U reader   Upload private key to smartcard.\n");
   #endif /* SMARTCARD */
   
         exit(1);          exit(1);
 }  }
   
Line 749 
Line 819 
 main(int ac, char **av)  main(int ac, char **av)
 {  {
         char dotsshdir[16 * 1024], comment[1024], *passphrase1, *passphrase2;          char dotsshdir[16 * 1024], comment[1024], *passphrase1, *passphrase2;
           char *reader_id = NULL;
         Key *private, *public;          Key *private, *public;
         struct passwd *pw;          struct passwd *pw;
         int opt, type, fd, reader = -1;  
         struct stat st;          struct stat st;
           int opt, type, fd, download = 0;
         FILE *f;          FILE *f;
   
         extern int optind;          extern int optind;
Line 771 
Line 842 
                 exit(1);                  exit(1);
         }          }
   
         while ((opt = getopt(ac, av, "deiqpclBRxXyb:f:t:u:P:N:C:")) != -1) {          while ((opt = getopt(ac, av, "deiqpclBRxXyb:f:t:U:D:P:N:C:")) != -1) {
                 switch (opt) {                  switch (opt) {
                 case 'b':                  case 'b':
                         bits = atoi(optarg);                          bits = atoi(optarg);
Line 831 
Line 902 
                 case 't':                  case 't':
                         key_type_name = optarg;                          key_type_name = optarg;
                         break;                          break;
                 case 'u':                  case 'D':
                         reader = atoi(optarg); /*XXX*/                          download = 1;
                   case 'U':
                           reader_id = optarg;
                         break;                          break;
                 case '?':                  case '?':
                 default:                  default:
Line 859 
Line 932 
                 do_convert_from_ssh2(pw);                  do_convert_from_ssh2(pw);
         if (print_public)          if (print_public)
                 do_print_public(pw);                  do_print_public(pw);
         if (reader != -1)          if (reader_id != NULL) {
                 do_upload(pw, reader);  #ifdef SMARTCARD
                   if (download)
                           do_download(pw, reader_id);
                   else
                           do_upload(pw, reader_id);
   #else
                   fatal("no support for smartcards.");
   #endif
           }
   
         arc4random_stir();          arc4random_stir();
   

Legend:
Removed from v.1.66  
changed lines
  Added in v.1.77