From 0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4 Mon Sep 17 00:00:00 2001 From: rsc Date: Sun, 21 Mar 2004 14:04:56 +0000 Subject: Add most of libsec. --- src/libsec/port/dsaverify.c | 46 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 src/libsec/port/dsaverify.c (limited to 'src/libsec/port/dsaverify.c') diff --git a/src/libsec/port/dsaverify.c b/src/libsec/port/dsaverify.c new file mode 100644 index 00000000..70e7f3cb --- /dev/null +++ b/src/libsec/port/dsaverify.c @@ -0,0 +1,46 @@ +#include "os.h" +#include +#include + +int +dsaverify(DSApub *pub, DSAsig *sig, mpint *m) +{ + int rv = -1; + mpint *u1, *u2, *v, *sinv; + + if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0) + return rv; + if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0) + return rv; + u1 = mpnew(0); + u2 = mpnew(0); + v = mpnew(0); + sinv = mpnew(0); + + // find (s**-1) mod q, make sure it exists + mpextendedgcd(sig->s, pub->q, u1, sinv, v); + if(mpcmp(u1, mpone) != 0) + goto out; + + // u1 = (sinv * m) mod q, u2 = (r * sinv) mod q + mpmul(sinv, m, u1); + mpmod(u1, pub->q, u1); + mpmul(sig->r, sinv, u2); + mpmod(u2, pub->q, u2); + + // v = (((alpha**u1)*(key**u2)) mod p) mod q + mpexp(pub->alpha, u1, pub->p, sinv); + mpexp(pub->key, u2, pub->p, v); + mpmul(sinv, v, v); + mpmod(v, pub->p, v); + mpmod(v, pub->q, v); + + if(mpcmp(v, sig->r) == 0) + rv = 0; +out: + mpfree(v); + mpfree(u1); + mpfree(u2); + mpfree(sinv); + return rv; +} -- cgit v1.2.3