plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

dsaverify.c (934B)


      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 }