#fips #ml #lattice #kem #203

fips203-ffi

C共享库,暴露FIPS 203(草案):基于模块-格的密钥封装机制

1个不稳定版本

0.2.1 2024年5月25日

#1458密码学

MIT/Apache

390KB
1.5K SLoC

Rust 1K SLoC // 0.2% comments Python 220 SLoC // 0.3% comments

ML-KEM的C共享对象

此crate提供了一个共享对象(动态链接库),使用标准的C FFI ABI,提供了一个ML-KEM的功能实现。

此实现的目的是

  • 简单性
  • 正确性
  • 调用者只处理序列化对象
  • 没有库特定的内存管理(调用者管理所有对象)
  • 库在调用之间不保留内部状态
  • 最小化的符号可见性
  • 稳定的API/ABI

安全相关目标

  • 恒定时间操作
  • 清理库RAM(对象应在函数退出前从任何库分配的内存中清零)

非目标是

  • 速度
  • 效率
  • 大小

待完成的工作

  • 更好的内部错误处理
  • 测试!
  • 在共享对象中减少符号可见性

考虑但放弃的路径

  • 自动生成稳定的C头文件(例如使用cbindgen);考虑到API/ABI的简单性,手动编写的头文件可能没问题

快速入门

$ cd ffi   # this directory
$ cargo build
$ (cd tests && make)
$ python3
>>> from fips203 import ML_KEM_512
>>> 
>>> (encapsulation_key, decapsulation_key) = ML_KEM_512.keygen()
>>> (ciphertext, shared_secret_1) = encapsulation_key.encaps()
>>> shared_secret_2 = decapsulation_key.decaps(ciphertext)
>>> assert(shared_secret_1 == shared_secret_2)

依赖关系

~1.4–2MB
~27K SLoC