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)