Mbed TLS中分配内存的替代方法(替代malloc calloc()/free)

原文链接

Alternative ways of allocating memory in Mbed TLS — Mbed TLS documentation

在某些情况下,比如当嵌入式平台上没有操作系统时,堆或calloc()/free()并没有真正的可用性。Mbed TLS仍然需要某种形式的动态内存分配来操作SSL堆栈。我们可以假设所有结构的最大尺寸,但这将消耗大量的内存空间。相反,我们选择让Mbed TLS只使用钩子来分配和释放动态内存。

目前您有两种选择:

  1. 提供你自己的分配和释放函数。

  2. 使用Mbed TLS中的缓冲分配器(buffer allocator )功能。

要启用内存分配层,请定义MBEDTLS_PLATFORM_CMBEDTLS_PLATFORM_MEMORYmbedtls_config.h里。看见如何配置Mbed TLS.

如果不启用layer,libc标准calloc()free()被使用。

内部构件

在内部,只有两个函数指针mbedtls_calloc()mbedtls_free()在Mbed TLS中为每次动态内存分配或取消分配调用。

extern void * (*mbedtls_calloc)( size_t n, size_t size );
extern void (*mbedtls_free)( void *ptr );

这些函数的原型与libc标准calloc()free()。没有任何进一步的调用,默认libc这些指针被赋予了名称。

没有libc等价物

如果您的系统没有libc等效地,您将得到如下编译错误calloc()或者free()找不到。

定义MBEDTLS_PLATFORM_NO_STD_FUNCTIONSmbedtls_config.h文件里阻止Mbed TLS了解这些功能。

提供你自己的钩子

如果您的操作系统已经提供了libc分配器函数,您可以使用以下命令来设置它们:

int mbedtls_platform_set_calloc_free( void * (*calloc_func)( size_t, size_t ),
                                      void (*free_func)( void * ) );

使用Mbed TLS缓冲分配器

如果希望Mbed TLS分配静态缓冲区内的所有内容,可以通过定义MBEDTLS_MEMORY_BUFFER_ALLOC_C在……里mbedtls_config.h文件。

在调用任何其他Mbed TLS函数之前,按如下方式启用缓冲分配器:

unsigned char memory_buf[100000];
mbedtls_memory_buffer_alloc_init( memory_buf, sizeof(memory_buf) );

安全警告

缓冲区分配器是动态内存分配器的一种简单方法。没有实现特殊的堆保护机制。

在别处使用缓冲区分配器

缓冲分配器本身不依赖于Mbed TLS的任何其他部分。因此,您也可以在自己的代码库中使用它。

以下是一个基于STM32的RSA加密/解密例程,使用了mbedTLS库。 ```c #include "mbedtls/config.h" #include "mbedtls/platform.h" #include "mbedtls/rsa.h" /* RSA key sizes */ #define KEY_SIZE 2048 #define EXPONENT 65537 int main(void) { int ret; mbedtls_rsa_context rsa; unsigned char input[KEY_SIZE / 8] = "test"; unsigned char output[KEY_SIZE / 8]; size_t olen; mbedtls_platform_set_calloc_free(calloc, free); mbedtls_rsa_init(&rsa, MBEDTLS_RSA_PKCS_V15, 0); printf("Generating the RSA key pair...\n"); ret = mbedtls_rsa_gen_key(&rsa, mbedtls_ctr_drbg_random, NULL, KEY_SIZE, EXPONENT); if (ret != 0) { printf("mbedtls_rsa_gen_key returned %d\n", ret); goto exit; } printf("RSA key pair generated.\n"); printf("Encrypting message...\n"); ret = mbedtls_rsa_pkcs1_encrypt(&rsa, mbedtls_ctr_drbg_random, NULL, MBEDTLS_RSA_PUBLIC, sizeof(input), input, output); if (ret != 0) { printf("mbedtls_rsa_pkcs1_encrypt returned %d\n", ret); goto exit; } printf("Message encrypted.\n"); printf("Decrypting message...\n"); ret = mbedtls_rsa_pkcs1_decrypt(&rsa, mbedtls_ctr_drbg_random, NULL, MBEDTLS_RSA_PRIVATE, &olen, output, output, sizeof(output)); if (ret != 0) { printf("mbedtls_rsa_pkcs1_decrypt returned %d\n", ret); goto exit; } printf("Message decrypted: %s\n", output); exit: mbedtls_rsa_free(&rsa); return ret; } ``` 在上面的例程,首先使用mbedtls_rsa_gen_key函数生成一个RSA密钥对,然后使用mbedtls_rsa_pkcs1_encrypt和mbedtls_rsa_pkcs1_decrypt函数进行加密和解密。需要注意的是,输入的明文和输出的密文长度应该与密钥长度相等。 该例程使用的是PKCS#1 v1.5填充方式,也可以使用OAEP填充方式,具体可以参考mbedTLS文档。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值