/* -*-c-*-
*
- * $Id: dsa-verify.c,v 1.1 1999/11/19 19:28:00 mdw Exp $
+ * $Id: dsa-verify.c,v 1.3 1999/12/10 23:18:38 mdw Exp $
*
* DSA signature verification
*
/*----- 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.
+ *
* Revision 1.1 1999/11/19 19:28:00 mdw
* Implementation of the Digital Signature Algorithm.
*
/* --- @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.
*/
-#define SHOW(x) do { fputs(#x " = ", stdout); mp_writefile(x, stdout, 16); fputc('\n', stdout); } while (0)
-
-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;
/* --- 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);
}
/* --- 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);
/* --- @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
* 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)
mp_drop(dp.q);
mp_drop(dp.g);
mp_drop(y);
+ assert(mparena_count(MPARENA_GLOBAL) == 0);
return (ok);
}