Jamie-Cui/yacl-r
GitHub: Jamie-Cui/yacl-r
yacl-r 是一个用于密码学和安全计算研究的 C++ 基础库,提供了从底层加密原语到高层 MPC 协议的全栈实现。
Stars: 10 | Forks: 2
# 另一个用于研究的密码学库
```
██╗ ██╗ █████╗ ██████╗██╗ ██████╗
╚██╗ ██╔╝██╔══██╗██╔════╝██║ ██╔══██╗
╚████╔╝ ███████║██║ ██║ █████╗██████╔╝
╚██╔╝ ██╔══██║██║ ██║ ╚════╝██╔══██╗
██║ ██║ ██║╚██████╗███████╗ ██║ ██║
╚═╝ ╚═╝ ╚═╝ ╚═════╝╚══════╝ ╚═╝ ╚═╝
```
Yacl-r 是 C++ 密码学库
[secretflow/yacl](https://github.com/secretflow/yacl) 的一个分支和扩展。它提供了
密码学和安全计算构建块的研究实现,
包括 OT、VOLE、TPRE、DPF、PRG、RO、AES、哈希、公钥加密、
签名,以及辅助的数学/通信(link)工具。
目标平台:Linux x86_64、Linux aarch64 和 macOS Apple Silicon。
## 仓库结构
- [aead](yacl/aead/)、[aes](yacl/aes/)、
[block_cipher](yacl/block_cipher/)、[hash](yacl/hash/)、[hmac](yacl/hmac/):
对称加密、哈希和认证原语。
- [pke](yacl/pke/)、[sign](yacl/sign/)、[envelope](yacl/envelope/)、
[tpre](yacl/tpre/):公钥、签名、数字信封和门限代理
重加密代码。
- [ot](yacl/ot/):基础 OT、OT 扩展、OT 存储和 SimplestOT 后端。
- [vole](yacl/vole/):基础 VOLE、MP-VOLE、MPFSS 和无声 VOLE 代码。
- [mpc](yacl/mpc/):更高层的 MPC 内核和明文/秘密共享
执行器。
- [dpf](yacl/dpf/)、[oprf](yacl/oprf/)、[snark](yacl/snark/):额外的
协议实现。
- [io](yacl/io/):流式 I/O 和 Bristol Fashion 电路解析。
- [link](yacl/link/):RPC 风格的 SPMD 通信工具。
- [math](yacl/math/):大整数、有限域、ECC 和配对支持。
- [rand](yacl/rand/):随机性、DRBG、熵源和 OpenSSL provider
代码。
- [utils](yacl/utils/):通用类型、缓冲区、异常、序列化和
辅助工具。
- [theoretical_tools](yacl/theoretical_tools/):协议实现所使用的
PRG/RO/代码工具。
- [experimental](yacl/experimental/):不属于
稳定模块布局的实验性组件。
- [cmake](cmake/):CMake 模块、依赖脚本和依赖补丁。
## 前置条件
- GCC >= 11 或 Clang >= 12,需支持 C++20
- CMake >= 3.20
- Ninja 或 Make
- Perl 5 及其核心模块,OpenSSL 需要
- `patch`,用于应用依赖补丁
- 系统上可用的 GMP 开发文件
Ubuntu 示例:
```
sudo apt install -y git cmake ninja-build gcc g++ patch libgmp-dev
```
## 构建
Yacl-r 使用 CMake。
```
# 配置 Release 构建。
cmake -S . -B build -G Ninja
# 配置 Debug 构建。
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug
# 构建。
cmake --build build -j$(nproc)
```
使用 Clang/libFuzzer 构建 fuzz 目标:
```
cmake -S . -B build-fuzz -G Ninja \
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ \
-DBUILD_FUZZ=On
cmake --build build-fuzz -j$(nproc)
```
## 测试
在构建目录中运行测试:
```
cd build
ctest --output-on-failure
ctest -R plaintext_executor_test --output-on-failure
./bin/buffer_test
```
## 格式化与检查
此仓库未配置 pre-commit 或自动的许可证头检查。
请改用常规的构建、测试以及专门的格式化/lint 命令:
```
clang-format -i path/to/file.cc
clang-tidy path/to/file.cc -- -p build
cmake --build build -j$(nproc)
ctest --output-on-failure
```
## 安装
Yacl-r 支持 `cmake --install`。
```
cmake -S . -B build
cmake --build build -j$(nproc)
cmake --install build
# 或者安装到自定义 prefix。
cmake --install build --prefix /path/to/prefix
```
第三方内置依赖会被安装到安装前缀内的私有子目录中,
而不是被复制到系统范围的 include/library 路径中:
- 公共头文件:`include/yacl-r/yacl/...`
- 私有内置头文件:`include/yacl-r/deps/...`
- 私有内置库:`lib*/yacl-r/deps/...`
这使得 Yacl-r 的内置依赖项与系统工具链和
不相关的项目保持隔离。在包使用阶段,GMP 仍然被解析为系统依赖项。
使用者可以通过 CMake 使用已安装的包:
```
find_package(Yacl CONFIG REQUIRED)
target_link_libraries(your_target PRIVATE Yacl::yacl)
```
导出的 target 会将 `include/yacl-r` 添加到 include 路径中,因此安装后的
使用者可以使用 `#include "yacl/..."` 来包含公共头文件。
## 许可证
参见 [LICENSE](LICENSE)。
标签:Bash脚本, C++, 安全多方计算, 安全测试工具, 密码学, 密码学库, 底层原语, 手动系统调用, 数据擦除, 隐私计算