AnsweredAssumed Answered

Function returning wrong value in lpc824

Question asked by Johny George Malayil on Mar 31, 2017
Latest reply on Apr 4, 2017 by presso support

I am working on porting an application running on `Arduino Mega` to `LPC824`.

The following piece of code is working differently for both the platforms.

/**
* 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);
}

I am expecting a value like `{0x5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd,

0xf3, 0x45, 0xb7, 0x73, 0xa2}` for the `chain` variable.

But the follow function is working differently. The print inside the function has

the correct value which I want `({5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16,

0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2})`.

 

But when the function returns `chain` is having a different value, compared to what I

am expecting, I get the following value for `chain`

`{0x00, 0x20, 0x00, 0x10, 0x03, 0x01, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00}`

 

Inside the function, the result is correct. But it returns a wrong value to the

function which called it. Why is it happening so ?

 

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;
}


Outcomes