我想知道您是如何使用 axTLS 获得 7.5kB 的 RAM 使用量的。查看代码,所有上下文都存储在这个结构中:
typedef struct aes_key_st
{
uint16_t rounds;
uint16_t key_size;
uint32_t ks[(AES_MAXROUNDS+1)*8];
uint8_t iv[AES_IV_SIZE];
} AES_CTX;
这个结构体的大小是2 + 2 + 4 * 15 * 8 + 16 = 504。我在aes.c中没有看到全局变量,自动变量都很小,所以堆栈使用也是合理的。那么7.5kB去哪儿了?也许您正在尝试使用整个库而不是仅仅从中提取 AES 实现?
无论如何,这个实现看起来很简单,我宁愿坚持这段代码并尝试优化它。我知道这可能很棘手,但学习 AES 细节至少可以帮助您估计绝对最小 RAM 使用量。
更新:我刚刚尝试在 IA-32 Linux 上编译这个库并编写一个简单的 CBC AES-128 加密测试。得到以下结果(第一个数字是截面长度十六进制):
22 .data 00000028 0804a010 0804a010 00001010 2**2
CONTENTS, ALLOC, LOAD, DATA
23 .bss 00000294 0804a040 0804a040 00001038 2**5
ALLOC
这只是 .bss 的 660 字节(我已将 AES_CTX 声明为全局变量)。大多数 .data 被 IV 和 key 占用。我在这里不包括 .text ,因为你会在 PIC 上得到完全不同的结果(两种架构上的数据部分应该几乎相同)。