我正在努力将在Arduino Mega
上运行的应用程序移植到LPC824
。以下代码对两个平台的工作方式都不同。
/**
* Calculation of CMAC
*/
void cmac(const uint8_t* data, uint8_t dataLength) {
uint8_t trailer[1] = {0x80};
uint8_t bytes[_lenRnd];
uint8_t temp[_lenRnd];
memcpy(temp, data, dataLength);
concatArray(temp, dataLength, trailer, 1);
dataLength ++;
addPadding(temp, dataLength);
memcpy(bytes, _sk2, _lenRnd);
xorBytes(bytes,temp,_lenRnd);
aes128_ctx_t ctx;
aes128_init(_sessionkey, &ctx);
uint8_t* chain = aes128_enc_sendMode(bytes, _lenRnd, &ctx, _ivect);
Board_UARTPutSTR("chain\n\r");
printBytes(chain, 16, true);
memcpy(_ivect, chain, _lenRnd);
//memcpy(_ivect, aes128_enc_sendMode(bytes,_lenRnd,&ctx,_ivect), _lenRnd);
memcpy(_cmac,_ivect, _lenRnd);
Board_UARTPutSTR("Initialization vector\n\r");
printBytes(_ivect, 16, true);
}
我希望{0x5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2}
变量的值为chain
。但是跟随功能的工作方式不同。函数内部的打印具有正确的值,我想要({5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2})
。
但是当函数返回chain
具有不同的值时,与我期望的相比,我得到chain
{0x00, 0x20, 0x00, 0x10, 0x03, 0x01, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00}
在函数内部,结果是正确的。但是它会向调用它的函数返回一个错误的值。为什么会这样?
uint8_t* aes128_enc_sendMode(unsigned char* data, unsigned short len, aes128_ctx_t* key,
const unsigned char* iv) {
unsigned char tmp[16];
uint8_t chain[16];
unsigned char c;
unsigned char i;
memcpy(chain, iv, 16);
while (len >= 16) {
memcpy(tmp, data, 16);
//xorBytes(tmp,chain,16);
for (i = 0; i < 16; i++) {
tmp[i] = tmp[i] ^ chain[i];
}
aes128_enc(tmp, key);
for (i = 0; i < 16; i++) {
//c = data[i];
data[i] = tmp[i];
chain[i] = tmp[i];
}
len -= 16;
data += 16;
}
Board_UARTPutSTR("Chain!!!:");
printBytes(chain, 16, true);
return chain;
}
答案 0 :(得分:1)
像这样的问题的良好开端是在再现错误时尽可能多地删除,使用最少的代码示例,答案通常是清楚的。我在这里为你做过。
uint8_t* aes128_enc_sendMode(void) {
uint8_t chain[16];
return chain;
}
链变量是函数的局部变量,一旦函数存在就不再定义。访问指向该变量的指针会导致未定义的行为,请不要这样做。
实际上,指向数组的指针仍然存在,并指向任意内存块。此内存块不再保留,可以随时覆盖。
我怀疑它适用于AVR,因为它是一个简单的8位芯片,当你使用它时,那块内存就不受干扰了。 ARM会使用更大的优化,可能在寄存器上运行完整的数组,因此数据不会在转换过程中存活。
tldr;你需要malloc()任何你希望通过函数退出的数组。小心,malloc和嵌入式系统像柴油和聚苯乙烯泡沫塑料一样,它会很快变得混乱。