X-Git-Url: https://git.cryptolib.org/?p=arm-crypto-lib.git;a=blobdiff_plain;f=present%2Fpresent.c;h=3856055276a2d745b57904817dce39e51a4c0352;hp=6de3a6da4e3588f7f10ae025c78a811b48704809;hb=6095187b080b960d111a54f18a3b2da788d2d59d;hpb=f3456452a0f13bfe6d332aaeeada5b626dac2739 diff --git a/present/present.c b/present/present.c index 6de3a6d..3856055 100644 --- a/present/present.c +++ b/present/present.c @@ -72,26 +72,31 @@ static void p_inv(uint8_t* o, uint8_t* i){ } void present_init(const uint8_t* key, uint8_t keysize_b, present_ctx_t* ctx){ - uint8_t buffer[10], tmp[2]; + uint8_t tmp[2]; + union { + uint8_t v8[10]; + uint64_t v64; + uint16_t v16[5]; + } b; uint8_t i; - memcpy(buffer, key, 10); - memcpy(&(ctx->k[0]), buffer+2, 8); + memcpy(b.v8, key, 10); + memcpy(&(ctx->k[0]), b.v8+2, 8); for(i=1; i<32; ++i){ /* rotate buffer 19 right */ - memcpy(tmp, buffer, 2); - memmove(buffer, buffer+2, 8); - memcpy(buffer+8, tmp, 2); + memcpy(tmp, b.v8, 2); + memmove(b.v8, b.v8+2, 8); + memcpy(b.v8+8, tmp, 2); /* three shifts to do*/ - tmp[1]=buffer[0]; - *((uint64_t*)buffer)>>=3; - *((uint16_t*)(buffer+8))>>=3; - buffer[9] |= tmp[1]<<5; - buffer[7] |= tmp[0]<<5; + tmp[1]=b.v8[0]; + b.v64 >>= 3; + b.v16[4] >>= 3; + b.v8[9] |= tmp[1]<<5; + b.v8[7] |= tmp[0]<<5; /* rotating done now substitution */ - buffer[9] = (sbox(buffer[9])&0xF0) | ((buffer[9])&0x0F); + b.v8[9] = (sbox(b.v8[9])&0xF0) | ((b.v8[9])&0x0F); /* xor with round counter */ - *((uint16_t*)(buffer+1)) ^= (uint16_t)i<<7; - memcpy(&(ctx->k[i]), buffer+2, 8); + *((uint16_t*)(b.v8+1)) ^= (uint16_t)i<<7; + memcpy(&(ctx->k[i]), b.v8+2, 8); } }