/* -*-c-*-
*
- * $Id: dsa-verify.c,v 1.1 1999/11/19 19:28:00 mdw Exp $
+ * $Id: dsa-verify.c,v 1.7 2004/04/08 01:36:15 mdw Exp $
*
* DSA signature verification
*
* MA 02111-1307, USA.
*/
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: dsa-verify.c,v $
- * Revision 1.1 1999/11/19 19:28:00 mdw
- * Implementation of the Digital Signature Algorithm.
- *
- */
-
/*----- Header files ------------------------------------------------------*/
#include "dsa.h"
/* --- @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;
- mpmont_factor f[2];
+ mp_expfactor f[2];
int ok;
/* --- Ensure that all of the signature bits are in range --- */
/* --- Compute %$w = s^{-1} \bmod q$% --- */
{
- mp *z;
- mp_gcd(0, 0, &z, dp->q, (mp *)s);
+ mp *z = mp_modinv(MP_NEW, s, dp->q);
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);
/* --- 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);
+ ok = MP_EQ(w, r);
/* --- Tidy up --- */
/* --- @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);
}