13个版本

0.1.12 2022年9月30日
0.1.11 2022年9月7日
0.1.9 2022年8月27日
0.1.3 2022年7月25日
0.1.1 2022年6月26日

#784 in 网络编程

每月 34 次下载

MPL-2.0-no-copyleft-exception

170KB
3.5K SLoC

libmensago

一个用Rust编写的库,用于与Mensago平台上的密钥卡交互,在Mozilla Public License 2.0下发布。

描述

此库使开发人员能够创建、签名和验证密钥卡,这是一种专为平台需求设计的数字证书形式。

状态

libkeycard处于alpha阶段。API可能会有意外变化,直到1.0版本发布之前不应视为最终版本,因此使用此库的开发人员应知道,即使在当前的开发版本之间也可能会有破坏性的更改,因为semver将在1.0版本发布之前不使用。升级时请务必阅读变更日志

构建

构建libkeycard需要Rust工具链。检出仓库并运行cargo build


lib.rs:

Libkeycard是一个MPL2.0许可的库,用于与Mensago数字证书(称为密钥卡)交互。

尽管已经仔细编写,但此库不提供任何类型的保证。

为了有效使用此库,必须阅读Mensago 身份服务设计文档。

用法

与密钥卡交互的主要任务可以分为几个任务

  • 验证密钥卡
  • 检索加密或签名验证密钥
  • 添加新条目
  • 吊销密钥卡

验证密钥卡

与密钥卡交互最常见的情况是获取个人的最新加密或验证密钥。首先,您需要获取用户组织的完整密钥卡以及用户的完整密钥卡。

一旦您从组织的服务器获取了密钥卡的原始文本数据,验证组织的密钥卡就相对简单

  1. 使用 Keycard 对象,通过 from() 方法进行实例化。
  2. 调用 verify() 方法。

用户的关键卡验证更为复杂。

  1. 获取、实例化并验证组织的密钥卡。
  2. 获取、实例化并验证用户的密钥卡。
  3. 使用 find() 方法在组织的密钥卡中找到用户的根密钥卡条目。
  4. 从用户的密钥卡中获取根条目,并使用它来在分支点条目上调用 verify_chain() 方法。

获取密钥

获取密钥就像获取密钥卡当前条目的当前条目,并使用 get_field() 获取适当的字段。获取后,可以直接传递给 from_string()/from_strings() 用于加密或签名密钥/对或 CryptoString::from(),具体取决于使用需求。

添加新的组织条目

创建全新的根组织条目是在组织的服务器设置过程中完成的。通过从组织密钥卡数据创建一个 Keycard 实例并调用 chain() 方法来添加新条目,该方法生成新条目、签名并返回新条目和新密钥集。从那里,新的条目通过客户端发送的 ORGCHAIN 命令上传到服务器。

添加新的用户条目

创建新的根用户条目是所有与密钥卡相关过程中最复杂的,因为服务器和用户之间不信任对方。

  1. 生成新的用户密钥集,包括用于联系请求的签名密钥对、用于联系请求的加密密钥对、用于通用用途的签名密钥对和用于通用用途的加密密钥对。
  2. 使用 new()new_from_str() 创建新的条目实例。
  3. 根据需要设置字段数据,包括条目有效期(过期时间)。将“生存时间”字段设置为推荐的14天,并且构造函数还会自动生成时间戳。
  4. 使用 is_data_compliant() 确认条目符合基本数据合规性。
  5. 开始签名过程,通过将条目数据提交给服务器以填充 Organization-Signature 认证字符串。
  6. 使用组织密钥卡的当前条目的 Hash 字段的值设置 Previous-Hash 字段。
  7. 通过调用 hash() 并指定所需的哈希算法来生成所有当前条目数据的哈希。
  8. 使用联系请求签名对使用“用户签名”签名。
  9. 将条目上传到服务器

将新非根条目添加到密钥卡的过程相对简单。

  1. 创建一个用户密钥卡数据的 Keycard 实例。
  2. 调用密钥卡的 chain() 方法,使用当前条目的联系请求签名对来生成保管链签名,并返回新的条目和密钥集。
  3. 然后,客户端将新的条目上传到服务器进行签名。使用此库的服务器将调用 cross_sign() 方法来完成此操作。
  4. 通过调用 hash() 并指定所需的哈希算法来生成所有当前条目数据的哈希。
  5. 使用联系请求签名对使用“用户签名”签名。
  6. 将条目上传到服务器

撤销用户密钥卡

撤销用户密钥卡的过程并不复杂。

  1. 创建一个用户密钥卡数据的 Keycard 实例。
  2. 调用密钥卡的 revoke() 方法来创建一个新的根条目,并带有更新后的 Index 字段和新的密钥集。
  3. 然后,客户端将新的条目上传到服务器进行签名。使用此库的服务器将调用 cross_sign() 方法来完成此操作。
  4. 使用组织密钥卡的当前条目的 Hash 字段的值设置 Previous-Hash 字段。
  5. 通过调用 hash() 并指定所需的哈希算法来生成所有当前条目数据的哈希。
  6. 使用联系请求签名对使用“用户签名”签名。
  7. 使用 REVOKE 命令将条目上传到服务器

撤销组织密钥卡

从恢复时间来看,这是最坏的情况,但这个过程本身并不困难。

  1. 创建一个用户密钥卡数据的 Keycard 实例。
  2. 调用密钥卡的 revoke() 方法来创建一个新的根条目,并带有更新后的 Index 字段和新的密钥集。
  3. 然后,客户端将新的条目上传到服务器进行签名。使用此库的服务器将调用 cross_sign() 方法来完成此操作。
  4. 使用组织密钥卡的当前条目的 Hash 字段的值设置 Previous-Hash 字段。
  5. 通过调用 hash() 并指定所需的哈希算法来生成所有当前条目数据的哈希。
  6. 使用联系请求签名对使用“用户签名”签名。
  7. 使用 ORGREVOKE 命令将条目上传到服务器

通过发送 ORGREVOKE 命令,服务器将用新的密钥卡树替换组织的密钥卡树,并向所有用户发送撤销请求。

依赖关系

~26MB
~236K SLoC