#openpgp #pgp #encryption

sequoia-openpgp

OpenPGP数据类型和相关工具

48个版本 (26个稳定版)

1.21.2 2024年7月10日
1.20.0 2024年4月11日
1.19.0 2024年2月20日
1.17.0 2023年10月27日
0.2.0 2018年11月26日

密码学 中排名第16

Download history 2252/week @ 2024-04-28 2552/week @ 2024-05-05 2503/week @ 2024-05-12 3137/week @ 2024-05-19 3307/week @ 2024-05-26 3230/week @ 2024-06-02 3469/week @ 2024-06-09 3066/week @ 2024-06-16 3792/week @ 2024-06-23 3305/week @ 2024-06-30 3788/week @ 2024-07-07 5038/week @ 2024-07-14 4501/week @ 2024-07-21 4946/week @ 2024-07-28 4386/week @ 2024-08-04 5403/week @ 2024-08-11

每月下载量达 19,440
69 个crate(59个直接)中使用

LGPL-2.0-or-later

5MB
68K SLoC

该crate旨在提供OpenPGP的完整实现,如RFC 4880定义,以及一些扩展(例如,RFC 6637,它描述了OpenPGP的ECC加密),这包括对无缓冲消息处理的支撑。

一些OpenPGP社区认为已过时的功能(例如,版本3兼容性)已被省略。我们还更新了一些OpenPGP默认设置以避免错误(例如,我们选择了现代算法默认值)。如果某些功能缺失,请提交错误报告。

本crate的目标不是支持任何类型的高级附加功能。例如,RFC 4880没有定义信任模型,如信任网、直接信任或TOFU。本crate也没有。RFC 4880确实提供了一些创建信任模型的机制(特别是UserID证书),本crate也公开了这些机制。

我们也努力避免规定如何使用OpenPGP。这并不意味着我们没有关于OpenPGP在许多常见场景(例如,消息验证)中的使用意见。但在本crate中,我们避免表达这些意见;我们将在未来公开一个有意见的高级接口。为了确定最合适的通用接口,我们观察现有用户。如果您正在使用Sequoia,请与我们联系,以便我们了解您的用例,讨论您的意见,并基于这些经验在未来开发高级接口。

尽管——或者可能正因为——它的无意见性质,我们发现基于Sequoia开发有意见的OpenPGP软件很容易。

实验性功能

此crate实现了RFC 4880bis中的功能,特别是AEAD加密容器。截至本文撰写时,此RFC仍为草案,其中定义的语法或语义可能更改或取消。因此,所有相关功能可能更改,使用此功能创建的工件可能在未来不可用。请勿将其用于除实验之外的其他用途。

这个包旨在提供RFC 4880定义的OpenPGP的完整实现,以及一些扩展(例如,RFC 6637,它描述了OpenPGP的ECC密码学,以及RFC 4880bis,下一个OpenPGP标准的草案)。这包括对无缓冲消息处理的支持。

功能标志

此包使用功能来启用或禁用可选功能。您可以在您的Cargo.toml文件中调整功能,如下所示

sequoia-openpgp = { version = "*", default-features = false, features = ["compression", ...] }

默认情况下,Sequoia使用Nettle作为密码学后端,并启用所有压缩算法。使用默认功能仅适用于叶子包,请参阅本节

请注意,如果您使用default-features = false,则需要显式启用密码学后端,并启用压缩功能。

密码学后端

Sequoia支持在编译时选择的多个密码学库。目前,这些库可用

  • Nettle密码学库。这是默认后端,由默认功能集选择。如果您使用default-features = false,则需要显式包含crypto-nettle功能来启用它。

  • OpenSSL后端。要选择此后端,使用default-features = false,并显式包含crypto-openssl功能来启用它。

  • Botan后端。要选择此后端,使用default-features = false,并显式包含crypto-botan功能来启用它。crypto-botan默认为2023年4月发布的Botan v3。使用crypto-botan2使用v2。

  • Windows密码学API:下一代(CNG)。要选择此后端,使用default-features = false,并显式包含crypto-cng功能来启用它。目前,CNG后端至少需要Windows 10。

  • RustCrypto包。要选择此后端,使用default-features = false,并显式包含crypto-rust功能来启用它。截至本文撰写时,RustCrypto包不建议用于通用用途,因为它们无法提供与更成熟的密码学库相同的保证。

实验性和可变时间的密码学后端

一些密码学后端尚未被认为足够成熟,可以用于通用消费。使用此类后端需要使用功能标志allow-experimental-crypto显式同意。

一些密码学后端无法保证密码学操作需要恒定的时间量。这可能在某些设置中泄露秘密密钥。使用此类后端需要使用功能标志allow-variable-time-crypto显式同意。

如何在crates中选择密码学后端

在Rust中,功能是统一的,因此功能应该是累加的,即启用任何功能组合应该是安全的。但是,这不适用于密码学后端,因为编译Sequoia需要恰好选择一个密码学后端。

为了适应这一点,我们制定了一条以下规则:在所有使用 Sequoia 的项目中,恰好有一个 crate 可以选择加密后端,而这个 crate 就是叶子 crate(即二进制或 cdylib crate)。任何非叶子、库 crate 必须避免选择加密后端,包括默认的后端,通过禁用默认功能来实现。

总结一下,根据您正在开发的 crate 类型,遵循以下规则

叶子 crate

叶子 crate 应选择默认后端(您可以委托 Sequoia 选择默认后端),但应允许您的下游用户切换后端

# Cargo.toml
[dependencies]
sequoia-openpgp = { version = "*", default-features = false }
# If you need compression features, enable them here:
# sequoia-openpgp = { version = "*", default-features = false, features = ["compression"] }

[features]
# Pick a crypto backend enabled by default (here we defer to Sequoia
# to pick the default):
default = ["sequoia-openpgp/default"]

# .. but allow others to select a different backend, as well
crypto-nettle = ["sequoia-openpgp/crypto-nettle"]
crypto-openssl = ["sequoia-openpgp/crypto-openssl"]
crypto-botan = ["sequoia-openpgp/crypto-botan"]
crypto-botan2 = ["sequoia-openpgp/crypto-botan2"]
crypto-rust = ["sequoia-openpgp/crypto-rust"]
crypto-cng = ["sequoia-openpgp/crypto-cng"]

# Experimental and variable-time cryptographic backend opt-ins
allow-experimental-crypto = ["sequoia-openpgp/allow-experimental-crypto"]
allow-variable-time-crypto = ["sequoia-openpgp/allow-variable-time-crypto"]

中间 crate

非叶子 crate 不应选择加密后端,并且必须禁用默认功能。此外,为了在不选择加密后端的情况下使 cargo test 工作,以及启用 docs.rs 构建您的文档,应选择性地为这些情况启用加密后端

# Cargo.toml
[dependencies]
sequoia-openpgp = { version = "*", default-features = false }
# If you need compression features, enable them here:
# sequoia-openpgp = { version = "*", default-features = false, features = ["compression"] }

# Enables a crypto backend for the tests:
[target.'cfg(not(windows))'.dev-dependencies]
sequoia-openpgp = { version = "1", default-features = false, features = ["crypto-nettle", "__implicit-crypto-backend-for-tests"]  }

# Enables a crypto backend for the tests:
[target.'cfg(windows)'.dev-dependencies]
sequoia-openpgp = { version = "1", default-features = false, features = ["crypto-cng", "__implicit-crypto-backend-for-tests"] }

# Enables a crypto backend for the docs.rs generation:
[package.metadata.docs.rs]
features = ["sequoia-openpgp/default"]

压缩算法

使用 compression 标志来启用对所有压缩算法的支持,使用 compression-deflate 来启用 DEFLATEzlib 压缩支持,以及使用 compression-bzip2 来启用 bzip2 支持。

编译到 WASM

通过设置正确的功能标志,Sequoia 可以编译到 WASM。为此,启用 RustCrypto 后端,并确保不启用 bzip2 压缩支持

sequoia-openpgp = { version = "*", default-features = false, features = ["crypto-rust", "allow-experimental-crypto", "allow-variable-time-crypto"] }

或者,启用 compression-deflate 支持

sequoia-openpgp = { version = "*", default-features = false, features = ["crypto-rust", "allow-experimental-crypto", "allow-variable-time-crypto", "compression-deflate"] }

最低支持的 Rust 版本 (MSRV)

sequoia-openpgp 需要 Rust 1.67。

依赖项

~7–19MB
~233K SLoC