void round_function(uint8_t *data,uint8_t *rkey,uint8_t mode){ uint8_t i, temp[4]; for(i=0;i<8;i++) data[i] ^= READ_ROUND_KEY_BYTE(rkey[i]); if(mode==ENC){ S_layer(data) L_layer(data) } else if(mode==DEC){ L_layerInv(data) S_layer(data) } else{//last-enc or first-dec round S_layer(data) } }
void decryption_round_function(uint8_t *data,uint8_t *rkey, uint8_t *temp){ uint8_t i; for(i=0;i<8;i++) data[i] ^= READ_ROUND_KEY_BYTE(rkey[i]); L_layerInv(data, temp); S_layer(data); }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint8_t i; uint8_t temp[4]; for(i=0;i<8;i++) block[i] ^= READ_ROUND_KEY_BYTE(roundKeys[i]); S_layer(block); for(i=1;i<NUMBER_OF_ROUNDS;i++) decryption_round_function(block,roundKeys+BLOCK_SIZE*i, temp); for(i=0;i<BLOCK_SIZE;i++) block[i] ^= READ_ROUND_KEY_BYTE(roundKeys[i])^READ_ROUND_KEY_BYTE(roundKeys[160+i]); }
void round_functionNoKS(uint8_t *data,uint8_t *rkey,uint8_t mode,uint8_t round){ uint8_t i; if(mode==LST) S_layer(data);//last-enc or first-dec round else{ for(i=0;i<4;i++){ data[2*i] ^= READ_ROUND_KEY_BYTE(rkey[2*i]); if(mode==ENC) data[2*i+1] ^= (READ_ROUND_KEY_BYTE(rkey[2*i+1])+READ_ROUND_CONSTANT_BYTE(round_constants[round*4+i])); else data[2*i+1] ^= (READ_ROUND_KEY_BYTE(rkey[2*i+1])+READ_ROUND_CONSTANT_BYTE(round_constants[76-round*4+i])); } if(mode==ENC){ S_layer(data); L_layer(data); } else if(mode==DEC){ L_layerInv(data); S_layer(data); } } }
void decryption_round_function(uint8_t *data,uint8_t *rkey,uint8_t round,uint8_t *temp){ uint8_t i; for(i=0;i<4;i++){ data[2*i] ^= READ_ROUND_KEY_BYTE(rkey[2*i]); data[2*i+1] ^= (READ_ROUND_KEY_BYTE(rkey[2*i+1])+READ_ROUND_CONSTANT_BYTE(round_constants[76-round*4+i])); } L_layerInv(data, temp); S_layer(data, temp); }
void Decrypt(uint8_t *block, uint8_t *roundKeys) { uint8_t i; for(i=0;i<BLOCK_SIZE;i++) block[i] ^= READ_ROUND_KEY_BYTE(roundKeys[i]); S_layer(block); for(i=0;i<(NUMBER_OF_ROUNDS-1);i++) decryption_round_function(block,roundKeys+BLOCK_SIZE,i); for(i=0;i<4;i++){ block[2*i] ^= READ_ROUND_KEY_BYTE(roundKeys[2*i])^READ_ROUND_KEY_BYTE(roundKeys[8+2*i]); block[2*i+1] ^= READ_ROUND_KEY_BYTE(roundKeys[2*i+1])^(READ_ROUND_KEY_BYTE(roundKeys[8+2*i+1])+READ_ROUND_CONSTANT_BYTE(round_constants[i])); } }