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 加密学

Download history 753/week @ 2024-03-14 798/week @ 2024-03-21 711/week @ 2024-03-28 693/week @ 2024-04-04 871/week @ 2024-04-11 1021/week @ 2024-04-18 455/week @ 2024-04-25 848/week @ 2024-05-02 597/week @ 2024-05-09 781/week @ 2024-05-16 1016/week @ 2024-05-23 1021/week @ 2024-05-30 560/week @ 2024-06-06 734/week @ 2024-06-13 742/week @ 2024-06-20 402/week @ 2024-06-27

每月下载2,675
8 个crate中使用 (5个直接使用)

Apache-2.0

305KB
7K SLoC

Rust PKCS#11库

Latest version Documentation Build status Build status Build status Build status codecov License

这是一个将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的实现并不总是遵循标准,您的令牌可能仍然存在问题,这很遗憾。以下是一些用户报告的已知令牌,它们肯定可以与这个库一起工作。

如果您使用的是这里未列出的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 longlong在Microsoft编译器中默认情况下都是32位的。然而,在其他任何Unix平台上,默认值并没有真正定义,并且可能需要选择其中一个或另一个。

依赖关系

~0.5–1MB
~15K SLoC