QuickLogic-Corp/qlcrypt

GitHub: QuickLogic-Corp/qlcrypt

qlcrypt 是一个用于 FPGA 设备数据 IP 静态保护的 AES-256-GCM 文件加密库和 CLI 工具,解决 EDA 工具链中敏感数据的认证加密与密钥管理问题。

Stars: 0 | Forks: 0

# qlcrypt QuickLogic 独立加密库和 CLI,用于保护处于静态的 FPGA 设备数据 IP。在版本化的 `.en` 容器格式中提供经认证的 AES-256-GCM 文件加密,以及一个加固的密钥数据库和 命令行工具。作为 git submodule 被 FOEDAG 和 VTR/VPR 使用。 ## 状态 Pre-1.0 版本。API 和 `.en` 格式对于 v2 规范是稳定的,但 在标记 v1.0.0 版本之前,公共 API 可能会进行非破坏性更新。 有关发布历史,请参阅 [CHANGELOG.md](CHANGELOG.md),有关内部设计,请参阅 [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md)。 ## 功能 - **经过认证的 AES-256-GCM 加密**,每个文件使用随机 nonce (符合 NIST SP 800-38D 标准)。 - **版本化的 `.en` 容器** — 自描述的 27 字节 header (magic、版本、加密算法、nonce、明文长度)。 - **向后兼容的 v1 解密**,适用于旧版 FOEDAG 包。 - **解密缓存**(`Processor`) — 每个独立的文件在每个进程生命周期内最多解密一次;满足 VPR 要求的“每次运行只解密一次”的 不变性。 - **密钥指纹识别**(8 字节 SHA-256 前缀),用于针对每个客户的泄露进行 归因。 - **安全的内存清理** — 为密钥使用 `SecByteBlock`,为明文缓存使用 `SecureWipeBuffer`,在受支持的平台上可选 `mlock` / `madvise(MADV_DONTDUMP)` / `VirtualLock`。 - **CLI 工具**(`qlcrypt`),带有 git 风格的子命令: `keygen`、`encrypt`、`decrypt`、`inspect`、`verify`、`fingerprint`、`rotate`。 ## 构建说明 ### 前置条件 - CMake ≥ 3.15 - C++17 编译器:GCC ≥ 9、Clang ≥ 10、MSVC ≥ 2019 - [Crypto++](https://www.cryptopp.com/) ≥ 8.7.0(系统包或自带源码) - [cereal](https://github.com/USCiLab/cereal) 1.3.x(默认通过 FetchContent 获取源码) - [CLI11](https://github.com/CLIUtils/CLI11) 2.4.x(自带单头文件) - GoogleTest 1.14.x(通过 FetchContent 获取,仅用于构建测试) 在 Ubuntu / Debian 上: ``` sudo apt install cmake g++ libcrypto++-dev libcrypto++-utils pkg-config ``` 在 macOS 上: ``` brew install cmake cryptopp pkg-config ``` ### 快速构建 ``` git clone https://github.com/QuickLogic-Corp/qlcrypt.git cd qlcrypt cmake -B build -DCMAKE_BUILD_TYPE=Release cmake --build build -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) ctest --test-dir build --output-on-failure ``` ### CMake 选项 | 选项 | 默认值 | 用途 | |---|---|---| | `QLCRYPT_BUILD_TESTS` | 独立运行 `ON`,通过 `add_subdirectory` 时 `OFF` | 构建单元和集成测试 | | `QLCRYPT_BUILD_TOOL` | 独立运行 `ON`,通过 `add_subdirectory` 时 `OFF` | 构建 `qlcrypt` CLI 可执行文件 | | `QLCRYPT_BUILD_BENCH` | `OFF` | 构建 Google Benchmark 套件 | | `QLCRYPT_BUILD_FUZZ` | `OFF` | 构建 libFuzzer harness(需要 Clang) | | `QLCRYPT_ENABLE_ASAN` | `OFF` | Address sanitizer | | `QLCRYPT_ENABLE_UBSAN` | `OFF` | UB sanitizer | | `QLCRYPT_ENABLE_MSAN` | `OFF` | Memory sanitizer(仅限 Clang) | | `QLCRYPT_ENABLE_COVERAGE` | `OFF` | lcov / gcov 插桩 | | `QLCRYPT_WARNINGS_AS_ERRORS` | `OFF`(CI 环境下:`ON`) | 将警告视为错误 | ## 用法 ### 作为 CMake submodule 使用 ``` add_subdirectory(third_party/qlcrypt) target_link_libraries(my_target PRIVATE qlcrypt::qlcrypt) ``` ### 作为系统安装的包使用 ``` find_package(qlcrypt 0.1 REQUIRED) target_link_libraries(my_target PRIVATE qlcrypt::qlcrypt) ``` ### 库 API ``` #include #include int main() { qlcrypt::KeyDB key_db; if (auto s = qlcrypt::KeyDB::load("device/_Supp.db", key_db); !qlcrypt::ok(s)) { std::cerr << "Load failed: " << qlcrypt::toString(s) << '\n'; return 1; } qlcrypt::Processor processor(std::move(key_db)); std::string_view yaml_view; if (auto s = processor.decryptFile("device/SB_MAPS.yml.en", yaml_view); !qlcrypt::ok(s)) { std::cerr << "Decrypt failed: " << qlcrypt::toString(s) << '\n'; return 1; } // yaml_view is valid for the lifetime of `processor`. // The same call again will hit the cache (no re-decrypt). } ``` ### CLI ``` # 创建 key database(带可选 customer tag) qlcrypt keygen --out device/_Supp.db --customer-id ACME-001 # 加密文件 qlcrypt encrypt --key-db device/_Supp.db \ --in device/SB_MAPS.yml --out device/SB_MAPS.yml.en # 就地加密目录(匹配 pattern) qlcrypt encrypt --key-db device/_Supp.db \ --in device/CSV --in-place --include '*.csv' # 解密至 stdout qlcrypt decrypt --key-db device/_Supp.db --in device/SB_MAPS.yml.en # 检查 header(无需 key) qlcrypt inspect device/SB_MAPS.yml.en --format json # 验证完整性(auth tag 检查,不写入 plaintext) qlcrypt verify --key-db device/_Supp.db --in device/SB_MAPS.yml.en # 打印 key fingerprint qlcrypt fingerprint device/_Supp.db # 在整个目录中 rotate keys qlcrypt rotate --old-key-db old/_Supp.db --new-key-db new/_Supp.db --dir device ``` 有关完整的参考说明,请参阅 `docs/CLI.md` 和 `man qlcrypt`。 ## 文档 - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — 内部设计 - [docs/FILE_FORMAT.md](docs/FILE_FORMAT.md) — `.en` v2 规范(权威标准) - [docs/API.md](docs/API.md) — 公共 API 参考 - [docs/CLI.md](docs/CLI.md) — CLI 参考 - [docs/SECURITY.md](docs/SECURITY.md) — 威胁模型和披露政策 - [docs/CONSUMER_GUIDE.md](docs/CONSUMER_GUIDE.md) — FOEDAG / VTR 集成指南 ## 许可证 Apache License 2.0。请参阅 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。
标签:AES-256-GCM, Bash脚本, C++, FPGA, 密码学, 手动系统调用, 数据擦除, 文件加密