2017-03-31 6 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); 
} 

私はchain変数の{0x5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2}のような値を期待しています。しかし、それに続く機能は異なった働きをしています。ファンクション内のプリントには、({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; 
} 

チェーン変数は関数のローカルであり、関数が存在すると定義されなくなります。その変数へのポインタにアクセスすると、未定義の動作が発生します。実行しないでください。

実際には、配列へのポインタはまだ存在し、任意のメモリブロックを指しています。このメモリブロックはもはや予約されておらず、いつでも上書きすることができます。

私はそれが単純な8ビットのチップであり、そのメモリの部分があなたがそれを使用した時点では控えめに座っていたので、それはAVRで動作すると思われます。 ARMはより大きな最適化を行い、おそらくレジスタ上で完全な配列を実行していたため、データは遷移から生き残ることができませんでした。

tldr;関数の出口を過ぎて生きたい配列をmalloc()する必要があります。注意してください、mallocと組み込みシステムは一緒にディーゼルや発泡スチロールのように行く、それは本当に乱雑になる。

関連する問題