将mbed TLS移植到新的环境或操作系统

mbed TLS可以在不同的架构和运行环境中移植,并可以在各种不同的操作系统或裸机端口上执行。体系结构的可移植性通过以通用的可移植方式使用C语言来实现,而通过最小化其平台依赖性来实现环境或体系结构独立性,减少依赖于特定环境或OS的代码量并干净地隔离平台特定的代码从高度便携的核心,使平台代码可以很容易地更换。本文是关于后一部分:它解释了将mbed TLS移植到新环境应该如何做,以及如何做到这一点。

请注意,这篇文章是关于mbed TLS库,而不是作为mbed OS一部分的yotta模块 ; 它将mbed TLS移植到新的运行时环境,而不是新的硬件平台。它也只是关于图书馆本身,而不是mbed TLS示例程序和测试套件,它们具有不同的系统要求。

概观

mbed TLS具有模块化设计,许多模块完全独立于任何运行时或环境依赖关系,但标准C库的系统无关部分除外。图书馆唯一可能与环境互动的部分是:

网络模块net_sockets.c可以被禁用,并被替换为一个单独的网络堆栈。这可能意味着任何使用mbed TLS的传输层堆栈。
定时模块timing.c可以禁用和替换,以适应底层操作系统或硬件驱动程序。
熵模块中熵的默认来源,以及其他来源可以被注册。
访问可以被禁用的文件系统的功能,在使用时是可选的。
想要知道实时时钟的当前时间的函数可以被禁用,尽管这确实限制了证书可能的验证。
通常用于调试和诊断的打印消息的功能可以禁用或替换,以将消息输出到其他平台特定的调试输出。

总之,为了编译mbed TLS上已经有一个标准C库裸机环境中,所有你所要做的就是配置编译通过禁用MBEDTLS_NET_C,MBEDTLS_TIMING_C并且MBEDTLS_ENTROPY_PLATFORM,和潜在的MBEDTLS_FS_IO,MBEDTLS_HAVE_TIME_DATE和MBEDTLS_HAVE_TIME也。这在config.h中有更详细的记录。

以下部分详细介绍如何更换缺少的部分。

联网

提供的网络模块net_sockets.c工作在实现BSD套接字API的Windows和Unix系统上。它只能由SSL / TLS模块通过回调函数选择使用,并可在编译时禁用,而不会影响库的其余部分。

回调可以被替换为编写自己的函数(阻塞或非阻塞)写和读(可选地超时),基于您选择的网络或传输层堆栈。替代函数必须与函数期望的API匹配mbedtls_ssl_set_bio()。

定时

提供的计时模块timing.c适用于Windows,Linux和BSD(包括OS X)。它只能由SSL / TLS模块通过DTLS的回调函数使用,并可在编译时禁用,而不会影响库的其余部分。

如果您不使用DTLS,则不需要定时功能。如果您使用DTLS,则需要编写适合传递给函数的自定义回调函数mbedtls_ssl_set_timer_cb()。在我们的DTLS教程中将更详细地讨论这个问题,以全面描述如何使用回调。

默认熵源

作为RNG模块的一部分,熵池从各种来源收集和安全地混合熵。在Windows和提供/ dev / urandom的不同Unix平台上,注册了一个默认的基于操作系统的源代码。它可以在编译时被禁用,而不影响库的其余部分。

这个源代码可以通过对一个或多个实现函数期望的API的熵集函数进行编码,mbedtls_entropy_add_source()并在运行时对该函数进行注册,或者在编译时根据硬件资源进行注册MBEDTLS_ENTROPY_HARDWARE_ALT。

请注意,出于明显的安全原因,熵模块将拒绝输出任何内容,直到声明强大的来源已被注册。

警告:评估提供的来源的强度是做平台端口的人的责任。

硬件加速

实现密码原语的大多数模块都可以用原语的替代实现替代,以便平台可以利用可能存在的硬件加速。这可以通过MBEDTLS_*_ALT为每个需要被替换的模块定义适当的预处理器符号来实现。例如,MBEDTLS_AES_ALT可以定义为用硬件加速的AES驱动器替换整个AES API,并且MBEDTLS_AES_ENCRYPT_ALT可以被定义为仅替换AES块加密功能。

文件系统访问

几个模块包括访问文件系统的功能。所有这些都可以在编译时被禁用,而不会影响库的其余部分。

每一个访问文件系统的函数都只是一个方便的包装函数,它和内存缓冲区执行相同的工作,所以在这里没有什么东西需要替换 - 只需要使用缓冲区中的函数。

实时时钟

有几个模块可以选择访问当前时间,既可以测量时间间隔,也可以知道当前的绝对时间和日期。这些功能可以在编译时被禁用,而不会影响库的其余部分。

每个测量时间间隔的函数都有一个替代版本的代码,以便在时间不可用时提供类似的功能(例如,根据使用次数而不是经过时间旋转键)。绝对时间和日期仅在X.509中用于检查证书的有效期 - 如果不可用,则跳过此检查。

警告:根据您如何使用X.509证书来保护您的平台,这可能是一个严重的安全风险!

诊断输出

在库中,打印消息(使用printf())的唯一功能是自检功能。这些可以在编译时禁用(MBEDTLS_SELF_TEST)而不影响库的其余部分。

或者,printf()可以很容易地用自己的打印功能替换,这要归功于平台层,可以MBEDTLS_PLATFORM_PRINTF_ALT在编译时启用,然后mbedtls_platform_set_printf()在运行时使用,或者MBEDTLS_PLATFORM_PRINTF_MACRO在编译时使用。

结论

由于其模块化设计,mbed TLS易于在各种不同的平台和环境中使用。如果在您的环境中无法正常工作,则可以轻松地提供您自己的与环境交互的少数几个部分的实现,并让其余的mbed TLS使用它们。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章