在此处查看每个组件的构建状态
简而言之, PQClean致力于收集 NIST 后量子项目中后量子方案的干净实现。 PQClean 的目标是提供独立的实现
PQCclean 的目的不是
作为第一个主要目标,我们正在收集满足下列要求的 C 实现。我们也接受优化的实现,但仍然需要高质量、经过测试的代码。
如果您有兴趣向 PQClean 添加方案,另请查看我们的贡献者指南。
有关 PQClean 工作中的经验教训总结,请参阅:
马蒂亚斯·J·坎维舍尔 (Matthias J. Kannwischer)、彼得·施瓦贝 (Peter Schwabe)、道格拉斯·斯特比拉 (Douglas Stebila) 和汤姆·威格斯 (Thom Wiggers)。 “提高密码学标准化项目的软件质量。”见:安全标准化研究 – EuroS&P 研讨会 2022。2022。
论文地址:https://eprint.iacr.org/2022/337
引用 PQClean 时请引用这项工作:
@inproceedings { SSR:KSSW22 ,
author = { Matthias J. Kannwischer and
Peter Schwabe and
Douglas Stebila and
Thom Wiggers } ,
title = { Improving Software Quality in Cryptography Standardization Projects } ,
booktitle = { {IEEE} European Symposium on Security and Privacy, EuroS{&}P 2022 - Workshops, Genoa, Italy, June 6-10, 2022 } ,
pages = { 19--30 } ,
publisher = { IEEE Computer Society } ,
address = { Los Alamitos, CA, USA } ,
year = { 2022 } ,
url = { https://eprint.iacr.org/2022/337 } ,
doi = { 10.1109/EuroSPW55150.2022.00010 } ,
}
请注意,PQClean 中包含的许多实现都源自原始研究项目本身,它们的作者也将很高兴被引用。
对该清单上项目的检查仍在开发中。检查的项目应该可以工作。
api.h
不能包含外部文件-Wall -Wextra -Wpedantic -Werror -Wmissing-prototypes
和gcc
和clang
进行编译#if
/ #ifdef
仅用于标头封装const
参数被标记为const
fips202.c
、 sha2.c
、 aes.c
、 randombytes.c
0
nmake
) PQCLEAN_SCHEMENAME_
命名LICENSE
文件(见下文) META.yml
文件,提供有关算法版本、设计者的详细信息META.yml
中指定。 stdint.h
类型(可选,推荐)size_t
(可选,推荐)for (size_t i=...
) (可选,推荐) 对于以下方案,我们有一个或多个参数集的实现。对于所有这些方案,我们都有干净的 C 代码,但对于某些方案,我们也有优化的代码。
决赛入围者:
候补候选人:
未来标准:
候补候选人:
之前在 PQClean 中可用并在 NIST 标准化工作第 3 轮中放弃的实现可在round2
标签中使用。
之前在 PQClean 中可用并在 NIST 标准化工作第 4 轮中删除的实现可在round3
标签中使用。
PQClean 本质上使用与 NIST 参考实现所需的相同 API,SUPERCOP 和 libpqcrypto 也使用该 API。与该 API 的唯一区别如下:
size_t
类型传递,而不是unsigned long long
;和 int PQCLEAN_SCHEME_IMPL_crypto_sign_signature (
uint8_t * sig , size_t * siglen ,
const uint8_t * m , size_t mlen ,
const uint8_t * sk );
int PQCLEAN_SCHEME_IMPL_crypto_sign_verify (
const uint8_t * sig , size_t siglen ,
const uint8_t * m , size_t mlen ,
const uint8_t * pk );
如上所述,PQClean并不意味着构建为单个库:它是可以轻松集成到其他库中的源代码集合。 PQClean 存储库包含各种测试程序,它们确实构建了各种文件,但您不应该使用生成的二进制文件。
所需依赖项列表: gcc or clang, make, python3, python-yaml library, valgrind, astyle (>= 3.0)
。
PQClean 中的每个实现目录(例如 crypto_kem/kyber768_clean)都可以提取以在您自己的项目中使用。您将需要:
common/randombytes.h
(加密随机数生成器),可能还包括common/sha2.h
(SHA-2 哈希函数系列)、 common/aes.h
(AES 实现)、 common/fips202.h
( SHA-3 哈希函数系列)和common/sp800-185.h
(cSHAKE 系列)。可以使用common/
文件夹中的实现,但请注意,它们可能不是性能最高的实现,并且可能出于我们的测试目的执行不必要的操作(例如堆分配)。关于#2,将文件添加到项目的构建系统中,PQClean 中的每个实现都附带两个示例 makefile,它们显示了如何为该实现构建文件:
Makefile
可以与 GNU Make、BSD Make 以及可能的其他文件一起使用。Makefile.Microsoft_nmake
可以与 Visual Studio 的 nmake 一起使用。 以下项目使用 PQClean 的实现,并提供自己的围绕实现的包装器。他们的集成策略可以作为您自己项目的示例。
每个包含实现的子目录都包含一个LICENSE
文件,说明在什么许可证下发布特定的实现。这些文件的common
在于文件顶部包含许可信息(当前属于公共域或 MIT)。此存储库中的所有其他代码都是在 CC0 条件下发布的。
有关 PQClean 测试框架的详细信息,请参阅 https://github.com/PQClean/PQClean/wiki/Test-framework。
虽然我们在 Github Actions((模拟)Linux 版本、MacOS 和 Windows 版本)和 Travis CI(Aarch64 版本)上运行了大量的自动测试,但大多数测试也可以在本地运行。为此,请确保安装了以下内容:
pytest
。我们还建议安装pytest-xdist
以允许并行运行测试。
您还需要通过运行以下命令来确保子模块已初始化:
git submodule update --init
通过进入test
目录并运行pytest -v
或(推荐) pytest -n=auto
来运行基于 Python 的测试以进行并行测试。
您还可以运行python3
,其中
是test/
文件夹中以test_
开头的任何文件。