Mbed-TLS/TF-PSA-Crypto

GitHub: Mbed-TLS/TF-PSA-Crypto

提供符合 PSA 密码学 API 1.2 的参考实现,解决跨平台安全密码原语访问与硬件加速集成问题。

Stars: 45 | Forks: 92

# TF-PSA-Crypto 的 README TF-PSA-Crypto 仓库提供了 [PSA 密码学 API 版本 1.2](https://arm-software.github.io/psa-api/crypto/1.2/) 的实现,限制在于 [PAKE 扩展](https://arm-software.github.io/psa-api/crypto/1.2/ext-pake/) 的实现仍存在一些不合规情况,例如返回的错误码。 PSA 密码学 API 的实现围绕 [PSA 密码学驱动接口](docs/proposed/psa-driver-interface.md) 构建,旨在简化对密码加速器与处理器的支持。 ## PSA 密码学 API [PSA 密码学 API](https://arm-software.github.io/psa-api/crypto/) 提供对一组密码原语(primitive)的访问。它具有双重用途。 首先,它可在 PSA 兼容平台上用于构建服务,例如 安全启动、安全存储和安全通信。其次,它也可以独立于其他 PSA 组件在任何平台上使用。 PSA 密码学 API 的设计目标包括: * API 将调用方内存与内部内存分离,这允许库在隔离空间中实现以提升安全性。 如果不需要隔离,库调用可以实现为直接函数调用;如果需要隔离,则可以实现为远程过程调用。 * 内部数据的结构对应用程序隐藏,这允许在构建时或运行时替换替代实现, 例如为了利用硬件加速器。 * 所有密钥访问都通过密钥标识符进行,这允许对应用程序透明地支持外部密码处理器。 * 算法接口是通用的,倾向于算法灵活性。 * 接口设计得易于使用且难以意外误用。 我们欢迎对 API 设计提出反馈。如果您认为可以改进,请在我们的 GitHub 仓库上 [提交问题](https://github.com/Mbed-TLS/TF-PSA-Crypto/issues/new/choose)。或者,如果您更愿意私下提供反馈,请通过电子邮件联系 [`mbed-crypto@arm.com`](mailto:mbed-crypto@arm.com)。所有通过电子邮件收到的反馈都会保密处理。 ### TF-PSA-Crypto 中的 PSA 密码学 API 实现 TF-PSA-Crypto 包含一个 PSA 密码学 API 的实现。它覆盖了 大部分,但并非全部算法。 ### PSA 密码学驱动接口 TF-PSA-Crypto 支持用于密码加速器、安全元件和随机数生成器的驱动。 这是一项正在进行中的工作。请注意,驱动接口尚未完全稳定,可能会在未通知的情况下变更。 我们打算保持对应用程序代码(使用 PSA 密码学 API)的向后兼容性, 但驱动代码可能需要在 TF-PSA-Crypto 的小版本发布中变更。 有关编写驱动的详细信息,请参阅 [PSA 驱动示例与指南](docs/psa-driver-example-and-guide.md)。 ## 配置 TF-PSA-Crypto 仓库应该可以在大多数系统上开箱即用构建。 其配置基于在 `include/psa/crypto_config.h` 中定义 C 预处理器宏。 这些配置选项分为七个组: 1. 密码机制选择(PSA API):PSA_WANT_xxx 宏用于指定用户希望启用的 PSA 密码学 API 部分, 例如加密算法、密钥类型、椭圆曲线。 2. 平台抽象层:用于适配库到不同平台的选项。 3. 常规和测试配置选项:与测试相关或不与库特定部分相关的选项。 4. 密码机制选择(扩展 API):用于启用超出当前 PSA 密码学 API 的密码机制, 例如 LMS 或密钥封装。 5. 数据格式支持:用于启用对各种数据格式的支持, 例如 ASN.1 或 PEM。 6. PSA 核心:用于配置密钥管理、随机数生成等非密码机制的组件。 7. 内置驱动:用于配置内置密码机制的非功能性方面,例如性能/体积权衡。 文件 `include/psa/crypto_config.h` 可以手动编辑, 或者以编程方式使用 Python 脚本 `scripts/config.py` 编辑(使用 `--help` 获取用法说明)。 我们提供了一些专注于特定使用场景的非标准配置,位于 `configs/` 目录中。更多细节请参见 `configs/README.txt`。 ## 文档 PSA 密码学 API 的文档可在 [GitHub](https://arm-software.github.io/psa-api/crypto/) 上获取。 要生成本地 HTML 格式的库文档: 1. 确保已安装 [Doxygen](http://www.doxygen.nl/)。 2. 运行 `cmake -B /path/to/build_dir /path/to/TF-PSA-Crypto/source` 3. 运行 `cmake --build /path/to/build_dir --target tfpsacrypto-apidoc` 4. 打开生成的 HTML 文件之一: * `apidoc/index.html` * `apidoc/modules.html` 或 `apidoc/topics.html` ## 编译 构建系统使用 CMake。 CMake 构建系统会创建一个库:libtfpsacrypto。 ### 工具版本 需要以下工具来从主分支构建库(使用提供的 CMake 文件)。 TF-PSA-Crypto 对工具的最小版本要求基于主要 Linux 发行版最新或倒数第二个 长期支持(LTS)版本发布时使用的版本, 即撰写时为:Ubuntu 22.04、RHEL 9 和 SLES 15 SP4。 * 一个 C99 工具链(编译器、链接器、归档器)。我们积极测试 GCC 5.4、 Clang 3.8 和 Arm Compiler 6.21。更新版本应可工作。稍旧版本也可能可用。 * Python 3.8 或更高版本,用于生成部分源文件(见下文)、测试代码和示例程序。 * CMake 3.20.2 或更高版本。 * 用于生成构建文件的构建系统,如 Make 或 Ninja。 * Microsoft Visual Studio 2019 或更高版本(若使用 Visual Studio)。 * Doxygen 1.8.14 或更高版本。 ### Git 使用 受支持的(参见 [`BRANCHES.md`](BRANCHES.md))分支使用 [Git 子模块](https://git-scm.com/book/en/v2/Git-Tools-Submodules#_cloning_submodules) [framework](https://github.com/TF-PSA-Crypto/mbedtls-framework)。 发布标签也使用 Git 子模块。 克隆仓库或检出分支/标签后,请运行: ``` git submodule update --init ``` 以初始化并更新子模块后再进行构建。 不过,官方源码发布包(例如 [tf-psa-crypto-1.0.0.tar.bz2](https://github.com/Mbed-TLS/TF-PSA-Crypto/releases/download/tf-psa-crypto-1.0.0/tf-psa-crypto-1.0.0.tar.bz2)) 已包含子模块内容。 ### 开发分支中的生成源文件 开发分支中的源代码包含一些由脚本自动生成的文件, 其内容仅依赖于 TF-PSA-Crypto 源码,而不依赖平台或库配置。 这些文件未包含在开发分支中,但会包含在官方发布版本中。 本节说明了如何在开发分支中生成缺失的文件。 需要以下工具: * Python 3 及若干 Python 包,用于部分库源文件、示例程序和测试数据。 安装所需包: ``` python3 -m pip install --user -r scripts/basic.requirements.txt ``` 根据你的 Python 安装方式,可能需要运行 `python` 而非 `python3`。 若要在系统范围或虚拟环境中安装,请省略 `--user` 选项。 * 用于宿主平台的主机 C 编译器,用于部分测试数据。 生成与平台无关的配置文件时,会按以下顺序查找主机 C 编译器: 1. `HOSTCC` 环境变量。这可用于当 `CC` 指向交叉编译器时。 2. `CC` 环境变量。 3. 路径中名为 `cc` 的可执行文件。 注意:若安装了多个工具链,建议在生成文件前将 `CC` 或 `HOSTCC` 设置为预期的主机编译器。 以下任一方法均可用于生成与平台无关的配置文件: * 在非 Windows 系统且非交叉编译时,CMake 会自动生成所需文件。 * 运行 `framework/scripts/make_generated_files.py` 以生成所有 配置无关文件。 ### CMake 若要在独立目录中(推荐)使用 CMake 构建源码,请执行: ``` mkdir /path/to/build_dir && cd /path/to/build_dir cmake /path/to/tf/psa/crypto/source cmake --build . ``` 运行测试时,请执行: ``` ctest ``` 测试套件需要 Python 构建。如果未安装 Python, 请通过以下选项禁用测试套件: ``` cmake -DENABLE_TESTING=Off /path/to/tf/psa/crypto/source ``` 要配置以构建共享库,请使用: ``` cmake -DUSE_SHARED_TF_PSA_CRYPTO_LIBRARY=On /path/to/tf/psa/crypto/source ``` 在 CMake 构建系统中有多种构建模式可用。 其中大多数适用于 gcc 和 clang,部分为编译器专用: - `Release`:生成默认代码,不包含二进制文件中的额外信息。 - `Debug`:生成调试信息并关闭代码优化。 - `ASan`:使用 AddressSanitizer 检测内存错误(包含 LeakSanitizer)。 - `ASanDbg`:同 ASan 但更慢,包含调试信息和更优堆栈回溯。 - `MemSan`:使用 MemorySanitizer 检测未初始化内存读取(实验性)。 - `MemSanDbg`:同 MemSan 但更慢,包含调试信息和更优堆栈回溯。 - `Check`:启用依赖优化的编译器警告,并将所有警告视为错误。 - `TSan`:使用 ThreadSanitizer 检测数据竞争与线程相关并发问题。 - `TSanDbg`:同 TSan 但更慢,包含调试信息和更优堆栈回溯。 切换 CMake 构建模式很简单。要进入调试模式,请在命令行中执行: ``` cmake -D CMAKE_BUILD_TYPE=Debug /path/to/tf/psa/crypto/source ``` 要列出所有可用的 CMake 选项,请使用: ``` cmake -LH ``` 注意:使用 CMake 时,无法在首次调用 cmake 后调整编译器或其标志。 这意味着 `CC=your_cc make` 和 `make CC=your_cc` **不会生效**(对 `CFLAGS` 及其他变量同样如此)。 这些变量必须在首次调用 cmake 时设置,例如: ``` CC=your_cc cmake /path/to/tf/psa/crypto/source ``` 若已调用 cmake 并希望更改这些设置,需要再次运行配置阶段并传入新设置。 注意可以以就地方式构建,使用: ``` cmake . cmake --build . ``` 关于变量,还需注意:如果在调用 cmake 时设置了 CFLAGS, 你的 CFLAGS 值不会覆盖 CMake 提供的值(取决于上述构建模式), 而是会被前置到已有内容之前。 ### 使用 TF-PSA-Crypto TF-PSA-Crypto 为其他 CMake 项目提供 CMake 包配置文件,可作为依赖项使用。 加载其 CMake 库目标: ``` find_package(TF-PSA-Crypto) ``` 你可以帮助 CMake 找到该包: - 通过设置变量 `TF-PSA-Crypto_DIR` 为 `${YOUR_TF_PSA_CRYPTO_BUILD_DIR}/cmake`, 示例如 `programs/test/cmake_package/CMakeLists.txt`;或 - 将 TF-PSA-Crypto 的安装前缀添加到 `CMAKE_PREFIX_PATH`, 示例如 `programs/test/cmake_package_install/CMakeLists.txt`。 成功执行 `find_package(TF-PSA-Crypto)` 后, 目标 `TF-PSA-Crypto::tfpsacrypto` 即可用。 随后可直接通过 `target_link_libraries()` 使用: ``` add_executable(xyz) target_link_libraries(xyz PUBLIC TF-PSA-Crypto::tfpsacrypto) ``` 这会将 TF-PSA-Crypto 库链接到你的库或应用程序, 并将其包含目录传递给你的目标(传递性依赖, 在 `PUBLIC` 或 `INTERFACE` 链接库时生效)。 #### 作为子项目使用 TF-PSA-Crypto 仓库支持作为 CMake 子项目构建。 可通过 `add_subdirectory()` 从父 CMake 项目中包含 TF-PSA-Crypto。 ### Microsoft Visual Studio TF-PSA-Crypto 库可使用已正确安装 CMake 的 Microsoft Visual Studio Community 构建。 关于 Visual Studio 中 CMake 项目的通用文档,请参考其官方文档。 以下说明已在 Microsoft Visual Studio Community 2019 版本 16.11.26 上测试通过。TF-PSA-Crypto 库及其测试开箱即用: * 安装 Visual Studio Community,包含默认的 “Desktop development with C++” 和 “Python development” 工作负载。 * 安装 Python 库以用于代码和测试生成,如 `basic.requirements.txt` 中定义。 有关 Visual Studio 中的 Python 环境,请参考其文档。 * 克隆 TF-PSA-Crypto 仓库时,CMakeSettings.json 会在仓库根目录创建。 在该文件中,添加 `"environments": [ {"CC" : "cl"} ]` 到配置项中。这样在构建库及其测试时, 会设置 CC 环境变量值为 “cl”。这对于生成测试用例的 Python 脚本是必需的。 CMakeSettings.json 可通过 **Project > CMake Settings for TF-PSA-Crypto > Edit JSON** 编辑。 * 如有必要(可能在更新 CMakeSettings.json 后自动完成),生成 CMake 缓存: **Project > Generate Cache** * 构建库:**Build > Build All** * 可运行测试套件:**Test > Run CTests for TF-PSA-Crypto** ## 示例程序 我们已在 [`programs/`](programs/README.md) 中包含用于不同特性和用途的示例程序。 请注意,这些示例程序的目的是展示库的具体功能, 代码可能需要适配才能用于实际应用。 ## 测试 TF-PSA-Crypto 仓库包含一个完善的测试套件,位于 `tests/` 目录, 最初需要 Python 来生成测试文件 (例如 `test_suite_psa_crypto.c`)。 这些文件由一个 `function file`(如 `suites/test_suite_psa_crypto.function`) 和一个 `data file`(如 `suites/test_suite_psa_crypto.data`)生成。 `function file` 包含测试函数,`data file` 包含作为参数传递给测试函数的测试用例。 ## 移植 TF-PSA-Crypto TF-PSA-Crypto 可移植到多种架构、操作系统与平台。 在开始移植之前,以下知识库文章可能有用: - [将 Mbed TLS 移植到新环境或操作系统](https://mbed-tls.readthedocs.io/en/latest/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS/) - [Mbed TLS 的外部依赖项](https://mbed-tls.readthedocs.io/en/latest/kb/development/what-external-dependencies-does-mbedtls-rely-on/) - [如何配置 Mbed TLS](https://mbed-tls.readthedocs.io/en/latest/kb/compiling-and-building/how-do-i-configure-mbedtls/) TF-PSA-Crypto 主要使用可移植的 C99 编写; 但它有一些超出标准但大多数现代架构都能满足的平台要求: - 字节必须为 8 位。 - 全零表示必须是指针的有效表示。 - 有符号整数必须使用补码表示。 - `int` 和 `size_t` 宽度至少为 32 位。 - 必须提供 `uint8_t`、`uint16_t`、`uint32_t` 及其有符号对应类型。 - 不支持混合大小端平台。 - SIZE_MAX 必须至少与 INT_MAX 和 UINT_MAX 一样大。 ## 许可证 除非文件中另有明确说明,TF-PSA-Crypto 文件均采用双重许可: [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html) **或** [GPL-2.0-or-later](https://spdx.org/licenses/GPL-2.0-or-later.html)。 完整的许可证文本请参见 [LICENSE](LICENSE) 文件。 ### 包含的第三方代码 本项目包含来自其他项目的代码。 这些代码位于 `drivers/` 目录中。 原始许可证文本包含在项目子目录中(如果与常规 Mbed TLS 许可证不同), 或者位于源文件中。 涉及的工程包括: * `drivers/everest/`:源自 [Project Everest](https://project-everest.github.io/),采用 Apache 2.0 许可证。 * `drivers/p256-m/p256-m/`:代码取自 [p256-m](https://github.com/mpg/p256-m) 仓库。 原始仓库采用 Apache 2.0 许可证。 在 TF-PSA-Crypto 中采用双重许可(Apache-2.0 **或** GPL-2.0-or-later),并获得作者许可。 ## 贡献 我们衷心感谢社区提交的 Bug 报告与贡献。 请参阅 [贡献指南](CONTRIBUTING.md) 获取详细信息。 ## 联系 * 如需报告 TF-PSA-Crypto 的安全漏洞,请发送邮件至 。 更多信息请参见 [`SECURITY.md`](SECURITY.md)。 * 如需报告 Bug 或请求功能,请[在 GitHub 上提交问题](https://github.com/Mbed-TLS/TF-PSA-Crypto/issues/new/choose)。 * 如需其他讨论与支持,请参考 [`SUPPORT.md`](SUPPORT.md)。
标签:Bash脚本, Golang, PAKE, PSA Cryptography API, PSA驱动接口, TF-PSA-Crypto, 内存隔离, 加密API, 参考实现, 可移植加密, 安全启动, 安全存储, 安全编程, 安全通信, 客户端加密, 嵌入式安全, 操作系统检测, 硬件加速, 算法敏捷性, 远程过程调用, 逆向工具, 错误码处理, 驱动接口