liboqs 是一个用于量子安全密码算法的开源 C 语言库。
liboqs 提供:
liboqs 是 Open Quantum Safe (OQS) 项目的一部分,该项目旨在开发量子安全密码学并将其集成到应用程序中,以促进在真实世界环境中的部署和测试。特别是,OQS 通过我们的 OpenSSL 3 Provider 提供了将 liboqs 集成到 TLS、X.509 和 S/MIME 等协议中的原型集成,并且我们提供了各种其他后量子启用演示。
OQS 项目由 Post-Quantum Cryptography Alliance 作为 Linux Foundation 的一部分提供支持。有关 Open Quantum Safe 项目的更多信息,请访问 openquantumsafe.org。
OQS 正在进行一项调查,以更好地了解我们的社区。我们希望听取组织和个人对 Open Quantum Safe 项目的兴趣和使用情况。请花几分钟时间填写调查问卷:https://linuxfoundation.surveymonkey.com/r/oqssurvey
下表总结了当前集成到 liboqs 中的每个算法系列。有关每个变体的详细信息(包括 NIST 级别、恒定时间状态、形式化验证和可用优化),请参阅 ALGORITHMS.md;有关上游来源和建议,请参阅 docs/algorithms 下的每个算法页面。
由 NIST 标准化的算法名称 — ML-KEM、ML-DSA 和 SLH-DSA — 是稳定的;如果 NIST 更改实现细节,liboqs 将进行调整,以保护用户免受此类更改的影响。所有其他名称可能会发生变化。构建哪些算法可以通过 OQS_ALGS_ENABLED 控制;默认情况下,liboqs 构建时支持表中的所有算法,包括实验性算法。
虽然在撰写本文时,此库中使用的任何量子安全算法均未发现已知漏洞,但在部署量子安全算法时仍需谨慎,因为大多数算法和软件尚未经过与当前已部署算法同等程度的审查。应特别关注标准制定社区提供的指导,尤其是 NIST 的 Post-Quantum Cryptography Standardization 项目。随着研究的推进,受支持的算法在安全性方面可能会发生快速变化,甚至可能被证明对经典计算机和量子计算机都不安全。此外,请注意 sntrup761 仅用于互操作性测试。
liboqs 无意"挑选赢家":算法支持以 NIST PQC 标准化项目为依据。我们强烈建议应用程序和协议在部署后量子密码学时依赖该项目的成果。
我们意识到某些方可能希望在 NIST PQC 标准化项目结束之前部署量子安全密码学。我们强烈建议此类尝试使用所谓的混合密码学,即将量子安全公钥算法与传统公钥算法(如 RSA 或椭圆曲线)结合使用,以便解决方案至少不比现有传统密码学安全性更低。
我们目前不建议在生产环境中依赖此库或使用它来保护任何敏感数据。 此库旨在帮助研究和原型开发。虽然我们尽最大努力避免安全漏洞,但此库尚未经过高安全性使用所需的审计和分析水平。
请参阅 SECURITY.md 了解如何报告漏洞以及 OQS 漏洞响应流程的详细信息。
为了优化支持工作,
安装依赖:
在 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
在 macOS 上,使用你选择的包管理器(我们选择了 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
使用 Nix:
nix develop
请注意,如果你希望 liboqs 使用 OpenSSL 来实现各种对称加密算法(AES、SHA-2 等),则必须安装 OpenSSL(推荐 3.x 版本;已停止维护的 1.1.1 版本仍可使用)。
获取源码:
git clone -b main https://github.com/open-quantum-safe/liboqs.git
cd liboqs
然后构建:
mkdir build && cd build
cmake -GNinja ..
ninja
各种用于定制生成产物的 cmake 构建选项均可用,并在 CONFIGURE.md 中进行了说明。所有受支持的选项也列在 .CMake/alg-support.cmake 文件中,并可通过在 build 目录中运行 cmake -LAH -N .. 查看。
以下说明假定我们位于 build 目录中。
默认情况下,主要构建产物是静态库 lib/liboqs.a。如果你想构建共享/动态库,请在上述 cmake -GNinja .. 命令后附加 -DBUILD_SHARED_LIBS=ON,结果将是 lib/liboqs.so|dylib|dll。公共头文件位于 include 目录中。tests 目录下还构建了多种程序:
test_kem:用于密钥封装机制的简单测试工具test_sig:用于签名方案的简单测试工具test_sig_stfl:用于有状态签名方案的简单测试工具test_kem_mem:用于检查密钥封装机制内存消耗的简单测试工具test_sig_mem:用于检查签名方案内存消耗的简单测试工具kat_kem:使用与 NIST 提交要求相同的程序生成密钥封装机制已知答案测试(KAT)值的程序,用于通过 tests/test_kat.py 与提交的 KAT 值进行核对可以使用安装了 CMake Tools 扩展的 Visual Studio 2019 生成二进制文件。可以使用与上述 Linux/macOS 相同的选项,构建产物将生成在指定的 build 文件夹中。
如果你想创建 Visual Studio 构建文件,例如不使用 ninja 时,请务必_不要_像上面示例那样向 cmake 命令传递 -GNinja 参数。然后你可以使用 msbuild 构建所有组件,例如:msbuild ALL_BUILD.vcxproj,并使用如下命令安装所有产物:msbuild INSTALL.vcxproj。
你可以为各种平台交叉编译 liboqs。详细信息请参阅 Wiki。
有关构建、可选构建参数、示例应用程序、编码约定等的更详细信息,请参阅 wiki。
我们热忱欢迎符合验收标准的贡献。更多详情请参阅我们的 贡献指南。
liboqs 根据 MIT 许可证授权;详情请参阅 LICENSE.txt。
liboqs 包含一些采用不同许可证的第三方库或模块;相应的子文件夹包含适用于该情况的许可证。特别是:
.CMake/CMakeDependentOption.cmake:BSD 3-Clause 许可证src/common/common.c:包含 Apache License v2.0 许可的部分src/common/crypto/aes/aes_c.c:公有领域或任何 OSI 批准的许可证src/common/crypto/aes/aes*_ni.c:公有领域src/common/crypto/sha2/sha2_c.c:公有领域src/common/crypto/sha3/xkcp_low:CC0(公有领域),brg_endian.h 和 KeccakP-1600-AVX2.s 除外src/common/crypto/sha3/xkcp_low/.../brg_endian.h:BSD 3-Clause 许可证src/common/crypto/sha3/xkcp_low/.../KeccakP-1600-AVX2.s:类似 BSD 的 CRYPTOGAMS 许可证src/common/rand/rand_nist.c:参见文件src/kem/bike/additional:Apache License v2.0OQS 项目由 后量子密码联盟 作为 Linux 基金会 的一部分提供支持。
OQS 项目由 Douglas Stebila 和 Michele Mosca 在滑铁卢大学创立。liboqs 的贡献者 包括个人贡献者、学者和研究人员,以及多家公司,包括 Amazon Web Services、Cisco Systems、evolutionQ、IBM Research、Microsoft Research、SandboxAQ 和 softwareQ。
Open Quantum Safe 的开发获得了 Amazon Web Services、加拿大网络安全中心、Cisco、Unitary Fund、NGI Assure Fund 和 VeriSign Inc. 的财务支持。
开发 OQS 特定组件的研究项目得到了多项研究资助的支持,包括加拿大自然科学与工程研究委员会(NSERC)的资助;资助确认请参见原始论文。
| 算法系列 | 标准化状态 | 主要实现 | 上游维护 | OQS 层级 |
|---|
| BIKE | 未被 NIST 选中 | awslabs/bike-kem | 待定 | 第 3 层(社区) |
| Classic McEliece | 正在接受 ISO 审议 | PQClean/PQClean@1eacfda | 无活跃维护 | 第 3 层(社区) |
| FrodoKEM | 正在接受 ISO 审议 | microsoft/PQCrypto-LWEKE@a2f9dec | 尽力而为 | 第 2 层(受支持) |
| HQC | 被 NIST 选中用于即将到来的标准化 | pqc-hqc/hqc@161cd4f | 待定 | 第 2 层(受支持) |
| Kyber | 被 NIST 选为 ML-KEM(FIPS 203)的基础 | pq-crystals/kyber@441c051 | 积极维护 | 第 3 层(社区) |
| ML-KEM | 由 NIST 标准化 | pq-code-package/mlkem-native@0ba906c | 积极维护 | 第 1 层(核心) |
| NTRU | 未被 NIST 选中,正在接受 NTT 的标准化审议 | PQClean/PQClean@4c9e5a3 | 积极维护 | 第 3 层(社区) |
| NTRU-Prime | 未被 NIST 选中 | openssh/openssh-portable | 积极维护 | 第 3 层(社区) |
| 算法系列 | 标准化状态 | 主要实现 | 上游维护 | OQS 层级 |
|---|
| CROSS | 正在接受 NIST 审议 | CROSS-signature/CROSS-lib-oqs@179d61b | 积极维护 | 第 3 层(社区) |
| Falcon | 被 NIST 选中用于即将到来的标准化 | PQClean/PQClean@1eacfda | 待定 | 第 3 层(社区) |
| MAYO | 正在接受 NIST 审议 | PQCMayo/MAYO-C@64e15c6 | 积极维护 | 第 3 层(社区) |
| ML-DSA | 由 NIST 标准化 | pq-code-package/mldsa-native@9b0ee84 | 积极维护 | 第 2 层(受支持) |
| MQOM | 正在接受 NIST 审议 | mqom/mqom-v2@ec6b7fa | 积极维护 | 第 3 层(社区) |
| SLH-DSA | 由 NIST 标准化 | pq-code-package/slhdsa-c@a0fc1ff | 尽力而为 | 第 3 层(社区) |
| SNOVA | 正在接受 NIST 审议 | vacuas/SNOVA@1c3ca6f | 尽力而为 | 第 3 层(社区) |
| UOV | 正在接受 NIST 审议 | pqov/pqov@33fa527 | 尽力而为 | 第 3 层(社区) |
| 算法系列 | 标准化状态 | 主要实现 | 上游维护 | OQS 层级 |
|---|
| LMS | 由 IRTF 标准化,经 NIST 批准 | cisco/hash-sigs | 尽力而为 | 第 2 层(受支持) |
| XMSS | 由 IRTF 标准化,经 NIST 批准 | XMSS/xmss-reference | 积极维护 | 第 2 层(受支持) |
kat_sig:使用与 NIST 提交要求相同的程序生成签名方案已知答案测试(KAT)值的程序,用于通过 tests/test_kat.py 与提交的 KAT 值进行核对kat_sig_stfl:用于通过 tests/test_kat.py 与提交的 KAT 值进行核对结果的程序speed_kem:密钥封装机制基准测试程序;用法说明请参见 ./speed_kem --helpspeed_sig:签名机制基准测试程序;用法说明请参见 ./speed_sig --helpspeed_sig_stfl:有状态签名机制基准测试程序;用法说明请参见 ./speed_sig_stfl --helpexample_kem:展示 KEM API 用法的最小可运行示例example_sig:展示签名 API 用法的最小可运行示例example_sig_stfl:展示有状态签名 API 用法的最小可运行示例test_aes、test_sha3:用于加密子组件的简单测试工具test_portability:用于检查跨 CPU 代码可移植性的简单测试工具;需要存在 qemu;仅在 Ubuntu 上验证了正确运行可以使用以下命令运行完整的测试套件:
ninja run_tests
要生成 API 的 HTML 文档,请运行:
ninja gen_docs
然后在 Web 浏览器中打开 docs/html/index.html。
可以运行 ninja install 将构建的库和 include 文件安装到指定位置,该位置可以在配置时通过向 cmake 传递 -DCMAKE_INSTALL_PREFIX=<dir> 选项来指定。或者,可以运行 ninja package 来创建安装包。
可以运行 ninja uninstall 来删除所有安装文件。
src/kem/classic_mceliece/pqclean_*:公有领域src/kem/kyber/pqcrystals-*:公有领域(CC0)或 Apache License v2.0src/kem/kyber/pqclean_*:公有领域(CC0),以及公有领域(CC0)或 Apache License v2.0,以及公有领域(CC0)或 MIT,以及 MITsrc/kem/kyber/libjade_*:公有领域(CC0)或 Apache License v2.0src/kem/ml_kem/mlkem-native_*:MIT 或 Apache License v2.0 或 ISC 许可证src/kem/ntru/pqclean_*:公有领域(CC0)src/kem/ntruprime/sntrup761_openssh:公有领域src/sig/falcon/pqclean_\*\_aarch64:Apache License v2.0src/sig/mayo/*:Apache License v2.0src/sig/ml_dsa/pqcrystals-*:公有领域(CC0)或 Apache License v2.0