blob: a7a39aec74e1a979e225645bc3058f170d0c841c (
plain) (
tree)
|
|
lass="hl opt">&= ~0x03, aes_bad : ( aes_ret )( cx->Nkey << 2 ) );
cx->mode = ( cx->mode & ~0x03 ) | ( ( byte )f & 0x03 );
cx->Nkey = n_bytes >> 2;
cx->Nrnd = Nr( cx->Nkey, ( word )nc );
cx->e_key[0] = word_in( in_key );
cx->e_key[1] = word_in( in_key + 4 );
cx->e_key[2] = word_in( in_key + 8 );
cx->e_key[3] = word_in( in_key + 12 );
kf = cx->e_key;
kt = kf + nc * ( cx->Nrnd + 1 ) - cx->Nkey;
rci = 0;
switch ( cx->Nkey ) {
case 4:
_Pragma( "loopbound min 0 max 0" )
do {
kf[4] = kf[0] ^ ls_box( kf[3], 3 ) ^ rijndael_enc_rcon_tab[rci++];
kf[5] = kf[1] ^ kf[4];
kf[6] = kf[2] ^ kf[5];
kf[7] = kf[3] ^ kf[6];
kf += 4;
} while ( kf < kt );
break;
case 6:
cx->e_key[4] = word_in( in_key + 16 );
cx->e_key[5] = word_in( in_key + 20 );
_Pragma( "loopbound min 0 max 0" )
do {
kf[ 6] = kf[0] ^ ls_box( kf[5], 3 ) ^ rijndael_enc_rcon_tab[rci++];
kf[ 7] = kf[1] ^ kf[ 6];
kf[ 8] = kf[2] ^ kf[ 7];
kf[ 9] = kf[3] ^ kf[ 8];
kf[10] = kf[4] ^ kf[ 9];
kf[11] = kf[5] ^ kf[10];
kf += 6;
} while ( kf < kt );
break;
case 8:
cx->e_key[4] = word_in( in_key + 16 );
cx->e_key[5] = word_in( in_key + 20 );
cx->e_key[6] = word_in( in_key + 24 );
cx->e_key[7] = word_in( in_key + 28 );
_Pragma( "loopbound min 7 max 7" )
do {
kf[ 8] = kf[0] ^ ls_box( kf[7], 3 ) ^ rijndael_enc_rcon_tab[rci++];
kf[ 9] = kf[1] ^ kf[ 8];
kf[10] = kf[2] ^ kf[ 9];
kf[11] = kf[3] ^ kf[10];
kf[12] = kf[4] ^ ls_box( kf[11], 0 );
kf[13] = kf[5] ^ kf[12];
kf[14] = kf[6] ^ kf[13];
kf[15] = kf[7] ^ kf[14];
kf += 8;
} while ( kf < kt );
break;
}
if ( ( cx->mode & 3 ) != enc ) {
word i;
kt = cx->d_key + nc * cx->Nrnd;
kf = cx->e_key;
cpy( kt, kf );
kt -= 2 * nc;
_Pragma( "loopbound min 0 max 0" )
for ( i = 1; i < cx->Nrnd; ++i ) {
mix( kt, kf );
kt -= 2 * nc;
}
cpy( kt, kf );
}
return aes_good;
}
short rijndael_enc_encrypt( unsigned char in_blk[], unsigned char out_blk[],
const struct aes *cx )
{
const unsigned long *kp = cx->e_key;
if ( !( cx->mode & 1 ) )
return 0;
unsigned long b0[4];
b0[0] = *( unsigned long * )in_blk ^ kp[0];
b0[1] = *( unsigned long * )( in_blk + 4 )^kp[1];
b0[2] = *( unsigned long * )( in_blk + 8 )^kp[2];
b0[3] = *( unsigned long * )( in_blk + 12 )^kp[3];
kp += 4;
unsigned long b1[4];
switch ( cx->Nrnd ) {
case 14:
b1[0] = kp[0] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[0] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[1] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[2] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[3] >> 24 ) )] );
b1[1] = kp[1] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[1] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[2] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[3] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[0] >> 24 ) )] );
b1[2] = kp[2] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[2] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[3] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[0] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[1] >> 24 ) )] );
b1[3] = kp[3] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[3] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[0] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[1] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[2] >> 24 ) )] );
b0[0] = ( kp + 4 )[0] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[0] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[1] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[2] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[3] >> 24 ) )] );
b0[1] = ( kp + 4 )[1] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[1] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[2] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[3] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[0] >> 24 ) )] );
b0[2] = ( kp + 4 )[2] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[2] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[3] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[0] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[1] >> 24 ) )] );
b0[3] = ( kp + 4 )[3] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[3] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[0] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[1] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[2] >> 24 ) )] );
kp += 8;
case 12:
b1[0] = kp[0] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[0] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[1] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[2] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[3] >> 24 ) )] );
b1[1] = kp[1] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[1] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[2] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[3] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[0] >> 24 ) )] );
b1[2] = kp[2] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[2] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[3] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[0] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[1] >> 24 ) )] );
b1[3] = kp[3] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b0[3] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b0[0] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b0[1] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b0[2] >> 24 ) )] );
b0[0] = ( kp + 4 )[0] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[0] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[1] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[2] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[3] >> 24 ) )] );
b0[1] = ( kp + 4 )[1] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[1] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[2] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[3] >> 16 ) )] ^
rijndael_enc_ft_tab[3][( ( unsigned char )( b1[0] >> 24 ) )] );
b0[2] = ( kp + 4 )[2] ^ ( rijndael_enc_ft_tab[0][( ( unsigned char )b1[2] )] ^
rijndael_enc_ft_tab[1][( ( unsigned char )( b1[3] >> 8 ) )] ^
rijndael_enc_ft_tab[2][( ( unsigned char )( b1[0] >> 16 ) )] ^<
|