diff dsa_sign_hash.c @ 143:5d99163f7e32 libtomcrypt-orig

import of libtomcrypt 0.99
author Matt Johnston <matt@ucc.asn.au>
date Sun, 19 Dec 2004 11:34:45 +0000
parents 7faae8f46238
children
line wrap: on
line diff
--- a/dsa_sign_hash.c	Tue Jun 15 14:07:21 2004 +0000
+++ b/dsa_sign_hash.c	Sun Dec 19 11:34:45 2004 +0000
@@ -16,11 +16,10 @@
                         unsigned char *out, unsigned long *outlen,
                         prng_state *prng, int wprng, dsa_key *key)
 {
-   mp_int k, kinv, tmp, r, s;
-   unsigned char buf[512];
-   int err, y;
-   unsigned long len;
-
+   mp_int         k, kinv, tmp, r, s;
+   unsigned char *buf;
+   int            err, y;
+   unsigned long  len;
 
    _ARGCHK(in     != NULL);
    _ARGCHK(out    != NULL);
@@ -35,10 +34,15 @@
    }
 
    /* check group order size  */
-   if (key->qord >= (int)sizeof(buf)) {
+   if (key->qord >= MDSA_MAX_GROUP) {
       return CRYPT_INVALID_ARG;
    }
 
+   buf = XMALLOC(MDSA_MAX_GROUP);
+   if (buf == NULL) {
+      return CRYPT_MEM;
+   }
+
    /* Init our temps */
    if ((err = mp_init_multi(&k, &kinv, &r, &s, &tmp, NULL)) != MP_OKAY)               { goto error; }
 
@@ -48,7 +52,7 @@
       /* gen random k */
       if (prng_descriptor[wprng].read(buf, key->qord, prng) != (unsigned long)key->qord) {
          err = CRYPT_ERROR_READPRNG;
-         goto done;
+         goto __ERR;
       }
 
       /* read k */
@@ -83,7 +87,7 @@
    /* first check that we have enough room */
    if (*outlen < (unsigned long)(PACKET_SIZE + 4 + mp_unsigned_bin_size(&s) + mp_unsigned_bin_size(&r))) {
       err = CRYPT_BUFFER_OVERFLOW;
-      goto done;
+      goto __ERR;
    }
 
    /* packet header */
@@ -112,13 +116,16 @@
    *outlen = y;
 
    err = CRYPT_OK;
-   goto done;
+   goto __ERR;
 
-error : err = mpi_to_ltc_error(err);
-done  : mp_clear_multi(&k, &kinv, &r, &s, &tmp, NULL);
+error: 
+   err = mpi_to_ltc_error(err);
+__ERR: 
+   mp_clear_multi(&k, &kinv, &r, &s, &tmp, NULL);
 #ifdef CLEAN_STACK
-   zeromem(buf, sizeof(buf));
+   zeromem(buf, MDSA_MAX_GROUP);
 #endif
+   XFREE(buf);
    return err;
 }