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

Diff for /src/usr.bin/ssh/ssh-dss.c between version 1.8.2.1 and 1.8.2.2

version 1.8.2.1, 2001/11/14 03:24:39 version 1.8.2.2, 2002/03/07 17:37:47
Line 42 
Line 42 
 int  int
 ssh_dss_sign(  ssh_dss_sign(
     Key *key,      Key *key,
     u_char **sigp, int *lenp,      u_char **sigp, u_int *lenp,
     u_char *data, int datalen)      u_char *data, u_int datalen)
 {  {
         DSA_SIG *sig;          DSA_SIG *sig;
         EVP_MD *evp_md = EVP_sha1();          const EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
         u_char *digest, *ret, sigblob[SIGBLOB_LEN];          u_char *ret, digest[EVP_MAX_MD_SIZE], sigblob[SIGBLOB_LEN];
         u_int rlen, slen, len, dlen;          u_int rlen, slen, len, dlen;
         Buffer b;          Buffer b;
   
Line 56 
Line 56 
                 error("ssh_dss_sign: no DSA key");                  error("ssh_dss_sign: no DSA key");
                 return -1;                  return -1;
         }          }
         dlen = evp_md->md_size;  
         digest = xmalloc(dlen);  
         EVP_DigestInit(&md, evp_md);          EVP_DigestInit(&md, evp_md);
         EVP_DigestUpdate(&md, data, datalen);          EVP_DigestUpdate(&md, data, datalen);
         EVP_DigestFinal(&md, digest, NULL);          EVP_DigestFinal(&md, digest, &dlen);
   
         sig = DSA_do_sign(digest, dlen, key->dsa);          sig = DSA_do_sign(digest, dlen, key->dsa);
           memset(digest, 'd', sizeof(digest));
   
         memset(digest, 0, dlen);  
         xfree(digest);  
         if (sig == NULL) {          if (sig == NULL) {
                 error("ssh_dss_sign: sign failed");                  error("ssh_dss_sign: sign failed");
                 return -1;                  return -1;
Line 109 
Line 106 
 int  int
 ssh_dss_verify(  ssh_dss_verify(
     Key *key,      Key *key,
     u_char *signature, int signaturelen,      u_char *signature, u_int signaturelen,
     u_char *data, int datalen)      u_char *data, u_int datalen)
 {  {
         DSA_SIG *sig;          DSA_SIG *sig;
         EVP_MD *evp_md = EVP_sha1();          const EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
         u_char *digest, *sigblob;          u_char digest[EVP_MAX_MD_SIZE], *sigblob;
         u_int len, dlen;          u_int len, dlen;
         int rlen, ret;          int rlen, ret;
         Buffer b;          Buffer b;
Line 145 
Line 142 
                 sigblob = buffer_get_string(&b, &len);                  sigblob = buffer_get_string(&b, &len);
                 rlen = buffer_len(&b);                  rlen = buffer_len(&b);
                 buffer_free(&b);                  buffer_free(&b);
                 if(rlen != 0) {                  if (rlen != 0) {
                         error("ssh_dss_verify: "                          error("ssh_dss_verify: "
                             "remaining bytes in signature %d", rlen);                              "remaining bytes in signature %d", rlen);
                         xfree(sigblob);                          xfree(sigblob);
Line 158 
Line 155 
         }          }
   
         /* parse signature */          /* parse signature */
         sig = DSA_SIG_new();          if ((sig = DSA_SIG_new()) == NULL)
         sig->r = BN_new();                  fatal("ssh_dss_verify: DSA_SIG_new failed");
         sig->s = BN_new();          if ((sig->r = BN_new()) == NULL)
                   fatal("ssh_dss_verify: BN_new failed");
           if ((sig->s = BN_new()) == NULL)
                   fatal("ssh_dss_verify: BN_new failed");
         BN_bin2bn(sigblob, INTBLOB_LEN, sig->r);          BN_bin2bn(sigblob, INTBLOB_LEN, sig->r);
         BN_bin2bn(sigblob+ INTBLOB_LEN, INTBLOB_LEN, sig->s);          BN_bin2bn(sigblob+ INTBLOB_LEN, INTBLOB_LEN, sig->s);
   
Line 170 
Line 170 
         }          }
   
         /* sha1 the data */          /* sha1 the data */
         dlen = evp_md->md_size;  
         digest = xmalloc(dlen);  
         EVP_DigestInit(&md, evp_md);          EVP_DigestInit(&md, evp_md);
         EVP_DigestUpdate(&md, data, datalen);          EVP_DigestUpdate(&md, data, datalen);
         EVP_DigestFinal(&md, digest, NULL);          EVP_DigestFinal(&md, digest, &dlen);
   
         ret = DSA_do_verify(digest, dlen, sig, key->dsa);          ret = DSA_do_verify(digest, dlen, sig, key->dsa);
           memset(digest, 'd', sizeof(digest));
   
         memset(digest, 0, dlen);  
         xfree(digest);  
         DSA_SIG_free(sig);          DSA_SIG_free(sig);
   
         debug("ssh_dss_verify: signature %s",          debug("ssh_dss_verify: signature %s",

Legend:
Removed from v.1.8.2.1  
changed lines
  Added in v.1.8.2.2