dsaverify.c 925 B

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