#mbed-tls #ssl #mbed

sys no-std mbedtls-platform-support

这个 Rust crate 是为 mbedtls crate 提供的辅助库,提供所有必要函数的平台和目标特定实现。通过将此逻辑分离为单独的 crate,可以在单个 crate 中共存多个 mbedtls crate 版本。这有助于避免链接名称冲突错误。该 crate 导出 Rust 函数,并定义 C 函数以支持在各个平台或目标下进行自定义实现时所需的外部覆盖。

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

Download history 971/week @ 2024-03-14 1241/week @ 2024-03-21 861/week @ 2024-03-28 778/week @ 2024-04-04 1401/week @ 2024-04-11 1285/week @ 2024-04-18 1585/week @ 2024-04-25 1232/week @ 2024-05-02 1348/week @ 2024-05-09 1336/week @ 2024-05-16 1079/week @ 2024-05-23 1061/week @ 2024-05-30 1208/week @ 2024-06-06 1133/week @ 2024-06-13 1314/week @ 2024-06-20 816/week @ 2024-06-27

4,675 每月下载量
10 个 crate 中使用(通过 mbedtls

Apache-2.0 OR GPL-2.0-or-later

6.5MB
136K SLoC

C 102K SLoC // 0.1% comments Shell 15K SLoC // 0.1% comments Visual Studio Project 9K SLoC Python 7K SLoC // 0.4% comments Perl 1.5K SLoC // 0.1% comments Rust 1K SLoC // 0.1% comments Visual Studio Solution 729 SLoC GDB Script 21 SLoC // 0.6% comments Batch 15 SLoC Bitbake 6 SLoC TCL 3 SLoC

mbedtls

Build Status

这是一个 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,您需要安装clangcmake,详情见下文。

配置和链接MbedTLS

MbedTLS有大量的编译时配置选项,这些选项将严重影响可用的功能。为了确保Rust对MbedTLS的看法与C中构建的内容一致,必须使用Cargo功能(见下一节)配置MbedTLS,并使用mbedtls-sys的构建脚本进行构建。

mbedtls-sys crate包含MbedTLS源代码,MbedTLS版本将与crate的major.minor版本相同。除了使用提供的源代码外,您还可以使用环境变量RUST_MBEDTLS_SYS_SOURCE指定您自己的源树路径。不推荐使用基于与crate中提供的MbedTLS不同版本的MbedTLS的自定义源。

构建脚本将执行以下步骤

  1. 生成适当的config.h(忽略任何现有的config.h),
  2. 编译一个静态链接的MbedTLS,这需要安装cmake,
  3. 根据配置生成Rust绑定,这需要安装clang。

功能

这是mbedtls-sys可用的Cargo功能的列表。粗体功能默认启用。

  • aesni 启用对 AES-NI 指令的支持。在 SGX 上,此功能自动启用。
  • aes_alt 允许替代AES实现,替换T-tables代码。
  • custom_has_support 覆盖运行时功能检测。在依赖crate中,您必须定义函数mbedtls_aesni_has_supportmbedtls_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/

  1. 删除 vendor/ 并用分发tarball的内容替换它。
  2. 从上一个版本中 cherry-pick 任何本地更改。
  3. 使用 build/headers.rs 中的命令生成头文件列表,并适当更新该文件。
  4. 检查 build/config.rsvendor/include/mbedtls/config.h 的差异。
  5. 更新 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-APACHELICENSE-GPL

关于许可的说明

MbedTLS 是 Apache-2.0 / GPL-2.0+ 的双重许可,mbedtlsmbedtls-sys-auto 包也是如此。然而,源代码以两个不同的单许可证 tarball 分发。mbedtlsmbedtls-sys-auto 包的作者 不保证 两个版本的 MbedTLS 代码完全相同。此存储库包含 Apache-2.0 版本。由于 Apache-2.0 与 GPL-3.0+ 兼容,这可能对希望在 GPL-3.0+-许可的项目中使用 mbedtls-sys 的人来说不是问题,但如果您想在 GPL-2.0 许可的项目中使用它,您在构建时应手动指定 GPL-2.0 源代码。

依赖关系