15 个稳定版本
使用旧的 Rust 2015
3.5.0-alpha.3+0b3de6f |
|
---|---|
2.28.7 | 2024年1月29日 |
2.28.4+mbedtls-2.28.3 | 2023年9月14日 |
2.28.3 | 2023年6月13日 |
2.4.0 | 2016年10月31日 |
在 加密学 中排名第 854
每月下载量 5,115
在 14 个 仓库中使用(直接使用 4 个)
6.5MB
136K SLoC
[!WARNING] 此存储库的状态已更改为维护状态。我们不会接受任何更多功能请求。请检查 状态变更 以获取详细信息
mbedtls
这是一个 MbedTLS 的惯用 Rust 包装器,允许您使用仅包含安全代码的 MbedTLS,同时能够使用 Rust 的错误处理和闭包等出色功能。
此外,鉴于 MbedTLS 专注于嵌入式使用,此软件包也可以用于无 std 环境。
状态变更
我们发现 mbedtls 3.4.X
不是线程安全的,并且无法与多个线程正确工作。这个问题在短时间内不会得到解决。并且新的 PSA 方法不符合我们的需求。
因此,我们现在决定继续使用 mbedtls 2.28.X
;此存储库的状态已更改为维护。我们不会接受任何更多功能请求。
mbedtls 3.X
的旧代码已从 master
分支移动到分支 mbedtls-3
。
相关问题: #320
参考链接
- 设计变更
- 错误
构建
此软件包依赖于 mbedtls-sys-auto 软件包,有关构建详细信息,请参阅以下内容。
功能
这是 mbedtls 可用的 Cargo 功能列表。功能在
-
x509 启用 PKI 功能。由该功能启用的主要代码位于
x509
模块中。 -
ssl 启用 ssl/tls 功能。由该功能启用的主要代码位于
ssl
模块中。
注意:上述功能被引入,以便该包可以作为仅用于加密(或 PKI)的库使用。
粗体 默认启用。
- 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 的支持。这意味着 ssl。
- no_std_deps 在 no_std 上,您必须启用此功能。它启用了在 no_std 上需要的可选依赖项。如果启用了
std
功能,则忽略此功能。 - padlock 启用对 VIA padlock 的支持。
- pkcs12 启用使用 yasna 解析 PKCS12 文件的代码。这意味着 x509。
- pkcs12_rc2 启用使用 RC2 crate 解密 RC2 加密的 PKCS12 文件。
- rdrand 启用 RDRAND 随机数生成器。在 SGX 上,此功能自动启用。
- std 如果未启用此功能,则此包是一个 no_std 包。(需要一个分配器)将提供必要的 C 函数,以便 MbedTLS 可以在没有 libc 的情况下工作。
- time 在 mbedtls-sys 中启用时间支持。
- zlib 在 mbedtls-sys 中启用 zlib 支持。
- async-rt 启用 SSL 的异步支持。
- chrono 启用
chrono
支持(例如,在x509::Time
和chrono
类型之间实现转换特性)
mbedtls-sys-auto
不幸的是,crates.io 上的 mbedtls-sys
包已被另一个显然不活跃的项目声称。
要使用此包,您需要安装 clang 和 cmake,下面将详细介绍。
配置和链接 MbedTLS
MbedTLS 有许多编译时配置选项,这些选项会显著影响可用的功能。为了确保 Rust 的 MbedTLS 视图与 C 中构建的内容相匹配,必须使用 Cargo 功能(见下一节)配置 MbedTLS 并使用 mbedtls-sys 的构建脚本来构建。
mbedtls-sys 包包含 MbedTLS 源代码,MbedTLS 版本将与包的 major.minor 版本相同。您可以使用提供的源代码,也可以使用 RUST_MBEDTLS_SYS_SOURCE
环境变量指定您自己的源代码树。不建议使用与包中提供的 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 覆盖运行时功能检测。在依赖项包中,您必须定义函数
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 代码。在 x86 平台上尤其如此,因为需要编译时缓解推测执行(例如,LVI)。让编译器在 C 代码编译期间插入所需的 lfences 可能会产生比让编译器在汇编代码上应用缓解更快的代码。
- padlock 启用对 VIA padlock 的支持。
- pkcs11 启用 PKCS#11 支持。这需要安装 pkcs11-helper。
- std 如果此功能未启用,则此 crate 为 no_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 平台上,这还启用了网络、文件系统和 OS 熵。 - threading 启用线程支持。在
cfg(unix)
平台上,此功能使用 pthreads。在其他平台上,您需要提供一个自定义的线程实现。在依赖的 crate 中,必须根据 MbedTLS 函数签名定义以下函数:mbedtls_mutex_init()
、mbedtls_mutex_free()
、mbedtls_mutex_lock()
和mbedtls_mutex_unlock()
。 - 时间 启用时间支持。在
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-sys/
下的新 MbedTLS 源代码版本的说明
- 删除
vendor/
并用分发 tarball 中的内容替换。 - 选择性地合并前一个版本中的任何本地更改。
- 使用
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.0的条款下发布,详情请见LICENSE-APACHE和LICENSE-GPL。
关于许可的说明
MbedTLS采用Apache-2.0 / GPL-2.0+的双许可方式,同样mbedtls
和mbedtls-sys-auto
crate也是。然而,源代码以两个不同的单许可tar包形式发布。mbedtls
和mbedtls-sys-auto
crate的作者**不保证**这两个版本的MbedTLS代码完全相同。本仓库包含Apache-2.0版本。由于Apache-2.0与GPL-3.0+兼容,这可能对希望在GPL-3.0+许可的项目中使用mbedtls-sys的人来说不是问题,但如果要在GPL-2.0许可的项目中使用,您可能需要在构建时手动指定GPL-2.0源代码。