Mbed TLS 是一个 C 库,可实现加密原语、X.509 证书操作以及 SSL/TLS 和 DTLS 协议。其代码占用空间小,使其适合嵌入式系统。
mbed TLS 包括 PSA 加密 API 的参考实现。目前这只是一个预览,仅供评估之用。
mbed TLS 在大多数系统上应该是开箱即用的。完整记录的配置文件include/mbedtls/mbedtls_config.h
中提供了一些特定于平台的选项,这也是可以选择功能的地方。该文件可以手动编辑,也可以使用Python 3脚本scripts/config.py
以更具编程性的方式编辑(使用--help
获取使用说明)。
使用 Make 和 CMake 构建系统时,可以使用常规环境变量(例如CC
和CFLAGS
设置编译器选项(见下文)。
我们在configs/
目录中提供了一些针对特定用例的非标准配置。您可以在configs/README.txt
中阅读有关这些内容的更多信息
主要 Mbed TLS 文档可通过 ReadTheDocs 获取。
GitHub 上提供了 PSA 加密 API 的文档。
要生成 HTML 格式的库文档的本地副本(根据您的编译时配置定制):
make apidoc
。apidoc/index.html
或apidoc/modules.html
。有关其他文档来源,请参阅支持文档。
目前,Mbed TLS 版本中使用了三个活跃的构建系统:
用于开发的主要系统是CMake和GNU Make。这些系统始终是完整且最新的。其他应该反映 CMake 和 Make 构建系统中存在的所有更改,尽管功能可能不会自动移植到那里。
Make 和 CMake 构建系统创建三个库:libmbedcrypto/libtfpsacrypto、libmbedx509 和 libmbedtls。请注意,libmbedtls 依赖于 libmbedx509 和 libmbedcrypto/libtfpsacrypto,而 libmbedx509 依赖于 libmbedcrypto/libtfpsacrypto。因此,某些链接器会期望标志按特定顺序排列,例如 GNU 链接器需要-lmbedtls -lmbedx509 -lmbedcrypto
。
您需要以下工具来使用提供的 makefile 构建库:
Mbed TLS 的development
分支和mbedtls-3.6
长期支持分支使用 Git 子模块(框架)。仅仅在发布标签上编译库不需要这样做。使用发布存档(zip 或 tar)不需要这样做。
Mbed TLS 的源代码包括一些由脚本自动生成的文件,其内容仅取决于 Mbed TLS 源,而不取决于平台或库配置。这些文件不包含在 Mbed TLS 的开发分支中,但生成的文件包含在正式版本中。本节介绍如何在开发分支中生成缺失的文件。
需要以下工具:
python3 -m pip install --user -r scripts/basic.requirements.txt
python
而不是python3
。要在系统范围内安装软件包,请省略--user
选项。如果进行交叉编译,则在生成与配置无关的文件时,必须将CC
环境变量设置为主机平台的 C 编译器。
以下任意方法均可用于生成与配置无关的文件:
make
或仅运行make
,将自动生成所需的文件。make generated_files
以生成所有与配置无关的文件。tests/scripts/check-generated-files.sh -u
以生成所有与配置无关的文件。scriptsmake_generated_files.bat
以生成所有与配置无关的文件。我们需要 GNU Make。要构建库和示例程序,GNU Make 和 C 编译器就足够了。一些更高级的构建目标需要一些 Unix/Linux 工具。
我们有意只在 makefile 中使用最少的功能,以使它们尽可能简单并独立于不同的工具链,从而允许用户更轻松地在不同平台之间移动。需要更多功能的用户建议使用CMake。
为了使用 GNU Make 从源代码构建,只需在命令行中输入:
make
为了运行测试,请输入:
make check
测试需要构建 Python 并运行 Perl。如果您没有安装其中之一,您可以使用以下命令跳过构建测试:
make no_test
您仍然可以使用以下命令运行一组小得多的测试:
programs/test/selftest
为了针对 Windows 平台进行构建,如果目标是 Windows 但构建环境是类 Unix 的(例如交叉编译或从 MSYS shell 编译时),则应使用 WINDOWS_BUILD=1;如果目标是 Windows,则应使用WINDOWS=1
WINDOWS_BUILD=1
构建环境是 Windows shell(例如使用 mingw32-make)(在这种情况下某些目标将不可用)。
在您的环境中设置变量SHARED
将在静态库之外构建共享库。设置DEBUG
将为您提供调试版本。您可以通过在您的环境中或在 make 命令行中设置来覆盖CFLAGS
和LDFLAGS
;可以使用WARNING_CFLAGS
单独覆盖编译器警告选项。一些特定于目录的选项(例如, -I
指令)仍然保留。
请注意,设置CFLAGS
会覆盖其默认值-O2
,设置WARNING_CFLAGS
会覆盖其默认值(以-Wall -Wextra
开头),因此如果您只想在默认选项中添加一些警告选项,可以通过设置CFLAGS=-O2 -Werror
来实现CFLAGS=-O2 -Werror
例如。当您想要删除其默认内容时(例如,因为您的编译器不接受-Wall
作为选项),设置WARNING_CFLAGS
非常有用。无法从命令行覆盖特定于目录的选项。
根据您的平台,您可能会遇到一些问题。请检查library/
、 programs/
和tests/
中的Makefiles以获取针对特定平台手动添加或删除的选项。您还可以查看 Mbed TLS 知识库,了解有关您的平台或问题的文章。
如果您发现还需要执行其他操作,请告知我们具体内容,以便我们将其添加到 Mbed TLS 知识库中。
为了在单独的目录中使用 CMake 构建源代码(推荐),只需在命令行中输入:
mkdir /path/to/build_dir && cd /path/to/build_dir
cmake /path/to/mbedtls_source
cmake --build .
为了运行测试,请输入:
ctest
测试套件需要构建 Python 并执行 Perl。如果您没有安装其中之一,您将需要使用以下方法禁用测试套件:
cmake -DENABLE_TESTING=Off /path/to/mbedtls_source
如果禁用测试套件,但保持程序启用,您仍然可以使用以下命令运行小得多的测试集:
programs/test/selftest
要配置 CMake 来构建共享库,请使用:
cmake -DUSE_SHARED_MBEDTLS_LIBRARY=On /path/to/mbedtls_source
CMake 构建系统中有许多不同的构建模式可用。其中大多数可用于 gcc 和 clang,尽管有些是特定于编译器的:
Release
。这会生成默认代码,二进制文件中没有任何不必要的信息。Debug
。这会生成调试信息并禁用代码优化。Coverage
。除了调试信息之外,这还会生成代码覆盖率信息。ASan
.这会使用 AddressSanitizer 来检测代码以检查内存错误。 (这包括 LeakSanitizer,以及最新版本的 gcc 和 clang。)(使用最新版本的 clang,此模式还使用 UndefinedSanitizer 来检测代码以检查未定义的行为。)ASanDbg
。与 ASan 相同,但速度较慢,具有调试信息和更好的堆栈跟踪。MemSan
。这会使用 MemorySanitizer 来检测代码以检查未初始化的内存读取。实验性的,需要 Linux/x86_64 上的最新 clang。MemSanDbg
。与 MemSan 相同,但速度较慢,具有调试信息、更好的堆栈跟踪和原点跟踪。Check
。这会激活依赖于优化的编译器警告并将所有警告视为错误。在 CMake 中切换构建模式很简单。对于调试模式,在命令行输入:
cmake -D CMAKE_BUILD_TYPE=Debug /path/to/mbedtls_source
要列出其他可用的 CMake 选项,请使用:
cmake -LH
请注意,使用 CMake,您无法在首次调用 cmake 后调整编译器或其标志。这意味着CC=your_cc make
和make CC=your_cc
将不起作用(与CFLAGS
和其他变量类似)。第一次调用cmake时需要调整这些变量,例如:
CC=your_cc cmake /path/to/mbedtls_source
如果您已经调用了 cmake 并想要更改这些设置,则需要删除构建目录并重新创建它。
请注意,可以就地构建;但是,这将覆盖提供的 Makefile(如果您想阻止git status
将其显示为已修改,请参阅scripts/tmp_ignore_makefiles.sh
)。为此,请从 Mbed TLS 源目录中使用:
cmake .
make
如果之后想要更改CC
或CFLAGS
,则需要删除 CMake 缓存。这可以使用 GNU find 通过以下命令来完成:
find . -iname '*cmake*' -not -name CMakeLists.txt -exec rm -rf {} +
您现在可以进行所需的更改:
CC=your_cc cmake .
make
关于变量,还要注意,如果您在调用 cmake 时设置 CFLAGS,则 CFLAGS 的值不会覆盖 cmake 提供的内容(取决于上面所示的构建模式),它只是添加到它的前面。
Mbed TLS 提供了一个包配置文件,供其他 CMake 项目中的依赖项使用。您可以自行包含 Mbed TLS 的 CMake 目标:
find_package(MbedTLS)
如果出现提示,请将MbedTLS_DIR
设置为${YOUR_MBEDTLS_INSTALL_DIR}/cmake
。这将创建以下目标:
MbedTLS::tfpsacrypto
(加密库)MbedTLS::mbedtls
(TLS 库)MbedTLS::mbedx509
(X509 库)然后您可以通过target_link_libraries()
直接使用它们:
add_executable(xyz)
target_link_libraries(xyz
PUBLIC MbedTLS::mbedtls
MbedTLS::tfpsacrypto
MbedTLS::mbedx509)
这会将 Mbed TLS 库链接到您的库或应用程序,并将其包含目录添加到您的目标(对于PUBLIC
或INTERFACE
链接库,可传递)。
mbed TLS 支持构建为 CMake 子项目。可以使用父 CMake 项目中的add_subdirectory()
将 Mbed TLS 作为子项目包含在内。
Microsoft Visual Studio 的构建文件是为 Visual Studio 2017 生成的。
解决方案文件mbedTLS.sln
包含构建库和所有程序所需的所有基本项目。测试中的文件不会生成和编译,因为这些文件也需要 Python 和 perl 环境。不过programs/test/
中的自检程序仍然可用。
在 Mbed TLS 的开发分支中,需要首先生成 Visual Studio 解决方案文件,如“在开发分支中生成的源文件”中所述。
我们在programs/
中包含了许多不同功能和用途的示例程序。请注意,这些示例程序的目标是演示该库的特定功能,并且可能需要调整代码以构建实际的应用程序。
mbed TLS 在tests/
中包含一个精心设计的测试套件,最初需要Python 来生成测试文件(例如test_suite_ssl.c
)。这些文件是从function file
(例如suites/test_suite_ssl.function
)和data file
(例如suites/test_suite_ssl.data
)生成的。 function file
包含测试函数。 data file
包含测试用例,指定为将传递给测试函数的参数。
对于安装了 Unix shell 和 OpenSSL(以及可选的 GnuTLS)的计算机,可以使用其他测试脚本:
tests/ssl-opt.sh
运行各种 TLS 选项(重新协商、恢复等)的集成测试,并测试这些选项与其他实现的互操作性。tests/compat.sh
测试每个密码套件与其他实现的互操作性。tests/scripts/test-ref-configs.pl
测试以各种简化的配置构建。tests/scripts/depends.py
测试构建在具有单曲线、密钥交换、散列、密码或 pkalg 的配置中。tests/scripts/all.sh
运行上述测试的组合,再加上一些测试,以及各种构建选项(例如 ASan、完整的mbedtls_config.h
等)。可以使用我们的 CI 系统中的 Docker 映像,而不是手动安装测试所需的所有工具的所需版本,如我们的测试基础设施存储库中所述。
mbed TLS 可以移植到许多不同的架构、操作系统和平台。在开始移植之前,您可能会发现以下知识库文章很有用:
mbed TLS 大部分是用可移植的 C99 编写的;然而,它有一些超出标准的平台要求,但大多数现代架构都可以满足:
int
和size_t
必须至少为 32 位宽。uint8_t
、 uint16_t
、 uint32_t
及其带符号的等效项必须可用。Arm 的平台安全架构 (PSA) 是一套完整的威胁模型、安全分析、硬件和固件架构规范以及开源固件参考实现。 PSA 提供了一种基于行业最佳实践的方案,允许在硬件和固件级别上一致地设计安全性。
PSA 加密 API 提供对一组加密原语的访问。它有双重目的。首先,它可以在符合PSA标准的平台中用于构建服务,例如安全启动、安全存储和安全通信。其次,它还可以在任何平台上独立于其他 PSA 组件使用。
PSA 加密 API 的设计目标包括:
Arm 欢迎对 API 设计提供反馈。如果您认为有需要改进的地方,请在我们的 Github 存储库上提出问题。或者,如果您希望私下提供反馈,请发送电子邮件至[email protected]
。所有通过电子邮件收到的反馈都会得到保密处理。
mbed TLS 包括 PSA 加密 API 的参考实现。然而,它并不旨在实现整个规范;特别是它没有实现所有算法。
X.509 和 TLS 代码可以对大多数操作使用 PSA 加密。要启用此支持,请激活mbedtls_config.h
中的编译选项MBEDTLS_USE_PSA_CRYPTO
。请注意,无论此选项如何,TLS 1.3 对大多数操作都使用 PSA 加密。有关详细信息,请参阅docs/use-psa-crypto.md
。
mbed TLS 支持加密加速器、安全元件和随机生成器的驱动程序。这项工作正在进行中。请注意,驱动程序接口尚未完全稳定,可能会发生变化,恕不另行通知。我们打算保留应用程序代码的向后兼容性(使用 PSA Crypto API),但驱动程序的代码可能必须在 Mbed TLS 的未来次要版本中进行更改。
有关编写驱动程序的信息,请参阅 PSA 驱动程序示例和指南。
使用驱动程序时,您通常需要启用两个编译选项(有关更多信息,请参阅参考手册):
MBEDTLS_USE_PSA_CRYPTO
是必需的,以便 X.509 和 TLS 代码调用 PSA 驱动程序而不是内置软件实现。MBEDTLS_PSA_CRYPTO_CONFIG
允许您启用 PSA 加密机制,而无需包含相应软件实现的代码。并非所有机制都支持这一点。 除非文件中另有明确说明,否则 mbed TLS 文件是在 Apache-2.0 或 GPL-2.0 或更高版本双重许可证下提供的。请参阅许可证文件以获取这些许可证的全文,并参阅贡献指南中的“许可证和版权”部分以获取更多信息。
该项目包含来自其他项目的代码。此代码位于tf-psa-crypto/drivers/
目录中。原始许可证文本包含在项目子目录中,它不同于普通的 Mbed TLS 许可证和/或源文件。项目如下:
drivers/everest/
:文件源自 Project Everest,并根据 Apache 2.0 许可证分发。drivers/p256-m/p256-m/
:文件已从 p256-m 存储库中获取。原始存储库中的代码是根据 Apache 2.0 许可证分发的。经作者许可,它在 Apache-2.0 或 GPL-2.0 或更高版本的双重许可证下以 Mbed TLS 形式分发。 我们衷心接受社区的错误报告和贡献。有关如何执行此操作的详细信息,请参阅贡献指南。
SECURITY.md
。SUPPORT.md
了解有关 Mbed TLS 的讨论和支持的其他渠道。