liboqs собирает реализации постквантовых механизмов инкапсуляции ключа (OQS_KEM) и схем подписи (OQS_SIG) за единым API на C и служит движком провайдера Open Quantum Safe для OpenSSL 3. Факты на этой странице проверены на релизе 0.16.0 (коммит 5a1a854b0dc9), собранном с параметрами CMake по умолчанию, при которых симметричные примитивы берутся из OpenSSL. В README прописными буквами сказано: «МЫ ПОКА НЕ РЕКОМЕНДУЕМ ПОЛАГАТЬСЯ НА ЭТУ БИБЛИОТЕКУ В РАБОЧЕЙ СРЕДЕ ИЛИ ДЛЯ ЗАЩИТЫ КАКИХ-ЛИБО КОНФИДЕНЦИАЛЬНЫХ ДАННЫХ». Для ML-KEM и ML-DSA в рабочей среде смотрите страницы OpenSSL, BoringSSL, AWS-LC и Bouncy Castle: на них перечислено, что входит в основные API этих библиотек.
В сборке по умолчанию включены 41 KEM и 221 набор параметров подписи, и для одного набора параметров каждого семейства полный цикл прошёл успешно: стандарты NIST ML-KEM, ML-DSA и SLH-DSA (156 вариантов SLH-DSA, чистых и с предварительным хешированием), Falcon, KEM-кандидаты HQC, Classic McEliece, FrodoKEM, BIKE, NTRU и sntrup761, предстандартный Kyber и дополнительные кандидаты в схемы подписи MAYO, CROSS, UOV, SNOVA и MQOM. В новом коде указывайте ML-KEM-768, а не Kyber768. Ни один набор параметров XMSS или LMS в сборке по умолчанию не включён.
Подписание ML-DSA рандомизировано (hedged): две подписи одного и того же сообщения одним и тем же ключом различались, поэтому тесты должны проверять подписи, а не сравнивать байты. Строки контекста FIPS 204 поддерживаются через OQS_SIG_sign_with_ctx_str; подпись, созданная с контекстом invoice-v1, не прошла проверку с invoice-v2 и с обычной OQS_SIG_verify, которая использует пустой контекст, поэтому обе стороны должны согласовать контекст. Обрезанная подпись, 3-байтовый блок данных и верная подпись других данных вернули одну и ту же ошибку OQS_ERROR.
Декапсуляция ML-KEM не сообщает о повреждённом шифртексте: после инверсии одного бита OQS_KEM_decaps вернула OQS_SUCCESS и другой общий секрет, как того требует неявное отклонение (implicit rejection) из FIPS 203. Несовпадение проявляется только при использовании выведенных ключей, например как ошибка расшифрования AEAD. Кроме того, функция не принимает длину шифртекста и читает ровно length_ciphertext байт (1088 байт для ML-KEM-768). Попробуйте обе схемы в инструменте ML-KEM и инструменте постквантовых подписей.