2017-03-31 34 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和嵌入式系統像柴油和聚苯乙烯泡沫塑料一樣走到一起,真正快速地變得混亂。