ELGAMAL(3)                                             ELGAMAL(3)

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

     SYNOPSIS
          #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*)

     DESCRIPTION
          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(3)                                             ELGAMAL(3)

                    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.

     SOURCE
          /src/libsec

     SEE ALSO
          mp(3), aes(3), blowfish(3), des(3), dsa(3), rc4(3), rsa(3),
          sechash(3), prime(3), rand(3)