ELGAMAL(2)                                             ELGAMAL(2)

          eggen, egencrypt, egdecrypt, egsign, egverify, egpuballoc,
          egpubfree, egprivalloc, egprivfree, egsigalloc, egsigfree,
          egprivtopub - elgamal encryption

          #include <u.h>
          #include <libc.h>
          #include <mp.h>
          #include <libsec.h>

          EGpriv*   eggen(int nlen, int nrep)

          mpint*    egencrypt(EGpub *k, mpint *in, mpint *out)

          mpint*    egdecrypt(EGpriv *k, mpint *in, mpint *out)

          EGsig*    egsign(EGpriv *k, mpint *m)

          int       egverify(EGpub *k, EGsig *sig, mpint *m)

          EGpub*    egpuballoc(void)

          void      egpubfree(EGpub*)

          EGpriv*   egprivalloc(void)

          void      egprivfree(EGpriv*)

          EGsig*    egsigalloc(void)

          void      egsigfree(EGsig*)

          EGpub*    egprivtopub(EGpriv*)

          Elgamal is a public key encryption and signature algorithm.
          The owner of a key publishes the public part of the key:
               struct EGpub
                    mpint     *p;  // modulus
                    mpint     *alpha;   // generator
                    mpint     *key;     // (encryption key) alpha**secret mod p
          This part can be used for encrypting data (with egencrypt)
          to be sent to the owner.  The owner decrypts (with
          egdecrypt) using his private key:
               struct EGpriv
                    EGpub     pub;

     ELGAMAL(2)                                             ELGAMAL(2)

                    mpint     *secret; // (decryption key)

          Keys are generated using eggen. Eggen takes both bit length
          of the modulus and the number of repetitions of the Miller-
          Rabin primality test to run.  If the latter is 0, it does
          the default number of rounds.  Egprivtopub returns a newly
          allocated copy of the public key corresponding to the pri-
          vate key.

          The routines egpuballoc, egpubfree, egprivalloc, and
          egprivfree are provided to manage key storage.

          Egsign signs message m using a private key k yielding a
               struct EGsig
                    mpint     *r, *s;
          Egverify returns 0 if the signature is valid and -1 if not.

          The routines egsigalloc and egsigfree are provided to manage
          signature storage.


          mp(2), aes(2), blowfish(2), des(2), dsa(2), rc4(2), rsa(2),
          sechash(2), prime(2), rand(2)