Change interface for suggested destinations.
[u/mdw/catacomb] / dsa-verify.c
index 4b931bf..fee0dd3 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.3 1999/12/10 23:18:38 mdw Exp $
  *
  * DSA signature verification
  *
@@ -30,6 +30,9 @@
 /*----- Revision history --------------------------------------------------* 
  *
  * $Log: dsa-verify.c,v $
+ * 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,8 +83,8 @@ 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);
   }
@@ -97,8 +99,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 +116,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 +129,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 +193,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);
 }