liboqs bündelt Implementierungen von Schlüsselkapselungsverfahren (OQS_KEM) und Signaturverfahren (OQS_SIG) der Post-Quanten-Kryptografie hinter einer C-API und bildet den Kern des Open-Quantum-Safe-Providers für OpenSSL 3. Die Fakten auf dieser Seite wurden mit Release 0.16.0 (Commit 5a1a854b0dc9) geprüft, gebaut mit den Standardoptionen von CMake, die für die symmetrischen Primitive OpenSSL verwenden. Im README steht in Großbuchstaben: „WIR EMPFEHLEN DERZEIT NICHT, SICH IN EINER PRODUKTIONSUMGEBUNG AUF DIESE BIBLIOTHEK ZU VERLASSEN ODER SIE ZUM SCHUTZ SENSIBLER DATEN EINZUSETZEN.“ Was die Haupt-APIs für ML-KEM und ML-DSA im Produktionseinsatz mitbringen, führen die Seiten zu OpenSSL, BoringSSL, AWS-LC und Bouncy Castle auf.
Der Standard-Build aktivierte 41 KEMs und 221 Parametersätze für Signaturen, und je ein Parametersatz jeder Familie durchlief einen vollständigen Roundtrip: die NIST-Standards ML-KEM, ML-DSA und SLH-DSA (156 SLH-DSA-Varianten, rein und mit Pre-Hash), Falcon, die KEM-Kandidaten HQC, Classic McEliece, FrodoKEM, BIKE, NTRU und sntrup761, das vorstandardisierte Kyber sowie die zusätzlichen Signaturkandidaten MAYO, CROSS, UOV, SNOVA und MQOM. Schreibe in neuem Code ML-KEM-768, nicht Kyber768. Im Standard-Build ist kein Parametersatz für XMSS oder LMS aktiviert.
ML-DSA signiert im Hedged-Modus: Zwei Signaturen derselben Nachricht mit demselben Schlüssel unterschieden sich, Tests müssen Signaturen also prüfen, statt Bytes zu vergleichen. Kontext-Strings nach FIPS 204 werden über OQS_SIG_sign_with_ctx_str unterstützt; eine unter dem Kontext invoice-v1 erstellte Signatur scheiterte unter invoice-v2 und mit dem einfachen OQS_SIG_verify, das den leeren Kontext verwendet – beide Seiten müssen sich also auf den Kontext einigen. Eine gekürzte Signatur, ein 3-Byte-Blob und eine gültige Signatur über andere Daten lieferten alle dasselbe OQS_ERROR.
Die Entkapselung von ML-KEM meldet kein beschädigtes Chiffrat: Mit einem gekippten Bit gab OQS_KEM_decaps den Wert OQS_SUCCESS und ein anderes gemeinsames Geheimnis zurück, wie es die implizite Zurückweisung (Implicit Rejection) aus FIPS 203 verlangt. Die Abweichung zeigt sich erst, wenn die abgeleiteten Schlüssel verwendet werden, etwa als fehlgeschlagene AEAD-Entschlüsselung. Außerdem nimmt die Funktion keine Länge des Chiffrats entgegen und liest genau length_ciphertext Byte, bei ML-KEM-768 also 1088. Probiere beide Verfahren im ML-KEM-Tool und im Tool für Post-Quanten-Signaturen aus.