@ -166,6 +166,58 @@ class Crypt_AES extends Crypt_Rijndael {
*/
var $ecb ;
/**
* The SubByte S - Box
*
* @ see Crypt_AES :: _encryptBlock ()
* @ var Array
* @ access intern
*/
var $sbox = array (
0x63 , 0x7C , 0x77 , 0x7B , 0xF2 , 0x6B , 0x6F , 0xC5 , 0x30 , 0x01 , 0x67 , 0x2B , 0xFE , 0xD7 , 0xAB , 0x76 ,
0xCA , 0x82 , 0xC9 , 0x7D , 0xFA , 0x59 , 0x47 , 0xF0 , 0xAD , 0xD4 , 0xA2 , 0xAF , 0x9C , 0xA4 , 0x72 , 0xC0 ,
0xB7 , 0xFD , 0x93 , 0x26 , 0x36 , 0x3F , 0xF7 , 0xCC , 0x34 , 0xA5 , 0xE5 , 0xF1 , 0x71 , 0xD8 , 0x31 , 0x15 ,
0x04 , 0xC7 , 0x23 , 0xC3 , 0x18 , 0x96 , 0x05 , 0x9A , 0x07 , 0x12 , 0x80 , 0xE2 , 0xEB , 0x27 , 0xB2 , 0x75 ,
0x09 , 0x83 , 0x2C , 0x1A , 0x1B , 0x6E , 0x5A , 0xA0 , 0x52 , 0x3B , 0xD6 , 0xB3 , 0x29 , 0xE3 , 0x2F , 0x84 ,
0x53 , 0xD1 , 0x00 , 0xED , 0x20 , 0xFC , 0xB1 , 0x5B , 0x6A , 0xCB , 0xBE , 0x39 , 0x4A , 0x4C , 0x58 , 0xCF ,
0xD0 , 0xEF , 0xAA , 0xFB , 0x43 , 0x4D , 0x33 , 0x85 , 0x45 , 0xF9 , 0x02 , 0x7F , 0x50 , 0x3C , 0x9F , 0xA8 ,
0x51 , 0xA3 , 0x40 , 0x8F , 0x92 , 0x9D , 0x38 , 0xF5 , 0xBC , 0xB6 , 0xDA , 0x21 , 0x10 , 0xFF , 0xF3 , 0xD2 ,
0xCD , 0x0C , 0x13 , 0xEC , 0x5F , 0x97 , 0x44 , 0x17 , 0xC4 , 0xA7 , 0x7E , 0x3D , 0x64 , 0x5D , 0x19 , 0x73 ,
0x60 , 0x81 , 0x4F , 0xDC , 0x22 , 0x2A , 0x90 , 0x88 , 0x46 , 0xEE , 0xB8 , 0x14 , 0xDE , 0x5E , 0x0B , 0xDB ,
0xE0 , 0x32 , 0x3A , 0x0A , 0x49 , 0x06 , 0x24 , 0x5C , 0xC2 , 0xD3 , 0xAC , 0x62 , 0x91 , 0x95 , 0xE4 , 0x79 ,
0xE7 , 0xC8 , 0x37 , 0x6D , 0x8D , 0xD5 , 0x4E , 0xA9 , 0x6C , 0x56 , 0xF4 , 0xEA , 0x65 , 0x7A , 0xAE , 0x08 ,
0xBA , 0x78 , 0x25 , 0x2E , 0x1C , 0xA6 , 0xB4 , 0xC6 , 0xE8 , 0xDD , 0x74 , 0x1F , 0x4B , 0xBD , 0x8B , 0x8A ,
0x70 , 0x3E , 0xB5 , 0x66 , 0x48 , 0x03 , 0xF6 , 0x0E , 0x61 , 0x35 , 0x57 , 0xB9 , 0x86 , 0xC1 , 0x1D , 0x9E ,
0xE1 , 0xF8 , 0x98 , 0x11 , 0x69 , 0xD9 , 0x8E , 0x94 , 0x9B , 0x1E , 0x87 , 0xE9 , 0xCE , 0x55 , 0x28 , 0xDF ,
0x8C , 0xA1 , 0x89 , 0x0D , 0xBF , 0xE6 , 0x42 , 0x68 , 0x41 , 0x99 , 0x2D , 0x0F , 0xB0 , 0x54 , 0xBB , 0x16
);
/**
* The inverse SubByte S - Box
*
* @ see Crypt_AES :: _decryptBlock ()
* @ var Array
* @ access intern
*/
var $isbox = array (
0x52 , 0x09 , 0x6A , 0xD5 , 0x30 , 0x36 , 0xA5 , 0x38 , 0xBF , 0x40 , 0xA3 , 0x9E , 0x81 , 0xF3 , 0xD7 , 0xFB ,
0x7C , 0xE3 , 0x39 , 0x82 , 0x9B , 0x2F , 0xFF , 0x87 , 0x34 , 0x8E , 0x43 , 0x44 , 0xC4 , 0xDE , 0xE9 , 0xCB ,
0x54 , 0x7B , 0x94 , 0x32 , 0xA6 , 0xC2 , 0x23 , 0x3D , 0xEE , 0x4C , 0x95 , 0x0B , 0x42 , 0xFA , 0xC3 , 0x4E ,
0x08 , 0x2E , 0xA1 , 0x66 , 0x28 , 0xD9 , 0x24 , 0xB2 , 0x76 , 0x5B , 0xA2 , 0x49 , 0x6D , 0x8B , 0xD1 , 0x25 ,
0x72 , 0xF8 , 0xF6 , 0x64 , 0x86 , 0x68 , 0x98 , 0x16 , 0xD4 , 0xA4 , 0x5C , 0xCC , 0x5D , 0x65 , 0xB6 , 0x92 ,
0x6C , 0x70 , 0x48 , 0x50 , 0xFD , 0xED , 0xB9 , 0xDA , 0x5E , 0x15 , 0x46 , 0x57 , 0xA7 , 0x8D , 0x9D , 0x84 ,
0x90 , 0xD8 , 0xAB , 0x00 , 0x8C , 0xBC , 0xD3 , 0x0A , 0xF7 , 0xE4 , 0x58 , 0x05 , 0xB8 , 0xB3 , 0x45 , 0x06 ,
0xD0 , 0x2C , 0x1E , 0x8F , 0xCA , 0x3F , 0x0F , 0x02 , 0xC1 , 0xAF , 0xBD , 0x03 , 0x01 , 0x13 , 0x8A , 0x6B ,
0x3A , 0x91 , 0x11 , 0x41 , 0x4F , 0x67 , 0xDC , 0xEA , 0x97 , 0xF2 , 0xCF , 0xCE , 0xF0 , 0xB4 , 0xE6 , 0x73 ,
0x96 , 0xAC , 0x74 , 0x22 , 0xE7 , 0xAD , 0x35 , 0x85 , 0xE2 , 0xF9 , 0x37 , 0xE8 , 0x1C , 0x75 , 0xDF , 0x6E ,
0x47 , 0xF1 , 0x1A , 0x71 , 0x1D , 0x29 , 0xC5 , 0x89 , 0x6F , 0xB7 , 0x62 , 0x0E , 0xAA , 0x18 , 0xBE , 0x1B ,
0xFC , 0x56 , 0x3E , 0x4B , 0xC6 , 0xD2 , 0x79 , 0x20 , 0x9A , 0xDB , 0xC0 , 0xFE , 0x78 , 0xCD , 0x5A , 0xF4 ,
0x1F , 0xDD , 0xA8 , 0x33 , 0x88 , 0x07 , 0xC7 , 0x31 , 0xB1 , 0x12 , 0x10 , 0x59 , 0x27 , 0x80 , 0xEC , 0x5F ,
0x60 , 0x51 , 0x7F , 0xA9 , 0x19 , 0xB5 , 0x4A , 0x0D , 0x2D , 0xE5 , 0x7A , 0x9F , 0x93 , 0xC9 , 0x9C , 0xEF ,
0xA0 , 0xE0 , 0x3B , 0x4D , 0xAE , 0x2A , 0xF5 , 0xB0 , 0xC8 , 0xEB , 0xBB , 0x3C , 0x83 , 0x53 , 0x99 , 0x61 ,
0x17 , 0x2B , 0x04 , 0x7E , 0xBA , 0x77 , 0xD6 , 0x26 , 0xE1 , 0x69 , 0x14 , 0x63 , 0x55 , 0x21 , 0x0C , 0x7D
);
/**
* Default Constructor .
*
@ -214,8 +266,6 @@ class Crypt_AES extends Crypt_Rijndael {
$this -> mode = MCRYPT_MODE_CBC ;
}
$this -> debuffer = $this -> enbuffer = '' ;
break ;
default :
switch ( $mode ) {
@ -244,6 +294,36 @@ class Crypt_AES extends Crypt_Rijndael {
}
}
/**
* Extended Crypt_Rijndael :: _setup ()
*
* Optimizing the key schedule arrays ( $w , $dw ) for _encryptBlock () and _decryptBlock () after Crypt_Rijndael :: _setup ()
*
* @ see Crypt_Rijndael :: _setup ()
* @ access private
*/
function _setup ()
{
if ( ! $this -> changed ) {
return ;
}
$this -> w = $this -> dw = array ();
parent :: _setup ();
$this -> dw = array_reverse ( $this -> dw );
$w = array_pop ( $this -> w );
$dw = array_pop ( $this -> dw );
foreach ( $this -> w as $r => $wr ) {
foreach ( $wr as $c => $wc ) {
$w [] = $wc ;
$dw [] = $this -> dw [ $r ][ $c ];
}
}
$this -> w = $w ;
$this -> dw = $dw ;
}
/**
* Dummy function
*
@ -257,7 +337,6 @@ class Crypt_AES extends Crypt_Rijndael {
return ;
}
/**
* Sets the initialization vector . ( optional )
*
@ -295,51 +374,58 @@ class Crypt_AES extends Crypt_Rijndael {
function encrypt ( $plaintext )
{
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
$changed = $this -> changed ;
$this -> _mcryptSetup ();
/*
if ( $this -> mode == CRYPT_AES_MODE_CTR ) {
$iv = $this -> encryptIV ;
$xor = mcrypt_generic ( $this -> enmcrypt , $this -> _generate_xor ( strlen ( $plaintext ), $iv ));
$ciphertext = $plaintext ^ $xor ;
if ( $this -> continuousBuffer ) {
$this -> encryptIV = $iv ;
}
return $ciphertext ;
}
*/
// re: http://phpseclib.sourceforge.net/cfb-demo.phps
// using mcrypt's default handing of CFB the above would output two different things. using phpseclib's
// rewritten CFB implementation the above outputs the same thing twice.
if ( $this -> mode == 'ncfb' ) {
if ( $changed ) {
$this -> ecb = mcrypt_module_open ( MCRYPT_RIJNDAEL_128 , '' , MCRYPT_MODE_ECB , '' );
mcrypt_generic_init ( $this -> ecb , $this -> key , " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 " );
if ( $this -> mode == 'ncfb' && $this -> continuousBuffer ) {
$iv = & $this -> encryptIV ;
$pos = & $this -> enbuffer [ 'pos' ];
$len = strlen ( $plaintext );
$ciphertext = '' ;
$i = 0 ;
if ( $pos ) {
$orig_pos = $pos ;
$max = 16 - $pos ;
if ( $len >= $max ) {
$i = $max ;
$len -= $max ;
$pos = 0 ;
} else {
$i = $len ;
$pos += $len ;
$len = 0 ;
}
$ciphertext = substr ( $iv , $orig_pos ) ^ $plaintext ;
$iv = substr_replace ( $iv , $ciphertext , $orig_pos , $i );
$this -> enbuffer [ 'enmcrypt_init' ] = true ;
}
if ( $len >= 16 ) {
if ( $this -> enbuffer [ 'enmcrypt_init' ] === false || $len > 280 ) {
if ( $this -> enbuffer [ 'enmcrypt_init' ] === true ) {
mcrypt_generic_init ( $this -> enmcrypt , $this -> key , $iv );
$this -> enbuffer [ 'enmcrypt_init' ] = false ;
}
$ciphertext .= mcrypt_generic ( $this -> enmcrypt , substr ( $plaintext , $i , $len - $len % 16 ));
$iv = substr ( $ciphertext , - 16 );
$len %= 16 ;
} else {
while ( $len >= 16 ) {
$iv = mcrypt_generic ( $this -> ecb , $iv ) ^ substr ( $plaintext , $i , 16 );
$ciphertext .= $iv ;
$len -= 16 ;
$i += 16 ;
}
if ( strlen ( $this -> enbuffer )) {
$ciphertext = $plaintext ^ substr ( $this -> encryptIV , strlen ( $this -> enbuffer ));
$this -> enbuffer .= $ciphertext ;
if ( strlen ( $this -> enbuffer ) == 16 ) {
$this -> encryptIV = $this -> enbuffer ;
$this -> enbuffer = '' ;
mcrypt_generic_init ( $this -> enmcrypt , $this -> key , $this -> encryptIV );
}
$plaintext = substr ( $plaintext , strlen ( $ciphertext ));
} else {
$ciphertext = '' ;
}
$last_pos = strlen ( $plaintext ) & 0xFFFFFFF0 ;
$ciphertext .= $last_pos ? mcrypt_generic ( $this -> enmcrypt , substr ( $plaintext , 0 , $last_pos )) : '' ;
if ( strlen ( $plaintext ) & 0xF ) {
if ( strlen ( $ciphertext )) {
$this -> encryptIV = substr ( $ciphertext , - 16 );
}
$this -> encryptIV = mcrypt_generic ( $this -> ecb , $this -> encryptIV );
$this -> enbuffer = substr ( $plaintext , $last_pos ) ^ $this -> encryptIV ;
$ciphertext .= $this -> enbuffer ;
if ( $len ) {
$iv = mcrypt_generic ( $this -> ecb , $iv );
$block = $iv ^ substr ( $plaintext , - $len );
$iv = substr_replace ( $iv , $block , 0 , $len );
$ciphertext .= $block ;
$pos = $len ;
}
return $ciphertext ;
@ -373,49 +459,41 @@ class Crypt_AES extends Crypt_Rijndael {
function decrypt ( $ciphertext )
{
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
$changed = $this -> changed ;
$this -> _mcryptSetup ();
/*
if ( $this -> mode == CRYPT_AES_MODE_CTR ) {
$iv = $this -> decryptIV ;
$xor = mcrypt_generic ( $this -> enmcrypt , $this -> _generate_xor ( strlen ( $ciphertext ), $iv ));
$plaintext = $ciphertext ^ $xor ;
if ( $this -> continuousBuffer ) {
$this -> decryptIV = $iv ;
}
return $plaintext ;
}
*/
if ( $this -> mode == 'ncfb' ) {
if ( $changed ) {
$this -> ecb = mcrypt_module_open ( MCRYPT_RIJNDAEL_128 , '' , MCRYPT_MODE_ECB , '' );
mcrypt_generic_init ( $this -> ecb , $this -> key , " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 " );
}
if ( strlen ( $this -> debuffer )) {
$plaintext = $ciphertext ^ substr ( $this -> decryptIV , strlen ( $this -> debuffer ));
$this -> debuffer .= substr ( $ciphertext , 0 , strlen ( $plaintext ));
if ( strlen ( $this -> debuffer ) == 16 ) {
$this -> decryptIV = $this -> debuffer ;
$this -> debuffer = '' ;
mcrypt_generic_init ( $this -> demcrypt , $this -> key , $this -> decryptIV );
}
$ciphertext = substr ( $ciphertext , strlen ( $plaintext ));
} else {
if ( $this -> mode == 'ncfb' && $this -> continuousBuffer ) {
$iv = & $this -> decryptIV ;
$pos = & $this -> debuffer [ 'pos' ];
$len = strlen ( $ciphertext );
$plaintext = '' ;
$i = 0 ;
if ( $pos ) {
$orig_pos = $pos ;
$max = 16 - $pos ;
if ( $len >= $max ) {
$i = $max ;
$len -= $max ;
$pos = 0 ;
} else {
$i = $len ;
$pos += $len ;
$len = 0 ;
}
$last_pos = strlen ( $ciphertext ) & 0xFFFFFFF0 ;
$plaintext .= $last_pos ? mdecrypt_generic ( $this -> demcrypt , substr ( $ciphertext , 0 , $last_pos )) : '' ;
if ( strlen ( $ciphertext ) & 0xF ) {
if ( strlen ( $plaintext )) {
$this -> decryptIV = substr ( $ciphertext , $last_pos - 16 , 16 );
// ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize
$plaintext = substr ( $iv , $orig_pos ) ^ $ciphertext ;
$iv = substr_replace ( $iv , substr ( $ciphertext , 0 , $i ), $orig_pos , $i );
}
$this -> decryptIV = mcrypt_generic ( $this -> ecb , $this -> decryptIV );
$this -> debuffer = substr ( $ciphertext , $last_pos );
$plaintext .= $this -> debuffer ^ $this -> decryptIV ;
if ( $len >= 16 ) {
$cb = substr ( $ciphertext , $i , $len - $len % 16 );
$plaintext .= mcrypt_generic ( $this -> ecb , $iv . $cb ) ^ $cb ;
$iv = substr ( $cb , - 16 );
$len %= 16 ;
}
if ( $len ) {
$iv = mcrypt_generic ( $this -> ecb , $iv );
$plaintext .= $iv ^ substr ( $ciphertext , - $len );
$iv = substr_replace ( $iv , substr ( $ciphertext , - $len ), 0 , $len );
$pos = $len ;
}
return $plaintext ;
@ -486,11 +564,20 @@ class Crypt_AES extends Crypt_Rijndael {
$this -> demcrypt = mcrypt_module_open ( MCRYPT_RIJNDAEL_128 , '' , $mode , '' );
$this -> enmcrypt = mcrypt_module_open ( MCRYPT_RIJNDAEL_128 , '' , $mode , '' );
if ( $mode == 'ncfb' ) {
$this -> ecb = mcrypt_module_open ( MCRYPT_RIJNDAEL_128 , '' , MCRYPT_MODE_ECB , '' );
}
} // else should mcrypt_generic_deinit be called?
mcrypt_generic_init ( $this -> demcrypt , $this -> key , $this -> iv );
mcrypt_generic_init ( $this -> enmcrypt , $this -> key , $this -> iv );
if ( $this -> mode == 'ncfb' ) {
mcrypt_generic_init ( $this -> ecb , $this -> key , " \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 " );
}
$this -> changed = false ;
}
@ -506,53 +593,154 @@ class Crypt_AES extends Crypt_Rijndael {
*/
function _encryptBlock ( $in )
{
$state = unpack ( 'N*word ' , $in );
$state = unpack ( 'N*' , $in );
$Nr = $this -> Nr ;
$sbox = $this -> sbox ;
$w = $this -> w ;
$t0 = $this -> t0 ;
$t1 = $this -> t1 ;
$t2 = $this -> t2 ;
$t3 = $this -> t3 ;
// addRoundKey and reindex $state
$state = array (
$state [ 'word1' ] ^ $w [ 0 ][ 0 ],
$state [ 'word2' ] ^ $w [ 0 ][ 1 ],
$state [ 'word3' ] ^ $w [ 0 ][ 2 ],
$state [ 'word4' ] ^ $w [ 0 ][ 3 ]
);
// addRoundKey
$s0 = $state [ 1 ] ^ $w [ 4 ];
$s1 = $state [ 2 ] ^ $w [ 5 ];
$s2 = $state [ 3 ] ^ $w [ 6 ];
$s3 = $state [ 4 ] ^ $w [ 7 ];
// shiftRows + subWord + mixColumns + addRoundKey
// we could loop unroll this and use if statements to do more rounds as necessary, but, in my tests, that yields
// only a marginal improvement. since that also, imho, hinders the readability of the code, i've opted not to do it.
for ( $round = 1 ; $round < $this -> Nr ; $round ++ ) {
$state = array (
$t0 [ $state [ 0 ] & 0xFF000000 ] ^ $t1 [ $state [ 1 ] & 0x00FF0000 ] ^ $t2 [ $state [ 2 ] & 0x0000FF00 ] ^ $t3 [ $state [ 3 ] & 0x000000FF ] ^ $w [ $round ][ 0 ],
$t0 [ $state [ 1 ] & 0xFF000000 ] ^ $t1 [ $state [ 2 ] & 0x00FF0000 ] ^ $t2 [ $state [ 3 ] & 0x0000FF00 ] ^ $t3 [ $state [ 0 ] & 0x000000FF ] ^ $w [ $round ][ 1 ],
$t0 [ $state [ 2 ] & 0xFF000000 ] ^ $t1 [ $state [ 3 ] & 0x00FF0000 ] ^ $t2 [ $state [ 0 ] & 0x0000FF00 ] ^ $t3 [ $state [ 1 ] & 0x000000FF ] ^ $w [ $round ][ 2 ],
$t0 [ $state [ 3 ] & 0xFF000000 ] ^ $t1 [ $state [ 0 ] & 0x00FF0000 ] ^ $t2 [ $state [ 1 ] & 0x0000FF00 ] ^ $t3 [ $state [ 2 ] & 0x000000FF ] ^ $w [ $round ][ 3 ]
);
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 8 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 9 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 10 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 11 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 12 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 13 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 14 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 15 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 16 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 17 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 18 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 19 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 20 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 21 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 22 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 23 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 24 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 25 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 26 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 27 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 28 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 29 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 30 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 31 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 32 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 33 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 34 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 35 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 36 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 37 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 38 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 39 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 40 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 41 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 42 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 43 ];
switch ( $this -> Nr ) {
case 10 :
break ;
case 14 :
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 44 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 45 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 46 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 47 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 48 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 49 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 50 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 51 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 52 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 53 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 54 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 55 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 56 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 57 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 58 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 59 ];
break ;
case 12 :
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 44 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 45 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 46 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 47 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 48 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 49 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 50 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 51 ];
break ;
case 13 :
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 44 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 45 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 46 ];
$s3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 47 ];
$e0 = $t0 [( $s0 >> 24 ) & 0xff ] ^ $t1 [( $s1 >> 16 ) & 0xff ] ^ $t2 [( $s2 >> 8 ) & 0xff ] ^ $t3 [ $s3 & 0xff ] ^ $w [ 48 ];
$e1 = $t0 [( $s1 >> 24 ) & 0xff ] ^ $t1 [( $s2 >> 16 ) & 0xff ] ^ $t2 [( $s3 >> 8 ) & 0xff ] ^ $t3 [ $s0 & 0xff ] ^ $w [ 49 ];
$e2 = $t0 [( $s2 >> 24 ) & 0xff ] ^ $t1 [( $s3 >> 16 ) & 0xff ] ^ $t2 [( $s0 >> 8 ) & 0xff ] ^ $t3 [ $s1 & 0xff ] ^ $w [ 50 ];
$e3 = $t0 [( $s3 >> 24 ) & 0xff ] ^ $t1 [( $s0 >> 16 ) & 0xff ] ^ $t2 [( $s1 >> 8 ) & 0xff ] ^ $t3 [ $s2 & 0xff ] ^ $w [ 51 ];
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 52 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 53 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 54 ];
$e3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 55 ];
// Note: Here we skip $s3 but using $e3
$e0 = $s0 ;
$e1 = $s1 ;
$e2 = $s2 ;
// $e3 = $s3;
break ;
default : // 11
$s0 = $t0 [( $e0 >> 24 ) & 0xff ] ^ $t1 [( $e1 >> 16 ) & 0xff ] ^ $t2 [( $e2 >> 8 ) & 0xff ] ^ $t3 [ $e3 & 0xff ] ^ $w [ 44 ];
$s1 = $t0 [( $e1 >> 24 ) & 0xff ] ^ $t1 [( $e2 >> 16 ) & 0xff ] ^ $t2 [( $e3 >> 8 ) & 0xff ] ^ $t3 [ $e0 & 0xff ] ^ $w [ 45 ];
$s2 = $t0 [( $e2 >> 24 ) & 0xff ] ^ $t1 [( $e3 >> 16 ) & 0xff ] ^ $t2 [( $e0 >> 8 ) & 0xff ] ^ $t3 [ $e1 & 0xff ] ^ $w [ 46 ];
$e3 = $t0 [( $e3 >> 24 ) & 0xff ] ^ $t1 [( $e0 >> 16 ) & 0xff ] ^ $t2 [( $e1 >> 8 ) & 0xff ] ^ $t3 [ $e2 & 0xff ] ^ $w [ 47 ];
// Note: Here we skip $s3 but using $e3
$e0 = $s0 ;
$e1 = $s1 ;
$e2 = $s2 ;
// $e3 = $s3;
}
// subWord
$state = array (
$this -> _subWord ( $state [ 0 ]),
$this -> _subWord ( $state [ 1 ]),
$this -> _subWord ( $state [ 2 ]),
$this -> _subWord ( $state [ 3 ])
);
$e0 = $sbox [ $e0 & 0xff ] | ( $sbox [( $e0 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e0 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e0 >> 24 ) & 0xff ] << 24 );
$e1 = $sbox [ $e1 & 0xff ] | ( $sbox [( $e1 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e1 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e1 >> 24 ) & 0xff ] << 24 );
$e2 = $sbox [ $e2 & 0xff ] | ( $sbox [( $e2 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e2 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e2 >> 24 ) & 0xff ] << 24 );
$e3 = $sbox [ $e3 & 0xff ] | ( $sbox [( $e3 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e3 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e3 >> 24 ) & 0xff ] << 24 );
// shiftRows + addRoundKey
$state = array (
( $state [ 0 ] & 0xFF000000 ) ^ ( $state [ 1 ] & 0x00FF0000 ) ^ ( $state [ 2 ] & 0x0000FF00 ) ^ ( $state [ 3 ] & 0x000000FF ) ^ $this -> w [ $this -> Nr ][ 0 ],
( $state [ 1 ] & 0xFF000000 ) ^ ( $state [ 2 ] & 0x00FF0000 ) ^ ( $state [ 3 ] & 0x0000FF00 ) ^ ( $state [ 0 ] & 0x000000FF ) ^ $this -> w [ $this -> Nr ][ 1 ],
( $state [ 2 ] & 0xFF000000 ) ^ ( $state [ 3 ] & 0x00FF0000 ) ^ ( $state [ 0 ] & 0x0000FF00 ) ^ ( $state [ 1 ] & 0x000000FF ) ^ $this -> w [ $this -> Nr ][ 2 ],
( $state [ 3 ] & 0xFF000000 ) ^ ( $state [ 0 ] & 0x00FF0000 ) ^ ( $state [ 1 ] & 0x0000FF00 ) ^ ( $state [ 2 ] & 0x000000FF ) ^ $this -> w [ $this -> Nr ][ 3 ]
return pack ( 'N*' ,
( $e0 & 0xFF000000 ) ^ ( $e1 & 0x00FF0000 ) ^ ( $e2 & 0x0000FF00 ) ^ ( $e3 & 0x000000FF ) ^ $w [ 0 ],
( $e1 & 0xFF000000 ) ^ ( $e2 & 0x00FF0000 ) ^ ( $e3 & 0x0000FF00 ) ^ ( $e0 & 0x000000FF ) ^ $w [ 1 ],
( $e2 & 0xFF000000 ) ^ ( $e3 & 0x00FF0000 ) ^ ( $e0 & 0x0000FF00 ) ^ ( $e1 & 0x000000FF ) ^ $w [ 2 ],
( $e3 & 0xFF000000 ) ^ ( $e0 & 0x00FF0000 ) ^ ( $e1 & 0x0000FF00 ) ^ ( $e2 & 0x000000FF ) ^ $w [ 3 ]
);
return pack ( 'N*' , $state [ 0 ], $state [ 1 ], $state [ 2 ], $state [ 3 ]);
}
/**
@ -567,43 +755,190 @@ class Crypt_AES extends Crypt_Rijndael {
*/
function _decryptBlock ( $in )
{
$state = unpack ( 'N*word ' , $in );
$state = unpack ( 'N*' , $in );
$Nr = $this -> Nr ;
$sbox = $this -> isbox ;
$dw = $this -> dw ;
$dt0 = $this -> dt0 ;
$dt1 = $this -> dt1 ;
$dt2 = $this -> dt2 ;
$dt3 = $this -> dt3 ;
// addRoundKey and reindex $state
$state = array (
$state [ 'word1' ] ^ $dw [ $this -> Nr ][ 0 ],
$state [ 'word2' ] ^ $dw [ $this -> Nr ][ 1 ],
$state [ 'word3' ] ^ $dw [ $this -> Nr ][ 2 ],
$state [ 'word4' ] ^ $dw [ $this -> Nr ][ 3 ]
);
// addRoundKey
$s0 = $state [ 1 ] ^ $dw [ 4 ];
$s1 = $state [ 2 ] ^ $dw [ 5 ];
$s2 = $state [ 3 ] ^ $dw [ 6 ];
$s3 = $state [ 4 ] ^ $dw [ 7 ];
// invShiftRows + invSubBytes + invMixColumns + addRoundKey
for ( $round = $this -> Nr - 1 ; $round > 0 ; $round -- ) {
$state = array (
$dt0 [ $state [ 0 ] & 0xFF000000 ] ^ $dt1 [ $state [ 3 ] & 0x00FF0000 ] ^ $dt2 [ $state [ 2 ] & 0x0000FF00 ] ^ $dt3 [ $state [ 1 ] & 0x000000FF ] ^ $dw [ $round ][ 0 ],
$dt0 [ $state [ 1 ] & 0xFF000000 ] ^ $dt1 [ $state [ 0 ] & 0x00FF0000 ] ^ $dt2 [ $state [ 3 ] & 0x0000FF00 ] ^ $dt3 [ $state [ 2 ] & 0x000000FF ] ^ $dw [ $round ][ 1 ],
$dt0 [ $state [ 2 ] & 0xFF000000 ] ^ $dt1 [ $state [ 1 ] & 0x00FF0000 ] ^ $dt2 [ $state [ 0 ] & 0x0000FF00 ] ^ $dt3 [ $state [ 3 ] & 0x000000FF ] ^ $dw [ $round ][ 2 ],
$dt0 [ $state [ 3 ] & 0xFF000000 ] ^ $dt1 [ $state [ 2 ] & 0x00FF0000 ] ^ $dt2 [ $state [ 1 ] & 0x0000FF00 ] ^ $dt3 [ $state [ 0 ] & 0x000000FF ] ^ $dw [ $round ][ 3 ]
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 8 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 9 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 10 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 11 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 12 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 13 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 14 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 15 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 16 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 17 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 18 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 19 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 20 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 21 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 22 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 23 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 24 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 25 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 26 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 27 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 28 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 29 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 30 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 31 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 32 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 33 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 34 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 35 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 36 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 37 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 38 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 39 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 40 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 41 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 42 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 43 ];
switch ( $this -> Nr ) {
case 10 :
break ;
case 14 :
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 44 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 45 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 46 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 47 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 48 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 49 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 50 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 51 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 52 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 53 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 54 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 55 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 56 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 57 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 58 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 59 ];
break ;
case 12 :
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 44 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 45 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 46 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 47 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 48 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 49 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 50 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 51 ];
break ;
case 13 :
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 44 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 45 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 46 ];
$s3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 47 ];
$e0 = $dt0 [( $s0 >> 24 ) & 0xff ] ^ $dt1 [( $s3 >> 16 ) & 0xff ] ^ $dt2 [( $s2 >> 8 ) & 0xff ] ^ $dt3 [ $s1 & 0xff ] ^ $dw [ 48 ];
$e1 = $dt0 [( $s1 >> 24 ) & 0xff ] ^ $dt1 [( $s0 >> 16 ) & 0xff ] ^ $dt2 [( $s3 >> 8 ) & 0xff ] ^ $dt3 [ $s2 & 0xff ] ^ $dw [ 49 ];
$e2 = $dt0 [( $s2 >> 24 ) & 0xff ] ^ $dt1 [( $s1 >> 16 ) & 0xff ] ^ $dt2 [( $s0 >> 8 ) & 0xff ] ^ $dt3 [ $s3 & 0xff ] ^ $dw [ 50 ];
$e3 = $dt0 [( $s3 >> 24 ) & 0xff ] ^ $dt1 [( $s2 >> 16 ) & 0xff ] ^ $dt2 [( $s1 >> 8 ) & 0xff ] ^ $dt3 [ $s0 & 0xff ] ^ $dw [ 51 ];
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 52 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 53 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 54 ];
$e3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 55 ];
// Note: Here we skip $s3 but using $e3
$e0 = $s0 ;
$e1 = $s1 ;
$e2 = $s2 ;
// $e3 = $s3;
break ;
default : // 11
$s0 = $dt0 [( $e0 >> 24 ) & 0xff ] ^ $dt1 [( $e3 >> 16 ) & 0xff ] ^ $dt2 [( $e2 >> 8 ) & 0xff ] ^ $dt3 [ $e1 & 0xff ] ^ $dw [ 44 ];
$s1 = $dt0 [( $e1 >> 24 ) & 0xff ] ^ $dt1 [( $e0 >> 16 ) & 0xff ] ^ $dt2 [( $e3 >> 8 ) & 0xff ] ^ $dt3 [ $e2 & 0xff ] ^ $dw [ 45 ];
$s2 = $dt0 [( $e2 >> 24 ) & 0xff ] ^ $dt1 [( $e1 >> 16 ) & 0xff ] ^ $dt2 [( $e0 >> 8 ) & 0xff ] ^ $dt3 [ $e3 & 0xff ] ^ $dw [ 46 ];
$e3 = $dt0 [( $e3 >> 24 ) & 0xff ] ^ $dt1 [( $e2 >> 16 ) & 0xff ] ^ $dt2 [( $e1 >> 8 ) & 0xff ] ^ $dt3 [ $e0 & 0xff ] ^ $dw [ 47 ];
// Note: Here we skip $s3 but using $e3
$e0 = $s0 ;
$e1 = $s1 ;
$e2 = $s2 ;
// $e3 = $s3;
}
// invSubWord
$e0 = $sbox [ $e0 & 0xff ] | ( $sbox [( $e0 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e0 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e0 >> 24 ) & 0xff ] << 24 );
$e1 = $sbox [ $e1 & 0xff ] | ( $sbox [( $e1 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e1 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e1 >> 24 ) & 0xff ] << 24 );
$e2 = $sbox [ $e2 & 0xff ] | ( $sbox [( $e2 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e2 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e2 >> 24 ) & 0xff ] << 24 );
$e3 = $sbox [ $e3 & 0xff ] | ( $sbox [( $e3 >> 8 ) & 0xff ] << 8 ) | ( $sbox [( $e3 >> 16 ) & 0xff ] << 16 ) | ( $sbox [( $e3 >> 24 ) & 0xff ] << 24 );
// invShiftRows + addRoundKey
return pack ( 'N*' ,
( $e0 & 0xFF000000 ) ^ ( $e3 & 0x00FF0000 ) ^ ( $e2 & 0x0000FF00 ) ^ ( $e1 & 0x000000FF ) ^ $dw [ 0 ],
( $e1 & 0xFF000000 ) ^ ( $e0 & 0x00FF0000 ) ^ ( $e3 & 0x0000FF00 ) ^ ( $e2 & 0x000000FF ) ^ $dw [ 1 ],
( $e2 & 0xFF000000 ) ^ ( $e1 & 0x00FF0000 ) ^ ( $e0 & 0x0000FF00 ) ^ ( $e3 & 0x000000FF ) ^ $dw [ 2 ],
( $e3 & 0xFF000000 ) ^ ( $e2 & 0x00FF0000 ) ^ ( $e1 & 0x0000FF00 ) ^ ( $e0 & 0x000000FF ) ^ $dw [ 3 ]
);
}
// invShiftRows + invSubWord + addRoundKey
$state = array (
$this -> _invSubWord (( $state [ 0 ] & 0xFF000000 ) ^ ( $state [ 3 ] & 0x00FF0000 ) ^ ( $state [ 2 ] & 0x0000FF00 ) ^ ( $state [ 1 ] & 0x000000FF )) ^ $dw [ 0 ][ 0 ],
$this -> _invSubWord (( $state [ 1 ] & 0xFF000000 ) ^ ( $state [ 0 ] & 0x00FF0000 ) ^ ( $state [ 3 ] & 0x0000FF00 ) ^ ( $state [ 2 ] & 0x000000FF )) ^ $dw [ 0 ][ 1 ],
$this -> _invSubWord (( $state [ 2 ] & 0xFF000000 ) ^ ( $state [ 1 ] & 0x00FF0000 ) ^ ( $state [ 0 ] & 0x0000FF00 ) ^ ( $state [ 3 ] & 0x000000FF )) ^ $dw [ 0 ][ 2 ],
$this -> _invSubWord (( $state [ 3 ] & 0xFF000000 ) ^ ( $state [ 2 ] & 0x00FF0000 ) ^ ( $state [ 1 ] & 0x0000FF00 ) ^ ( $state [ 0 ] & 0x000000FF )) ^ $dw [ 0 ][ 3 ]
);
/**
* Treat consecutive " packets " as if they are a continuous buffer .
*
* The default behavior .
*
* @ see Crypt_Rijndael :: disableContinuousBuffer ()
* @ access public
*/
function enableContinuousBuffer ()
{
parent :: enableContinuousBuffer ();
return pack ( 'N*' , $state [ 0 ], $state [ 1 ], $state [ 2 ], $state [ 3 ]);
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
$this -> enbuffer [ 'enmcrypt_init' ] = true ;
$this -> debuffer [ 'demcrypt_init' ] = true ;
}
}
/**
* Treat consecutive packets as if they are a discontinuous buffer .
*
* The default behavior .
*
* @ see Crypt_Rijndael :: enableContinuousBuffer ()
* @ access public
*/
function disableContinuousBuffer ()
{
parent :: disableContinuousBuffer ();
if ( CRYPT_AES_MODE == CRYPT_AES_MODE_MCRYPT ) {
mcrypt_generic_init ( $this -> enmcrypt , $this -> key , $this -> iv );
mcrypt_generic_init ( $this -> demcrypt , $this -> key , $this -> iv );
}
}
}