Inhaltsverzeichnis

std.crypto.pqc.pqc

std.crypto.pqc.pqc ist die einheitliche High-Level-API für alle Post-Quantum-Kryptografie in Lyx. Sie abstrahiert über ML-KEM (FIPS 203), ML-DSA (FIPS 204), SLH-DSA (FIPS 205) und Hybrid-KEM — alle Algorithmen werden über denselben Handle-basierten Workflow bedient.

Empfehlung: Für neue Anwendungen immer diese Unit verwenden statt die Low-Level-Units direkt.

import std.crypto.pqc.pqc;

std.crypto.pqc · std.crypto


Algorithmus-Konstanten

Konstante Wert Algorithmus Typ
PQC_ALG_MLKEM_512 1 ML-KEM-512 (FIPS 203) KEM
PQC_ALG_MLKEM_768 2 ML-KEM-768 (FIPS 203) — Standardwahl KEM KEM
PQC_ALG_MLKEM_1024 3 ML-KEM-1024 (FIPS 203) KEM
PQC_ALG_MLDSA_44 4 ML-DSA-44 (FIPS 204) DSA
PQC_ALG_MLDSA_65 5 ML-DSA-65 (FIPS 204) — Standardwahl DSA DSA
PQC_ALG_MLDSA_87 6 ML-DSA-87 (FIPS 204) DSA
PQC_ALG_SLHDSA_128S 7 SLH-DSA-SHA2-128s (FIPS 205) DSA
PQC_ALG_SLHDSA_256S 8 SLH-DSA-SHA2-256s (FIPS 205) DSA
PQC_ALG_HYBRID_768 9 Hybrid-KEM X25519+ML-KEM-768 KEM
PQC_ALG_SLHDSA_MINI 10 Mini-Params (n=16, h=4) — nur für Tests DSA

Weitere Größenkonstanten: PQC_SS_LEN = 32 (Shared-Secret-Länge), PQC_KP_SIZE = 40 (Handle-Größe).


Seed-Größen für PQCKeyGenFromSeed

Algorithmus Seed-Größe
ML-KEM-512/768/1024 64 Bytes (d[32] + z[32])
ML-DSA-44/65/87 32 Bytes (ξ)
SLH-DSA-128s 48 Bytes (skseed[16] + skprf[16] + pkseed[16])
SLH-DSA-256s 96 Bytes (skseed[32] + skprf[32] + pkseed[32])
Hybrid-768 64 Bytes (seed_x25519[32] + seed_mlkem[32])

Funktionen

Schlüsselerzeugung:

Funktion Beschreibung
PQCKeyGen(alg): int64 Erzeugt Schlüsselpaar mit internem CSPRNG-Seed. Gibt Handle zurück.
PQCKeyGenFromSeed(alg, seed): int64 Deterministisch aus seed (PQCSeedSize(alg) Bytes). Gibt Handle zurück, oder 0 bei unbekanntem Algorithmus.
PQCFreeKeyPair(kp) Gibt Handle und alle zugehörigen Puffer frei.

Größenabfragen:

Funktion Beschreibung
PQCPublicKeyLen(alg): int64 PK-Größe in Bytes für Algorithmus alg.
PQCSecretKeyLen(alg): int64 SK-Größe in Bytes.
PQCCTLen(alg): int64 Ciphertext-Größe (nur KEM-Algorithmen).
PQCSigLen(alg): int64 Maximale Signaturlänge (nur DSA-Algorithmen).
PQCSeedSize(alg): int64 Seed-Größe für PQCKeyGenFromSeed.

Handle-Zugriff:

Funktion Beschreibung
PQCGetAlgorithm(kp): int64 Liest Algorithmus-ID aus Handle.
PQCGetPublicKey(kp): int64 Zeiger auf PK-Puffer.
PQCGetPublicKeyLen(kp): int64 PK-Länge aus Handle.
PQCGetSecretKey(kp): int64 Zeiger auf SK-Puffer.
PQCGetSecretKeyLen(kp): int64 SK-Länge aus Handle.

KEM-Operationen:

Funktion Beschreibung
PQCEncapsulate(kp, ctOut, ssOut): int64 Erzeugt CT und SS (32 Bytes) mit internem CSPRNG. ctOut: PQCCTLen(alg) Bytes. Gibt 0 bei Erfolg, -1 wenn kein KEM.
PQCDecapsulate(kp, ct, ssOut): int64 Rekonstruiert SS aus CT. ssOut: PQC_SS_LEN Bytes. Gibt 0 bei Erfolg, -1 wenn kein KEM.

DSA-Operationen:

Funktion Beschreibung
PQCSign(kp, msg, msgLen, sigOut): int64 Signiert msg. sigOut: PQCSigLen(alg) Bytes. Gibt tatsächliche Signaturlänge, oder 0 bei Fehler / falscher Algorithmus.
PQCVerify(kp, msg, msgLen, sig, sigLen): int64 Verifiziert Signatur. Gibt 1 bei gültig, 0 bei ungültig.

Import / Export:

Funktion Beschreibung
PQCExportPublicKey(kp, out): int64 Kopiert PK in out. Gibt pkLen zurück.
PQCExportSecretKey(kp, out): int64 Kopiert SK in out. Gibt skLen zurück.
PQCImportPublicKey(alg, data, len): int64 Erstellt Handle mit nur dem PK (kein SK). Für Encapsulate / Verify mit fremdem Key. Gibt Handle oder 0.

Verwendungsbeispiele

KEM — Shared Secret aushandeln (ML-KEM-768):

import std.crypto.pqc.pqc;
import std.alloc;

fn main(): int64 {
  // Empfänger erzeugt Schlüsselpaar
  var kp: int64 := PQCKeyGen(PQC_ALG_MLKEM_768);

  // Sender kapselt Shared Secret ein (nur PK nötig)
  var ct_len: int64 := PQCCTLen(PQC_ALG_MLKEM_768);
  var ct: int64 := alloc(ct_len);
  var ss_enc: int64 := alloc(PQC_SS_LEN);
  PQCEncapsulate(kp, ct, ss_enc);

  // Empfänger rekonstruiert Shared Secret
  var ss_dec: int64 := alloc(PQC_SS_LEN);
  PQCDecapsulate(kp, ct, ss_dec);
  // ss_enc == ss_dec

  free(ct, ct_len); free(ss_enc, PQC_SS_LEN); free(ss_dec, PQC_SS_LEN);
  PQCFreeKeyPair(kp);
  return 0;
}

DSA — Signieren und Verifizieren (ML-DSA-65):

import std.crypto.pqc.pqc;
import std.alloc;

fn main(): int64 {
  var kp: int64 := PQCKeyGen(PQC_ALG_MLDSA_65);

  var msg: pchar := "Zu signieren"c;
  var m_len: int64 := 12;
  var sig_max: int64 := PQCSigLen(PQC_ALG_MLDSA_65);
  var sig: int64 := alloc(sig_max);
  var sig_len: int64 := PQCSign(kp, msg as int64, m_len, sig);

  var ok: int64 := PQCVerify(kp, msg as int64, m_len, sig, sig_len);
  // ok == 1 wenn gültig

  free(sig, sig_max);
  PQCFreeKeyPair(kp);
  return 0;
}


Algorithmusauswahl

Aufgabe Empfohlener Algorithmus
Schlüsselaustausch (Standard) PQC_ALG_MLKEM_768
Schlüsselaustausch (Hybrid, maximale Sicherheit) PQC_ALG_HYBRID_768
Digitale Signatur (Standard) PQC_ALG_MLDSA_65
Digitale Signatur (kleiner Public Key, konservative Annahmen) PQC_ALG_SLHDSA_128S
Digitale Signatur (maximale Sicherheit) PQC_ALG_MLDSA_87

Letzte Aktualisierung: 2026-06-08