A liboqs reúne implementações de mecanismos de encapsulamento de chave pós-quânticos (OQS_KEM) e de esquemas de assinatura (OQS_SIG) sob uma única API em C, e é o motor do provedor Open Quantum Safe para o OpenSSL 3. Os fatos desta página foram verificados na versão 0.16.0 (commit 5a1a854b0dc9), compilada com as opções padrão do CMake, que usam o OpenSSL para as primitivas simétricas. O README diz, em maiúsculas: “NO MOMENTO, NÃO RECOMENDAMOS CONFIAR NESTA BIBLIOTECA EM UM AMBIENTE DE PRODUÇÃO NEM PARA PROTEGER QUAISQUER DADOS SENSÍVEIS.” Para ML-KEM e ML-DSA em produção, as páginas do OpenSSL, do BoringSSL, do AWS-LC e do Bouncy Castle listam o que as APIs principais de cada um oferecem.
O build padrão ativou 41 KEMs e 221 conjuntos de parâmetros de assinatura, e um conjunto de parâmetros de cada família completou o ciclo de ida e volta: os padrões do NIST ML-KEM, ML-DSA e SLH-DSA (156 variantes de SLH-DSA, puras e pré-hash), o Falcon, os candidatos a KEM HQC, Classic McEliece, FrodoKEM, BIKE, NTRU e sntrup761, o Kyber anterior à padronização e os candidatos adicionais de assinatura MAYO, CROSS, UOV, SNOVA e MQOM. Em código novo, use o nome ML-KEM-768, não Kyber768. Nenhum conjunto de parâmetros XMSS ou LMS vem ativado no build padrão.
A assinatura ML-DSA é hedged (usa aleatoriedade adicional): duas assinaturas da mesma mensagem com a mesma chave foram diferentes; por isso, os testes devem verificar as assinaturas em vez de comparar bytes. As strings de contexto do FIPS 204 são aceitas por meio de OQS_SIG_sign_with_ctx_str; uma assinatura feita com o contexto invoice-v1 falhou com invoice-v2 e com o OQS_SIG_verify simples, que usa o contexto vazio, então os dois lados precisam usar o mesmo contexto. Uma assinatura truncada, um blob de 3 bytes e uma assinatura válida sobre outros dados retornaram, todos, o mesmo OQS_ERROR.
O desencapsulamento ML-KEM não acusa um texto cifrado danificado: com um bit invertido, OQS_KEM_decaps retornou OQS_SUCCESS e um segredo compartilhado diferente, como exige a rejeição implícita do FIPS 203. A divergência só aparece quando as chaves derivadas são usadas, por exemplo como uma falha de descriptografia AEAD. A função também não recebe o tamanho do texto cifrado e lê exatamente length_ciphertext bytes, 1088 no ML-KEM-768. Experimente os dois esquemas na ferramenta de ML-KEM e na ferramenta de assinaturas pós-quânticas.