Make flags be macros rather than enumerations, to ensure that they're
[u/mdw/catacomb] / dsig.c
diff --git a/dsig.c b/dsig.c
index 32b5ea5..a34cca2 100644 (file)
--- a/dsig.c
+++ b/dsig.c
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: dsig.c,v 1.2 2000/07/01 11:27:22 mdw Exp $
+ * $Id: dsig.c,v 1.6 2000/12/06 20:33:27 mdw Exp $
  *
  * Verify signatures on distribuitions of files
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: dsig.c,v $
+ * Revision 1.6  2000/12/06 20:33:27  mdw
+ * Make flags be macros rather than enumerations, to ensure that they're
+ * unsigned.
+ *
+ * Revision 1.5  2000/10/08 12:12:09  mdw
+ * Shut up some warnings.
+ *
+ * Revision 1.4  2000/08/04 23:23:44  mdw
+ * Various <ctype.h> fixes.
+ *
+ * Revision 1.3  2000/07/15 20:53:23  mdw
+ * More hash functions.  Bug fix in getstring.
+ *
  * Revision 1.2  2000/07/01 11:27:22  mdw
  * Use new PKCS#1 padding functions rather than rolling by hand.
  *
 #include <mLib/report.h>
 #include <mLib/sub.h>
 
-#include "dsa.h"
 #include "getdate.h"
 #include "grand.h"
 #include "ghash.h"
 #include "key.h"
 #include "key-data.h"
-#include "md5.h"
 #include "noise.h"
+
+#include "dsa.h"
+#include "rsa.h"
 #include "pkcs1.h"
+
+#include "md4.h"
+#include "md5.h"
+#include "rmd128.h"
 #include "rmd160.h"
-#include "rsa.h"
+#include "rmd256.h"
+#include "rmd320.h"
 #include "sha.h"
+#include "tiger.h"
 
 /*----- Digital signature algorithm ---------------------------------------*/
 
@@ -85,8 +105,10 @@ static int dsasign(key *k, const void *m, size_t msz, dstr *d)
     return (e);
   }
   sz = mp_octets(dp.dp.q);
+  if (sz < msz)
+    die(EXIT_FAILURE, "hash function too wide for this signing key");
   DENSURE(d, sz * 2);
-  p = d->buf + d->len;
+  p = (octet *)d->buf + d->len;
   rand_get(RAND_GLOBAL, p, sz);
   dsa_sign(&dp.dp, dp.x, m, msz, p, sz, p, sz, p + sz, sz);
   d->len += sz * 2;
@@ -101,6 +123,7 @@ static int dsaverify(key *k, const void *m, size_t msz,
   key_packstruct ks[DSA_PUBFETCHSZ];
   key_packdef *kp;
   size_t sz;
+  const octet *p = s;
   int e;
 
   kp = key_fetchinit(dsa_pubfetch, ks, &dp);
@@ -109,7 +132,7 @@ static int dsaverify(key *k, const void *m, size_t msz,
     return (e);
   }
   sz = ssz / 2;
-  e = dsa_verify(&dp.dp, dp.y, m, msz, s, sz, s + sz, sz);
+  e = dsa_verify(&dp.dp, dp.y, m, msz, p, sz, p + sz, sz);
   key_fetchdone(kp);
   return (e);  
 }
@@ -175,7 +198,8 @@ typedef struct sig {
                const void */*s*/, size_t /*ssz*/);
 } sig;
 
-static const gchash *hashtab[] = { &rmd160, &sha, &md5, 0 };
+static const gchash *hashtab[] = {
+  &rmd160, &tiger, &sha, &rmd128, &rmd256, &rmd320, &md5, &md4, 0 };
 static sig sigtab[] = {
   { "dsa", "dsig-dsa", dsasign, dsaverify },
   { "rsa", "dsig-rsa", rsasign, rsaverify },
@@ -333,7 +357,7 @@ static int getstring(FILE *fp, dstr *d, unsigned raw)
 
 again:
   ch = getc(fp);
-  while (isspace((unsigned char)ch))
+  while (isspace(ch))
     ch = getc(fp);
   if (ch == '#') {
     do ch = getc(fp); while (ch != '\n' && ch != EOF);
@@ -365,7 +389,7 @@ again:
       if (ch == EOF)
        break;
       switch (ch) {
-       case 'a': ch = '\n'; break;
+       case 'a': ch = '\a'; break;
        case 'b': ch = '\b'; break;
        case 'f': ch = '\f'; break;
        case 'n': ch = '\n'; break;
@@ -374,6 +398,7 @@ again:
        case 'v': ch = '\v'; break;
       }
       DPUTC(d, ch);
+      ch = getc(fp);
       continue;
     }
 
@@ -799,14 +824,14 @@ static void keyreport(const char *file, int line, const char *err, void *p)
  *
  * Arguments:  @const gchash *c@ = pointer to hash class
  *             @const char *file@ = file to hash
- *             @octet *b@ = pointer to output buffer
+ *             @void *b@ = pointer to output buffer
  *
  * Returns:    Zero if it worked, or nonzero for a system error.
  *
  * Use:                Hashes a file.
  */
 
-static int fhash(const gchash *c, const char *file, octet *b)
+static int fhash(const gchash *c, const char *file, void *b)
 {
   FILE *fp = fopen(file, "rb");
   ghash *h = c->init();
@@ -855,11 +880,9 @@ static void fhex(FILE *fp, const void *p, size_t sz)
 
 static int sign(int argc, char *argv[])
 {
-  enum {
-    f_raw = 1,
-    f_bin = 2,
-    f_bogus = 4
-  };
+#define f_raw 1u
+#define f_bin 2u
+#define f_bogus 4u
 
   unsigned f = 0;
   const char *kt = 0;
@@ -1097,17 +1120,19 @@ static int sign(int argc, char *argv[])
   if (f & f_bogus)
     die(EXIT_FAILURE, "error(s) occurred while creating signature");
   return (EXIT_SUCCESS);
+
+#undef f_raw
+#undef f_bin
+#undef f_bogus
 }
 
 /*----- Signature verification --------------------------------------------*/
 
 static int verify(int argc, char *argv[])
 {
-  enum {
-    f_bogus = 1,
-    f_bin = 2,
-    f_ok = 4
-  };
+#define f_bogus 1u
+#define f_bin 2u
+#define f_ok 4u
 
   unsigned f = 0;
   unsigned verb = 1;
@@ -1116,7 +1141,7 @@ static int verify(int argc, char *argv[])
   sig *s = sigtab;
   const gchash *gch = &rmd160;
   dstr d = DSTR_INIT;
-  ghash *h;
+  ghash *h = 0;
   FILE *fp;
   block b;
   int e;
@@ -1326,6 +1351,10 @@ done:
       puts("OK signature verified");
   }
   return (f & f_bogus ? EXIT_FAILURE : EXIT_SUCCESS);
+
+#undef f_bogus
+#undef f_bin
+#undef f_ok
 }
 
 /*----- Main code ---------------------------------------------------------*/
@@ -1388,9 +1417,7 @@ int main(int argc, char *argv[])
   cmd *c = 0, *cc = 0;
   size_t n;
 
-  enum {
-    f_bogus = 1
-  };
+#define f_bogus 1u
 
   /* --- Initialize the library --- */
 
@@ -1458,6 +1485,8 @@ int main(int argc, char *argv[])
   if (!cc)
     die(EXIT_FAILURE, "unknown command `%s'", argv[0]);
   return (cc->func(argc, argv));
+
+#undef f_bogus
 }
 
 /*----- That's all, folks -------------------------------------------------*/