Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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]);
}
Exemplo n.º 4
0
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);
	}
}
Exemplo n.º 5
0
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);
    }
}
Exemplo n.º 6
0
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);
    }
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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]);
}
Exemplo n.º 10
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]);
}
Exemplo n.º 11
0
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;
}