[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.319 and 1.321

version 1.319, 2018/08/08 01:16:01 version 1.321, 2018/09/13 02:08:33
Line 439 
Line 439 
         u_int magic, i1, i2, i3, i4;          u_int magic, i1, i2, i3, i4;
         size_t slen;          size_t slen;
         u_long e;          u_long e;
           BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL;
           BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL;
           BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL;
           BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL;
         if ((b = sshbuf_from(blob, blen)) == NULL)          if ((b = sshbuf_from(blob, blen)) == NULL)
                 fatal("%s: sshbuf_from failed", __func__);                  fatal("%s: sshbuf_from failed", __func__);
         if ((r = sshbuf_get_u32(b, &magic)) != 0)          if ((r = sshbuf_get_u32(b, &magic)) != 0)
Line 483 
Line 486 
   
         switch (key->type) {          switch (key->type) {
         case KEY_DSA:          case KEY_DSA:
                 buffer_get_bignum_bits(b, key->dsa->p);                  if ((dsa_p = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->dsa->g);                      (dsa_q = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->dsa->q);                      (dsa_g = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->dsa->pub_key);                      (dsa_pub_key = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->dsa->priv_key);                      (dsa_priv_key = BN_new()) == NULL)
                           fatal("%s: BN_new", __func__);
                   buffer_get_bignum_bits(b, dsa_p);
                   buffer_get_bignum_bits(b, dsa_g);
                   buffer_get_bignum_bits(b, dsa_q);
                   buffer_get_bignum_bits(b, dsa_pub_key);
                   buffer_get_bignum_bits(b, dsa_priv_key);
                   if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g))
                           fatal("%s: DSA_set0_pqg failed", __func__);
                   dsa_p = dsa_q = dsa_g = NULL; /* transferred */
                   if (!DSA_set0_key(key->dsa, dsa_pub_key, dsa_priv_key))
                           fatal("%s: DSA_set0_key failed", __func__);
                   dsa_pub_key = dsa_priv_key = NULL; /* transferred */
                 break;                  break;
         case KEY_RSA:          case KEY_RSA:
                 if ((r = sshbuf_get_u8(b, &e1)) != 0 ||                  if ((r = sshbuf_get_u8(b, &e1)) != 0 ||
Line 504 
Line 519 
                         e += e3;                          e += e3;
                         debug("e %lx", e);                          debug("e %lx", e);
                 }                  }
                 if (!BN_set_word(key->rsa->e, e)) {                  if ((rsa_e = BN_new()) == NULL)
                           fatal("%s: BN_new", __func__);
                   if (!BN_set_word(rsa_e, e)) {
                           BN_clear_free(rsa_e);
                         sshbuf_free(b);                          sshbuf_free(b);
                         sshkey_free(key);                          sshkey_free(key);
                         return NULL;                          return NULL;
                 }                  }
                 buffer_get_bignum_bits(b, key->rsa->d);                  if ((rsa_n = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->rsa->n);                      (rsa_d = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->rsa->iqmp);                      (rsa_p = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->rsa->q);                      (rsa_q = BN_new()) == NULL ||
                 buffer_get_bignum_bits(b, key->rsa->p);                      (rsa_iqmp = BN_new()) == NULL)
                 if ((r = ssh_rsa_generate_additional_parameters(key)) != 0)                          fatal("%s: BN_new", __func__);
                   buffer_get_bignum_bits(b, rsa_d);
                   buffer_get_bignum_bits(b, rsa_n);
                   buffer_get_bignum_bits(b, rsa_iqmp);
                   buffer_get_bignum_bits(b, rsa_q);
                   buffer_get_bignum_bits(b, rsa_p);
                   if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, rsa_d))
                           fatal("%s: RSA_set0_key failed", __func__);
                   rsa_n = rsa_e = rsa_d = NULL; /* transferred */
                   if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q))
                           fatal("%s: RSA_set0_factors failed", __func__);
                   rsa_p = rsa_q = NULL; /* transferred */
                   if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0)
                         fatal("generate RSA parameters failed: %s", ssh_err(r));                          fatal("generate RSA parameters failed: %s", ssh_err(r));
                   BN_clear_free(rsa_iqmp);
                 break;                  break;
         }          }
         rlen = sshbuf_len(b);          rlen = sshbuf_len(b);
Line 623 
Line 654 
                     identity_file);                      identity_file);
         }          }
         fclose(fp);          fclose(fp);
         switch (EVP_PKEY_type(pubkey->type)) {          switch (EVP_PKEY_base_id(pubkey)) {
         case EVP_PKEY_RSA:          case EVP_PKEY_RSA:
                 if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)                  if ((*k = sshkey_new(KEY_UNSPEC)) == NULL)
                         fatal("sshkey_new failed");                          fatal("sshkey_new failed");
Line 645 
Line 676 
                 break;                  break;
         default:          default:
                 fatal("%s: unsupported pubkey type %d", __func__,                  fatal("%s: unsupported pubkey type %d", __func__,
                     EVP_PKEY_type(pubkey->type));                      EVP_PKEY_base_id(pubkey));
         }          }
         EVP_PKEY_free(pubkey);          EVP_PKEY_free(pubkey);
         return;          return;
Line 2064 
Line 2095 
 }  }
   
 static void  static void
   hash_to_blob(const char *cp, u_char **blobp, size_t *lenp,
       const char *file, u_long lnum)
   {
           char *tmp;
           size_t tlen;
           struct sshbuf *b;
           int r;
   
           if (strncmp(cp, "SHA256:", 7) != 0)
                   fatal("%s:%lu: unsupported hash algorithm", file, lnum);
           cp += 7;
   
           /*
            * OpenSSH base64 hashes omit trailing '='
            * characters; put them back for decode.
            */
           tlen = strlen(cp);
           tmp = xmalloc(tlen + 4 + 1);
           strlcpy(tmp, cp, tlen + 1);
           while ((tlen % 4) != 0) {
                   tmp[tlen++] = '=';
                   tmp[tlen] = '\0';
           }
           if ((b = sshbuf_new()) == NULL)
                   fatal("%s: sshbuf_new failed", __func__);
           if ((r = sshbuf_b64tod(b, tmp)) != 0)
                   fatal("%s:%lu: decode hash failed: %s", file, lnum, ssh_err(r));
           free(tmp);
           *lenp = sshbuf_len(b);
           *blobp = xmalloc(*lenp);
           memcpy(*blobp, sshbuf_ptr(b), *lenp);
           sshbuf_free(b);
   }
   
   static void
 update_krl_from_file(struct passwd *pw, const char *file, int wild_ca,  update_krl_from_file(struct passwd *pw, const char *file, int wild_ca,
     const struct sshkey *ca, struct ssh_krl *krl)      const struct sshkey *ca, struct ssh_krl *krl)
 {  {
         struct sshkey *key = NULL;          struct sshkey *key = NULL;
         u_long lnum = 0;          u_long lnum = 0;
         char *path, *cp, *ep, *line = NULL;          char *path, *cp, *ep, *line = NULL;
         size_t linesize = 0;          u_char *blob = NULL;
           size_t blen = 0, linesize = 0;
         unsigned long long serial, serial2;          unsigned long long serial, serial2;
         int i, was_explicit_key, was_sha1, r;          int i, was_explicit_key, was_sha1, was_sha256, was_hash, r;
         FILE *krl_spec;          FILE *krl_spec;
   
         path = tilde_expand_filename(file, pw->pw_uid);          path = tilde_expand_filename(file, pw->pw_uid);
Line 2087 
Line 2154 
                 printf("Revoking from %s\n", path);                  printf("Revoking from %s\n", path);
         while (getline(&line, &linesize, krl_spec) != -1) {          while (getline(&line, &linesize, krl_spec) != -1) {
                 lnum++;                  lnum++;
                 was_explicit_key = was_sha1 = 0;                  was_explicit_key = was_sha1 = was_sha256 = was_hash = 0;
                 cp = line + strspn(line, " \t");                  cp = line + strspn(line, " \t");
                 /* Trim trailing space, comments and strip \n */                  /* Trim trailing space, comments and strip \n */
                 for (i = 0, r = -1; cp[i] != '\0'; i++) {                  for (i = 0, r = -1; cp[i] != '\0'; i++) {
Line 2152 
Line 2219 
                         cp = cp + strspn(cp, " \t");                          cp = cp + strspn(cp, " \t");
                         if (ssh_krl_revoke_cert_by_key_id(krl, ca, cp) != 0)                          if (ssh_krl_revoke_cert_by_key_id(krl, ca, cp) != 0)
                                 fatal("%s: revoke key ID failed", __func__);                                  fatal("%s: revoke key ID failed", __func__);
                   } else if (strncasecmp(cp, "hash:", 5) == 0) {
                           cp += 5;
                           cp = cp + strspn(cp, " \t");
                           hash_to_blob(cp, &blob, &blen, file, lnum);
                           r = ssh_krl_revoke_key_sha256(krl, blob, blen);
                 } else {                  } else {
                         if (strncasecmp(cp, "key:", 4) == 0) {                          if (strncasecmp(cp, "key:", 4) == 0) {
                                 cp += 4;                                  cp += 4;
Line 2161 
Line 2233 
                                 cp += 5;                                  cp += 5;
                                 cp = cp + strspn(cp, " \t");                                  cp = cp + strspn(cp, " \t");
                                 was_sha1 = 1;                                  was_sha1 = 1;
                         } else {                          } else if (strncasecmp(cp, "sha256:", 7) == 0) {
                                   cp += 7;
                                   cp = cp + strspn(cp, " \t");
                                   was_sha256 = 1;
                                 /*                                  /*
                                  * Just try to process the line as a key.                                   * Just try to process the line as a key.
                                  * Parsing will fail if it isn't.                                   * Parsing will fail if it isn't.
Line 2174 
Line 2249 
                                     path, lnum, ssh_err(r));                                      path, lnum, ssh_err(r));
                         if (was_explicit_key)                          if (was_explicit_key)
                                 r = ssh_krl_revoke_key_explicit(krl, key);                                  r = ssh_krl_revoke_key_explicit(krl, key);
                         else if (was_sha1)                          else if (was_sha1) {
                                 r = ssh_krl_revoke_key_sha1(krl, key);                                  if (sshkey_fingerprint_raw(key,
                         else                                      SSH_DIGEST_SHA1, &blob, &blen) != 0) {
                                           fatal("%s:%lu: fingerprint failed",
                                               file, lnum);
                                   }
                                   r = ssh_krl_revoke_key_sha1(krl, blob, blen);
                           } else if (was_sha256) {
                                   if (sshkey_fingerprint_raw(key,
                                       SSH_DIGEST_SHA256, &blob, &blen) != 0) {
                                           fatal("%s:%lu: fingerprint failed",
                                               file, lnum);
                                   }
                                   r = ssh_krl_revoke_key_sha256(krl, blob, blen);
                           } else
                                 r = ssh_krl_revoke_key(krl, key);                                  r = ssh_krl_revoke_key(krl, key);
                         if (r != 0)                          if (r != 0)
                                 fatal("%s: revoke key failed: %s",                                  fatal("%s: revoke key failed: %s",
                                     __func__, ssh_err(r));                                      __func__, ssh_err(r));
                           freezero(blob, blen);
                           blob = NULL;
                           blen = 0;
                         sshkey_free(key);                          sshkey_free(key);
                 }                  }
         }          }

Legend:
Removed from v.1.319  
changed lines
  Added in v.1.321