elgamal.c 898 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. #include "config.h"
  2. #include <gmp.h>
  3. #include "elgamal.h"
  4. #include "entropy.h"
  5. #include "hss.h"
  6. elgamal_key_t elgamal_keygen()
  7. {
  8. elgamal_key_t rop;
  9. mpz_init(rop.sk);
  10. mpz_init_set_ui(rop.pk, 2);
  11. mpz_urandomm(rop.sk, _rstate, q);
  12. mpz_powm(rop.pk, rop.pk, rop.sk, p);
  13. return rop;
  14. }
  15. elgamal_cipher_t elgamal_encrypt(elgamal_key_t k, const mpz_t m)
  16. {
  17. mpz_t x;
  18. elgamal_cipher_t rop;
  19. mpz_init(x);
  20. mpz_urandomm(x, _rstate, q);
  21. mpz_init_set_ui(rop.c1, 2);
  22. mpz_powm(rop.c1, rop.c1, x, p);
  23. mpz_init_set(rop.c2, k.pk);
  24. mpz_powm(rop.c2, rop.c2, x, p);
  25. mpz_set_ui(x, 2);
  26. mpz_powm(x, x, m, p);
  27. mpz_mul(rop.c2, rop.c2, x);
  28. mpz_mod(rop.c2, rop.c2, p);
  29. mpz_clear(x);
  30. return rop;
  31. }
  32. void elgamal_decrypt(mpz_t rop, elgamal_key_t k, elgamal_cipher_t c)
  33. {
  34. mpz_powm(rop, c.c1, k.sk, p);
  35. mpz_invert(rop, rop, p);
  36. mpz_mul(rop, rop, c.c2);
  37. mpz_mod(rop, rop, p);
  38. }