Subversion Repositories planix.SVN

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}