2017-03-31 27 views
0

我正在将在Arduino Mega上运行的应用程序移植到LPC824。以下代码段对两个平台都有不同的工作原理。在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; 
} 

回答

1

一个良好的开端是这样的一个问题是删除尽可能多的,你可以同时复制错误,用最少的代码示例答案通常是清楚的。我在这里为你做了这件事。

uint8_t* aes128_enc_sendMode(void) { 
    uint8_t chain[16]; 
    return chain; 
} 

链变量是函数的局部函数,函数一旦存在就停止定义。访问该变量的指针会导致未定义的行为,不要这样做。

实际上,指向数组的指针仍然存在并指向任意一块内存。这块内存不再保留,随时可以覆盖。

我怀疑它适用于AVR,因为它是一个简单的8位芯片,并且这段内存在您使用它时不会受到干扰。 ARM会使用更大的优化,可能会在寄存器上运行完整的阵列,所以数据在转换中不会存在。

tldr;你需要malloc()你想要通过函数出口的任何数组。要小心,malloc和嵌入式系统像柴油和聚苯乙烯泡沫塑料一样走到一起,真正快速地变得混乱。