.TH ELGAMAL 2
.SH NAME
eggen, egencrypt, egdecrypt, egsign, egverify, egalloc, egfree, egpuballoc, egpubfree, egprivalloc, egprivfree, egsigalloc, egsigfree, egprivtopub - elgamal encryption
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.br
.B #include <mp.h>
.br
.B #include <libsec.h>
.PP
.B
EGpriv*	eggen(int nlen, int nrep)
.PP
.B
mpint*	egencrypt(EGpub *k, mpint *in, mpint *out)
.PP
.B
mpint*	egdecrypt(EGpriv *k, mpint *in, mpint *out)
.PP
.B
EGsig*	egsign(EGpriv *k, mpint *m)
.PP
.B
int		egverify(EGpub *k, EGsig *sig, mpint *m)
.PP
.B
EGpub*	egpuballoc(void)
.PP
.B
void		egpubfree(EGpub*)
.PP
.B
EGpriv*	egprivalloc(void)
.PP
.B
void		egprivfree(EGpriv*)
.PP
.B
EGsig*	egsigalloc(void)
.PP
.B
void		egsigfree(EGsig*)
.PP
.B
EGpub*	egprivtopub(EGpriv*)
.SH DESCRIPTION
.PP
The corresponding keys for the ElGamal algorithm are:
.EX
	struct EGpub
	{
		mpint	*p;	// modulus
		mpint	*alpha;	// generator
		mpint	*key;	// (encryption key) alpha**secret mod p
	};
.EE
and
.EX
	struct EGpriv
	{
		EGpub	pub;
		mpint	*secret; // (decryption key)
	};
.EE
.I Egsign
signs message
.I m
using a private key
.I k
yielding a
.EX
	struct EGsig
	{
		mpint	*r, *s;
	};
.EE
.I Egverify
returns 0 if the signature is valid and \-1 if not.
.SH SOURCE
.B /sys/src/libsec
.SH SEE ALSO
.IR mp (2),
.IR aes (2),
.IR blowfish (2),
.IR des (2),
.IR rc4 (2),
.IR rsa (2),
.IR sechash (2),
.IR prime (2),
.IR rand (2)
