egdecrypt.c 564 B

12345678910111213141516171819202122232425262728
  1. #include "os.h"
  2. #include <mp.h>
  3. #include <libsec.h>
  4. mpint*
  5. egdecrypt(EGpriv *priv, mpint *in, mpint *out)
  6. {
  7. EGpub *pub = &priv->pub;
  8. mpint *gamma, *delta;
  9. mpint *p = pub->p;
  10. int plen = mpsignif(p)+1;
  11. int shift = ((plen+Dbits-1)/Dbits)*Dbits;
  12. if(out == nil)
  13. out = mpnew(0);
  14. gamma = mpnew(0);
  15. delta = mpnew(0);
  16. mpright(in, shift, gamma);
  17. mpleft(gamma, shift, delta);
  18. mpsub(in, delta, delta);
  19. mpexp(gamma, priv->secret, p, out);
  20. mpinvert(out, p, gamma);
  21. mpmul(gamma, delta, out);
  22. mpmod(out, p, out);
  23. mpfree(gamma);
  24. mpfree(delta);
  25. return out;
  26. }