====== 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; → [[lyx_-_programmiersprache:units:crypto:pqc|std.crypto.pqc]] · [[lyx_-_programmiersprache:units:crypto|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