Major memory management overhaul. Added arena support. Use the secure
[u/mdw/catacomb] / dsa-verify.c
index 4b931bf..7a1dc11 100644 (file)
@@ -1,6 +1,6 @@
 /* -*-c-*-
  *
- * $Id: dsa-verify.c,v 1.2 1999/11/23 00:20:04 mdw Exp $
+ * $Id: dsa-verify.c,v 1.4 2000/06/17 10:53:35 mdw Exp $
  *
  * DSA signature verification
  *
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: dsa-verify.c,v $
+ * Revision 1.4  2000/06/17 10:53:35  mdw
+ * Typesetting fixes.
+ *
+ * Revision 1.3  1999/12/10 23:18:38  mdw
+ * Change interface for suggested destinations.
+ *
  * Revision 1.2  1999/11/23 00:20:04  mdw
  * Remove stray debugging code.
  *
 /* --- @dsa_vrfy@ --- *
  *
  * Arguments:  @const dsa_param *dp@ = pointer to DSA parameters
- *             @const mp *y@ = public verification key
- *             @const mp *m@ = message which was signed
- *             @const mp *r, *s@ = the signature
+ *             @mp *y@ = public verification key
+ *             @mp *m@ = message which was signed
+ *             @mp *r, *s@ = the signature
  *
  * Returns:    Zero if the signature is a forgery, nonzero if it's valid.
  *
  * Use:                Verifies a DSA digital signature.
  */
 
-int dsa_vrfy(const dsa_param *dp, const mp *y,
-            const mp *m, const mp *r, const mp *s)
+int dsa_vrfy(const dsa_param *dp, mp *y, mp *m, mp *r, mp *s)
 {
   mpmont pm, qm;
   mp *w;
@@ -81,13 +86,13 @@ int dsa_vrfy(const dsa_param *dp, const mp *y,
   /* --- Compute %$w = s^{-1} \bmod q$% --- */
 
   {
-    mp *z;
-    mp_gcd(0, 0, &z, dp->q, (mp *)s);
+    mp *z = MP_NEW;
+    mp_gcd(0, 0, &z, dp->q, s);
     w = mpmont_mul(&qm, MP_NEW, z, qm.r2);
     mp_drop(z);
   }
 
-  /* --- Compute %$wr%$ and %$wm$% --- */
+  /* --- Compute %$wr$% and %$wm$% --- */
 
   f[0].exp = mpmont_mul(&qm, MP_NEW, w, m);
   f[1].exp = mpmont_mul(&qm, MP_NEW, w, r);
@@ -97,8 +102,8 @@ int dsa_vrfy(const dsa_param *dp, const mp *y,
   /* --- Do the exponentiation and take residue mod @q@ --- */
 
   f[0].base = dp->g;
-  f[1].base = (mp *)y;
-  w = mpmont_mexp(&pm, f, 2);
+  f[1].base = y;
+  w = mpmont_mexp(&pm, MP_NEW, f, 2);
   mp_div(0, &w, w, dp->q);
   ok = MP_CMP(w, ==, r);
 
@@ -114,7 +119,7 @@ int dsa_vrfy(const dsa_param *dp, const mp *y,
 /* --- @dsa_verify@ --- *
  *
  * Arguments:  @const dsa_param *dp@ = pointer to DSA parameters
- *             @const mp *y@ = public verification key
+ *             @mp *y@ = public verification key
  *             @const void *m@ = pointer to message block
  *             @size_t msz@ = size of message block
  *             @const void *r@ = pointer to @r@ signature half
@@ -127,7 +132,7 @@ int dsa_vrfy(const dsa_param *dp, const mp *y,
  * Use:                Verifies a DSA digital signature.
  */
 
-int dsa_verify(const dsa_param *dp, const mp *y,
+int dsa_verify(const dsa_param *dp, mp *y,
               const void *m, size_t msz,
               const void *r, size_t rsz,
               const void *s, size_t ssz)
@@ -191,6 +196,7 @@ static int verify(int good, dstr *v)
   mp_drop(dp.q);
   mp_drop(dp.g);
   mp_drop(y);
+  assert(mparena_count(MPARENA_GLOBAL) == 0);
   return (ok);
 }