/******************************************************************************* * Function Name : AES_keyschedule_dec * Description : According to key computes the expanded key (expkey) for AES128 * decryption. * Input : key: user key (128 bits / 16 bytes) * Output : expkey: expanded key (320 bits / 40 bytes) * Return : None *******************************************************************************/ void AES_keyschedule_dec(ot_u32* key, ot_u32* expkey) { #if (AES_USEHW == ENABLED) #elif (AES_USEFAST == ENABLED) register ot_u32* local_pointer;// = expkey; register int i; // = 0; register ot_u32 copy0; register ot_u32 copy1; register ot_u32 copy2; register ot_u32 copy3; AES_keyschedule_enc(key,expkey); local_pointer = expkey; local_pointer[0] = key[0]; local_pointer[1] = key[1]; local_pointer[2] = key[2]; local_pointer[3] = key[3]; for (i = 1; i <10; i++) { local_pointer += 4; copy0 = local_pointer[0]; copy1 = local_pointer[1]; copy2 = local_pointer[2]; copy3 = local_pointer[3]; local_pointer[0] = dec_table[Sbox[byte0(copy0)]] ^ rot1(dec_table[Sbox[byte1(copy0)]]) ^ rot2(dec_table[Sbox[byte2(copy0)]]) ^ rot3(dec_table[Sbox[byte3(copy0)]]); local_pointer[1] = dec_table[Sbox[byte0(copy1)]] ^ rot1(dec_table[Sbox[byte1(copy1)]]) ^ rot2(dec_table[Sbox[byte2(copy1)]]) ^ rot3(dec_table[Sbox[byte3(copy1)]]); local_pointer[2] = dec_table[Sbox[byte0(copy2)]] ^ rot1(dec_table[Sbox[byte1(copy2)]]) ^ rot2(dec_table[Sbox[byte2(copy2)]]) ^ rot3(dec_table[Sbox[byte3(copy2)]]); local_pointer[3] = dec_table[Sbox[byte0(copy3)]] ^ rot1(dec_table[Sbox[byte1(copy3)]]) ^ rot2(dec_table[Sbox[byte2(copy3)]]) ^ rot3(dec_table[Sbox[byte3(copy3)]]); } #elif (AES_USELITE == ENABLED) AES_keyschedule_enc(key, exp); #endif }
/******************************************************************************* * Function Name : WMBus_AppliEncrypt * Description : Does key expension before encryption starts * and put the data stream back into payload buffer * Input : - input_pointer: input payload address * - input pointer: encryption key * - int: length * Output : None * Return : None *******************************************************************************/ uint8_t WMBus_AppliEncrypt(u8 *key, unsigned char *payload, int length) { /*******************************************************/ /* AES CTR ENCRYPTION */ /*******************************************************/ /* Encryption key scheduling, to be done once */ AES_keyschedule_enc((u8*)key,(u32*)exp_key); /* encryption starts here*/ encrypt_pdu_cbc((u32*)exp_key,payload,length,payload); return(CipherBlocklen); }
/******************************************************************************* * Function Name : AES_keyschedule_dec * Description : According to key computes the expanded key (expkey) for AES128 * decryption. * Input : key: user key * Output : expkey: expanded key * Return : None *******************************************************************************/ void AES_keyschedule_dec(u8* key, u32* expkey) { register u32* local_pointer = expkey; register int i = 0; register u32 copy0; register u32 copy1; register u32 copy2; register u32 copy3; AES_keyschedule_enc(key,expkey); local_pointer[0] = *key; local_pointer[0] =local_pointer[0]<<8; local_pointer[0] |= *(key+1); local_pointer[0] =local_pointer[0]<<8; local_pointer[0] |= *(key+2); local_pointer[0] =local_pointer[0]<<8; local_pointer[0] |= *(key+3); local_pointer[1] = *(key+4); local_pointer[1] =local_pointer[1]<<8; local_pointer[1] |= *(key+5); local_pointer[1] =local_pointer[1]<<8; local_pointer[1] |= *(key+6); local_pointer[1] =local_pointer[1]<<8; local_pointer[1] |= *(key+7); local_pointer[2] = *(key+8); local_pointer[2] =local_pointer[2]<<8; local_pointer[2] |= *(key+9); local_pointer[2] =local_pointer[2]<<8; local_pointer[2] |= *(key+10); local_pointer[2] =local_pointer[2]<<8; local_pointer[2] |= *(key+11); local_pointer[3] = *(key+12); local_pointer[3] =local_pointer[3]<<8; local_pointer[3] |= *(key+13); local_pointer[3] =local_pointer[3]<<8; local_pointer[3] |= *(key+14); local_pointer[3] =local_pointer[3]<<8; local_pointer[3] |= *(key+15); // local_pointer[0] = key[0]; // local_pointer[1] = key[1]; // local_pointer[2] = key[2]; // local_pointer[3] = key[3]; for (i = 1; i <10; i++) { local_pointer += 4; copy0 = local_pointer[0]; copy1 = local_pointer[1]; copy2 = local_pointer[2]; copy3 = local_pointer[3]; local_pointer[0] = dec_table[Sbox[byte0(copy0)]] ^ rot1(dec_table[Sbox[byte1(copy0)]]) ^ rot2(dec_table[Sbox[byte2(copy0)]]) ^ rot3(dec_table[Sbox[byte3(copy0)]]); local_pointer[1] = dec_table[Sbox[byte0(copy1)]] ^ rot1(dec_table[Sbox[byte1(copy1)]]) ^ rot2(dec_table[Sbox[byte2(copy1)]]) ^ rot3(dec_table[Sbox[byte3(copy1)]]); local_pointer[2] = dec_table[Sbox[byte0(copy2)]] ^ rot1(dec_table[Sbox[byte1(copy2)]]) ^ rot2(dec_table[Sbox[byte2(copy2)]]) ^ rot3(dec_table[Sbox[byte3(copy2)]]); local_pointer[3] = dec_table[Sbox[byte0(copy3)]] ^ rot1(dec_table[Sbox[byte1(copy3)]]) ^ rot2(dec_table[Sbox[byte2(copy3)]]) ^ rot3(dec_table[Sbox[byte3(copy3)]]); } }
/******************************************************************************* * Function Name : AES_keyschedule_dec * Description : According to key computes the expanded key (expkey) for AES128 * decryption. * Input : key: user key * Output : expkey: expanded key * Return : None *******************************************************************************/ void AES_keyschedule_dec(u32* key, u32* exp) { AES_keyschedule_enc(key, exp); }