kstzv/ml-kem
GitHub: kstzv/ml-kem
纯 C 语言实现的 ML-KEM(FIPS 203)后量子密钥封装机制,支持用户空间与 Linux 内核,零外部依赖,面向可移植性和内存显式控制。
Stars: 1 | Forks: 0
# ML-KEM (FIPS 203) — 纯 C 语言实现
一个用纯 C 编写的 ML-KEM (Kyber) 后量子密钥封装机制的低级实现。
本项目侧重于正确性、透明度和架构清晰度,而不是过早的优化或生产就绪。
## 📌 概述
该实现侧重于架构清晰度、可移植性以及显式的内存控制。
设计上避免了外部依赖,并引入了自定义的解封装池,以减少分配开销并提高在受限环境或内核环境中的性能。
该实现遵循标准 C 语义,以简化在不同平台(包括用户空间和 Linux 内核)之间的移植。
## ⚠️ 状态
Beta (v0.2.1)
**这是一个早期(beta)版本。**
- ✔ 用户空间实现功能正常
- ✔ NIST KAT 测试(密钥生成与封装)通过
- ✔ 已针对有效的封装输出进行端到端解封装验证
- ✔ Linux 内核模块构建及加载/卸载正常
- ✔ 解封装池的压力测试(参见 `test_pool/`)
**尚未完成:**
- ❌ 完整的恒定时间验证(计划通过 dudect 实现)
- ❌ 广泛的模糊测试
- ❌ 内核空间中针对 KAT 的验证
- ❌ 正式的安全审计
## 🎯 目标
- 提供一个**清晰、易读的 ML-KEM (FIPS 203) 实现**
- 保持**对内存和数据流的严格控制**
- 避免外部依赖(包括加密库)
- 同时支持:
- 用户空间
- Linux 内核环境
- 作为**本项目的研究与教育主要实现**
## ✨ 特性
- 纯 C (C11),无外部库
- 零依赖的加密核心
- 自有实现包括:
- SHA3-256 / SHA3-512
- SHAKE128 / SHAKE256
- Keccak-f[1600]
- 完整的多项式算术:
- NTT / 逆 NTT
- Barrett 约减
- ML-KEM 组件:
- 密钥生成
- 封装
- 解封装
- 用于解封装上下文的内存池(使用原子操作的无锁实现)
- 专为可移植性设计(用户空间 + 内核)
## 🚀 未来工作
- 恒定时间验证 (dudect)
- 用于内核测试的 AF_ALG 集成
- 额外的优化阶段
- 扩展的测试覆盖范围
- 文档改进
### 🔧 硬件加速(探索)
计划研究硬件辅助加速路径,包括:
- 集成特定于 CPU 的优化(例如 SIMD、指令集)的可行性
- 潜在的平台提供的加密加速器的使用
- 针对可选硬件后端的抽象层评估
- 硬件辅助路径的恒定时间影响分析
目标是探索性能提升,同时不损害可移植性或引入强制性依赖。
## 🧱 项目结构
| 文件 | 描述 |
|------|------------|
| `ml_kem.c` | 公共 API 层 |
| `ml_kem_core_header.h` | 核心定义、常量和结构 |
| `ml_kem_create_keys.c` | 密钥生成 |
| `ml_kem_encaps.c` | 封装逻辑 |
| `ml_kem_decrypt.c` | 解封装(解密 + 重新封装) |
| `ml_kem_ntt_main.c` | NTT 与多项式运算 |
| `math_operations.c` | 模算术(Barrett 约减等) |
| `ml_kem_sha.c` | SHA3-256 / SHA3-512 |
| `ml_kem_shake.c` | SHAKE128 / SHAKE256 |
| `keccak_f1600_ct.c` | Keccak 置换 |
| `ml_kem_pool.c` | 解封装池实现 |
## 🧠 架构概述
该实现围绕显式的上下文结构构建:
- `ml_kem_ctx` — 持久性密钥材料
- `ml_kem_temp` — 密钥生成的临时缓冲区
- `ml_kem_encaps_ctx` — 封装上下文
- `ml_kem_decrypt_ctx` — 解封装上下文
- `ml_kem_pool_decaps_ctx` — 可重用的解封装插槽池
关键设计理念:
- 分离**持久内存与临时内存**
- 避免隐藏的分配
- 显式的生命周期控制(分配 / 擦除 / 销毁)
- 最小的抽象开销
## 🔐 安全考量
- 核心加密路径中不存在依赖于秘密数据的分支(在适用情况下)
- 显式的内存清零(`ml_kem_memzero`)
- 公开数据流与秘密数据流的分离
- 设计时考虑了恒定时间执行原则
⚠️ 但是:
- 恒定时间保证**尚未得到正式验证**
- 编译器优化可能会影响行为
- 计划进行进一步的验证
## 🧪 测试
当前已实现:
- ✔ NIST KAT(密钥生成、封装)
- ✔ 功能性解封装验证
- ✔ 以下项目的高竞争压力测试:
- 解封装池(256 个线程 / 16 个插槽)
- ThreadSanitizer (TSan) 无异常
- AddressSanitizer (ASan) / UBSan 无异常
- (有关可重现的压力测试设置和 sanitizer 运行,请参见 `test_pool/`)
计划中:
- 基于 dudect 的恒定时间测试
- 内核空间的 KAT 验证
- 池子系统的压力测试
- 随机性质量检查
## 🐧 内核支持
本项目包含与 Linux 内核兼容的构建:
- 不依赖仅限用户空间的 API
- 适合与内核加密子系统集成(未来工作)
- 潜在的用例:
- 嵌入式系统
- 安全固件
- 内核中的加密服务
## ⚙️ 构建
### 用户空间
```
gcc -std=c11 -O2 -Wall -Wextra *.c -o ml_kem
---
## 📌 注意事项
- This project intentionally avoids external crypto libraries.
- If your compiler aggressively optimizes memory operations,
consider replacing `ml_kem_memzero()` with a platform-specific secure wipe.
---
## License
This project is dual-licensed under:
- GNU General Public License v2.0
- MIT License
You may choose either license.
---
## 🤝 Contributing
Feedback, reviews, and suggestions are welcome.
---
## 📬 联系我们
- GitHub: kstzv(https://github.com/kstzv)
- Email: kstzavertaylo@gmail.com
```
标签:Barrett约简, C11, FIPS 203, Keccak, KEM, Kyber, Linux内核, ML-KEM, NTT, PQC, SHA3, SHA3-256, SHA3-512, SHAKE128, SHAKE256, 内存池, 内核模块, 分配释放, 原子操作, 后量子密码学, 多项式算术, 安全, 安全资源, 客户端加密, 密码学, 密码库, 密码算法实现, 密钥封装机制, 开源, 手动系统调用, 抗量子计算, 数论变换, 无内存分配, 无锁, 用户态, 纯C, 超时处理, 透明性, 零依赖