Blame


1 0fc65b37 2004-03-21 devnull #include "os.h"
2 0fc65b37 2004-03-21 devnull #include <mp.h>
3 0fc65b37 2004-03-21 devnull #include <libsec.h>
4 0fc65b37 2004-03-21 devnull
5 0fc65b37 2004-03-21 devnull int
6 0fc65b37 2004-03-21 devnull dsaverify(DSApub *pub, DSAsig *sig, mpint *m)
7 0fc65b37 2004-03-21 devnull {
8 0fc65b37 2004-03-21 devnull int rv = -1;
9 0fc65b37 2004-03-21 devnull mpint *u1, *u2, *v, *sinv;
10 0fc65b37 2004-03-21 devnull
11 0fc65b37 2004-03-21 devnull if(mpcmp(sig->r, mpone) < 0 || mpcmp(sig->r, pub->q) >= 0)
12 0fc65b37 2004-03-21 devnull return rv;
13 0fc65b37 2004-03-21 devnull if(mpcmp(sig->s, mpone) < 0 || mpcmp(sig->s, pub->q) >= 0)
14 0fc65b37 2004-03-21 devnull return rv;
15 0fc65b37 2004-03-21 devnull u1 = mpnew(0);
16 0fc65b37 2004-03-21 devnull u2 = mpnew(0);
17 0fc65b37 2004-03-21 devnull v = mpnew(0);
18 0fc65b37 2004-03-21 devnull sinv = mpnew(0);
19 0fc65b37 2004-03-21 devnull
20 cbeb0b26 2006-04-01 devnull /* find (s**-1) mod q, make sure it exists */
21 0fc65b37 2004-03-21 devnull mpextendedgcd(sig->s, pub->q, u1, sinv, v);
22 0fc65b37 2004-03-21 devnull if(mpcmp(u1, mpone) != 0)
23 0fc65b37 2004-03-21 devnull goto out;
24 0fc65b37 2004-03-21 devnull
25 cbeb0b26 2006-04-01 devnull /* u1 = (sinv * m) mod q, u2 = (r * sinv) mod q */
26 0fc65b37 2004-03-21 devnull mpmul(sinv, m, u1);
27 0fc65b37 2004-03-21 devnull mpmod(u1, pub->q, u1);
28 0fc65b37 2004-03-21 devnull mpmul(sig->r, sinv, u2);
29 0fc65b37 2004-03-21 devnull mpmod(u2, pub->q, u2);
30 0fc65b37 2004-03-21 devnull
31 cbeb0b26 2006-04-01 devnull /* v = (((alpha**u1)*(key**u2)) mod p) mod q */
32 0fc65b37 2004-03-21 devnull mpexp(pub->alpha, u1, pub->p, sinv);
33 0fc65b37 2004-03-21 devnull mpexp(pub->key, u2, pub->p, v);
34 0fc65b37 2004-03-21 devnull mpmul(sinv, v, v);
35 0fc65b37 2004-03-21 devnull mpmod(v, pub->p, v);
36 0fc65b37 2004-03-21 devnull mpmod(v, pub->q, v);
37 0fc65b37 2004-03-21 devnull
38 0fc65b37 2004-03-21 devnull if(mpcmp(v, sig->r) == 0)
39 0fc65b37 2004-03-21 devnull rv = 0;
40 0fc65b37 2004-03-21 devnull out:
41 0fc65b37 2004-03-21 devnull mpfree(v);
42 0fc65b37 2004-03-21 devnull mpfree(u1);
43 0fc65b37 2004-03-21 devnull mpfree(u2);
44 0fc65b37 2004-03-21 devnull mpfree(sinv);
45 0fc65b37 2004-03-21 devnull return rv;
46 0fc65b37 2004-03-21 devnull }