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;
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 private 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
/usr/local/plan9/src/libsec

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

Space Glenda