[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.6.6.3 and 1.7

version 1.6.6.3, 2002/03/09 00:20:45 version 1.7, 2001/06/06 23:13:54
Line 42 
Line 42 
 int  int
 ssh_dss_sign(  ssh_dss_sign(
     Key *key,      Key *key,
     u_char **sigp, u_int *lenp,      u_char **sigp, int *lenp,
     u_char *data, u_int datalen)      u_char *data, int datalen)
 {  {
         DSA_SIG *sig;          DSA_SIG *sig;
         const EVP_MD *evp_md = EVP_sha1();          EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
         u_char *ret, digest[EVP_MAX_MD_SIZE], sigblob[SIGBLOB_LEN];          u_char *digest, *ret, 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, &dlen);          EVP_DigestFinal(&md, digest, NULL);
   
         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 106 
Line 109 
 int  int
 ssh_dss_verify(  ssh_dss_verify(
     Key *key,      Key *key,
     u_char *signature, u_int signaturelen,      u_char *signature, int signaturelen,
     u_char *data, u_int datalen)      u_char *data, int datalen)
 {  {
         DSA_SIG *sig;          DSA_SIG *sig;
         const EVP_MD *evp_md = EVP_sha1();          EVP_MD *evp_md = EVP_sha1();
         EVP_MD_CTX md;          EVP_MD_CTX md;
         u_char digest[EVP_MAX_MD_SIZE], *sigblob;          u_char *digest, *sigblob;
         u_int len, dlen;          u_int len, dlen;
         int rlen, ret;          int rlen, ret;
         Buffer b;          Buffer b;
Line 130 
Line 133 
                 /* ietf-drafts */                  /* ietf-drafts */
                 char *ktype;                  char *ktype;
                 buffer_init(&b);                  buffer_init(&b);
                 buffer_append(&b, signature, signaturelen);                  buffer_append(&b, (char *) signature, signaturelen);
                 ktype = buffer_get_string(&b, NULL);                  ktype = buffer_get_string(&b, NULL);
                 if (strcmp("ssh-dss", ktype) != 0) {                  if (strcmp("ssh-dss", ktype) != 0) {
                         error("ssh_dss_verify: cannot handle type %s", ktype);                          error("ssh_dss_verify: cannot handle type %s", ktype);
                         buffer_free(&b);                          buffer_free(&b);
                         xfree(ktype);  
                         return -1;                          return -1;
                 }                  }
                 xfree(ktype);                  sigblob = (u_char *)buffer_get_string(&b, &len);
                 sigblob = buffer_get_string(&b, &len);  
                 rlen = buffer_len(&b);                  rlen = buffer_len(&b);
                 buffer_free(&b);                  if(rlen != 0) {
                 if (rlen != 0) {                          error("remaining bytes in signature %d", rlen);
                         error("ssh_dss_verify: "                          buffer_free(&b);
                             "remaining bytes in signature %d", rlen);  
                         xfree(sigblob);  
                         return -1;                          return -1;
                 }                  }
                   buffer_free(&b);
                   xfree(ktype);
         }          }
   
         if (len != SIGBLOB_LEN) {          if (len != SIGBLOB_LEN) {
Line 155 
Line 156 
         }          }
   
         /* parse signature */          /* parse signature */
         if ((sig = DSA_SIG_new()) == NULL)          sig = DSA_SIG_new();
                 fatal("ssh_dss_verify: DSA_SIG_new failed");          sig->r = BN_new();
         if ((sig->r = BN_new()) == NULL)          sig->s = BN_new();
                 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 168 
         }          }
   
         /* 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, &dlen);          EVP_DigestFinal(&md, digest, NULL);
   
         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.6.6.3  
changed lines
  Added in v.1.7