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