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

Diff for /src/usr.bin/ssh/ssh-rsa.c between version 1.67 and 1.68

version 1.67, 2018/07/03 11:39:54 version 1.68, 2018/09/13 02:08:33
Line 99 
Line 99 
 }  }
   
 int  int
 ssh_rsa_generate_additional_parameters(struct sshkey *key)  ssh_rsa_complete_crt_parameters(struct sshkey *key, const BIGNUM *iqmp)
 {  {
         BIGNUM *aux = NULL;          const BIGNUM *rsa_p, *rsa_q, *rsa_d;
           BIGNUM *aux = NULL, *d_consttime = NULL;
           BIGNUM *rsa_dmq1 = NULL, *rsa_dmp1 = NULL, *rsa_iqmp = NULL;
         BN_CTX *ctx = NULL;          BN_CTX *ctx = NULL;
         BIGNUM d;  
         int r;          int r;
   
         if (key == NULL || key->rsa == NULL ||          if (key == NULL || key->rsa == NULL ||
             sshkey_type_plain(key->type) != KEY_RSA)              sshkey_type_plain(key->type) != KEY_RSA)
                 return SSH_ERR_INVALID_ARGUMENT;                  return SSH_ERR_INVALID_ARGUMENT;
   
           RSA_get0_key(key->rsa, NULL, NULL, &rsa_d);
           RSA_get0_factors(key->rsa, &rsa_p, &rsa_q);
   
         if ((ctx = BN_CTX_new()) == NULL)          if ((ctx = BN_CTX_new()) == NULL)
                 return SSH_ERR_ALLOC_FAIL;                  return SSH_ERR_ALLOC_FAIL;
         if ((aux = BN_new()) == NULL) {          if ((aux = BN_new()) == NULL ||
               (rsa_dmq1 = BN_new()) == NULL ||
               (rsa_dmp1 = BN_new()) == NULL)
                   return SSH_ERR_ALLOC_FAIL;
           if ((d_consttime = BN_dup(rsa_d)) == NULL ||
               (rsa_iqmp = BN_dup(iqmp)) == NULL) {
                 r = SSH_ERR_ALLOC_FAIL;                  r = SSH_ERR_ALLOC_FAIL;
                 goto out;                  goto out;
         }          }
         BN_set_flags(aux, BN_FLG_CONSTTIME);          BN_set_flags(aux, BN_FLG_CONSTTIME);
           BN_set_flags(d_consttime, BN_FLG_CONSTTIME);
   
         BN_init(&d);          if ((BN_sub(aux, rsa_q, BN_value_one()) == 0) ||
         BN_with_flags(&d, key->rsa->d, BN_FLG_CONSTTIME);              (BN_mod(rsa_dmq1, d_consttime, aux, ctx) == 0) ||
               (BN_sub(aux, rsa_p, BN_value_one()) == 0) ||
         if ((BN_sub(aux, key->rsa->q, BN_value_one()) == 0) ||              (BN_mod(rsa_dmp1, d_consttime, aux, ctx) == 0)) {
             (BN_mod(key->rsa->dmq1, &d, aux, ctx) == 0) ||  
             (BN_sub(aux, key->rsa->p, BN_value_one()) == 0) ||  
             (BN_mod(key->rsa->dmp1, &d, aux, ctx) == 0)) {  
                 r = SSH_ERR_LIBCRYPTO_ERROR;                  r = SSH_ERR_LIBCRYPTO_ERROR;
                 goto out;                  goto out;
         }          }
           if (!RSA_set0_crt_params(key->rsa, rsa_dmp1, rsa_dmq1, rsa_iqmp)) {
                   r = SSH_ERR_LIBCRYPTO_ERROR;
                   goto out;
           }
           rsa_dmp1 = rsa_dmq1 = rsa_iqmp = NULL; /* transferred */
           /* success */
         r = 0;          r = 0;
  out:   out:
         BN_clear_free(aux);          BN_clear_free(aux);
           BN_clear_free(d_consttime);
           BN_clear_free(rsa_dmp1);
           BN_clear_free(rsa_dmq1);
           BN_clear_free(rsa_iqmp);
         BN_CTX_free(ctx);          BN_CTX_free(ctx);
         return r;          return r;
 }  }
Line 140 
Line 157 
 ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,  ssh_rsa_sign(const struct sshkey *key, u_char **sigp, size_t *lenp,
     const u_char *data, size_t datalen, const char *alg_ident)      const u_char *data, size_t datalen, const char *alg_ident)
 {  {
           const BIGNUM *rsa_n;
         u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL;          u_char digest[SSH_DIGEST_MAX_LENGTH], *sig = NULL;
         size_t slen = 0;          size_t slen = 0;
         u_int dlen, len;          u_int dlen, len;
Line 158 
Line 176 
         if (key == NULL || key->rsa == NULL || hash_alg == -1 ||          if (key == NULL || key->rsa == NULL || hash_alg == -1 ||
             sshkey_type_plain(key->type) != KEY_RSA)              sshkey_type_plain(key->type) != KEY_RSA)
                 return SSH_ERR_INVALID_ARGUMENT;                  return SSH_ERR_INVALID_ARGUMENT;
         if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)          RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
           if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
                 return SSH_ERR_KEY_LENGTH;                  return SSH_ERR_KEY_LENGTH;
         slen = RSA_size(key->rsa);          slen = RSA_size(key->rsa);
         if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)          if (slen <= 0 || slen > SSHBUF_MAX_BIGNUM)
Line 220 
Line 239 
     const u_char *sig, size_t siglen, const u_char *data, size_t datalen,      const u_char *sig, size_t siglen, const u_char *data, size_t datalen,
     const char *alg)      const char *alg)
 {  {
           const BIGNUM *rsa_n;
         char *sigtype = NULL;          char *sigtype = NULL;
         int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;          int hash_alg, want_alg, ret = SSH_ERR_INTERNAL_ERROR;
         size_t len = 0, diff, modlen, dlen;          size_t len = 0, diff, modlen, dlen;
Line 230 
Line 250 
             sshkey_type_plain(key->type) != KEY_RSA ||              sshkey_type_plain(key->type) != KEY_RSA ||
             sig == NULL || siglen == 0)              sig == NULL || siglen == 0)
                 return SSH_ERR_INVALID_ARGUMENT;                  return SSH_ERR_INVALID_ARGUMENT;
         if (BN_num_bits(key->rsa->n) < SSH_RSA_MINIMUM_MODULUS_SIZE)          RSA_get0_key(key->rsa, &rsa_n, NULL, NULL);
           if (BN_num_bits(rsa_n) < SSH_RSA_MINIMUM_MODULUS_SIZE)
                 return SSH_ERR_KEY_LENGTH;                  return SSH_ERR_KEY_LENGTH;
   
         if ((b = sshbuf_from(sig, siglen)) == NULL)          if ((b = sshbuf_from(sig, siglen)) == NULL)

Legend:
Removed from v.1.67  
changed lines
  Added in v.1.68