
Biblioteca em C para prototipagem e experimentação com criptografia resistente a computação quântica
liboqs é uma biblioteca C de código aberto para algoritmos criptográficos resistentes a computação quântica.
liboqs fornece:
liboqs faz parte do projeto Open Quantum Safe (OQS), que visa desenvolver e integrar em aplicações criptografia resistente a computação quântica para facilitar a implantação e os testes em contextos do mundo real. Em particular, o OQS fornece integrações protótipo do liboqs em protocolos como TLS, X.509 e S/MIME, por meio do nosso OpenSSL 3 Provider, e fornecemos uma variedade de outras demos habilitadas para pós-quântica.
O projeto OQS é apoiado pela Post-Quantum Cryptography Alliance como parte da Linux Foundation. Mais informações sobre o projeto Open Quantum Safe podem ser encontradas em openquantumsafe.org.
O OQS está realizando uma pesquisa para entender melhor nossa comunidade. Gostaríamos de ouvir organizações e indivíduos sobre seu interesse e uso do projeto Open Quantum Safe. Por favor, reserve alguns minutos para preencher a pesquisa: https://linuxfoundation.surveymonkey.com/r/oqssurvey
A tabela abaixo resume cada família de algoritmos atualmente integrada ao liboqs. Para detalhes por variante (incluindo nível NIST, status de tempo constante, verificação formal e otimizações disponíveis), consulte ALGORITHMS.md; para fontes upstream e avisos, consulte as páginas por algoritmo em docs/algorithms.
Os nomes dos algoritmos padronizados pelo NIST — ML-KEM, ML-DSA e SLH-DSA — são estáveis; se o NIST alterar os detalhes de implementação, o liboqs se ajustará para que os usuários fiquem protegidos contra tais mudanças. Todos os outros nomes estão sujeitos a alterações. Quais algoritmos são compilados pode ser controlado via OQS_ALGS_ENABLED; por padrão, o liboqs é compilado com suporte a todos os algoritmos da tabela, incluindo os experimentais.
Embora no momento em que este texto foi escrito não haja vulnerabilidades conhecidas em nenhum dos algoritmos resistentes a computação quântica usados nesta biblioteca, recomenda-se cautela ao implantar algoritmos resistentes a computação quântica, pois a maioria dos algoritmos e softwares não foi submetida ao mesmo grau de escrutínio que os algoritmos atualmente implantados. Atenção especial deve ser dada às orientações fornecidas pela comunidade de padronização, especialmente pelo projeto Post-Quantum Cryptography Standardization do NIST. À medida que a pesquisa avança, os algoritmos suportados podem sofrer mudanças rápidas em sua segurança e podem até se mostrar inseguros contra computadores clássicos e quânticos. Além disso, observe que o sntrup761 está incluído apenas para testes de interoperabilidade.
O liboqs não pretende "escolher vencedores": o suporte a algoritmos é informado pelo projeto de padronização PQC do NIST. Recomendamos fortemente que aplicações e protocolos dependam dos resultados desse esforço ao implantar criptografia pós-quântica.
Reconhecemos que algumas partes podem querer implantar criptografia resistente a computação quântica antes da conclusão do projeto de padronização PQC do NIST. Recomendamos fortemente que tais tentativas façam uso da chamada criptografia híbrida, na qual algoritmos de chave pública resistentes a computação quântica são usados juntamente com algoritmos tradicionais de chave pública (como RSA ou curvas elípticas), de modo que a solução seja pelo menos tão segura quanto a criptografia tradicional existente.
NÃO RECOMENDAMOS ATUALMENTE CONFIAR NESTA BIBLIOTECA EM UM AMBIENTE DE PRODUÇÃO OU PARA PROTEGER QUAISQUER DADOS SENSÍVEIS. Esta biblioteca destina-se a auxiliar em pesquisa e prototipagem. Embora façamos um esforço de melhor esforço para evitar bugs de segurança, esta biblioteca não recebeu o nível de auditoria e análise necessário para se confiar nela em usos de alta segurança.
Consulte SECURITY.md para detalhes sobre como relatar uma vulnerabilidade e o processo de resposta a vulnerabilidades do OQS.
Para otimizar o esforço de suporte,
Instale as dependências:
No Ubuntu:
sudo apt install astyle cmake gcc ninja-build libssl-dev unzip xsltproc doxygen graphviz valgrind
python3 -m venv .venv
source .venv/bin/activate
pip install --require-hashes -r requirements.txt
No macOS, usando um gestor de pacotes à sua escolha (escolhemos o Homebrew):
brew install cmake ninja openssl@3 wget doxygen graphviz astyle valgrind
python3 -m venv .venv
source .venv/bin/activate
pip install --require-hashes -r requirements.txt
Usando Nix:
nix develop
Note que, se quiser que o liboqs use OpenSSL para vários algoritmos criptográficos simétricos (AES, SHA-2, etc.), então deve ter o OpenSSL instalado (versão 3.x recomendada; a versão EOL 1.1.1 ainda é possível).
Obtenha o código-fonte:
git clone -b main https://github.com/open-quantum-safe/liboqs.git
cd liboqs
e compile:
mkdir build && cd build
cmake -GNinja ..
ninja
Várias opções de compilação cmake para personalizar os artefactos resultantes estão disponíveis e são documentadas em CONFIGURE.md. Todas as opções suportadas também estão listadas no ficheiro .CMake/alg-support.cmake e podem ser visualizadas executando cmake -LAH -N .. no diretório build.
As seguintes instruções assumem que estamos em build.
Por predefinição, o principal resultado da compilação é lib/liboqs.a, uma biblioteca estática. Se quiser compilar uma biblioteca partilhada/dinâmica, acrescente -DBUILD_SHARED_LIBS=ON ao comando cmake -GNinja .. acima e o resultado será lib/liboqs.so|dylib|dll. Os cabeçalhos públicos estão localizados no diretório include. Existem também vários programas compilados no diretório tests:
test_kem: Teste simples para mecanismos de encapsulamento de chavestest_sig: Teste simples para esquemas de assinaturatest_sig_stfl: Teste simples para esquemas de assinatura com estadotest_kem_mem: Teste simples para verificar o consumo de memória de mecanismos de encapsulamento de chavestest_sig_mem: Teste simples para verificar o consumo de memória de esquemas de assinaturaOs binários podem ser gerados usando o Visual Studio 2019 com a extensão CMake Tools instalada. As mesmas opções explicadas acima para Linux/macOS podem ser usadas e os artefactos de compilação são gerados nas pastas build especificadas.
Se quiser criar ficheiros de compilação do Visual Studio, por exemplo, se não estiver a usar ninja, certifique-se de não passar o parâmetro -GNinja ao comando cmake como exemplificado acima. Pode então compilar todos os componentes usando msbuild, por exemplo, da seguinte forma: msbuild ALL_BUILD.vcxproj e instalar todos os artefactos, por exemplo, usando este comando msbuild INSTALL.vcxproj.
Pode compilar cruzadamente o liboqs para várias plataformas. Informações detalhadas estão disponíveis no Wiki.
Informações mais detalhadas sobre compilação, parâmetros de compilação opcionais, aplicações de exemplo, convenções de codificação e mais podem ser encontradas no wiki.
Contribuições que cumpram os critérios de aceitação são bem-vindas. Veja o nosso Guia de Contribuição para mais detalhes.
O liboqs está licenciado sob a Licença MIT; veja LICENSE.txt para detalhes.
O liboqs inclui algumas bibliotecas ou módulos de terceiros que são licenciados de forma diferente; a subpasta correspondente contém a licença que se aplica nesse caso. Em particular:
.CMake/CMakeDependentOption.cmake: Licença BSD 3-Clausesrc/common/common.c: inclui partes que são Apache License v2.0src/common/crypto/aes/aes_c.c: domínio público ou qualquer licença aprovada pela OSIsrc/common/crypto/aes/aes*_ni.c: domínio públicosrc/common/crypto/sha2/sha2_c.c: domínio públicosrc/common/crypto/sha3/xkcp_low : CC0 (domínio público), exceto brg_endian.h e KeccakP-1600-AVX2.ssrc/common/crypto/sha3/xkcp_low/.../brg_endian.h : Licença BSD 3-Clausesrc/common/crypto/sha3/xkcp_low/.../KeccakP-1600-AVX2.s : Licença CRYPTOGAMS semelhante à BSDsrc/common/rand/rand_nist.c: Veja o ficheiroO projeto OQS é apoiado pela Post-Quantum Cryptography Alliance como parte da Linux Foundation.
O projeto OQS foi fundado por Douglas Stebila e Michele Mosca na Universidade de Waterloo. Contribuidores do liboqs incluem contribuidores individuais, académicos e investigadores, e várias empresas, incluindo Amazon Web Services, Cisco Systems, evolutionQ, IBM Research, Microsoft Research, SandboxAQ e softwareQ.
O apoio financeiro para o desenvolvimento do Open Quantum Safe foi fornecido pela Amazon Web Services, o Canadian Centre for Cyber Security, a Cisco, o Unitary Fund, o NGI Assure Fund e a VeriSign Inc.
Os projetos de investigação que desenvolveram componentes específicos do OQS foram apoiados por várias bolsas de investigação, incluindo financiamento do Natural Sciences and Engineering Research Council of Canada (NSERC); veja os artigos de origem para os agradecimentos de financiamento.
| Família de algoritmos | Status de padronização | Implementação principal | Manutenção upstream | Nível OQS |
|---|
| BIKE | Não selecionado pelo NIST | awslabs/bike-kem | A definir | Nível 3 (Comunidade) |
| Classic McEliece | Sob consideração da ISO | PQClean/PQClean@1eacfda | Sem manutenção ativa | Nível 3 (Comunidade) |
| FrodoKEM | Sob consideração da ISO | microsoft/PQCrypto-LWEKE@a2f9dec | Melhor esforço | Nível 2 (Suportado) |
| HQC | Selecionado pelo NIST para padronização futura | pqc-hqc/hqc@161cd4f | A definir | Nível 2 (Suportado) |
| Kyber | Selecionado pelo NIST como base para o ML-KEM (FIPS 203) | pq-crystals/kyber@441c051 | Mantido ativamente | Nível 3 (Comunidade) |
| ML-KEM | Padronizado pelo NIST | pq-code-package/mlkem-native@0ba906c | Mantido ativamente | Nível 1 (Núcleo) |
| NTRU | Não selecionado pelo NIST, sob consideração de padronização pela NTT | PQClean/PQClean@4c9e5a3 | Mantido ativamente | Nível 3 (Comunidade) |
| NTRU-Prime | Não selecionado pelo NIST | openssh/openssh-portable | Mantido ativamente | Nível 3 (Comunidade) |
| Família de algoritmos | Status de padronização | Implementação principal | Manutenção upstream | Nível OQS |
|---|
| CROSS | Sob consideração do NIST | CROSS-signature/CROSS-lib-oqs@179d61b | Mantido ativamente | Nível 3 (Comunidade) |
| Falcon | Selecionado pelo NIST para padronização futura | PQClean/PQClean@1eacfda | A definir | Nível 3 (Comunidade) |
| MAYO | Sob consideração do NIST | PQCMayo/MAYO-C@64e15c6 | Mantido ativamente | Nível 3 (Comunidade) |
| ML-DSA | Padronizado pelo NIST | pq-code-package/mldsa-native@9b0ee84 | Mantido ativamente | Nível 2 (Suportado) |
| MQOM | Sob consideração do NIST | mqom/mqom-v2@ec6b7fa | Mantido ativamente | Nível 3 (Comunidade) |
| SLH-DSA | Padronizado pelo NIST | pq-code-package/slhdsa-c@a0fc1ff | Melhor esforço | Nível 3 (Comunidade) |
| SNOVA | Sob consideração do NIST | vacuas/SNOVA@1c3ca6f | Melhor esforço | Nível 3 (Comunidade) |
| UOV | Sob consideração do NIST | pqov/pqov@33fa527 | Melhor esforço | Nível 3 (Comunidade) |
| Família de algoritmos | Status de padronização | Implementação principal | Manutenção upstream | Nível OQS |
|---|
| LMS | Padronizado pela IRTF, aprovado pelo NIST | cisco/hash-sigs | Melhor esforço | Nível 2 (Suportado) |
| XMSS | Padronizado pela IRTF, aprovado pelo NIST | XMSS/xmss-reference | Mantido ativamente | Nível 2 (Suportado) |
kat_kem: Programa que gera valores de teste de resposta conhecida (KAT) para mecanismos de encapsulamento de chaves usando o mesmo procedimento dos requisitos de submissão do NIST, para verificação contra valores KAT submetidos usando tests/test_kat.pykat_sig: Programa que gera valores de teste de resposta conhecida (KAT) para esquemas de assinatura usando o mesmo procedimento dos requisitos de submissão do NIST, para verificação contra valores KAT submetidos usando tests/test_kat.pykat_sig_stfl: Programa para verificar resultados contra valores KAT submetidos usando tests/test_kat.pyspeed_kem: Programa de benchmarking para mecanismos de encapsulamento de chaves; veja ./speed_kem --help para instruções de utilizaçãospeed_sig: Programa de benchmarking para mecanismos de assinatura; veja ./speed_sig --help para instruções de utilizaçãospeed_sig_stfl: Programa de benchmarking para mecanismos de assinatura com estado; veja ./speed_sig_stfl --help para instruções de utilizaçãoexample_kem: Exemplo mínimo executável que mostra a utilização da API KEMexample_sig: Exemplo mínimo executável que mostra a utilização da API de assinaturaexample_sig_stfl: Exemplo mínimo executável que mostra a utilização da API de assinatura com estadotest_aes, test_sha3: Testes simples para subcomponentes criptográficostest_portability: Testes simples para verificar a portabilidade de código entre CPUs; requer a presença de qemu; operação correta validada apenas no UbuntuA suíte de testes completa pode ser executada usando
ninja run_tests
Para gerar documentação HTML da API, execute:
ninja gen_docs
Depois abra docs/html/index.html no seu navegador web.
ninja install pode ser executado para instalar a biblioteca compilada e os ficheiros include num local à escolha, que pode ser especificado passando a opção -DCMAKE_INSTALL_PREFIX=<dir> ao cmake no momento da configuração. Alternativamente, ninja package pode ser executado para criar um pacote de instalação.
ninja uninstall pode ser executado para remover todos os ficheiros de instalação.
src/kem/bike/additional: Apache License v2.0src/kem/classic_mceliece/pqclean_*: domínio públicosrc/kem/kyber/pqcrystals-*: domínio público (CC0) ou Apache License v2.0src/kem/kyber/pqclean_*: domínio público (CC0), e domínio público (CC0) ou Apache License v2.0, e domínio público (CC0) ou MIT, e MITsrc/kem/kyber/libjade_* domínio público (CC0) ou Apache License v2.src/kem/ml_kem/mlkem-native_*: MIT ou Apache License v2.0 ou Licença ISCsrc/kem/ntru/pqclean_*: domínio público (CC0)src/kem/ntruprime/sntrup761_openssh: domínio públicosrc/sig/mayo/*: Apache License v2.0src/sig/ml_dsa/pqcrystals-*: domínio público (CC0) ou Apache License v2.0