ELGAMAL(3)

πŸ“¦ version 0_git20260208, in alpine 3.24, arch rolling, nixos 26.05, nixpkgs unstable

ELGAMAL(3) πŸ’…βœ¨

Welcome to the Library Functions Manual page for ELGAMAL(3), bestie β€” it’s giving cryptography, and we’re gonna make it make sense. No cap.

🌸 NAME 🌸

eggen, egencrypt, egdecrypt, egsign, egverify, egpuballoc, egpubfree, egprivalloc, egprivfree, egsigalloc, egsigfree, egprivtopub β€” elgamal encryption.

✨ SYNOPSIS ✨

Okay so here’s the exact sig, character-for-character, no edits:

#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 the 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.

Bestie, that’s the whole vibe check: 0 = valid, -1 = not valid. Periodt.

The routines egsigalloc and egsigfree are provided to manage signature storage.

🌈 SOURCE 🌈

/src/libsec

πŸ’– SEE ALSO πŸ’–


Source/version check, bestie: the SOURCE is /src/libsec, and the footer is just ELGAMAL(3) with no date shown β€” that’s the whole cute sign-off. Stay iconic and encrypted πŸ’œβœ¨