5 个不稳定版本
0.3.1 | 2023 年 9 月 14 日 |
---|---|
0.3.0 | 2023 年 6 月 29 日 |
0.2.0 | 2023 年 6 月 27 日 |
0.1.1 | 2023 年 9 月 14 日 |
0.1.0 | 2023 年 5 月 11 日 |
#1419 在 密码学 中
4,675 每月下载量
在 10 个 crate 中使用(通过 mbedtls)
6.5MB
136K SLoC
mbedtls
这是一个 MbedTLS 的惯用 Rust 包装器,允许您使用仅安全代码的 MbedTLS,同时能够使用像错误处理和闭包这样的出色的 Rust 功能。
此外,鉴于 MbedTLS 对嵌入式使用的关注,此 crate 可以在无 std 环境中使用。
构建
此 crate 依赖于 mbedtls-sys-auto crate,有关构建详细信息,请参见下文。
功能
这是 mbedtls 可用的 Cargo 功能列表。粗体功能默认启用。
- aesni 启用对 AES-NI 指令的支持。在 SGX 上,此功能自动启用。
- debug 启用将调试打印到 stdout。您需要在运行时配置调试阈值。
- dsa 启用对 DSA 签名的支持
- force_aesni_support MbedTLS 通常使用运行时检测 AES-NI 支持。使用此功能,始终使用 AES-NI。这将导致在不受支持的处理器上出现未定义指令异常。在 SGX 上,此功能自动启用。
- mpi_force_c_code 启用 mbedtls-sys 中的
mpi_force_c_code
功能 - legacy_protocols 启用对 SSLv3、TLSv1.0 和 TLSv1.1 的支持
- no_std_deps 在无 std 上,您必须启用此功能。它启用了无 std 所需的可选依赖项。如果启用了
std
功能,则忽略此功能。 - padlock 启用对 VIA padlock 的支持
- pkcs12 启用使用 yasna 解析 PKCS12 文件的代码
- pkcs12_rc2 启用使用 RC2 crate 解密 RC2 加密的 PKCS12 文件
- rdrand 启用 RDRAND 随机数生成器。在 SGX 上,此功能自动启用。
- std 如果此功能未启用,此crate是一个no_std crate。(需要分配器)将提供必要的C函数,使MbedTLS在没有libc的情况下工作。
- time 在mbedtls-sys中启用时间支持。
- zlib 在mbedtls-sys中启用zlib支持。
- async-rt 启用SSL的异步支持。
鼓励添加新功能的PR。
mbedtls-sys-auto
遗憾的是,crates.io上的mbedtls-sys
crate已被另一个似乎不活跃的项目声明。
要使用此crate,您需要安装clang和cmake,详情见下文。
配置和链接MbedTLS
MbedTLS有大量的编译时配置选项,这些选项将严重影响可用的功能。为了确保Rust对MbedTLS的看法与C中构建的内容一致,必须使用Cargo功能(见下一节)配置MbedTLS,并使用mbedtls-sys的构建脚本进行构建。
mbedtls-sys crate包含MbedTLS源代码,MbedTLS版本将与crate的major.minor版本相同。除了使用提供的源代码外,您还可以使用环境变量RUST_MBEDTLS_SYS_SOURCE
指定您自己的源树路径。不推荐使用基于与crate中提供的MbedTLS不同版本的MbedTLS的自定义源。
构建脚本将执行以下步骤
- 生成适当的config.h(忽略任何现有的config.h),
- 编译一个静态链接的MbedTLS,这需要安装cmake,
- 根据配置生成Rust绑定,这需要安装clang。
功能
这是mbedtls-sys可用的Cargo功能的列表。粗体功能默认启用。
- aesni 启用对 AES-NI 指令的支持。在 SGX 上,此功能自动启用。
- aes_alt 允许替代AES实现,替换T-tables代码。
- custom_has_support 覆盖运行时功能检测。在依赖crate中,您必须定义函数
mbedtls_aesni_has_support
和mbedtls_padlock_has_support
,按照MbedTLS函数签名。在SGX上,此功能自动启用。 - custom_printf 提供自定义的printf实现。printf仅用于自测试。在依赖crate中,您必须使用具有标准printf签名的函数定义
mbedtls_printf
。 - debug 启用调试回调。
- havege 启用硬件可变熵收集和扩展(HAVEGE)算法。
- legacy_protocols 启用对SSLv3、TLSv1.0和TLSv1.1的支持。
- mpi_force_c_code MbedTLS在可用时使用汇编代码进行MPI函数。在某些情况下,我们可能更喜欢C代码。这特别适用于需要编译时缓解 speculative execution的平台(例如,LVI)。让编译器在C代码编译时插入所需的lfences可能会导致比让编译器在汇编代码上应用缓解更快的代码。
- padlock 启用对 VIA padlock 的支持
- pkcs11 启用PKCS#11支持。这需要安装pkcs11-helper。
- std 如果此功能未启用,则此crate是一个无std crate。在没有libc的no_std配置中,您需要提供以下标准C函数的自定义版本:
calloc()
/free()
,以及strstr()
/strlen()
/strncpy()
/strncmp()
/strcmp()
/snprintf()
,以及memmove()
/memcpy()
/memcmp()
/memset()
,以及rand()
/printf()
。对于printf()
,您可以选择使用custom_printf
功能。rand()
仅用于自测试。在UNIX平台上,这还启用了网络、文件系统和操作系统熵。 - threading 启用线程支持。在
cfg(unix)
平台上,这使用pthread。在其他平台上,您需要提供自定义的线程实现。在依赖项crate中,您必须定义函数mbedtls_mutex_init()
、mbedtls_mutex_free()
、mbedtls_mutex_lock()
和mbedtls_mutex_unlock()
,遵循MbedTLS函数签名。 - time 启用时间支持。在
cfg(unix)
平台上,这使用libc
。在其他平台上,您需要提供自己的mbedtls_platform_gmtime_r(const long long*, struct tm*)
和mbedtls_time(long long*)
实现。 - trusted_cert_callback 启用受信任证书回调支持。
- zlib 启用zlib支持。
有关功能到config.h定义的完整映射,请参阅 mbedtls-sys/build/config.rs。鼓励提交添加新功能的PR。
MbedTLS版本更新
有关更新到新MbedTLS源代码版本的说明,请参阅 mbedtls-sys/
- 删除
vendor/
并用分发tarball的内容替换它。 - 从上一个版本中 cherry-pick 任何本地更改。
- 使用
build/headers.rs
中的命令生成头文件列表,并适当更新该文件。 - 检查
build/config.rs
与vendor/include/mbedtls/config.h
的差异。 - 更新
Cargo.toml
的版本号。
mbedtls-selftest
此 Rust 包旨在分离需要导出 Rust 函数并定义 C 函数以供 C mbedtls
使用的自测试代码。通过分离此代码,可以在单个包中使用不同版本的 Rust mbedtls
包,从而帮助解决链接名称冲突错误。
注意:尽管可以在单个包中同时使用多个版本的 Rust mbedtls
包,但由于它们作为本地库构建,因此只能使用一个 mbedtls-selftest
和一个 mbedtls-sys-auto
包。
贡献
我们感激地接受来自社区的错误报告和贡献。通过参与此社区,您同意遵守 行为准则。所有贡献均受开发者证书起源(DCO)的约束。
开发者证书起源 1.1
通过向此项目做出贡献,我保证
(a) 该贡献全部或部分由我创建,我有权在文件中指示的开源许可证下提交它;或者
(b) 该贡献基于我了解的最佳知识,受适当的开源许可证的覆盖,并且我有权根据该许可证提交该作品,无论是否全部或部分由我创建,在相同的开源许可证下(除非我被允许使用不同的许可证),如文件中所示;或者
(c) 该贡献直接由其他经认证(a)、(b)或(c)的个人提供给我,并且我未对其进行修改。
(d) 我理解并同意此项目和贡献是公开的,并且贡献的记录(包括我提交的所有个人信息,包括我的签名)将无限期保留,并且可以与本项目或相关的开源许可证一致地重新分发。
许可证
本项目主要在 Apache License 版本 2.0 和 GNU 通用公共许可证版本 2 的条款下分发,详情请参阅 LICENSE-APACHE 和 LICENSE-GPL。
关于许可的说明
MbedTLS 是 Apache-2.0 / GPL-2.0+ 的双重许可,mbedtls
和 mbedtls-sys-auto
包也是如此。然而,源代码以两个不同的单许可证 tarball 分发。mbedtls
和 mbedtls-sys-auto
包的作者 不保证 两个版本的 MbedTLS 代码完全相同。此存储库包含 Apache-2.0 版本。由于 Apache-2.0 与 GPL-3.0+ 兼容,这可能对希望在 GPL-3.0+-许可的项目中使用 mbedtls-sys 的人来说不是问题,但如果您想在 GPL-2.0 许可的项目中使用它,您在构建时应手动指定 GPL-2.0 源代码。