]> andersk Git - openssh.git/blobdiff - ssh-dss.c
- jakob@cvs.openbsd.org 2001/07/31 09:28:44
[openssh.git] / ssh-dss.c
index 96b1565d232a9f0131ed8e2fcd78954fbaa9796c..5cf0076672bc832fc243b2c584d81919e0a84844 100644 (file)
--- a/ssh-dss.c
+++ b/ssh-dss.c
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: ssh-dss.c,v 1.2 2000/12/19 23:17:58 markus Exp $");
+RCSID("$OpenBSD: ssh-dss.c,v 1.7 2001/06/06 23:13:54 markus Exp $");
+
+#include <openssl/bn.h>
+#include <openssl/evp.h>
 
-#include "ssh.h"
 #include "xmalloc.h"
 #include "buffer.h"
 #include "bufaux.h"
 #include "compat.h"
-
-#include <openssl/bn.h>
-#include <openssl/rsa.h>
-#include <openssl/dsa.h>
-#include <openssl/evp.h>
-
+#include "log.h"
 #include "key.h"
+#include "ssh-dss.h"
 
 #define INTBLOB_LEN    20
 #define SIGBLOB_LEN    (2*INTBLOB_LEN)
@@ -47,29 +45,30 @@ ssh_dss_sign(
     u_char **sigp, int *lenp,
     u_char *data, int datalen)
 {
-       u_char *digest;
-       u_char *ret;
        DSA_SIG *sig;
        EVP_MD *evp_md = EVP_sha1();
        EVP_MD_CTX md;
-       u_int rlen;
-       u_int slen;
-       u_int len;
-       u_char sigblob[SIGBLOB_LEN];
+       u_char *digest, *ret, sigblob[SIGBLOB_LEN];
+       u_int rlen, slen, len, dlen;
        Buffer b;
 
        if (key == NULL || key->type != KEY_DSA || key->dsa == NULL) {
                error("ssh_dss_sign: no DSA key");
                return -1;
        }
-       digest = xmalloc(evp_md->md_size);
+       dlen = evp_md->md_size;
+       digest = xmalloc(dlen);
        EVP_DigestInit(&md, evp_md);
        EVP_DigestUpdate(&md, data, datalen);
        EVP_DigestFinal(&md, digest, NULL);
 
-       sig = DSA_do_sign(digest, evp_md->md_size, key->dsa);
+       sig = DSA_do_sign(digest, dlen, key->dsa);
+
+       memset(digest, 0, dlen);
+       xfree(digest);
        if (sig == NULL) {
-               fatal("ssh_dss_sign: cannot sign");
+               error("ssh_dss_sign: sign failed");
+               return -1;
        }
 
        rlen = BN_num_bytes(sig->r);
@@ -79,15 +78,12 @@ ssh_dss_sign(
                DSA_SIG_free(sig);
                return -1;
        }
-       debug("sig size %d %d", rlen, slen);
-
        memset(sigblob, 0, SIGBLOB_LEN);
        BN_bn2bin(sig->r, sigblob+ SIGBLOB_LEN - INTBLOB_LEN - rlen);
        BN_bn2bin(sig->s, sigblob+ SIGBLOB_LEN - slen);
        DSA_SIG_free(sig);
 
        if (datafellows & SSH_BUG_SIGBLOB) {
-               debug("datafellows");
                ret = xmalloc(SIGBLOB_LEN);
                memcpy(ret, sigblob, SIGBLOB_LEN);
                if (lenp != NULL)
@@ -116,34 +112,19 @@ ssh_dss_verify(
     u_char *signature, int signaturelen,
     u_char *data, int datalen)
 {
-       Buffer b;
-       u_char *digest;
        DSA_SIG *sig;
        EVP_MD *evp_md = EVP_sha1();
        EVP_MD_CTX md;
-       u_char *sigblob;
-       char *txt;
+       u_char *digest, *sigblob;
        u_int len, dlen;
-       int rlen;
-       int ret;
+       int rlen, ret;
+       Buffer b;
 
        if (key == NULL || key->type != KEY_DSA || key->dsa == NULL) {
                error("ssh_dss_verify: no DSA key");
                return -1;
        }
 
-       if (!(datafellows & SSH_BUG_SIGBLOB) &&
-           signaturelen == SIGBLOB_LEN) {
-               datafellows |= ~SSH_BUG_SIGBLOB;
-               log("autodetect SSH_BUG_SIGBLOB");
-       } else if ((datafellows & SSH_BUG_SIGBLOB) &&
-           signaturelen != SIGBLOB_LEN) {
-               log("autoremove SSH_BUG_SIGBLOB");
-               datafellows &= ~SSH_BUG_SIGBLOB;
-       }
-
-       debug("len %d datafellows %d", signaturelen, datafellows);
-
        /* fetch signature */
        if (datafellows & SSH_BUG_SIGBLOB) {
                sigblob = signature;
@@ -185,7 +166,7 @@ ssh_dss_verify(
                memset(sigblob, 0, len);
                xfree(sigblob);
        }
-       
+
        /* sha1 the data */
        dlen = evp_md->md_size;
        digest = xmalloc(dlen);
@@ -199,18 +180,7 @@ ssh_dss_verify(
        xfree(digest);
        DSA_SIG_free(sig);
 
-       switch (ret) {
-       case 1:
-               txt = "correct";
-               break;
-       case 0:
-               txt = "incorrect";
-               break;
-       case -1:
-       default:
-               txt = "error";
-               break;
-       }
-       debug("ssh_dss_verify: signature %s", txt);
+       debug("ssh_dss_verify: signature %s",
+           ret == 1 ? "correct" : ret == 0 ? "incorrect" : "error");
        return ret;
 }
This page took 0.037247 seconds and 4 git commands to generate.