egsign.c 807 B

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. #include "os.h"
  2. #include <mp.h>
  3. #include <libsec.h>
  4. EGsig*
  5. egsign(EGpriv *priv, mpint *m)
  6. {
  7. EGpub *pub = &priv->pub;
  8. EGsig *sig;
  9. mpint *pm1, *k, *kinv, *r, *s;
  10. mpint *p = pub->p, *alpha = pub->alpha;
  11. int plen = mpsignif(p);
  12. pm1 = mpnew(0);
  13. kinv = mpnew(0);
  14. r = mpnew(0);
  15. s = mpnew(0);
  16. k = mpnew(0);
  17. mpsub(p, mpone, pm1);
  18. while(1){
  19. mprand(plen, genrandom, k);
  20. if((mpcmp(mpone, k) > 0) || (mpcmp(k, pm1) >= 0))
  21. continue;
  22. mpextendedgcd(k, pm1, r, kinv, s);
  23. if(mpcmp(r, mpone) != 0)
  24. continue;
  25. break;
  26. }
  27. mpmod(kinv, pm1, kinv); // make kinv positive
  28. mpexp(alpha, k, p, r);
  29. mpmul(priv->secret, r, s);
  30. mpmod(s, pm1, s);
  31. mpsub(m, s, s);
  32. mpmul(kinv, s, s);
  33. mpmod(s, pm1, s);
  34. sig = egsigalloc();
  35. sig->r = r;
  36. sig->s = s;
  37. mpfree(pm1);
  38. mpfree(k);
  39. mpfree(kinv);
  40. return sig;
  41. }