ELGAMAL(2) ELGAMAL(2) 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; Page 1 Plan 9 (printed 12/21/24) 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. SOURCE /sys/src/libsec SEE ALSO mp(2), aes(2), blowfish(2), des(2), dsa(2), rc4(2), rsa(2), sechash(2), prime(2), rand(2) Page 2 Plan 9 (printed 12/21/24)