8个版本 (4个重大更新)
使用旧的Rust 2015
0.5.0 | 2020年4月20日 |
---|---|
0.4.2 | 2020年4月4日 |
0.4.1 | 2019年12月5日 |
0.4.0 | 2019年10月9日 |
0.1.0 | 2017年11月9日 |
#770 in 加密学
每月下载2,675次
在 8 个crate中使用 (5个直接使用)
305KB
7K SLoC
Rust PKCS#11库
这是一个将PKCS#11支持引入Rust的库。它旨在提供一个非常底层的API,将PKCS#11功能映射到Rust,同时也提供更高层次的API,以方便使用并提高编程对PKCS#11的安全性。
状态
该库完全支持PKCS#11 v2.40中的所有功能。理论上应与任何v2.00或更高版本的Cryptoki版本兼容。例如,对于仅在v2.01中添加的C_WaitForSlotEvent
,有特殊处理。您可以成功实现并达到所有低级别Cryptoki语义和结构。所有这些都在SoftHSM的帮助下进行了集成测试。为了更好的互操作性,低层API使用了与官方标准中定义的几乎相同的函数/方法调用和数据结构。这意味着使用低层API对于熟悉PKCS#11的人来说应该非常容易,因为命名和变量/常量/定义都是相同的。
正在设计一个更符合Rust风格的API。其目标是隐藏大多数不需要了解的低级PKCS#11语义,因为它们可能非常冗长。此外,使用Rust数据结构,可以在编译时创建一个更安全的库,以帮助用户更成功地使用PKCS#11,并使其更健壮。它还将提供更简单的多部分加密/解密/签名等原语。理想情况下,通过提供流式API。最后但并非最不重要的是,它将提供会话管理和锁定/解锁会话,这些会话可以从上下文中获得。特别是在提供并行处理的令牌上,这可能是一个非常繁琐且容易出错的流程。
兼容性矩阵
待办事项: 这仍在制作中,很可能非常不完整。
由于PKCS#11的实现并不总是遵循标准,您的令牌可能仍然存在问题,这很遗憾。以下是一些用户报告的已知令牌,它们肯定可以与这个库一起工作。
- SoftHSM版本2(当然,谁会想到)
- Nitrokey HSM 2
- CardConnect SmartCard-HSM
- Safenet iKey 2032
- 以及可能还有更多...
如果您使用的是这里未列出的HSM,请打开一个问题(或者更好的是提交一个PR),以便我可以更新这个矩阵。如果您的令牌无法正常工作,当然,也请打开一个问题,以便我们可以进行调查。
测试
当前的测试使用的是SoftHSM2。非常感谢OpenDNSSEC团队编写SoftHSM。这使得开发需要支持PKCS#11的应用程序成为可能。没有它,我真的不知道该怎么办。(欢迎提出建议。)
待办事项
以下是一份实现状态和后续计划列表
- 动态加载PKCS#11模块(感谢libloading)
- 初始化和丢弃PKCS#11上下文
- 实现令牌和PIN管理函数
- 实现会话管理函数
- 实现对象管理函数
- 实现密钥管理函数
- 实现加密/解密函数
- 实现消息摘要函数
- 实现签名和MACing
- 实现签名和MAC的验证
- 实现双功能加密操作
- 实现遗留的PKCS#11函数
- 重新组织低级API的代码(过于庞大,我们都知道PKCS#11就是这样的)
- 将C头文件
pkcs11t.h
中的类型导入到Rust中 - 将C头文件
pkcs11f.h
中的函数导入到Rust中 - 在crates.io上发布(哇,那太容易了)
- C类型常量到字符串转换函数,以及反向操作(可能是高级API的一部分?)
- 设计和实现高级API
- 编写和生成Rust文档的文档
- 更好的测试(大量重复的代码 + 我们需要一个测试框架,并为不同的平台使用不同的SoftHSM版本)
- 支持PKCS#11 v3.00
- 在可能的情况下,使用平台默认值创建打包的struct和CK_ULONG / CK_LONG功能标志 - 目前当目标为Windows时,这是默认的,因为PKCS#11明确要求在Windows上使用打包的struct,并且
unsigned long
和long
在Microsoft编译器中默认情况下都是32位的。然而,在其他任何Unix平台上,默认值并没有真正定义,并且可能需要选择其中一个或另一个。
依赖关系
~0.5–1MB
~15K SLoC