void Encrypt(uint8_t *block, uint8_t *roundKeys) { uint32_t *block32 = (uint32_t *)block; const uint32_t *rk = (uint32_t *)roundKeys; uint32_t y = block32[0]; uint32_t x = block32[1]; uint8_t i = 0; while (i < NUMBER_OF_ROUNDS) { x = (rot32r8(x) + y) ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i++]); y = rot32l3(y) ^ x; x = (rot32r8(x) + y) ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i++]); y = rot32l3(y) ^ x; x = (rot32r8(x) + y) ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i++]); y = rot32l3(y) ^ x; } block32[0] = y; block32[1] = x; }
void round_f(uint32_t *left, uint32_t *right, uint32_t *roundKeys) { uint32_t temp; uint8_t i; uint16_t *b0_l = (uint16_t *)left; uint16_t *b0_r = (uint16_t *)left + 1; uint16_t *b1_l = (uint16_t *)right; uint16_t *b1_r = (uint16_t *)right + 1; /* left branch */ for (i = 0; i < 3; i++) { *left ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[i]); speckey(b0_l, b0_r); } /* right branch */ for (i = 0; i < 3; i++) { *right ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[i + 3]); speckey(b1_l, b1_r); } /* linear layer */ temp = *left; *right ^= *left ^ rot32l8(*left) ^ rot32r8(*left); *left = *right; *right = temp; }
void Encrypt(uint8_t *block, uint8_t *keyBytes) { uint32_t *v = (uint32_t *)block; uint32_t *k = (uint32_t *)keyBytes; uint8_t i; /* Whitening */ v[0] ^= READ_ROUND_KEY_DOUBLE_WORD(k[0]); v[1] ^= READ_ROUND_KEY_DOUBLE_WORD(k[1]); v[2] ^= READ_ROUND_KEY_DOUBLE_WORD(k[2]); v[3] ^= READ_ROUND_KEY_DOUBLE_WORD(k[3]); /* Chaskey permutation */ for (i = 0; i < NUMBER_OF_ROUNDS; ++i) { v[0] += v[1]; v[1]=rot32l5(v[1]); v[1] ^= v[0]; v[0]=rot32l16(v[0]); v[2] += v[3]; v[3]=rot32l8(v[3]); v[3] ^= v[2]; v[0] += v[3]; v[3]=rot32l13(v[3]); v[3] ^= v[0]; v[2] += v[1]; v[1]=rot32l7(v[1]); v[1] ^= v[2]; v[2]=rot32l16(v[2]); } /* Whitening */ v[0] ^= READ_ROUND_KEY_DOUBLE_WORD(k[0]); v[1] ^= READ_ROUND_KEY_DOUBLE_WORD(k[1]); v[2] ^= READ_ROUND_KEY_DOUBLE_WORD(k[2]); v[3] ^= READ_ROUND_KEY_DOUBLE_WORD(k[3]); }
void Encrypt(uint8_t *block, uint8_t *roundKeys) { uint8_t i; uint32_t *rk = (uint32_t *)roundKeys; uint32_t *rightPtr = (uint32_t *)block; uint32_t *leftPtr = (rightPtr + 1); uint32_t rk2i; uint32_t rk2ip1; for (i = 0; i < NUMBER_OF_ROUNDS/2; ++i) { rk2i = READ_ROUND_KEY_DOUBLE_WORD(rk[2*i]); rk2ip1 = READ_ROUND_KEY_DOUBLE_WORD(rk[2*i + 1]); doubleRound(leftPtr, rightPtr, rk2i, rk2ip1); } }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { int8_t i; uint32_t *rk = (uint32_t *)roundKeys; uint32_t *rightPtr = (uint32_t *)block; uint32_t *leftPtr = rightPtr + 1; uint32_t rk2ip1; uint32_t rk2i; for (i = NUMBER_OF_ROUNDS/2 - 1; i >= 0; --i) { rk2ip1 = READ_ROUND_KEY_DOUBLE_WORD(rk[2*i + 1]); rk2i = READ_ROUND_KEY_DOUBLE_WORD(rk[2*i]); doubleRound(rightPtr, leftPtr, rk2ip1, rk2i); } }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint32_t *rk = (uint32_t *)roundKeys; uint32_t *rightPtr = (uint32_t *)block; uint32_t *leftPtr = rightPtr + 1; int8_t i; for (i = NUMBER_OF_ROUNDS - 1; i >= 0; --i) { *rightPtr = rorBeta(*rightPtr ^ *leftPtr); *leftPtr = rolAlpha((*leftPtr ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i])) - *rightPtr); } }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint32_t *block32 = (uint32_t *)block; const uint32_t *rk = (uint32_t *)roundKeys; uint32_t y = block32[0]; uint32_t x = block32[1]; int8_t i; for (i = NUMBER_OF_ROUNDS - 1; i >= 0; --i) { y = rot32r3(x ^ y); x = rot32l8((x ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i])) - y); } block32[0] = y; block32[1] = x; }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint32_t *block32 = (uint32_t *)block; const uint32_t *rk = (uint32_t *)roundKeys; uint32_t y = block32[0]; uint32_t x = block32[1]; int8_t i; uint32_t tmp; for (i = NUMBER_OF_ROUNDS - 1; i >= 0; i--) { tmp = y; y = x ^ ( rot32l1(y) & rot32l8(y) ) ^ ( rot32l1(rot32l1(y)) ) ^ READ_ROUND_KEY_DOUBLE_WORD(rk[i]); x = tmp; } block32[0] = y; block32[1] = x; }
void round_f_inverse(uint32_t *left, uint32_t *right, uint32_t *roundKeys) { uint32_t temp; uint16_t *b0_l = (uint16_t *)left; uint16_t *b0_r = (uint16_t *)left + 1; uint16_t *b1_l = (uint16_t *)right; uint16_t *b1_r = (uint16_t *)right + 1; /* linear layer */ temp = *right; *left ^= *right ^ rot32l8(*right) ^ rot32r8(*right); *right = *left; *left = temp; /* right branch */ speckey_inverse(b1_l, b1_r); *right ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[5]); speckey_inverse(b1_l, b1_r); *right ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[4]); speckey_inverse(b1_l, b1_r); *right ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[3]); /* left branch */ speckey_inverse(b0_l, b0_r); *left ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[2]); speckey_inverse(b0_l, b0_r); *left ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[1]); speckey_inverse(b0_l, b0_r); *left ^= READ_ROUND_KEY_DOUBLE_WORD(roundKeys[0]); }
void Encrypt(uint8_t *block, uint8_t *roundKeys) { uint32_t *Block = (uint32_t *)block; uint32_t *RoundKeys = (uint32_t *)roundKeys; Block[0] = Block[0] + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[0]); Block[1] = Block[1] + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[1]); /* Round 1 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[2]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[3]); /* Round 2 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[4]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[5]); /* Round 3 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[6]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[7]); /* Round 4 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[8]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[9]); /* Round 5 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[10]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[11]); /* Round 6 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[12]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[13]); /* Round 7 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[14]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[15]); /* Round 8 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[16]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[17]); /* Round 9 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[18]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[19]); /* Round 10 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[20]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[21]); /* Round 11 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[22]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[23]); /* Round 12 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[24]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[25]); /* Round 13 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[26]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[27]); /* Round 14 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[28]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[29]); /* Round 15 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[30]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[31]); /* Round 16 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[32]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[33]); /* Round 17 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[34]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[35]); /* Round 18 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[36]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[37]); /* Round 19 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[38]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[39]); /* Round 20 */ Block[0] = RC5_ROTL(Block[0] ^ Block[1], Block[1]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[40]); Block[1] = RC5_ROTL(Block[1] ^ Block[0], Block[0]) + READ_ROUND_KEY_DOUBLE_WORD(RoundKeys[41]); }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint64_t state = *(uint64_t*)block; uint64_t temp; uint32_t subkey_lo, subkey_hi; uint8_t keyindex = 31; uint8_t i, k; for (i = 0; i < 31; i++) { /* addRoundkey */ subkey_lo = READ_ROUND_KEY_DOUBLE_WORD(((uint32_t*)roundKeys)[2 * keyindex]); subkey_hi = READ_ROUND_KEY_DOUBLE_WORD(((uint32_t*)roundKeys)[2 * keyindex + 1]); state ^= (uint64_t)subkey_lo ^ (((uint64_t)subkey_hi) << 32); keyindex--; /* pLayer */ temp = 0; for (k = 0; k < 64; k++) { /* arithmetic calculation of the p-Layer */ uint16_t position = (4 * k) % 63; /* exception for bit 63 */ if (k == 63) { position = 63; } /* result writing */ temp |= ((state >> k) & 0x1) << position; } state = temp; /* sBoxLayer */ for (k = 0; k < 16; k++) { /* get lowest nibble */ uint16_t sBoxValue = state & 0xF; /* kill lowest nibble */ state &= 0xFFFFFFFFFFFFFFF0; /* put new value to lowest nibble (sbox) */ state |= READ_SBOX_BYTE(invsBox4[sBoxValue]); /* next(rotate by one nibble) */ state = rotate4l_64(state); } } /* addRoundkey (Round 31) */ subkey_lo = READ_ROUND_KEY_DOUBLE_WORD(((uint32_t*)roundKeys)[2 * keyindex]); subkey_hi = READ_ROUND_KEY_DOUBLE_WORD(((uint32_t*)roundKeys)[2 * keyindex + 1]); state ^= (uint64_t)subkey_lo ^ (((uint64_t)subkey_hi) << 32); *(uint64_t*)block = state; }