407 lines
27 KiB
C
Executable File
407 lines
27 KiB
C
Executable File
/*
|
|
-----------------------------------------------------------------------
|
|
Copyright (c) 2001 Dr Brian Gladman <brg@gladman.uk.net>, Worcester, UK
|
|
|
|
TERMS
|
|
|
|
Redistribution and use in source and binary forms, with or without
|
|
modification, are permitted provided that the following conditions
|
|
are met:
|
|
1. Redistributions of source code must retain the above copyright
|
|
notice, this list of conditions and the following disclaimer.
|
|
2. Redistributions in binary form must reproduce the above copyright
|
|
notice, this list of conditions and the following disclaimer in the
|
|
documentation and/or other materials provided with the distribution.
|
|
|
|
This software is provided 'as is' with no guarantees of correctness or
|
|
fitness for purpose.
|
|
-----------------------------------------------------------------------
|
|
|
|
FUNCTION
|
|
|
|
The AES algorithm Rijndael implemented for block and key sizes of 128,
|
|
bits (16 bytes) by Brian Gladman.
|
|
|
|
This is an implementation of the AES encryption algorithm (Rijndael)
|
|
designed by Joan Daemen and Vincent Rijmen.
|
|
*/
|
|
|
|
#include "aes.h"
|
|
|
|
#include "aestab.h"
|
|
|
|
#define four_tables(x,tab,vf,rf,c) ( tab[ 0 ][ bval(vf(x,0,c),rf(0,c)) ] ^ \
|
|
tab[ 1 ][ bval(vf(x,1,c),rf(1,c)) ] ^ \
|
|
tab[ 2 ][ bval(vf(x,2,c),rf(2,c)) ] ^ \
|
|
tab[ 3 ][ bval(vf(x,3,c),rf(3,c)) ] )
|
|
|
|
#define vf1(x,r,c) (x)
|
|
#define rf1(r,c) (r)
|
|
#define rf2(r,c) ((r-c)&3)
|
|
|
|
#define ls_box(x,c) four_tables(x,rijndael_dec_fl_tab,vf1,rf2,c)
|
|
|
|
#define inv_mcol(x) four_tables(x,rijndael_dec_im_tab,vf1,rf1,0)
|
|
|
|
/*
|
|
Subroutine to set the block size (if variable) in bytes, legal
|
|
values being 16, 24 and 32.
|
|
*/
|
|
|
|
#define nc (Ncol)
|
|
|
|
/*
|
|
Initialise the key schedule from the user supplied key. The key
|
|
length is now specified in bytes - 16, 24 or 32 as appropriate.
|
|
This corresponds to bit lengths of 128, 192 and 256 bits, and
|
|
to Nk values of 4, 6 and 8 respectively.
|
|
*/
|
|
|
|
#define mx(t,f) (*t++ = inv_mcol(*f),f++)
|
|
#define cp(t,f) *t++ = *f++
|
|
|
|
#define cpy(d,s) do { cp(d,s); cp(d,s); cp(d,s); cp(d,s); } while (0) //min 1 max 1
|
|
#define mix(d,s) do { mx(d,s); mx(d,s); mx(d,s); mx(d,s); } while (0) //min 1 max 1
|
|
|
|
aes_ret rijndael_dec_set_key( byte in_key[ ], const word n_bytes,
|
|
const enum aes_key f, struct aes *cx )
|
|
{
|
|
word *kf, *kt, rci;
|
|
|
|
if ( ( n_bytes & 7 ) || n_bytes < 16 || n_bytes > 32 || ( !( f & 1 ) &&
|
|
!( f & 2 ) ) )
|
|
return ( n_bytes ? cx->mode &= ~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_dec_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_dec_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_dec_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 13 max 13" )
|
|
for ( i = 1; i < cx->Nrnd; ++i ) {
|
|
mix( kt, kf );
|
|
kt -= 2 * nc;
|
|
}
|
|
|
|
cpy( kt, kf );
|
|
}
|
|
|
|
return aes_good;
|
|
}
|
|
|
|
short rijndael_dec_decrypt( const unsigned char in_blk[ ],
|
|
unsigned char out_blk[ ], const struct aes *cx )
|
|
{
|
|
const unsigned long *kp = cx->d_key;
|
|
if ( !( cx->mode & 2 ) )
|
|
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_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
kp += 8;
|
|
case 12:
|
|
b1[ 0 ] = kp[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
kp += 8;
|
|
case 10:
|
|
b1[ 0 ] = kp[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = kp[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = kp[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = kp[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 4 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 4 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 4 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 4 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
b1[ 0 ] = ( kp + 8 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = ( kp + 8 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = ( kp + 8 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = ( kp + 8 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 12 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 12 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 12 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 12 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
b1[ 0 ] = ( kp + 16 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = ( kp + 16 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = ( kp + 16 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = ( kp + 16 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 20 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 20 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 20 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 20 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
b1[ 0 ] = ( kp + 24 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = ( kp + 24 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = ( kp + 24 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = ( kp + 24 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 28 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 28 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 28 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 28 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
b1[ 0 ] = ( kp + 32 )[ 0 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 0 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 1 ] >> 24 ) ) ] );
|
|
b1[ 1 ] = ( kp + 32 )[ 1 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 1 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 2 ] >> 24 ) ) ] );
|
|
b1[ 2 ] = ( kp + 32 )[ 2 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 2 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 3 ] >> 24 ) ) ] );
|
|
b1[ 3 ] = ( kp + 32 )[ 3 ] ^ ( rijndael_dec_it_tab[ 0 ][ ( ( unsigned char )b0[ 3 ] ) ] ^
|
|
rijndael_dec_it_tab[ 1 ][ ( ( unsigned char )( b0[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_it_tab[ 2 ][ ( ( unsigned char )( b0[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_it_tab[ 3 ][ ( ( unsigned char )( b0[ 0 ] >> 24 ) ) ] );
|
|
b0[ 0 ] = ( kp + 36 )[ 0 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 0 ] ) ] ^
|
|
rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 3 ] >> 8 ) ) ] ^
|
|
rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 2 ] >> 16 ) ) ] ^
|
|
rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 1 ] >> 24 ) ) ] );
|
|
b0[ 1 ] = ( kp + 36 )[ 1 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 1 ] ) ] ^
|
|
rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 0 ] >> 8 ) ) ] ^
|
|
rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 3 ] >> 16 ) ) ] ^
|
|
rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 2 ] >> 24 ) ) ] );
|
|
b0[ 2 ] = ( kp + 36 )[ 2 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 2 ] ) ] ^
|
|
rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 1 ] >> 8 ) ) ] ^
|
|
rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 0 ] >> 16 ) ) ] ^
|
|
rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 3 ] >> 24 ) ) ] );
|
|
b0[ 3 ] = ( kp + 36 )[ 3 ] ^ ( rijndael_dec_il_tab[ 0 ][ ( ( unsigned char )b1[ 3 ] ) ] ^
|
|
rijndael_dec_il_tab[ 1 ][ ( ( unsigned char )( b1[ 2 ] >> 8 ) ) ] ^
|
|
rijndael_dec_il_tab[ 2 ][ ( ( unsigned char )( b1[ 1 ] >> 16 ) ) ] ^
|
|
rijndael_dec_il_tab[ 3 ][ ( ( unsigned char )( b1[ 0 ] >> 24 ) ) ] );
|
|
}
|
|
*( unsigned long * )out_blk = ( b0[ 0 ] );
|
|
*( unsigned long * )( out_blk + 4 ) = ( b0[ 1 ] );
|
|
*( unsigned long * )( out_blk + 8 ) = ( b0[ 2 ] );
|
|
*( unsigned long * )( out_blk + 12 ) = ( b0[ 3 ] );
|
|
return aes_good;
|
|
}
|
|
|