includes/rijndael.php
changeset 1227 bdac73ed481e
parent 832 7152ca0a0ce9
child 1327 e8f4dea267c8
equal deleted inserted replaced
1226:de56132c008d 1227:bdac73ed481e
    47 define ('ENC_BASE64', 202);
    47 define ('ENC_BASE64', 202);
    48 define ('ENC_BINARY', 203);
    48 define ('ENC_BINARY', 203);
    49 
    49 
    50 class librijndael2
    50 class librijndael2
    51 {
    51 {
    52   //////////////////// CONVERSION FUNCTIONS ///////////////////////////
    52 	//////////////////// CONVERSION FUNCTIONS ///////////////////////////
    53 
    53 
    54   // Byte to hex
    54 	// Byte to hex
    55   static function byte2hex($byte)
    55 	static function byte2hex($byte)
    56   {
    56 	{
    57     if ( strlen(dechex(ord($byte))) < 2 )
    57 		if ( strlen(dechex(ord($byte))) < 2 )
    58       return ( "0" . dechex(ord($byte)) );
    58 			return ( "0" . dechex(ord($byte)) );
    59     else 
    59 		else 
    60       return ( dechex(ord($byte)) );
    60 			return ( dechex(ord($byte)) );
    61   }
    61 	}
    62 
    62 
    63 
    63 
    64   /* Convert String to Hex String 
    64 	/* Convert String to Hex String 
    65    * Null byte cannot appear in middle of String.
    65  	* Null byte cannot appear in middle of String.
    66    * this function is necessary because toString(16) does not 
    66  	* this function is necessary because toString(16) does not 
    67    * produces two hex caracters for 0 to 15.
    67  	* produces two hex caracters for 0 to 15.
    68    */
    68  	*/
    69   static function string2hex ($s) {
    69 	static function string2hex ($s) {
    70     $hex = '';
    70 		$hex = '';
    71     for ($x = 0; $x < strlen($s); $x++) {
    71 		for ($x = 0; $x < strlen($s); $x++) {
    72       $byte = $s{$x};
    72 			$byte = $s{$x};
    73       $hex .= librijndael2::byte2hex($byte);
    73 			$hex .= librijndael2::byte2hex($byte);
    74     }
    74 		}
    75 
    75 
    76     return $hex;
    76 		return $hex;
    77   }
    77 	}
    78            
    78  					
    79   /* Convert Hex String to String  
    79 	/* Convert Hex String to String  
    80    * 00 (NULL)  is not converted!
    80  	* 00 (NULL)  is not converted!
    81    * Hex String must be even number of chars (A must be 0A, F must be 0F, etc)
    81  	* Hex String must be even number of chars (A must be 0A, F must be 0F, etc)
    82    */
    82  	*/
    83   static function hex2string($hex) {
    83 	static function hex2string($hex) {
    84     $s = '';
    84 		$s = '';
    85     if (strlen($hex) % 2 == 1) {
    85 		if (strlen($hex) % 2 == 1) {
    86       librijndael2::trace("Error: Hex String must be even number of chars");
    86 			librijndael2::trace("Error: Hex String must be even number of chars");
    87       return -1;
    87 			return -1;
    88     }
    88 		}
    89 
    89 
    90     for ( $i = 0; $i < strlen($hex); $i+=2 )
    90 		for ( $i = 0; $i < strlen($hex); $i+=2 )
    91     {
    91 		{
    92       $byte = $hex{$i} . $hex{$i+1};
    92 			$byte = $hex{$i} . $hex{$i+1};
    93       $s .= chr(hexdec($byte));
    93 			$s .= chr(hexdec($byte));
    94     }
    94 		}
    95           
    95 					
    96     return $s;
    96 		return $s;
    97   }
    97 	}
    98   
    98 	
    99   static function trace($error)
    99 	static function trace($error)
   100   {
   100 	{
   101     // $bt = debug_backtrace();
   101 		// $bt = debug_backtrace();
   102     echo("$error\n");
   102 		echo("$error\n");
   103     // echo '<pre>' . htmlspecialchars(print_r($bt, true)) . '</pre>';
   103 		// echo '<pre>' . htmlspecialchars(print_r($bt, true)) . '</pre>';
   104     
   104 		
   105     exit();
   105 		exit();
   106   }
   106 	}
   107   
   107 	
   108   static function parseInt($str)
   108 	static function parseInt($str)
   109   {
   109 	{
   110     if ( is_int($str) )
   110 		if ( is_int($str) )
   111       return $str;
   111 			return $str;
   112     if ( !is_string($str) )
   112 		if ( !is_string($str) )
   113       librijndael2::trace('Error: non-string (' . gettype($str) . ') passed to librijndael2::parseInt(' . $str . ')');
   113 			librijndael2::trace('Error: non-string (' . gettype($str) . ') passed to librijndael2::parseInt(' . $str . ')');
   114     if ( substr($str, 0, 2) == '0x' )
   114 		if ( substr($str, 0, 2) == '0x' )
   115     {
   115 		{
   116       return ( preg_match('/^0x([a-f0-9][a-f0-9])+$/i', $str) ) ? eval("return $str;") : intval($str);
   116 			return ( preg_match('/^0x([a-f0-9][a-f0-9])+$/i', $str) ) ? eval("return $str;") : intval($str);
   117     }
   117 		}
   118     return intval($str);
   118 		return intval($str);
   119   }
   119 	}
   120   
   120 	
   121   static function ord2hex($byte)
   121 	static function ord2hex($byte)
   122   {
   122 	{
   123     if ( !is_int($byte) )
   123 		if ( !is_int($byte) )
   124       librijndael2::trace('Error: non-integer passed to ord2hex()');
   124 			librijndael2::trace('Error: non-integer passed to ord2hex()');
   125     $result = strval(dechex($byte));
   125 		$result = strval(dechex($byte));
   126     if ( strlen($result) < 2 )
   126 		if ( strlen($result) < 2 )
   127       $result = "0$result";
   127 			$result = "0$result";
   128     return $result;
   128 		return $result;
   129   }
   129 	}
   130 }
   130 }
   131 
   131 
   132 class Crypt_Rijndael
   132 class Crypt_Rijndael
   133 {
   133 {
   134 
   134 
   135  //////////////////// TABLES, STRUCTURES... ////////////////////////
   135  //////////////////// TABLES, STRUCTURES... ////////////////////////
   136    
   136  	
   137   var $Te0 = array(
   137 	var $Te0 = array(
   138     0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
   138 		0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d,
   139     0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
   139 		0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554,
   140     0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
   140 		0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d,
   141     0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
   141 		0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a,
   142     0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
   142 		0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87,
   143     0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
   143 		0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b,
   144     0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
   144 		0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea,
   145     0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
   145 		0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b,
   146     0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
   146 		0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a,
   147     0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
   147 		0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f,
   148     0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
   148 		0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108,
   149     0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
   149 		0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f,
   150     0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
   150 		0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e,
   151     0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
   151 		0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5,
   152     0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
   152 		0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d,
   153     0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
   153 		0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f,
   154     0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
   154 		0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e,
   155     0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
   155 		0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb,
   156     0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
   156 		0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce,
   157     0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
   157 		0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497,
   158     0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
   158 		0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c,
   159     0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
   159 		0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed,
   160     0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
   160 		0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b,
   161     0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
   161 		0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a,
   162     0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
   162 		0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16,
   163     0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
   163 		0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594,
   164     0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
   164 		0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81,
   165     0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
   165 		0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3,
   166     0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
   166 		0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a,
   167     0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
   167 		0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504,
   168     0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
   168 		0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163,
   169     0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
   169 		0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d,
   170     0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
   170 		0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f,
   171     0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
   171 		0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739,
   172     0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
   172 		0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47,
   173     0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
   173 		0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395,
   174     0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
   174 		0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f,
   175     0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
   175 		0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883,
   176     0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
   176 		0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c,
   177     0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
   177 		0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76,
   178     0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
   178 		0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e,
   179     0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
   179 		0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4,
   180     0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
   180 		0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6,
   181     0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
   181 		0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b,
   182     0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
   182 		0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7,
   183     0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
   183 		0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0,
   184     0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
   184 		0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25,
   185     0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
   185 		0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818,
   186     0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
   186 		0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72,
   187     0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
   187 		0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651,
   188     0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
   188 		0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21,
   189     0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
   189 		0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85,
   190     0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
   190 		0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa,
   191     0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
   191 		0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12,
   192     0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
   192 		0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0,
   193     0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
   193 		0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9,
   194     0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
   194 		0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133,
   195     0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
   195 		0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7,
   196     0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
   196 		0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920,
   197     0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
   197 		0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a,
   198     0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
   198 		0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17,
   199     0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
   199 		0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8,
   200     0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
   200 		0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11,
   201     0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
   201 		0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a
   202   );
   202 	);
   203   
   203 	
   204   var $Te1 = array(
   204 	var $Te1 = array(
   205     0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
   205 		0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b,
   206     0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
   206 		0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5,
   207     0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
   207 		0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b,
   208     0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
   208 		0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676,
   209     0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
   209 		0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d,
   210     0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
   210 		0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0,
   211     0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
   211 		0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf,
   212     0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
   212 		0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0,
   213     0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
   213 		0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626,
   214     0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
   214 		0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc,
   215     0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
   215 		0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1,
   216     0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
   216 		0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515,
   217     0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
   217 		0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3,
   218     0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
   218 		0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a,
   219     0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
   219 		0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2,
   220     0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
   220 		0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575,
   221     0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
   221 		0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a,
   222     0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
   222 		0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0,
   223     0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
   223 		0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3,
   224     0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
   224 		0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484,
   225     0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
   225 		0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded,
   226     0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
   226 		0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b,
   227     0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
   227 		0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939,
   228     0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
   228 		0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf,
   229     0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
   229 		0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb,
   230     0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
   230 		0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585,
   231     0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
   231 		0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f,
   232     0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
   232 		0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8,
   233     0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
   233 		0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f,
   234     0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
   234 		0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5,
   235     0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
   235 		0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121,
   236     0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
   236 		0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2,
   237     0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
   237 		0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec,
   238     0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
   238 		0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717,
   239     0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
   239 		0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d,
   240     0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
   240 		0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373,
   241     0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
   241 		0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc,
   242     0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
   242 		0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888,
   243     0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
   243 		0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414,
   244     0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
   244 		0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb,
   245     0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
   245 		0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a,
   246     0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
   246 		0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c,
   247     0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
   247 		0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262,
   248     0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
   248 		0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979,
   249     0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
   249 		0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d,
   250     0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
   250 		0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9,
   251     0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
   251 		0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea,
   252     0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
   252 		0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808,
   253     0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
   253 		0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e,
   254     0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
   254 		0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6,
   255     0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
   255 		0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f,
   256     0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
   256 		0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a,
   257     0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
   257 		0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666,
   258     0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
   258 		0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e,
   259     0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
   259 		0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9,
   260     0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
   260 		0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e,
   261     0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
   261 		0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111,
   262     0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
   262 		0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494,
   263     0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
   263 		0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9,
   264     0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
   264 		0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf,
   265     0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
   265 		0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d,
   266     0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
   266 		0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868,
   267     0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
   267 		0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f,
   268     0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616     
   268 		0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616     
   269   );
   269 	);
   270   
   270 	
   271   var $Te2 = array(
   271 	var $Te2 = array(
   272     0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
   272 		0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b,
   273     0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
   273 		0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5,
   274     0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
   274 		0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b,
   275     0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
   275 		0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76,
   276     0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
   276 		0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d,
   277     0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
   277 		0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0,
   278     0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
   278 		0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af,
   279     0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
   279 		0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0,
   280     0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
   280 		0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26,
   281     0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
   281 		0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc,
   282     0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
   282 		0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1,
   283     0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
   283 		0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15,
   284     0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
   284 		0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3,
   285     0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
   285 		0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a,
   286     0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
   286 		0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2,
   287     0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
   287 		0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75,
   288     0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
   288 		0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a,
   289     0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
   289 		0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0,
   290     0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
   290 		0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3,
   291     0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
   291 		0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384,
   292     0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
   292 		0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed,
   293     0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
   293 		0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b,
   294     0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
   294 		0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239,
   295     0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
   295 		0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf,
   296     0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
   296 		0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb,
   297     0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
   297 		0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185,
   298     0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
   298 		0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f,
   299     0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
   299 		0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8,
   300     0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
   300 		0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f,
   301     0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
   301 		0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5,
   302     0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
   302 		0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221,
   303     0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
   303 		0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2,
   304     0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
   304 		0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec,
   305     0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
   305 		0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17,
   306     0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
   306 		0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d,
   307     0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
   307 		0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673,
   308     0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
   308 		0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc,
   309     0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
   309 		0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88,
   310     0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
   310 		0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814,
   311     0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
   311 		0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb,
   312     0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
   312 		0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a,
   313     0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
   313 		0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c,
   314     0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
   314 		0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462,
   315     0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
   315 		0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279,
   316     0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
   316 		0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d,
   317     0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
   317 		0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9,
   318     0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
   318 		0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea,
   319     0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
   319 		0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008,
   320     0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
   320 		0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e,
   321     0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
   321 		0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6,
   322     0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
   322 		0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f,
   323     0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
   323 		0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a,
   324     0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
   324 		0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66,
   325     0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
   325 		0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e,
   326     0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
   326 		0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9,
   327     0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
   327 		0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e,
   328     0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
   328 		0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211,
   329     0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
   329 		0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394,
   330     0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
   330 		0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9,
   331     0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
   331 		0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df,
   332     0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
   332 		0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d,
   333     0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
   333 		0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068,
   334     0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
   334 		0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f,
   335     0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16
   335 		0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16
   336   );
   336 	);
   337   
   337 	
   338   var $Te3 = array(
   338 	var $Te3 = array(
   339     0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
   339 		0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6,
   340     0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
   340 		0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491,
   341     0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
   341 		0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56,
   342     0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
   342 		0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec,
   343     0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
   343 		0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa,
   344     0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
   344 		0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb,
   345     0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
   345 		0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45,
   346     0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
   346 		0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b,
   347     0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
   347 		0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c,
   348     0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
   348 		0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83,
   349     0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
   349 		0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9,
   350     0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
   350 		0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a,
   351     0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
   351 		0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d,
   352     0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
   352 		0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f,
   353     0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
   353 		0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf,
   354     0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
   354 		0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea,
   355     0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
   355 		0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34,
   356     0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
   356 		0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b,
   357     0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
   357 		0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d,
   358     0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
   358 		0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713,
   359     0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
   359 		0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1,
   360     0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
   360 		0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6,
   361     0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
   361 		0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72,
   362     0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
   362 		0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85,
   363     0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
   363 		0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed,
   364     0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
   364 		0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411,
   365     0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
   365 		0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe,
   366     0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
   366 		0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b,
   367     0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
   367 		0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05,
   368     0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
   368 		0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1,
   369     0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
   369 		0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342,
   370     0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
   370 		0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf,
   371     0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
   371 		0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3,
   372     0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
   372 		0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e,
   373     0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
   373 		0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a,
   374     0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
   374 		0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6,
   375     0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
   375 		0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3,
   376     0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
   376 		0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b,
   377     0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
   377 		0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28,
   378     0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
   378 		0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad,
   379     0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
   379 		0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14,
   380     0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
   380 		0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8,
   381     0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
   381 		0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4,
   382     0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
   382 		0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2,
   383     0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
   383 		0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da,
   384     0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
   384 		0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049,
   385     0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
   385 		0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf,
   386     0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
   386 		0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810,
   387     0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
   387 		0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c,
   388     0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
   388 		0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197,
   389     0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
   389 		0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e,
   390     0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
   390 		0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f,
   391     0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
   391 		0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc,
   392     0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
   392 		0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c,
   393     0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
   393 		0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069,
   394     0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
   394 		0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927,
   395     0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
   395 		0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322,
   396     0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
   396 		0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733,
   397     0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
   397 		0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9,
   398     0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
   398 		0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5,
   399     0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
   399 		0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a,
   400     0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
   400 		0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0,
   401     0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
   401 		0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e,
   402     0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c
   402 		0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c
   403   );
   403 	);
   404   
   404 	
   405   var $Te4 = array(
   405 	var $Te4 = array(
   406     0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
   406 		0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b,
   407     0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
   407 		0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5,
   408     0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
   408 		0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b,
   409     0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
   409 		0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676,
   410     0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
   410 		0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d,
   411     0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
   411 		0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0,
   412     0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
   412 		0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf,
   413     0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
   413 		0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0,
   414     0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
   414 		0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626,
   415     0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
   415 		0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc,
   416     0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
   416 		0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1,
   417     0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
   417 		0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515,
   418     0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
   418 		0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3,
   419     0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
   419 		0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a,
   420     0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
   420 		0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2,
   421     0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
   421 		0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575,
   422     0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
   422 		0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a,
   423     0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
   423 		0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0,
   424     0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
   424 		0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3,
   425     0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
   425 		0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484,
   426     0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
   426 		0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed,
   427     0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
   427 		0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b,
   428     0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
   428 		0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939,
   429     0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
   429 		0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf,
   430     0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
   430 		0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb,
   431     0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
   431 		0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585,
   432     0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
   432 		0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f,
   433     0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
   433 		0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8,
   434     0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
   434 		0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f,
   435     0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
   435 		0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5,
   436     0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
   436 		0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121,
   437     0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
   437 		0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2,
   438     0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
   438 		0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec,
   439     0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
   439 		0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717,
   440     0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
   440 		0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d,
   441     0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
   441 		0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373,
   442     0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
   442 		0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc,
   443     0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
   443 		0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888,
   444     0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
   444 		0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414,
   445     0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
   445 		0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb,
   446     0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
   446 		0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a,
   447     0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
   447 		0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c,
   448     0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
   448 		0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262,
   449     0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
   449 		0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979,
   450     0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
   450 		0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d,
   451     0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
   451 		0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9,
   452     0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
   452 		0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea,
   453     0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
   453 		0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808,
   454     0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
   454 		0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e,
   455     0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
   455 		0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6,
   456     0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
   456 		0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f,
   457     0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
   457 		0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a,
   458     0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
   458 		0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666,
   459     0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
   459 		0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e,
   460     0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
   460 		0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9,
   461     0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
   461 		0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e,
   462     0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
   462 		0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111,
   463     0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
   463 		0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494,
   464     0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
   464 		0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9,
   465     0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
   465 		0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf,
   466     0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
   466 		0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d,
   467     0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
   467 		0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868,
   468     0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
   468 		0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f,
   469     0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
   469 		0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616
   470   );
   470 	);
   471   
   471 	
   472   var $Td0 = array(
   472 	var $Td0 = array(
   473     0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
   473 		0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96,
   474     0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
   474 		0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393,
   475     0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
   475 		0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25,
   476     0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
   476 		0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f,
   477     0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
   477 		0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1,
   478     0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
   478 		0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6,
   479     0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
   479 		0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da,
   480     0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
   480 		0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844,
   481     0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
   481 		0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd,
   482     0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
   482 		0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4,
   483     0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
   483 		0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45,
   484     0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
   484 		0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94,
   485     0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
   485 		0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7,
   486     0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
   486 		0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a,
   487     0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
   487 		0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5,
   488     0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
   488 		0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c,
   489     0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
   489 		0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1,
   490     0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
   490 		0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a,
   491     0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
   491 		0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75,
   492     0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
   492 		0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051,
   493     0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
   493 		0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46,
   494     0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
   494 		0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff,
   495     0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
   495 		0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77,
   496     0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
   496 		0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb,
   497     0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
   497 		0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000,
   498     0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
   498 		0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e,
   499     0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
   499 		0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927,
   500     0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
   500 		0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a,
   501     0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
   501 		0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e,
   502     0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
   502 		0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16,
   503     0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
   503 		0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d,
   504     0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
   504 		0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8,
   505     0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
   505 		0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd,
   506     0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
   506 		0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34,
   507     0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
   507 		0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163,
   508     0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
   508 		0xd731dcca, 0x42638510, 0x13972240, 0x84c61120,
   509     0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
   509 		0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d,
   510     0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
   510 		0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0,
   511     0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
   511 		0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422,
   512     0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
   512 		0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef,
   513     0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
   513 		0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36,
   514     0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
   514 		0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4,
   515     0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
   515 		0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662,
   516     0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
   516 		0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5,
   517     0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
   517 		0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3,
   518     0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
   518 		0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b,
   519     0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
   519 		0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8,
   520     0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
   520 		0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6,
   521     0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
   521 		0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6,
   522     0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
   522 		0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0,
   523     0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
   523 		0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815,
   524     0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
   524 		0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f,
   525     0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
   525 		0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df,
   526     0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
   526 		0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f,
   527     0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
   527 		0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e,
   528     0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
   528 		0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713,
   529     0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
   529 		0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89,
   530     0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
   530 		0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c,
   531     0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
   531 		0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf,
   532     0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
   532 		0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86,
   533     0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
   533 		0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f,
   534     0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
   534 		0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541,
   535     0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
   535 		0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190,
   536     0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
   536 		0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742
   537   );
   537 	);
   538   
   538 	
   539   var $Td1 = array(
   539 	var $Td1 = array(
   540     0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
   540 		0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e,
   541     0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
   541 		0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303,
   542     0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
   542 		0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c,
   543     0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
   543 		0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3,
   544     0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
   544 		0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0,
   545     0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
   545 		0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9,
   546     0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
   546 		0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259,
   547     0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
   547 		0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8,
   548     0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
   548 		0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971,
   549     0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
   549 		0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a,
   550     0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
   550 		0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f,
   551     0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
   551 		0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b,
   552     0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
   552 		0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8,
   553     0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
   553 		0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab,
   554     0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
   554 		0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708,
   555     0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
   555 		0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682,
   556     0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
   556 		0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2,
   557     0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
   557 		0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe,
   558     0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
   558 		0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb,
   559     0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
   559 		0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10,
   560     0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
   560 		0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd,
   561     0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
   561 		0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015,
   562     0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
   562 		0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e,
   563     0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
   563 		0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee,
   564     0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
   564 		0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000,
   565     0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
   565 		0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72,
   566     0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
   566 		0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39,
   567     0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
   567 		0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e,
   568     0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
   568 		0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91,
   569     0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
   569 		0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a,
   570     0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
   570 		0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17,
   571     0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
   571 		0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9,
   572     0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
   572 		0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60,
   573     0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
   573 		0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e,
   574     0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
   574 		0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1,
   575     0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
   575 		0xcad731dc, 0x10426385, 0x40139722, 0x2084c611,
   576     0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
   576 		0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1,
   577     0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
   577 		0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3,
   578     0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
   578 		0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964,
   579     0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
   579 		0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390,
   580     0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
   580 		0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b,
   581     0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
   581 		0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf,
   582     0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
   582 		0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46,
   583     0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
   583 		0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af,
   584     0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
   584 		0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512,
   585     0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
   585 		0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb,
   586     0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
   586 		0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a,
   587     0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
   587 		0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8,
   588     0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
   588 		0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c,
   589     0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
   589 		0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266,
   590     0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
   590 		0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8,
   591     0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
   591 		0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6,
   592     0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
   592 		0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604,
   593     0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
   593 		0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551,
   594     0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
   594 		0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41,
   595     0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
   595 		0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647,
   596     0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
   596 		0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c,
   597     0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
   597 		0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1,
   598     0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
   598 		0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737,
   599     0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
   599 		0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db,
   600     0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
   600 		0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340,
   601     0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
   601 		0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95,
   602     0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
   602 		0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1,
   603     0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
   603 		0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857
   604   );
   604 	);
   605   
   605 	
   606   var $Td2 = array(
   606 	var $Td2 = array(
   607     0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
   607 		0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27,
   608     0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
   608 		0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3,
   609     0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
   609 		0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502,
   610     0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
   610 		0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562,
   611     0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
   611 		0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe,
   612     0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
   612 		0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3,
   613     0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
   613 		0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552,
   614     0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
   614 		0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9,
   615     0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
   615 		0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9,
   616     0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
   616 		0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce,
   617     0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
   617 		0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253,
   618     0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
   618 		0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908,
   619     0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
   619 		0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b,
   620     0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
   620 		0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655,
   621     0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
   621 		0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337,
   622     0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
   622 		0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16,
   623     0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
   623 		0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69,
   624     0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
   624 		0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6,
   625     0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
   625 		0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6,
   626     0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
   626 		0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e,
   627     0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
   627 		0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6,
   628     0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
   628 		0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050,
   629     0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
   629 		0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9,
   630     0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
   630 		0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8,
   631     0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
   631 		0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000,
   632     0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
   632 		0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a,
   633     0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
   633 		0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d,
   634     0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
   634 		0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436,
   635     0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
   635 		0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b,
   636     0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
   636 		0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12,
   637     0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
   637 		0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b,
   638     0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
   638 		0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e,
   639     0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
   639 		0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f,
   640     0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
   640 		0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb,
   641     0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
   641 		0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4,
   642     0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
   642 		0xdccad731, 0x85104263, 0x22401397, 0x112084c6,
   643     0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
   643 		0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729,
   644     0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
   644 		0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1,
   645     0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
   645 		0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9,
   646     0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
   646 		0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233,
   647     0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
   647 		0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4,
   648     0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
   648 		0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad,
   649     0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
   649 		0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e,
   650     0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
   650 		0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3,
   651     0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
   651 		0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25,
   652     0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
   652 		0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b,
   653     0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
   653 		0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f,
   654     0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
   654 		0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15,
   655     0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
   655 		0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0,
   656     0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
   656 		0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2,
   657     0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
   657 		0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7,
   658     0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
   658 		0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791,
   659     0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
   659 		0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496,
   660     0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
   660 		0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665,
   661     0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
   661 		0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b,
   662     0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
   662 		0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6,
   663     0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
   663 		0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13,
   664     0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
   664 		0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47,
   665     0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
   665 		0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7,
   666     0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
   666 		0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844,
   667     0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
   667 		0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3,
   668     0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
   668 		0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d,
   669     0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
   669 		0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456,
   670     0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
   670 		0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8
   671   );
   671 	);
   672   
   672 	
   673   var $Td3 = array(
   673 	var $Td3 = array(
   674     0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
   674 		0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a,
   675     0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
   675 		0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b,
   676     0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
   676 		0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5,
   677     0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
   677 		0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5,
   678     0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
   678 		0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d,
   679     0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
   679 		0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b,
   680     0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
   680 		0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95,
   681     0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
   681 		0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e,
   682     0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
   682 		0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27,
   683     0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
   683 		0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d,
   684     0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
   684 		0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562,
   685     0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
   685 		0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9,
   686     0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
   686 		0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752,
   687     0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
   687 		0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66,
   688     0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
   688 		0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3,
   689     0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
   689 		0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced,
   690     0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
   690 		0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e,
   691     0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
   691 		0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4,
   692     0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
   692 		0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4,
   693     0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
   693 		0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd,
   694     0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
   694 		0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d,
   695     0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
   695 		0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60,
   696     0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
   696 		0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767,
   697     0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
   697 		0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79,
   698     0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
   698 		0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000,
   699     0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
   699 		0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c,
   700     0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
   700 		0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736,
   701     0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
   701 		0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24,
   702     0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
   702 		0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b,
   703     0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
   703 		0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c,
   704     0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
   704 		0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12,
   705     0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
   705 		0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814,
   706     0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
   706 		0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3,
   707     0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
   707 		0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b,
   708     0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
   708 		0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8,
   709     0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
   709 		0x31dccad7, 0x63851042, 0x97224013, 0xc6112084,
   710     0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
   710 		0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7,
   711     0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
   711 		0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077,
   712     0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
   712 		0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247,
   713     0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
   713 		0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22,
   714     0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
   714 		0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698,
   715     0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
   715 		0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f,
   716     0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
   716 		0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254,
   717     0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
   717 		0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582,
   718     0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
   718 		0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf,
   719     0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
   719 		0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb,
   720     0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
   720 		0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883,
   721     0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
   721 		0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef,
   722     0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
   722 		0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629,
   723     0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
   723 		0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035,
   724     0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
   724 		0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533,
   725     0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
   725 		0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17,
   726     0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
   726 		0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4,
   727     0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
   727 		0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46,
   728     0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
   728 		0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb,
   729     0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
   729 		0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d,
   730     0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
   730 		0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb,
   731     0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
   731 		0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a,
   732     0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
   732 		0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73,
   733     0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
   733 		0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678,
   734     0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
   734 		0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2,
   735     0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
   735 		0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff,
   736     0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
   736 		0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064,
   737     0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
   737 		0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0
   738   );
   738 	);
   739   
   739 	
   740   var $Td4 = array(
   740 	var $Td4 = array(
   741     0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
   741 		0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5,
   742     0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
   742 		0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838,
   743     0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
   743 		0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e,
   744     0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
   744 		0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb,
   745     0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
   745 		0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282,
   746     0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
   746 		0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787,
   747     0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
   747 		0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444,
   748     0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
   748 		0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb,
   749     0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
   749 		0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232,
   750     0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
   750 		0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d,
   751     0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
   751 		0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b,
   752     0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
   752 		0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e,
   753     0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
   753 		0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666,
   754     0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
   754 		0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2,
   755     0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
   755 		0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949,
   756     0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
   756 		0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525,
   757     0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
   757 		0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464,
   758     0x86868686, 0x68686868, 0x98989898, 0x16161616,
   758 		0x86868686, 0x68686868, 0x98989898, 0x16161616,
   759     0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
   759 		0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc,
   760     0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
   760 		0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292,
   761     0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
   761 		0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050,
   762     0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
   762 		0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada,
   763     0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
   763 		0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757,
   764     0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
   764 		0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484,
   765     0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
   765 		0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000,
   766     0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
   766 		0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a,
   767     0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
   767 		0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505,
   768     0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
   768 		0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606,
   769     0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
   769 		0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f,
   770     0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
   770 		0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202,
   771     0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
   771 		0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303,
   772     0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
   772 		0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b,
   773     0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
   773 		0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141,
   774     0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
   774 		0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea,
   775     0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
   775 		0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece,
   776     0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
   776 		0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373,
   777     0x96969696, 0xacacacac, 0x74747474, 0x22222222,
   777 		0x96969696, 0xacacacac, 0x74747474, 0x22222222,
   778     0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
   778 		0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585,
   779     0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
   779 		0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8,
   780     0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
   780 		0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e,
   781     0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
   781 		0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171,
   782     0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
   782 		0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989,
   783     0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
   783 		0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e,
   784     0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
   784 		0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b,
   785     0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
   785 		0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b,
   786     0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
   786 		0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020,
   787     0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
   787 		0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe,
   788     0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
   788 		0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4,
   789     0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
   789 		0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333,
   790     0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
   790 		0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131,
   791     0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
   791 		0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959,
   792     0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
   792 		0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f,
   793     0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
   793 		0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9,
   794     0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
   794 		0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d,
   795     0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
   795 		0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f,
   796     0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
   796 		0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef,
   797     0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
   797 		0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d,
   798     0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
   798 		0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0,
   799     0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
   799 		0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c,
   800     0x83838383, 0x53535353, 0x99999999, 0x61616161,
   800 		0x83838383, 0x53535353, 0x99999999, 0x61616161,
   801     0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
   801 		0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e,
   802     0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
   802 		0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626,
   803     0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
   803 		0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363,
   804     0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d
   804 		0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d
   805   );
   805 	);
   806   
   806 	
   807   var $rcon = array(
   807 	var $rcon = array(
   808     0x01000000, 0x02000000, 0x04000000, 0x08000000,
   808 		0x01000000, 0x02000000, 0x04000000, 0x08000000,
   809     0x10000000, 0x20000000, 0x40000000, 0x80000000,
   809 		0x10000000, 0x20000000, 0x40000000, 0x80000000,
   810     0x1B000000, 0x36000000
   810 		0x1B000000, 0x36000000
   811   );
   811 	);
   812 
   812 
   813   //////////////////// CORE FUNCTIONS ///////////////////////////
   813 	//////////////////// CORE FUNCTIONS ///////////////////////////
   814 
   814 
   815   // Encrypt a single block (bin) and return (bout)
   815 	// Encrypt a single block (bin) and return (bout)
   816   function AES_encrypt($bin, $key)
   816 	function AES_encrypt($bin, $key)
   817   {
   817 	{
   818     $rk = 0;
   818 		$rk = 0;
   819     
   819 		
   820     if ($bin == '' || $key == '') {
   820 		if ($bin == '' || $key == '') {
   821       librijndael2::trace("AES_encrypt: bin/key undefined");
   821 			librijndael2::trace("AES_encrypt: bin/key undefined");
   822       return;
   822 			return;
   823     }
   823 		}
   824     
   824 		
   825     // FIXME: BAD: we need rd_key
   825 		// FIXME: BAD: we need rd_key
   826   
   826 	
   827     // map byte array block to cipher state
   827 		// map byte array block to cipher state
   828     // and add initial round key:
   828 		// and add initial round key:
   829     
   829 		
   830     $s0 = librijndael2::parseInt("0x" . substr($bin, 0 , 8)) ^ $key->rd_key[0];
   830 		$s0 = librijndael2::parseInt("0x" . substr($bin, 0 , 8)) ^ $key->rd_key[0];
   831     $s1 = librijndael2::parseInt("0x" . substr($bin, 8 , 8)) ^ $key->rd_key[1];
   831 		$s1 = librijndael2::parseInt("0x" . substr($bin, 8 , 8)) ^ $key->rd_key[1];
   832     $s2 = librijndael2::parseInt("0x" . substr($bin, 16, 8)) ^ $key->rd_key[2];
   832 		$s2 = librijndael2::parseInt("0x" . substr($bin, 16, 8)) ^ $key->rd_key[2];
   833     $s3 = librijndael2::parseInt("0x" . substr($bin, 24, 8)) ^ $key->rd_key[3];
   833 		$s3 = librijndael2::parseInt("0x" . substr($bin, 24, 8)) ^ $key->rd_key[3];
   834     
   834 		
   835     // Using Full Unroll (Bigger more a bit faster :) )
   835 		// Using Full Unroll (Bigger more a bit faster :) )
   836     // round 1:
   836 		// round 1:
   837     $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[4];
   837 		$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[4];
   838     $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[5];
   838 		$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[5];
   839     $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[6];
   839 		$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[6];
   840     $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[7];
   840 		$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[7];
   841     $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[8];
   841 		$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[8];
   842     $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[9];
   842 		$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[9];
   843     $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[10];
   843 		$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[10];
   844     $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[11];
   844 		$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[11];
   845     $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[12];
   845 		$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[12];
   846     $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[13];
   846 		$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[13];
   847     $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[14];
   847 		$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[14];
   848     $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[15];
   848 		$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[15];
   849     $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[16];
   849 		$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[16];
   850     $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[17];
   850 		$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[17];
   851     $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[18];
   851 		$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[18];
   852     $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[19];
   852 		$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[19];
   853     $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[20];
   853 		$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[20];
   854     $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[21];
   854 		$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[21];
   855     $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[22];
   855 		$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[22];
   856     $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[23];
   856 		$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[23];
   857     $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[24];
   857 		$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[24];
   858     $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[25];
   858 		$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[25];
   859     $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[26];
   859 		$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[26];
   860     $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[27];
   860 		$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[27];
   861     $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[28];
   861 		$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[28];
   862     $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[29];
   862 		$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[29];
   863     $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[30];
   863 		$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[30];
   864     $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[31];
   864 		$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[31];
   865     $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[32];
   865 		$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[32];
   866     $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[33];
   866 		$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[33];
   867     $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[34];
   867 		$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[34];
   868     $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[35];
   868 		$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[35];
   869     $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[36];
   869 		$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[36];
   870     $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[37];
   870 		$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[37];
   871     $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[38];
   871 		$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[38];
   872     $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[39];
   872 		$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[39];
   873     
   873 		
   874     // FIXME: BAD: need $key->rounds
   874 		// FIXME: BAD: need $key->rounds
   875     
   875 		
   876     if ($key->rounds > 10) {
   876 		if ($key->rounds > 10) {
   877         // round 10:
   877 				// round 10:
   878         $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[40];
   878 				$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[40];
   879         $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[41];
   879 				$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[41];
   880         $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[42];
   880 				$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[42];
   881         $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[43];
   881 				$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[43];
   882         $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[44];
   882 				$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[44];
   883         $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[45];
   883 				$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[45];
   884         $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[46];
   884 				$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[46];
   885         $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[47];
   885 				$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[47];
   886         
   886 				
   887       if ($key->rounds > 12) {
   887 			if ($key->rounds > 12) {
   888             $s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[48];
   888 						$s0 = $this->Te0[($t0 >> 24) & 0xff] ^ $this->Te1[($t1 >> 16) & 0xff] ^ $this->Te2[($t2 >>  8) & 0xff] ^ $this->Te3[$t3 & 0xff] ^ $key->rd_key[48];
   889             $s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[49];
   889 						$s1 = $this->Te0[($t1 >> 24) & 0xff] ^ $this->Te1[($t2 >> 16) & 0xff] ^ $this->Te2[($t3 >>  8) & 0xff] ^ $this->Te3[$t0 & 0xff] ^ $key->rd_key[49];
   890             $s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[50];
   890 						$s2 = $this->Te0[($t2 >> 24) & 0xff] ^ $this->Te1[($t3 >> 16) & 0xff] ^ $this->Te2[($t0 >>  8) & 0xff] ^ $this->Te3[$t1 & 0xff] ^ $key->rd_key[50];
   891             $s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[51];
   891 						$s3 = $this->Te0[($t3 >> 24) & 0xff] ^ $this->Te1[($t0 >> 16) & 0xff] ^ $this->Te2[($t1 >>  8) & 0xff] ^ $this->Te3[$t2 & 0xff] ^ $key->rd_key[51];
   892             $t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[52];
   892 						$t0 = $this->Te0[($s0 >> 24) & 0xff] ^ $this->Te1[($s1 >> 16) & 0xff] ^ $this->Te2[($s2 >>  8) & 0xff] ^ $this->Te3[$s3 & 0xff] ^ $key->rd_key[52];
   893             $t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[53];
   893 						$t1 = $this->Te0[($s1 >> 24) & 0xff] ^ $this->Te1[($s2 >> 16) & 0xff] ^ $this->Te2[($s3 >>  8) & 0xff] ^ $this->Te3[$s0 & 0xff] ^ $key->rd_key[53];
   894             $t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[54];
   894 						$t2 = $this->Te0[($s2 >> 24) & 0xff] ^ $this->Te1[($s3 >> 16) & 0xff] ^ $this->Te2[($s0 >>  8) & 0xff] ^ $this->Te3[$s1 & 0xff] ^ $key->rd_key[54];
   895             $t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[55];   
   895 						$t3 = $this->Te0[($s3 >> 24) & 0xff] ^ $this->Te1[($s0 >> 16) & 0xff] ^ $this->Te2[($s1 >>  8) & 0xff] ^ $this->Te3[$s2 & 0xff] ^ $key->rd_key[55];   
   896         }
   896 				}
   897     }
   897 		}
   898    
   898  	
   899     // This is correct
   899 		// This is correct
   900     $rk = $key->rounds << 2;
   900 		$rk = $key->rounds << 2;
   901   
   901 	
   902   
   902 	
   903     /*
   903 		/*
   904     // No Full Unroll 
   904 		// No Full Unroll 
   905     */
   905 		*/
   906   
   906 	
   907     // Apply last round and
   907 		// Apply last round and
   908     // map cipher state to byte array block:
   908 		// map cipher state to byte array block:
   909      
   909  		
   910     $s0 =  ($this->Te4[($t0 >> 24) & 0xff] & 0xff000000) ^
   910 		$s0 =  ($this->Te4[($t0 >> 24) & 0xff] & 0xff000000) ^
   911            ($this->Te4[($t1 >> 16) & 0xff] & 0x00ff0000) ^
   911  					($this->Te4[($t1 >> 16) & 0xff] & 0x00ff0000) ^
   912            ($this->Te4[($t2 >>  8) & 0xff] & 0x0000ff00) ^
   912  					($this->Te4[($t2 >>  8) & 0xff] & 0x0000ff00) ^
   913            ($this->Te4[($t3      ) & 0xff] & 0x000000ff) ^
   913  					($this->Te4[($t3      ) & 0xff] & 0x000000ff) ^
   914             $key->rd_key[$rk];
   914 						$key->rd_key[$rk];
   915   
   915 	
   916     $out  = librijndael2::ord2hex(($s0 >> 24) & 0xff);
   916 		$out  = librijndael2::ord2hex(($s0 >> 24) & 0xff);
   917     $out .= librijndael2::ord2hex(($s0 >> 16) & 0xff);
   917 		$out .= librijndael2::ord2hex(($s0 >> 16) & 0xff);
   918     $out .= librijndael2::ord2hex(($s0 >> 8) & 0xff);
   918 		$out .= librijndael2::ord2hex(($s0 >> 8) & 0xff);
   919     $out .= librijndael2::ord2hex($s0 & 0xff);
   919 		$out .= librijndael2::ord2hex($s0 & 0xff);
   920 
   920 
   921     $s1 =  ($this->Te4[($t1 >> 24) & 0xff] & 0xff000000) ^
   921 		$s1 =  ($this->Te4[($t1 >> 24) & 0xff] & 0xff000000) ^
   922            ($this->Te4[($t2 >> 16) & 0xff] & 0x00ff0000) ^
   922  					($this->Te4[($t2 >> 16) & 0xff] & 0x00ff0000) ^
   923            ($this->Te4[($t3 >>  8) & 0xff] & 0x0000ff00) ^
   923  					($this->Te4[($t3 >>  8) & 0xff] & 0x0000ff00) ^
   924            ($this->Te4[($t0      ) & 0xff] & 0x000000ff) ^
   924  					($this->Te4[($t0      ) & 0xff] & 0x000000ff) ^
   925            $key->rd_key[$rk+1];
   925  					$key->rd_key[$rk+1];
   926       
   926 			
   927     $out .= librijndael2::ord2hex(($s1 >> 24) & 0xff);
   927 		$out .= librijndael2::ord2hex(($s1 >> 24) & 0xff);
   928     $out .= librijndael2::ord2hex(($s1 >> 16) & 0xff);
   928 		$out .= librijndael2::ord2hex(($s1 >> 16) & 0xff);
   929     $out .= librijndael2::ord2hex(($s1 >> 8) & 0xff);
   929 		$out .= librijndael2::ord2hex(($s1 >> 8) & 0xff);
   930     $out .= librijndael2::ord2hex($s1 & 0xff);
   930 		$out .= librijndael2::ord2hex($s1 & 0xff);
   931     
   931 		
   932     $s2 =  ($this->Te4[($t2 >> 24) & 0xff] & 0xff000000) ^
   932 		$s2 =  ($this->Te4[($t2 >> 24) & 0xff] & 0xff000000) ^
   933            ($this->Te4[($t3 >> 16) & 0xff] & 0x00ff0000) ^
   933  					($this->Te4[($t3 >> 16) & 0xff] & 0x00ff0000) ^
   934            ($this->Te4[($t0 >>  8) & 0xff] & 0x0000ff00) ^
   934  					($this->Te4[($t0 >>  8) & 0xff] & 0x0000ff00) ^
   935            ($this->Te4[($t1      ) & 0xff] & 0x000000ff) ^
   935  					($this->Te4[($t1      ) & 0xff] & 0x000000ff) ^
   936            $key->rd_key[$rk+2];
   936  					$key->rd_key[$rk+2];
   937 
   937 
   938     $out .= librijndael2::ord2hex(($s2 >> 24) & 0xff);
   938 		$out .= librijndael2::ord2hex(($s2 >> 24) & 0xff);
   939     $out .= librijndael2::ord2hex(($s2 >> 16) & 0xff);
   939 		$out .= librijndael2::ord2hex(($s2 >> 16) & 0xff);
   940     $out .= librijndael2::ord2hex(($s2 >> 8) & 0xff); 
   940 		$out .= librijndael2::ord2hex(($s2 >> 8) & 0xff); 
   941     $out .= librijndael2::ord2hex($s2 & 0xff);
   941 		$out .= librijndael2::ord2hex($s2 & 0xff);
   942     
   942 		
   943     $s3 =  ($this->Te4[($t3 >> 24) & 0xff] & 0xff000000) ^
   943 		$s3 =  ($this->Te4[($t3 >> 24) & 0xff] & 0xff000000) ^
   944            ($this->Te4[($t0 >> 16) & 0xff] & 0x00ff0000) ^
   944  					($this->Te4[($t0 >> 16) & 0xff] & 0x00ff0000) ^
   945            ($this->Te4[($t1 >>  8) & 0xff] & 0x0000ff00) ^
   945  					($this->Te4[($t1 >>  8) & 0xff] & 0x0000ff00) ^
   946            ($this->Te4[($t2      ) & 0xff] & 0x000000ff) ^
   946  					($this->Te4[($t2      ) & 0xff] & 0x000000ff) ^
   947            $key->rd_key[$rk+3];
   947  					$key->rd_key[$rk+3];
   948     
   948 		
   949     $out .= librijndael2::ord2hex(($s3 >> 24) & 0xff);
   949 		$out .= librijndael2::ord2hex(($s3 >> 24) & 0xff);
   950     $out .= librijndael2::ord2hex(($s3 >> 16) & 0xff);
   950 		$out .= librijndael2::ord2hex(($s3 >> 16) & 0xff);
   951     $out .= librijndael2::ord2hex(($s3 >> 8) & 0xff);
   951 		$out .= librijndael2::ord2hex(($s3 >> 8) & 0xff);
   952     $out .= librijndael2::ord2hex($s3 & 0xff);
   952 		$out .= librijndael2::ord2hex($s3 & 0xff);
   953   
   953 	
   954     return $out;
   954 		return $out;
   955   }
   955 	}
   956 
   956 
   957 
   957 
   958   // Decrypt a single block (bin) and return (bout)
   958 	// Decrypt a single block (bin) and return (bout)
   959   function AES_decrypt($bin, $key)
   959 	function AES_decrypt($bin, $key)
   960   {
   960 	{
   961     $rk = 0;
   961 		$rk = 0;
   962     // var r;  // No Full Unroll
   962 		// var r;  // No Full Unroll
   963 
   963 
   964     if ($bin == '' || $key == '')
   964 		if ($bin == '' || $key == '')
   965     {
   965 		{
   966       librijndael2::trace("AES_decrypt: bin/key undefined");
   966 			librijndael2::trace("AES_decrypt: bin/key undefined");
   967       return;
   967 			return;
   968     }
   968 		}
   969     
   969 		
   970     // FIXME: BAD: need $key->rd_key
   970 		// FIXME: BAD: need $key->rd_key
   971 
   971 
   972     // map byte array block to cipher state
   972 		// map byte array block to cipher state
   973     // and add initial round key:
   973 		// and add initial round key:
   974     $s0 = librijndael2::parseInt("0x" . substr($bin, 0 , 8)) ^ $key->rd_key[0];
   974 		$s0 = librijndael2::parseInt("0x" . substr($bin, 0 , 8)) ^ $key->rd_key[0];
   975     $s1 = librijndael2::parseInt("0x" . substr($bin, 8 , 8)) ^ $key->rd_key[1];
   975 		$s1 = librijndael2::parseInt("0x" . substr($bin, 8 , 8)) ^ $key->rd_key[1];
   976     $s2 = librijndael2::parseInt("0x" . substr($bin, 16, 8)) ^ $key->rd_key[2];
   976 		$s2 = librijndael2::parseInt("0x" . substr($bin, 16, 8)) ^ $key->rd_key[2];
   977     $s3 = librijndael2::parseInt("0x" . substr($bin, 24, 8)) ^ $key->rd_key[3];
   977 		$s3 = librijndael2::parseInt("0x" . substr($bin, 24, 8)) ^ $key->rd_key[3];
   978    
   978  	
   979     // Using Full Unroll (Bigger more a bit faster :) )
   979 		// Using Full Unroll (Bigger more a bit faster :) )
   980     $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[4];  // ROUND 1
   980 		$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[4];  // ROUND 1
   981     $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[5];
   981 		$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[5];
   982     $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[6];
   982 		$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[6];
   983     $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[7];
   983 		$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[7];
   984     $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[8];  // ROUND 2
   984 		$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[8];  // ROUND 2
   985     $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[9];
   985 		$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[9];
   986     $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[10];
   986 		$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[10];
   987     $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[11];
   987 		$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[11];
   988     $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[12]; // ROUND 3
   988 		$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[12]; // ROUND 3
   989     $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[13];
   989 		$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[13];
   990     $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[14];
   990 		$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[14];
   991     $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[15];
   991 		$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[15];
   992     $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[16]; // ROUND 4
   992 		$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[16]; // ROUND 4
   993     $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[17];
   993 		$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[17];
   994     $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[18];
   994 		$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[18];
   995     $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[19];
   995 		$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[19];
   996     $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[20]; // ROUND 5
   996 		$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[20]; // ROUND 5
   997     $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[21];
   997 		$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[21];
   998     $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[22];
   998 		$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[22];
   999     $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[23];
   999 		$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[23];
  1000     $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[24]; // ROUND 6
  1000 		$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[24]; // ROUND 6
  1001     $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[25];
  1001 		$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[25];
  1002     $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[26];
  1002 		$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[26];
  1003     $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[27];
  1003 		$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[27];
  1004     $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[28]; // ROUND 7
  1004 		$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[28]; // ROUND 7
  1005     $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[29];
  1005 		$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[29];
  1006     $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[30];
  1006 		$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[30];
  1007     $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[31];
  1007 		$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[31];
  1008     $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[32]; // ROUND 8
  1008 		$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[32]; // ROUND 8
  1009     $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[33];
  1009 		$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[33];
  1010     $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[34];
  1010 		$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[34];
  1011     $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[35];
  1011 		$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[35];
  1012     $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[36]; // ROUND 9
  1012 		$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[36]; // ROUND 9
  1013     $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[37];
  1013 		$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[37];
  1014     $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[38];
  1014 		$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[38];
  1015     $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[39];
  1015 		$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[39];
  1016     
  1016 		
  1017     // FIXME: BAD: need $key->rounds
  1017 		// FIXME: BAD: need $key->rounds
  1018     
  1018 		
  1019     if ($key->rounds > 10)
  1019 		if ($key->rounds > 10)
  1020     {
  1020 		{
  1021       $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[40]; // ROUND 10
  1021 			$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[40]; // ROUND 10
  1022       $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[41];
  1022 			$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[41];
  1023       $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[42];
  1023 			$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[42];
  1024       $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[43];
  1024 			$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[43];
  1025       $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[44]; // ROUND 11
  1025 			$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[44]; // ROUND 11
  1026       $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[45];
  1026 			$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[45];
  1027       $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[46];
  1027 			$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[46];
  1028       $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[47];  
  1028 			$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[47];  
  1029         
  1029 				
  1030       if ($key->rounds > 12)
  1030 			if ($key->rounds > 12)
  1031       {
  1031 			{
  1032         $s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[48]; // ROUND 12
  1032 				$s0 = $this->Td0[($t0 >> 24) & 0xff] ^ $this->Td1[($t3 >> 16) & 0xff] ^ $this->Td2[($t2 >>  8) & 0xff] ^ $this->Td3[$t1 & 0xff] ^ $key->rd_key[48]; // ROUND 12
  1033         $s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[49];
  1033 				$s1 = $this->Td0[($t1 >> 24) & 0xff] ^ $this->Td1[($t0 >> 16) & 0xff] ^ $this->Td2[($t3 >>  8) & 0xff] ^ $this->Td3[$t2 & 0xff] ^ $key->rd_key[49];
  1034         $s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[50];
  1034 				$s2 = $this->Td0[($t2 >> 24) & 0xff] ^ $this->Td1[($t1 >> 16) & 0xff] ^ $this->Td2[($t0 >>  8) & 0xff] ^ $this->Td3[$t3 & 0xff] ^ $key->rd_key[50];
  1035         $s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[51];
  1035 				$s3 = $this->Td0[($t3 >> 24) & 0xff] ^ $this->Td1[($t2 >> 16) & 0xff] ^ $this->Td2[($t1 >>  8) & 0xff] ^ $this->Td3[$t0 & 0xff] ^ $key->rd_key[51];
  1036         $t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[52]; // ROUND 13
  1036 				$t0 = $this->Td0[($s0 >> 24) & 0xff] ^ $this->Td1[($s3 >> 16) & 0xff] ^ $this->Td2[($s2 >>  8) & 0xff] ^ $this->Td3[$s1 & 0xff] ^ $key->rd_key[52]; // ROUND 13
  1037         $t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[53];
  1037 				$t1 = $this->Td0[($s1 >> 24) & 0xff] ^ $this->Td1[($s0 >> 16) & 0xff] ^ $this->Td2[($s3 >>  8) & 0xff] ^ $this->Td3[$s2 & 0xff] ^ $key->rd_key[53];
  1038         $t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[54];
  1038 				$t2 = $this->Td0[($s2 >> 24) & 0xff] ^ $this->Td1[($s1 >> 16) & 0xff] ^ $this->Td2[($s0 >>  8) & 0xff] ^ $this->Td3[$s3 & 0xff] ^ $key->rd_key[54];
  1039         $t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[55];
  1039 				$t3 = $this->Td0[($s3 >> 24) & 0xff] ^ $this->Td1[($s2 >> 16) & 0xff] ^ $this->Td2[($s1 >>  8) & 0xff] ^ $this->Td3[$s0 & 0xff] ^ $key->rd_key[55];
  1040       }
  1040 			}
  1041     }
  1041 		}
  1042     
  1042 		
  1043     // This is correct
  1043 		// This is correct
  1044     $rk = $key->rounds << 2;
  1044 		$rk = $key->rounds << 2;
  1045 
  1045 
  1046     /*
  1046 		/*
  1047     // No Full Unroll 
  1047 		// No Full Unroll 
  1048     */
  1048 		*/
  1049   
  1049 	
  1050     // Apply last round and
  1050 		// Apply last round and
  1051     // map cipher state to byte array block:
  1051 		// map cipher state to byte array block:
  1052      
  1052  		
  1053     $s0 =  ($this->Td4[($t0 >> 24) & 0xff] & 0xff000000) ^
  1053 		$s0 =  ($this->Td4[($t0 >> 24) & 0xff] & 0xff000000) ^
  1054            ($this->Td4[($t3 >> 16) & 0xff] & 0x00ff0000) ^
  1054  					($this->Td4[($t3 >> 16) & 0xff] & 0x00ff0000) ^
  1055            ($this->Td4[($t2 >>  8) & 0xff] & 0x0000ff00) ^
  1055  					($this->Td4[($t2 >>  8) & 0xff] & 0x0000ff00) ^
  1056            ($this->Td4[($t1      ) & 0xff] & 0x000000ff) ^
  1056  					($this->Td4[($t1      ) & 0xff] & 0x000000ff) ^
  1057            $key->rd_key[$rk];
  1057  					$key->rd_key[$rk];
  1058   
  1058 	
  1059     $out  = librijndael2::ord2hex(($s0 >> 24) & 0xff);
  1059 		$out  = librijndael2::ord2hex(($s0 >> 24) & 0xff);
  1060     $out .= librijndael2::ord2hex(($s0 >> 16) & 0xff);
  1060 		$out .= librijndael2::ord2hex(($s0 >> 16) & 0xff);
  1061     $out .= librijndael2::ord2hex(($s0 >> 8) & 0xff);
  1061 		$out .= librijndael2::ord2hex(($s0 >> 8) & 0xff);
  1062     $out .= librijndael2::ord2hex($s0 & 0xff);
  1062 		$out .= librijndael2::ord2hex($s0 & 0xff);
  1063 
  1063 
  1064     $s1 =  ($this->Td4[($t1 >> 24) & 0xff] & 0xff000000) ^
  1064 		$s1 =  ($this->Td4[($t1 >> 24) & 0xff] & 0xff000000) ^
  1065            ($this->Td4[($t0 >> 16) & 0xff] & 0x00ff0000) ^
  1065  					($this->Td4[($t0 >> 16) & 0xff] & 0x00ff0000) ^
  1066            ($this->Td4[($t3 >>  8) & 0xff] & 0x0000ff00) ^
  1066  					($this->Td4[($t3 >>  8) & 0xff] & 0x0000ff00) ^
  1067            ($this->Td4[($t2      ) & 0xff] & 0x000000ff) ^
  1067  					($this->Td4[($t2      ) & 0xff] & 0x000000ff) ^
  1068            $key->rd_key[$rk+1];
  1068  					$key->rd_key[$rk+1];
  1069       
  1069 			
  1070     $out .= librijndael2::ord2hex(($s1 >> 24) & 0xff);
  1070 		$out .= librijndael2::ord2hex(($s1 >> 24) & 0xff);
  1071     $out .= librijndael2::ord2hex(($s1 >> 16) & 0xff);
  1071 		$out .= librijndael2::ord2hex(($s1 >> 16) & 0xff);
  1072     $out .= librijndael2::ord2hex(($s1 >> 8) & 0xff);
  1072 		$out .= librijndael2::ord2hex(($s1 >> 8) & 0xff);
  1073     $out .= librijndael2::ord2hex($s1 & 0xff);
  1073 		$out .= librijndael2::ord2hex($s1 & 0xff);
  1074     
  1074 		
  1075     $s2 =  ($this->Td4[($t2 >> 24) & 0xff] & 0xff000000) ^
  1075 		$s2 =  ($this->Td4[($t2 >> 24) & 0xff] & 0xff000000) ^
  1076            ($this->Td4[($t1 >> 16) & 0xff] & 0x00ff0000) ^
  1076  					($this->Td4[($t1 >> 16) & 0xff] & 0x00ff0000) ^
  1077            ($this->Td4[($t0 >>  8) & 0xff] & 0x0000ff00) ^
  1077  					($this->Td4[($t0 >>  8) & 0xff] & 0x0000ff00) ^
  1078            ($this->Td4[($t3      ) & 0xff] & 0x000000ff) ^
  1078  					($this->Td4[($t3      ) & 0xff] & 0x000000ff) ^
  1079            $key->rd_key[$rk+2];
  1079  					$key->rd_key[$rk+2];
  1080 
  1080 
  1081     $out .= librijndael2::ord2hex(($s2 >> 24) & 0xff);
  1081 		$out .= librijndael2::ord2hex(($s2 >> 24) & 0xff);
  1082     $out .= librijndael2::ord2hex(($s2 >> 16) & 0xff);
  1082 		$out .= librijndael2::ord2hex(($s2 >> 16) & 0xff);
  1083     $out .= librijndael2::ord2hex(($s2 >> 8) & 0xff);
  1083 		$out .= librijndael2::ord2hex(($s2 >> 8) & 0xff);
  1084     $out .= librijndael2::ord2hex($s2 & 0xff);
  1084 		$out .= librijndael2::ord2hex($s2 & 0xff);
  1085   
  1085 	
  1086     $s3 =  ($this->Td4[($t3 >> 24) & 0xff] & 0xff000000) ^
  1086 		$s3 =  ($this->Td4[($t3 >> 24) & 0xff] & 0xff000000) ^
  1087            ($this->Td4[($t2 >> 16) & 0xff] & 0x00ff0000) ^
  1087  					($this->Td4[($t2 >> 16) & 0xff] & 0x00ff0000) ^
  1088            ($this->Td4[($t1 >>  8) & 0xff] & 0x0000ff00) ^
  1088  					($this->Td4[($t1 >>  8) & 0xff] & 0x0000ff00) ^
  1089            ($this->Td4[($t0      ) & 0xff] & 0x000000ff) ^
  1089  					($this->Td4[($t0      ) & 0xff] & 0x000000ff) ^
  1090            $key->rd_key[$rk+3];
  1090  					$key->rd_key[$rk+3];
  1091     
  1091 		
  1092     $out .= librijndael2::ord2hex(($s3 >> 24) & 0xff);
  1092 		$out .= librijndael2::ord2hex(($s3 >> 24) & 0xff);
  1093     $out .= librijndael2::ord2hex(($s3 >> 16) & 0xff);
  1093 		$out .= librijndael2::ord2hex(($s3 >> 16) & 0xff);
  1094     $out .= librijndael2::ord2hex(($s3 >> 8) & 0xff);
  1094 		$out .= librijndael2::ord2hex(($s3 >> 8) & 0xff);
  1095     $out .= librijndael2::ord2hex($s3 & 0xff);
  1095 		$out .= librijndael2::ord2hex($s3 & 0xff);
  1096   
  1096 	
  1097     return $out;
  1097 		return $out;
  1098   }
  1098 	}
  1099 
  1099 
  1100 
  1100 
  1101   /////////////////////////////// MODES //////////////////////////////////
  1101 	/////////////////////////////// MODES //////////////////////////////////
  1102    
  1102  	
  1103   /* ECB MODE (AES_ecb_encrypt) 
  1103 	/* ECB MODE (AES_ecb_encrypt) 
  1104    * bin:  128 bit block (32 hex digits)
  1104  	* bin:  128 bit block (32 hex digits)
  1105    * key:  AES_KEY object (use AES_set_encrypt_key or AES_set_decrypt_key)
  1105  	* key:  AES_KEY object (use AES_set_encrypt_key or AES_set_decrypt_key)
  1106    * enc:  "AES_ENCRYPT" or "AES_DECRYPT"
  1106  	* enc:  "AES_ENCRYPT" or "AES_DECRYPT"
  1107    * Return value: 128 bit block (32 hex digits) 
  1107  	* Return value: 128 bit block (32 hex digits) 
  1108    */
  1108  	*/
  1109 
  1109 
  1110   function AES_ecb_encrypt($bin, $key, $enc)
  1110 	function AES_ecb_encrypt($bin, $key, $enc)
  1111   {
  1111 	{
  1112 
  1112 
  1113     if ($bin == '' || $key == '')
  1113 		if ($bin == '' || $key == '')
  1114     {
  1114 		{
  1115       librijndael2::trace("AES_ecb_encrypt: bin/key undefined");
  1115 			librijndael2::trace("AES_ecb_encrypt: bin/key undefined");
  1116       return;
  1116 			return;
  1117     }
  1117 		}
  1118     
  1118 		
  1119     if ($enc !== "AES_ENCRYPT" && $enc !== "AES_DECRYPT")
  1119 		if ($enc !== "AES_ENCRYPT" && $enc !== "AES_DECRYPT")
  1120     {
  1120 		{
  1121       librijndael2::trace("AES_ecb_encrypt: enc isn't AES_ENCRYPT/AES_DECRYPT");
  1121 			librijndael2::trace("AES_ecb_encrypt: enc isn't AES_ENCRYPT/AES_DECRYPT");
  1122       return;
  1122 			return;
  1123     }
  1123 		}
  1124     
  1124 		
  1125     if ($enc == "AES_ENCRYPT")
  1125 		if ($enc == "AES_ENCRYPT")
  1126         $bout = $this->AES_encrypt($bin, $key);
  1126 				$bout = $this->AES_encrypt($bin, $key);
  1127     else
  1127 		else
  1128         $bout = $this->AES_decrypt($bin, $key);
  1128 				$bout = $this->AES_decrypt($bin, $key);
  1129   
  1129 	
  1130     return $bout;
  1130 		return $bout;
  1131   }
  1131 	}
  1132 
  1132 
  1133 
  1133 
  1134   /* CBC MODE (AES_cbc_encrypt) 
  1134 	/* CBC MODE (AES_cbc_encrypt) 
  1135    * bin:  128 bit block (32 hex digits)
  1135  	* bin:  128 bit block (32 hex digits)
  1136    * key:  AES_KEY object (use AES_set_encrypt_key or AES_set_decrypt_key)
  1136  	* key:  AES_KEY object (use AES_set_encrypt_key or AES_set_decrypt_key)
  1137    * ivec: Initialization Vector (32 hex digits)
  1137  	* ivec: Initialization Vector (32 hex digits)
  1138    * enc:  "AES_ENCRYPT" or "AES_DECRYPT"
  1138  	* enc:  "AES_ENCRYPT" or "AES_DECRYPT"
  1139    * Return value: 128 bit block (32 hex digits) 
  1139  	* Return value: 128 bit block (32 hex digits) 
  1140    */
  1140  	*/
  1141 
  1141 
  1142   function AES_cbc_encrypt($bin, $key, $ivec, $enc)
  1142 	function AES_cbc_encrypt($bin, $key, $ivec, $enc)
  1143   {
  1143 	{
  1144 
  1144 
  1145     // if ($bin == '' || $key == '' || $ivec == '')
  1145 		// if ($bin == '' || $key == '' || $ivec == '')
  1146     // {
  1146 		// {
  1147     //   librijndael2::trace("AES_cbc_encrypt: bin/key/ivec undefined.");
  1147 		//   librijndael2::trace("AES_cbc_encrypt: bin/key/ivec undefined.");
  1148     //   return;
  1148 		//   return;
  1149     // }
  1149 		// }
  1150         
  1150 				
  1151     $len = strlen($bin);
  1151 		$len = strlen($bin);
  1152     
  1152 		
  1153     if ($len % 32 != 0)
  1153 		if ($len % 32 != 0)
  1154     {
  1154 		{
  1155       librijndael2::trace("AES_cbc_encrypt: data isn't multiple of 32 (32 hex = 128bits).");
  1155 			librijndael2::trace("AES_cbc_encrypt: data isn't multiple of 32 (32 hex = 128bits).");
  1156       return;
  1156 			return;
  1157     }
  1157 		}
  1158         
  1158 				
  1159     if ($enc !== "AES_ENCRYPT" && $enc !== "AES_DECRYPT")
  1159 		if ($enc !== "AES_ENCRYPT" && $enc !== "AES_DECRYPT")
  1160     {
  1160 		{
  1161       librijndael2::trace("AES_ecb_encrypt: enc isn't AES_ENCRYPT/AES_DECRYPT");
  1161 			librijndael2::trace("AES_ecb_encrypt: enc isn't AES_ENCRYPT/AES_DECRYPT");
  1162       return;
  1162 			return;
  1163     }
  1163 		}
  1164 
  1164 
  1165     $tin = $bin;
  1165 		$tin = $bin;
  1166     $tmp = '';
  1166 		$tmp = '';
  1167     $bout = '';
  1167 		$bout = '';
  1168     
  1168 		
  1169     if ($enc == "AES_ENCRYPT")
  1169 		if ($enc == "AES_ENCRYPT")
  1170       while ($len > 0)
  1170 			while ($len > 0)
  1171       {
  1171 			{
  1172         $tmp = "";
  1172 				$tmp = "";
  1173         for($n=0; $n < 32; $n += 2)
  1173 				for($n=0; $n < 32; $n += 2)
  1174         {
  1174 				{
  1175           $aux  = librijndael2::parseInt("0x" . substr($tin, $n , 2)) ^ librijndael2::parseInt("0x" . substr($ivec, $n, 2));
  1175 					$aux  = librijndael2::parseInt("0x" . substr($tin, $n , 2)) ^ librijndael2::parseInt("0x" . substr($ivec, $n, 2));
  1176           $tmp .= librijndael2::ord2hex($aux);
  1176 					$tmp .= librijndael2::ord2hex($aux);
  1177         }
  1177 				}
  1178         
  1178 				
  1179         $tout = $this->AES_encrypt($tmp, $key);
  1179 				$tout = $this->AES_encrypt($tmp, $key);
  1180         $ivec = $tout; 
  1180 				$ivec = $tout; 
  1181         $len -= 32;
  1181 				$len -= 32;
  1182         $tin = substr($tin, 32);
  1182 				$tin = substr($tin, 32);
  1183         $bout .= $tout;
  1183 				$bout .= $tout;
  1184       }
  1184 			}
  1185     else
  1185 		else
  1186       while ($len > 0) {
  1186 			while ($len > 0) {
  1187         $tmp = $this->AES_decrypt($tin, $key);
  1187 				$tmp = $this->AES_decrypt($tin, $key);
  1188         $tout = "";
  1188 				$tout = "";
  1189         for($n=0; $n < 32; $n+=2)
  1189 				for($n=0; $n < 32; $n+=2)
  1190         {
  1190 				{
  1191           $aux   = librijndael2::parseInt("0x" . substr($tmp, $n , 2)) ^ librijndael2::parseInt("0x" . substr($ivec, $n, 2)); 
  1191 					$aux   = librijndael2::parseInt("0x" . substr($tmp, $n , 2)) ^ librijndael2::parseInt("0x" . substr($ivec, $n, 2)); 
  1192           $tout .= librijndael2::ord2hex($aux);
  1192 					$tout .= librijndael2::ord2hex($aux);
  1193         }
  1193 				}
  1194           
  1194 					
  1195         $ivec = $tin;
  1195 				$ivec = $tin;
  1196         $len -= 32;
  1196 				$len -= 32;
  1197         $tin = substr($tin, 32);
  1197 				$tin = substr($tin, 32);
  1198         $bout .= $tout;
  1198 				$bout .= $tout;
  1199       }
  1199 			}
  1200   
  1200 	
  1201     return $bout;
  1201 		return $bout;
  1202   }
  1202 	}
  1203 
  1203 
  1204 }
  1204 }
  1205 
  1205 
  1206 class Crypt_Rijndael_Key extends Crypt_Rijndael
  1206 class Crypt_Rijndael_Key extends Crypt_Rijndael
  1207 {
  1207 {
  1208   var $rounds = 12;
  1208 	var $rounds = 12;
  1209   var $rd_key = array();
  1209 	var $rd_key = array();
  1210   var $key = '';
  1210 	var $key = '';
  1211   var $bits = 0;
  1211 	var $bits = 0;
  1212   var $key_state = 'none';
  1212 	var $key_state = 'none';
  1213   
  1213 	
  1214   function __construct($key)
  1214 	function __construct($key)
  1215   {
  1215 	{
  1216     $this->key = $key;
  1216 		$this->key = $key;
  1217     $this->bits = ( strlen($key) * 4 );
  1217 		$this->bits = ( strlen($key) * 4 );
  1218   }
  1218 	}
  1219   
  1219 	
  1220   // Expand the cipher key into the encryption key schedule.
  1220 	// Expand the cipher key into the encryption key schedule.
  1221   function set_encrypt()
  1221 	function set_encrypt()
  1222   {
  1222 	{
  1223     $i = 0;
  1223 		$i = 0;
  1224     $rk = 0;
  1224 		$rk = 0;
  1225     
  1225 		
  1226     if ( $this->key_state === 'encrypt' )
  1226 		if ( $this->key_state === 'encrypt' )
  1227     {
  1227 		{
  1228       return 0;
  1228 			return 0;
  1229     }
  1229 		}
  1230     
  1230 		
  1231     $this->key_state = 'encrypt';
  1231 		$this->key_state = 'encrypt';
  1232     
  1232 		
  1233     $userkey =& $this->key;
  1233 		$userkey =& $this->key;
  1234     $bits =& $this->bits;
  1234 		$bits =& $this->bits;
  1235     
  1235 		
  1236     if ($bits != 128 && $bits != 192 && $bits != 256)
  1236 		if ($bits != 128 && $bits != 192 && $bits != 256)
  1237     {
  1237 		{
  1238       librijndael2::trace("AES_set_encrypt_key: key size isn't 128/192/256");
  1238 			librijndael2::trace("AES_set_encrypt_key: key size isn't 128/192/256");
  1239       return -2;
  1239 			return -2;
  1240     }
  1240 		}
  1241 
  1241 
  1242     if ($bits==128)
  1242 		if ($bits==128)
  1243       $this->rounds = 10;
  1243 			$this->rounds = 10;
  1244     else if ($bits==192)
  1244 		else if ($bits==192)
  1245       $this->rounds = 12;
  1245 			$this->rounds = 12;
  1246     else
  1246 		else
  1247       $this->rounds = 14;
  1247 			$this->rounds = 14;
  1248         
  1248 				
  1249     
  1249 		
  1250     $this->rd_key = array();
  1250 		$this->rd_key = array();
  1251     $this->rd_key[0] = librijndael2::parseInt("0x" . substr($userkey, 0 , 8));
  1251 		$this->rd_key[0] = librijndael2::parseInt("0x" . substr($userkey, 0 , 8));
  1252     $this->rd_key[1] = librijndael2::parseInt("0x" . substr($userkey, 8 , 8));
  1252 		$this->rd_key[1] = librijndael2::parseInt("0x" . substr($userkey, 8 , 8));
  1253     $this->rd_key[2] = librijndael2::parseInt("0x" . substr($userkey, 16, 8));
  1253 		$this->rd_key[2] = librijndael2::parseInt("0x" . substr($userkey, 16, 8));
  1254     $this->rd_key[3] = librijndael2::parseInt("0x" . substr($userkey, 24, 8));
  1254 		$this->rd_key[3] = librijndael2::parseInt("0x" . substr($userkey, 24, 8));
  1255     
  1255 		
  1256     if ($bits == 128) {
  1256 		if ($bits == 128) {
  1257         for (;;) {
  1257 				for (;;) {
  1258             $temp  = $this->rd_key[3+$rk];
  1258 						$temp  = $this->rd_key[3+$rk];
  1259         // (temp >> 24) & 0xff was difficult bug to tracking...
  1259 				// (temp >> 24) & 0xff was difficult bug to tracking...
  1260             $this->rd_key[4+$rk] = $this->rd_key[$rk] ^
  1260 						$this->rd_key[4+$rk] = $this->rd_key[$rk] ^
  1261               ($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1261 							($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1262               ($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1262 							($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1263               ($this->Te4[ $temp        & 0xff] & 0x0000ff00) ^
  1263 							($this->Te4[ $temp        & 0xff] & 0x0000ff00) ^
  1264               ($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1264 							($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1265               $this->rcon[$i];
  1265 							$this->rcon[$i];
  1266            
  1266  					
  1267       $this->rd_key[5+$rk] = $this->rd_key[1+$rk] ^ $this->rd_key[4+$rk];
  1267 			$this->rd_key[5+$rk] = $this->rd_key[1+$rk] ^ $this->rd_key[4+$rk];
  1268             $this->rd_key[6+$rk] = $this->rd_key[2+$rk] ^ $this->rd_key[5+$rk];
  1268 						$this->rd_key[6+$rk] = $this->rd_key[2+$rk] ^ $this->rd_key[5+$rk];
  1269             $this->rd_key[7+$rk] = $this->rd_key[3+$rk] ^ $this->rd_key[6+$rk];
  1269 						$this->rd_key[7+$rk] = $this->rd_key[3+$rk] ^ $this->rd_key[6+$rk];
  1270             if (++$i == 10) return 0;
  1270 						if (++$i == 10) return 0;
  1271           $rk += 4;
  1271 					$rk += 4;
  1272         }
  1272 				}
  1273     }
  1273 		}
  1274  
  1274  
  1275     $this->rd_key[4] = librijndael2::parseInt("0x" . @substr($userkey, 32, 8));
  1275 		$this->rd_key[4] = librijndael2::parseInt("0x" . @substr($userkey, 32, 8));
  1276     $this->rd_key[5] = librijndael2::parseInt("0x" . @substr($userkey, 40, 8));
  1276 		$this->rd_key[5] = librijndael2::parseInt("0x" . @substr($userkey, 40, 8));
  1277     
  1277 		
  1278     if ($bits == 192) {
  1278 		if ($bits == 192) {
  1279         for (;;) {
  1279 				for (;;) {
  1280             $temp  = $this->rd_key[5+$rk];
  1280 						$temp  = $this->rd_key[5+$rk];
  1281             $this->rd_key[6+$rk] = $this->rd_key[$rk] ^
  1281 						$this->rd_key[6+$rk] = $this->rd_key[$rk] ^
  1282             ($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1282 						($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1283             ($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1283 						($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1284             ($this->Te4[($temp      ) & 0xff] & 0x0000ff00) ^
  1284 						($this->Te4[($temp      ) & 0xff] & 0x0000ff00) ^
  1285             ($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1285 						($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1286             $this->rcon[$i];
  1286 						$this->rcon[$i];
  1287     
  1287 		
  1288         $this->rd_key[7+$rk] = $this->rd_key[1+$rk] ^ $this->rd_key[6 + $rk];
  1288 				$this->rd_key[7+$rk] = $this->rd_key[1+$rk] ^ $this->rd_key[6 + $rk];
  1289             $this->rd_key[8+$rk] = $this->rd_key[2 + $rk] ^ $this->rd_key[7 + $rk];
  1289 						$this->rd_key[8+$rk] = $this->rd_key[2 + $rk] ^ $this->rd_key[7 + $rk];
  1290             $this->rd_key[9+$rk] = $this->rd_key[3 + $rk] ^ $this->rd_key[8 + $rk];
  1290 						$this->rd_key[9+$rk] = $this->rd_key[3 + $rk] ^ $this->rd_key[8 + $rk];
  1291             if (++$i == 8) {
  1291 						if (++$i == 8) {
  1292                 return 0;
  1292 								return 0;
  1293             }
  1293 						}
  1294         $this->rd_key[10 + $rk] = $this->rd_key[4 + $rk] ^ $this->rd_key[9 + $rk];
  1294 				$this->rd_key[10 + $rk] = $this->rd_key[4 + $rk] ^ $this->rd_key[9 + $rk];
  1295             $this->rd_key[11 + $rk] = $this->rd_key[5 + $rk] ^ $this->rd_key[10 + $rk];
  1295 						$this->rd_key[11 + $rk] = $this->rd_key[5 + $rk] ^ $this->rd_key[10 + $rk];
  1296             $rk += 6;
  1296 						$rk += 6;
  1297         }
  1297 				}
  1298     }
  1298 		}
  1299     
  1299 		
  1300     $this->rd_key[6] = librijndael2::parseInt("0x" . @substr($userkey, 48, 8));
  1300 		$this->rd_key[6] = librijndael2::parseInt("0x" . @substr($userkey, 48, 8));
  1301     $this->rd_key[7] = librijndael2::parseInt("0x" . @substr($userkey, 56, 8));
  1301 		$this->rd_key[7] = librijndael2::parseInt("0x" . @substr($userkey, 56, 8));
  1302     
  1302 		
  1303     if ($bits == 256) {
  1303 		if ($bits == 256) {
  1304         for (;;) {
  1304 				for (;;) {
  1305             $temp  = $this->rd_key[7+$rk];
  1305 						$temp  = $this->rd_key[7+$rk];
  1306             $this->rd_key[8+$rk] = $this->rd_key[$rk] ^
  1306 						$this->rd_key[8+$rk] = $this->rd_key[$rk] ^
  1307             ($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1307 						($this->Te4[($temp >> 16) & 0xff] & 0xff000000) ^
  1308             ($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1308 						($this->Te4[($temp >>  8) & 0xff] & 0x00ff0000) ^
  1309             ($this->Te4[($temp      ) & 0xff] & 0x0000ff00) ^
  1309 						($this->Te4[($temp      ) & 0xff] & 0x0000ff00) ^
  1310             ($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1310 						($this->Te4[($temp >> 24) & 0xff] & 0x000000ff) ^
  1311             $this->rcon[$i];
  1311 						$this->rcon[$i];
  1312       
  1312 			
  1313             $this->rd_key[9 + $rk] = $this->rd_key[1 + $rk] ^ $this->rd_key[8 + $rk];
  1313 						$this->rd_key[9 + $rk] = $this->rd_key[1 + $rk] ^ $this->rd_key[8 + $rk];
  1314             $this->rd_key[10 + $rk] = $this->rd_key[2 + $rk] ^ $this->rd_key[9 + $rk];
  1314 						$this->rd_key[10 + $rk] = $this->rd_key[2 + $rk] ^ $this->rd_key[9 + $rk];
  1315             $this->rd_key[11 + $rk] = $this->rd_key[3 + $rk] ^ $this->rd_key[10 + $rk];
  1315 						$this->rd_key[11 + $rk] = $this->rd_key[3 + $rk] ^ $this->rd_key[10 + $rk];
  1316             if (++$i == 7) {
  1316 						if (++$i == 7) {
  1317                 return 0;
  1317 								return 0;
  1318             }
  1318 						}
  1319             
  1319 						
  1320             $temp  = $this->rd_key[11 + $rk];
  1320 						$temp  = $this->rd_key[11 + $rk];
  1321             $this->rd_key[12 + $rk] = $this->rd_key[4 + $rk] ^
  1321 						$this->rd_key[12 + $rk] = $this->rd_key[4 + $rk] ^
  1322             ($this->Te4[($temp >> 24) & 0xff] & 0xff000000) ^
  1322 						($this->Te4[($temp >> 24) & 0xff] & 0xff000000) ^
  1323             ($this->Te4[($temp >> 16) & 0xff] & 0x00ff0000) ^
  1323 						($this->Te4[($temp >> 16) & 0xff] & 0x00ff0000) ^
  1324             ($this->Te4[($temp >>  8) & 0xff] & 0x0000ff00) ^
  1324 						($this->Te4[($temp >>  8) & 0xff] & 0x0000ff00) ^
  1325             ($this->Te4[($temp      ) & 0xff] & 0x000000ff);
  1325 						($this->Te4[($temp      ) & 0xff] & 0x000000ff);
  1326       
  1326 			
  1327       $this->rd_key[13 + $rk] = $this->rd_key[5 + $rk] ^ $this->rd_key[12 + $rk];
  1327 			$this->rd_key[13 + $rk] = $this->rd_key[5 + $rk] ^ $this->rd_key[12 + $rk];
  1328             $this->rd_key[14 + $rk] = $this->rd_key[6 + $rk] ^ $this->rd_key[13 + $rk];
  1328 						$this->rd_key[14 + $rk] = $this->rd_key[6 + $rk] ^ $this->rd_key[13 + $rk];
  1329             $this->rd_key[15 + $rk] = $this->rd_key[7 + $rk] ^ $this->rd_key[14 + $rk];
  1329 						$this->rd_key[15 + $rk] = $this->rd_key[7 + $rk] ^ $this->rd_key[14 + $rk];
  1330             $rk += 8;
  1330 						$rk += 8;
  1331         }
  1331 				}
  1332     }
  1332 		}
  1333     return 0;
  1333 		return 0;
  1334   }
  1334 	}
  1335 
  1335 
  1336 
  1336 
  1337   // Expand the cipher key into the decryption key schedule. 
  1337 	// Expand the cipher key into the decryption key schedule. 
  1338   function set_decrypt()
  1338 	function set_decrypt()
  1339   {
  1339 	{
  1340     $i = 0;
  1340 		$i = 0;
  1341     $j = 0;
  1341 		$j = 0;
  1342     $rk = 0;
  1342 		$rk = 0;
  1343     $bits =& $this->bits;
  1343 		$bits =& $this->bits;
  1344     
  1344 		
  1345     if ( $this->key_state === 'decrypt' )
  1345 		if ( $this->key_state === 'decrypt' )
  1346     {
  1346 		{
  1347       return 0;
  1347 			return 0;
  1348     }
  1348 		}
  1349     
  1349 		
  1350     $this->key_state = 'decrypt';
  1350 		$this->key_state = 'decrypt';
  1351     
  1351 		
  1352     // first, start with an encryption schedule 
  1352 		// first, start with an encryption schedule 
  1353     $status = $this->set_encrypt();
  1353 		$status = $this->set_encrypt();
  1354     
  1354 		
  1355     // set the state again because set_encrypt() will change it
  1355 		// set the state again because set_encrypt() will change it
  1356     $this->key_state = 'decrypt';
  1356 		$this->key_state = 'decrypt';
  1357     
  1357 		
  1358     if ($status < 0) {
  1358 		if ($status < 0) {
  1359       librijndael2::trace("AES_set_decrypt_key: AES_set_encrypt_key error");
  1359 			librijndael2::trace("AES_set_decrypt_key: AES_set_encrypt_key error");
  1360       return;
  1360 			return;
  1361     }
  1361 		}
  1362   
  1362 	
  1363     // invert the order of the round keys: 
  1363 		// invert the order of the round keys: 
  1364     for ($i = 0, $j = 4*($this->rounds); $i < $j; $i += 4, $j -= 4) {
  1364 		for ($i = 0, $j = 4*($this->rounds); $i < $j; $i += 4, $j -= 4) {
  1365       $temp = $this->rd_key[$i];   $this->rd_key[$i]   = $this->rd_key[$j];   $this->rd_key[$j]   = $temp;
  1365 			$temp = $this->rd_key[$i];   $this->rd_key[$i]   = $this->rd_key[$j];   $this->rd_key[$j]   = $temp;
  1366       $temp = $this->rd_key[$i+1]; $this->rd_key[$i+1] = $this->rd_key[$j+1]; $this->rd_key[$j+1] = $temp;
  1366 			$temp = $this->rd_key[$i+1]; $this->rd_key[$i+1] = $this->rd_key[$j+1]; $this->rd_key[$j+1] = $temp;
  1367       $temp = $this->rd_key[$i+2]; $this->rd_key[$i+2] = $this->rd_key[$j+2]; $this->rd_key[$j+2] = $temp;
  1367 			$temp = $this->rd_key[$i+2]; $this->rd_key[$i+2] = $this->rd_key[$j+2]; $this->rd_key[$j+2] = $temp;
  1368       $temp = $this->rd_key[$i+3]; $this->rd_key[$i+3] = $this->rd_key[$j+3]; $this->rd_key[$j+3] = $temp;
  1368 			$temp = $this->rd_key[$i+3]; $this->rd_key[$i+3] = $this->rd_key[$j+3]; $this->rd_key[$j+3] = $temp;
  1369     }
  1369 		}
  1370     
  1370 		
  1371     // apply the inverse MixColumn transform to all round keys but the first and the last: 
  1371 		// apply the inverse MixColumn transform to all round keys but the first and the last: 
  1372     for ($i = 1; $i < ($this->rounds); $i++) {
  1372 		for ($i = 1; $i < ($this->rounds); $i++) {
  1373 
  1373 
  1374         $rk += 4;
  1374 				$rk += 4;
  1375         $this->rd_key[$rk] =
  1375 				$this->rd_key[$rk] =
  1376         $this->Td0[$this->Te4[($this->rd_key[$rk] >> 24) & 0xff] & 0xff] ^
  1376 				$this->Td0[$this->Te4[($this->rd_key[$rk] >> 24) & 0xff] & 0xff] ^
  1377         $this->Td1[$this->Te4[($this->rd_key[$rk] >> 16) & 0xff] & 0xff] ^
  1377 				$this->Td1[$this->Te4[($this->rd_key[$rk] >> 16) & 0xff] & 0xff] ^
  1378         $this->Td2[$this->Te4[($this->rd_key[$rk] >>  8) & 0xff] & 0xff] ^
  1378 				$this->Td2[$this->Te4[($this->rd_key[$rk] >>  8) & 0xff] & 0xff] ^
  1379         $this->Td3[$this->Te4[($this->rd_key[$rk]      ) & 0xff] & 0xff];
  1379 				$this->Td3[$this->Te4[($this->rd_key[$rk]      ) & 0xff] & 0xff];
  1380        
  1380  			
  1381         $this->rd_key[1+$rk] =
  1381 				$this->rd_key[1+$rk] =
  1382         $this->Td0[$this->Te4[($this->rd_key[1+$rk] >> 24) & 0xff] & 0xff] ^
  1382 				$this->Td0[$this->Te4[($this->rd_key[1+$rk] >> 24) & 0xff] & 0xff] ^
  1383         $this->Td1[$this->Te4[($this->rd_key[1+$rk] >> 16) & 0xff] & 0xff] ^
  1383 				$this->Td1[$this->Te4[($this->rd_key[1+$rk] >> 16) & 0xff] & 0xff] ^
  1384         $this->Td2[$this->Te4[($this->rd_key[1+$rk] >>  8) & 0xff] & 0xff] ^
  1384 				$this->Td2[$this->Te4[($this->rd_key[1+$rk] >>  8) & 0xff] & 0xff] ^
  1385         $this->Td3[$this->Te4[($this->rd_key[1+$rk]      ) & 0xff] & 0xff];
  1385 				$this->Td3[$this->Te4[($this->rd_key[1+$rk]      ) & 0xff] & 0xff];
  1386 
  1386 
  1387         $this->rd_key[2+$rk] =
  1387 				$this->rd_key[2+$rk] =
  1388         $this->Td0[$this->Te4[($this->rd_key[2+$rk] >> 24) & 0xff] & 0xff] ^
  1388 				$this->Td0[$this->Te4[($this->rd_key[2+$rk] >> 24) & 0xff] & 0xff] ^
  1389         $this->Td1[$this->Te4[($this->rd_key[2+$rk] >> 16) & 0xff] & 0xff] ^
  1389 				$this->Td1[$this->Te4[($this->rd_key[2+$rk] >> 16) & 0xff] & 0xff] ^
  1390         $this->Td2[$this->Te4[($this->rd_key[2+$rk] >>  8) & 0xff] & 0xff] ^
  1390 				$this->Td2[$this->Te4[($this->rd_key[2+$rk] >>  8) & 0xff] & 0xff] ^
  1391         $this->Td3[$this->Te4[($this->rd_key[2+$rk]      ) & 0xff] & 0xff];
  1391 				$this->Td3[$this->Te4[($this->rd_key[2+$rk]      ) & 0xff] & 0xff];
  1392  
  1392  
  1393         $this->rd_key[3+$rk] =
  1393 				$this->rd_key[3+$rk] =
  1394         $this->Td0[$this->Te4[($this->rd_key[3+$rk] >> 24) & 0xff] & 0xff] ^
  1394 				$this->Td0[$this->Te4[($this->rd_key[3+$rk] >> 24) & 0xff] & 0xff] ^
  1395         $this->Td1[$this->Te4[($this->rd_key[3+$rk] >> 16) & 0xff] & 0xff] ^
  1395 				$this->Td1[$this->Te4[($this->rd_key[3+$rk] >> 16) & 0xff] & 0xff] ^
  1396         $this->Td2[$this->Te4[($this->rd_key[3+$rk] >>  8) & 0xff] & 0xff] ^
  1396 				$this->Td2[$this->Te4[($this->rd_key[3+$rk] >>  8) & 0xff] & 0xff] ^
  1397         $this->Td3[$this->Te4[($this->rd_key[3+$rk]      ) & 0xff] & 0xff];
  1397 				$this->Td3[$this->Te4[($this->rd_key[3+$rk]      ) & 0xff] & 0xff];
  1398     } 
  1398 		} 
  1399     return 0;
  1399 		return 0;
  1400   }
  1400 	}
  1401 }
  1401 }
  1402 
  1402 
  1403 /**
  1403 /**
  1404  * Frontend for Crypt_Rijndael, ABI-compatible with the old Rijndael framework.
  1404  * Frontend for Crypt_Rijndael, ABI-compatible with the old Rijndael framework.
  1405  * @package Enano
  1405  * @package Enano
  1408  * @license GNU General Public License
  1408  * @license GNU General Public License
  1409  */
  1409  */
  1410 
  1410 
  1411 class AESCrypt
  1411 class AESCrypt
  1412 {
  1412 {
  1413   
  1413 	
  1414   /**
  1414 	/**
  1415    * Fetches a Crypt_Rijndael_Key object for the given hex or binary key.
  1415  	* Fetches a Crypt_Rijndael_Key object for the given hex or binary key.
  1416    * @param string Key, binary or hex format
  1416  	* @param string Key, binary or hex format
  1417    * @return object
  1417  	* @return object
  1418    * @access protected
  1418  	* @access protected
  1419    */
  1419  	*/
  1420    
  1420  	
  1421   protected static function fetch_key($key)
  1421 	protected static function fetch_key($key)
  1422   {
  1422 	{
  1423     static $objects = array();
  1423 		static $objects = array();
  1424     
  1424 		
  1425     if ( !preg_match('/^[a-f0-9]+$/i', $key) )
  1425 		if ( !preg_match('/^[a-f0-9]+$/i', $key) )
  1426       $key = librijndael2::string2hex($key);
  1426 			$key = librijndael2::string2hex($key);
  1427     
  1427 		
  1428     if ( isset($objects[$key]) )
  1428 		if ( isset($objects[$key]) )
  1429     {
  1429 		{
  1430       return $objects[$key];
  1430 			return $objects[$key];
  1431     }
  1431 		}
  1432     else
  1432 		else
  1433     {
  1433 		{
  1434       $objects[$key] = new Crypt_Rijndael_Key($key);
  1434 			$objects[$key] = new Crypt_Rijndael_Key($key);
  1435       $ret =& $objects[$key];
  1435 			$ret =& $objects[$key];
  1436       return $ret;
  1436 			return $ret;
  1437     }
  1437 		}
  1438   }
  1438 	}
  1439   
  1439 	
  1440   /**
  1440 	/**
  1441    * Fetches a Crypt_Rijndael object.
  1441  	* Fetches a Crypt_Rijndael object.
  1442    * @return object
  1442  	* @return object
  1443    * @access protected
  1443  	* @access protected
  1444    */
  1444  	*/
  1445    
  1445  	
  1446   protected static function fetch_cr_singleton()
  1446 	protected static function fetch_cr_singleton()
  1447   {
  1447 	{
  1448     static $o = null;
  1448 		static $o = null;
  1449     
  1449 		
  1450     if ( is_object($o) )
  1450 		if ( is_object($o) )
  1451     {
  1451 		{
  1452       return $o;
  1452 			return $o;
  1453     }
  1453 		}
  1454     else
  1454 		else
  1455     {
  1455 		{
  1456       $o = new Crypt_Rijndael();
  1456 			$o = new Crypt_Rijndael();
  1457       $r =& $o;
  1457 			$r =& $o;
  1458       return $r;
  1458 			return $r;
  1459     }
  1459 		}
  1460   }
  1460 	}
  1461   
  1461 	
  1462   /**
  1462 	/**
  1463    * Pads a string with nul bytes until it reaches a multiple of 16 bytes.
  1463  	* Pads a string with nul bytes until it reaches a multiple of 16 bytes.
  1464    * @param string
  1464  	* @param string
  1465    * @return string
  1465  	* @return string
  1466    */
  1466  	*/
  1467   
  1467 	
  1468   protected function pad_string($string)
  1468 	protected function pad_string($string)
  1469   {
  1469 	{
  1470     while ( strlen($string) % 32 > 0 )
  1470 		while ( strlen($string) % 32 > 0 )
  1471     {
  1471 		{
  1472       $string .= "00";
  1472 			$string .= "00";
  1473     }
  1473 		}
  1474     return $string;
  1474 		return $string;
  1475   }
  1475 	}
  1476   
  1476 	
  1477   /**
  1477 	/**
  1478    * Constructor. Currently does not take parameters and ignores options from the old API.
  1478  	* Constructor. Currently does not take parameters and ignores options from the old API.
  1479    */
  1479  	*/
  1480   
  1480 	
  1481   public function __construct($key_size = 192, $block_size = 128, $debug = false)
  1481 	public function __construct($key_size = 192, $block_size = 128, $debug = false)
  1482   {
  1482 	{
  1483   }
  1483 	}
  1484   
  1484 	
  1485   /**
  1485 	/**
  1486    * Wrapper for encryption.
  1486  	* Wrapper for encryption.
  1487    * @param string Plain text to encrypt
  1487  	* @param string Plain text to encrypt
  1488    * @param string Binary or hex key
  1488  	* @param string Binary or hex key
  1489    * @param int Format to return result in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1489  	* @param int Format to return result in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1490    * @return string
  1490  	* @return string
  1491    */
  1491  	*/
  1492   
  1492 	
  1493   public function encrypt($plaintext, $key, $return_format = ENC_HEX)
  1493 	public function encrypt($plaintext, $key, $return_format = ENC_HEX)
  1494   {
  1494 	{
  1495     return $this->encrypt_cbc($plaintext, $key, '00000000000000000000000000000000', ENC_HEX);
  1495 		return $this->encrypt_cbc($plaintext, $key, '00000000000000000000000000000000', ENC_HEX);
  1496   }
  1496 	}
  1497   
  1497 	
  1498   /**
  1498 	/**
  1499    * Wrapper for decryption.
  1499  	* Wrapper for decryption.
  1500    * @param string Encrypted text
  1500  	* @param string Encrypted text
  1501    * @param string Binary or hex key
  1501  	* @param string Binary or hex key
  1502    * @param int Format that the encrypted text is in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1502  	* @param int Format that the encrypted text is in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1503    * @param bool If true, avoids caching the decryption result.
  1503  	* @param bool If true, avoids caching the decryption result.
  1504    * @return string
  1504  	* @return string
  1505    */
  1505  	*/
  1506   
  1506 	
  1507   public function decrypt($cryptext, $key, $input_format = ENC_HEX, $no_cache = false)
  1507 	public function decrypt($cryptext, $key, $input_format = ENC_HEX, $no_cache = false)
  1508   {
  1508 	{
  1509     return $this->decrypt_cbc($cryptext, $key, '00000000000000000000000000000000', ENC_HEX, $no_cache);
  1509 		return $this->decrypt_cbc($cryptext, $key, '00000000000000000000000000000000', ENC_HEX, $no_cache);
  1510   }
  1510 	}
  1511   
  1511 	
  1512   /**
  1512 	/**
  1513    * Wrapper for CBC encryption.
  1513  	* Wrapper for CBC encryption.
  1514    * @param string Plain text to encrypt
  1514  	* @param string Plain text to encrypt
  1515    * @param string Binary or hex key
  1515  	* @param string Binary or hex key
  1516    * @param string 128-bit initialization vector, either hex or binary will do
  1516  	* @param string 128-bit initialization vector, either hex or binary will do
  1517    * @param int Format to return result in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1517  	* @param int Format to return result in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1518    */
  1518  	*/
  1519   
  1519 	
  1520   public function encrypt_cbc($plaintext, $key, $ivec, $return_format = ENC_HEX)
  1520 	public function encrypt_cbc($plaintext, $key, $ivec, $return_format = ENC_HEX)
  1521   {
  1521 	{
  1522     $okey = self::fetch_key($key);
  1522 		$okey = self::fetch_key($key);
  1523     $okey->set_encrypt();
  1523 		$okey->set_encrypt();
  1524     $aes = self::fetch_cr_singleton();
  1524 		$aes = self::fetch_cr_singleton();
  1525     $plaintext = librijndael2::string2hex($plaintext);
  1525 		$plaintext = librijndael2::string2hex($plaintext);
  1526     
  1526 		
  1527     // init ivec
  1527 		// init ivec
  1528     if ( strlen($ivec) == '16' )
  1528 		if ( strlen($ivec) == '16' )
  1529     {
  1529 		{
  1530       $ivec = librijndael2::string2hex($ivec);
  1530 			$ivec = librijndael2::string2hex($ivec);
  1531     }
  1531 		}
  1532     else if ( preg_match('/^[a-f0-9]+$/i', $ivec) && strlen($ivec) == 32 )
  1532 		else if ( preg_match('/^[a-f0-9]+$/i', $ivec) && strlen($ivec) == 32 )
  1533     {
  1533 		{
  1534       // ivec is good
  1534 			// ivec is good
  1535     }
  1535 		}
  1536     else
  1536 		else
  1537     {
  1537 		{
  1538       // invalid ivec
  1538 			// invalid ivec
  1539       return false;
  1539 			return false;
  1540     }
  1540 		}
  1541     
  1541 		
  1542     $result = '';
  1542 		$result = '';
  1543     $plaintext = str_split($this->pad_string($plaintext), 32);
  1543 		$plaintext = str_split($this->pad_string($plaintext), 32);
  1544     foreach ( $plaintext as $block )
  1544 		foreach ( $plaintext as $block )
  1545     {
  1545 		{
  1546       $block = $aes->AES_cbc_encrypt($block, $okey, $ivec, 'AES_ENCRYPT');
  1546 			$block = $aes->AES_cbc_encrypt($block, $okey, $ivec, 'AES_ENCRYPT');
  1547       $result .= $block;
  1547 			$result .= $block;
  1548     }
  1548 		}
  1549     
  1549 		
  1550     switch ( $return_format )
  1550 		switch ( $return_format )
  1551     {
  1551 		{
  1552       case ENC_BINARY:
  1552 			case ENC_BINARY:
  1553         return librijndael2::hex2string($result);
  1553 				return librijndael2::hex2string($result);
  1554       case ENC_HEX:
  1554 			case ENC_HEX:
  1555       default:
  1555 			default:
  1556         return $result;
  1556 				return $result;
  1557       case ENC_BASE64:
  1557 			case ENC_BASE64:
  1558         return base64_encode(librijndael2::hex2string($result));
  1558 				return base64_encode(librijndael2::hex2string($result));
  1559     }
  1559 		}
  1560   }
  1560 	}
  1561   
  1561 	
  1562   /**
  1562 	/**
  1563    * Wrapper for CBC decryption.
  1563  	* Wrapper for CBC decryption.
  1564    * @param string Encrypted text
  1564  	* @param string Encrypted text
  1565    * @param string Binary or hex key
  1565  	* @param string Binary or hex key
  1566    * @param string 128-bit initialization vector, either hex or binary will do
  1566  	* @param string 128-bit initialization vector, either hex or binary will do
  1567    * @param int Format that the encrypted text is in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1567  	* @param int Format that the encrypted text is in - ENC_BINARY, ENC_HEX, or ENC_BASE64
  1568    * @param bool If true, avoids caching the decryption result.
  1568  	* @param bool If true, avoids caching the decryption result.
  1569    * @return string
  1569  	* @return string
  1570    */
  1570  	*/
  1571   
  1571 	
  1572   public function decrypt_cbc($cryptext, $key, $ivec, $input_format = ENC_HEX, $no_cache = false)
  1572 	public function decrypt_cbc($cryptext, $key, $ivec, $input_format = ENC_HEX, $no_cache = false)
  1573   {
  1573 	{
  1574     // AES_cbc_encrypt() expects hex
  1574 		// AES_cbc_encrypt() expects hex
  1575     switch ( $input_format )
  1575 		switch ( $input_format )
  1576     {
  1576 		{
  1577       case ENC_BINARY:
  1577 			case ENC_BINARY:
  1578         $cryptext = librijndael2::string2hex($cryptext);
  1578 				$cryptext = librijndael2::string2hex($cryptext);
  1579         break;
  1579 				break;
  1580       case ENC_BASE64:
  1580 			case ENC_BASE64:
  1581         $cryptext = librijndael2::string2hex(base64_decode($cryptext));
  1581 				$cryptext = librijndael2::string2hex(base64_decode($cryptext));
  1582         break;
  1582 				break;
  1583     }
  1583 		}
  1584     
  1584 		
  1585     $hash = sha1("{$cryptext}::{$key}");
  1585 		$hash = sha1("{$cryptext}::{$key}");
  1586     if ( $cache_result = aes_decrypt_cache_fetch($hash) )
  1586 		if ( $cache_result = aes_decrypt_cache_fetch($hash) )
  1587       return $cache_result;
  1587 			return $cache_result;
  1588     
  1588 		
  1589     // load objects
  1589 		// load objects
  1590     profiler_log("AES: Started decryption of string $hash");
  1590 		profiler_log("AES: Started decryption of string $hash");
  1591     $okey = self::fetch_key($key);
  1591 		$okey = self::fetch_key($key);
  1592     $okey->set_decrypt();
  1592 		$okey->set_decrypt();
  1593     $aes = self::fetch_cr_singleton();
  1593 		$aes = self::fetch_cr_singleton();
  1594     
  1594 		
  1595     // init ivec
  1595 		// init ivec
  1596     if ( strlen($ivec) == '16' )
  1596 		if ( strlen($ivec) == '16' )
  1597     {
  1597 		{
  1598       $ivec = librijndael2::string2hex($ivec);
  1598 			$ivec = librijndael2::string2hex($ivec);
  1599     }
  1599 		}
  1600     else if ( preg_match('/^[a-f0-9]+$/i', $ivec) && strlen($ivec) == 32 )
  1600 		else if ( preg_match('/^[a-f0-9]+$/i', $ivec) && strlen($ivec) == 32 )
  1601     {
  1601 		{
  1602       // ivec is good
  1602 			// ivec is good
  1603     }
  1603 		}
  1604     else
  1604 		else
  1605     {
  1605 		{
  1606       // invalid ivec
  1606 			// invalid ivec
  1607       return false;
  1607 			return false;
  1608     }
  1608 		}
  1609     
  1609 		
  1610     // perform decryption
  1610 		// perform decryption
  1611     $result = '';
  1611 		$result = '';
  1612     $cryptext_orig = $cryptext;
  1612 		$cryptext_orig = $cryptext;
  1613     $cryptext = enano_str_split($cryptext, 32);
  1613 		$cryptext = enano_str_split($cryptext, 32);
  1614     foreach ( $cryptext as $block )
  1614 		foreach ( $cryptext as $block )
  1615     {
  1615 		{
  1616       $block = $aes->AES_cbc_encrypt($block, $okey, $ivec, 'AES_DECRYPT');
  1616 			$block = $aes->AES_cbc_encrypt($block, $okey, $ivec, 'AES_DECRYPT');
  1617       $result .= $block;
  1617 			$result .= $block;
  1618     }
  1618 		}
  1619     
  1619 		
  1620     // decode result and trim nul bytes
  1620 		// decode result and trim nul bytes
  1621     $result = librijndael2::hex2string($result);
  1621 		$result = librijndael2::hex2string($result);
  1622     $result = rtrim($result, "\000");
  1622 		$result = rtrim($result, "\000");
  1623     
  1623 		
  1624     if ( !$no_cache )
  1624 		if ( !$no_cache )
  1625       aes_decrypt_cache_store($cryptext_orig, $result, $key);
  1625 			aes_decrypt_cache_store($cryptext_orig, $result, $key);
  1626     
  1626 		
  1627     profiler_log("AES: Finished decryption of string $hash");
  1627 		profiler_log("AES: Finished decryption of string $hash");
  1628     
  1628 		
  1629     // done! :)
  1629 		// done! :)
  1630     return $result;
  1630 		return $result;
  1631   }
  1631 	}
  1632   
  1632 	
  1633   /**
  1633 	/**
  1634    * Factory.
  1634  	* Factory.
  1635    * @param int Key size in bits
  1635  	* @param int Key size in bits
  1636    * @param int Block size in bits - ONLY 128-bit supported.
  1636  	* @param int Block size in bits - ONLY 128-bit supported.
  1637    * @return object Instance of AESCrypt
  1637  	* @return object Instance of AESCrypt
  1638    */
  1638  	*/
  1639   
  1639 	
  1640   public static function singleton($key_size = AES_BITS, $block_size = 128)
  1640 	public static function singleton($key_size = AES_BITS, $block_size = 128)
  1641   {
  1641 	{
  1642     static $instance = false;
  1642 		static $instance = false;
  1643     if ( !$instance )
  1643 		if ( !$instance )
  1644     {
  1644 		{
  1645       $class = __CLASS__;
  1645 			$class = __CLASS__;
  1646       $instance = new $class();
  1646 			$instance = new $class();
  1647     }
  1647 		}
  1648     return $instance;
  1648 		return $instance;
  1649   }
  1649 	}
  1650   
  1650 	
  1651   #
  1651 	#
  1652   # Utility functions
  1652 	# Utility functions
  1653   #
  1653 	#
  1654   
  1654 	
  1655   /**
  1655 	/**
  1656    * Generates a random key suitable for encryption
  1656  	* Generates a random key suitable for encryption
  1657    * @param int $len the length of the key, in bytes
  1657  	* @param int $len the length of the key, in bytes
  1658    * @return string a BINARY key
  1658  	* @return string a BINARY key
  1659    */
  1659  	*/
  1660   
  1660 	
  1661   static function randkey($len = 32)
  1661 	static function randkey($len = 32)
  1662   {
  1662 	{
  1663     if ( @file_exists('/dev/urandom') && @is_readable('/dev/urandom') )
  1663 		if ( @file_exists('/dev/urandom') && @is_readable('/dev/urandom') )
  1664     {
  1664 		{
  1665       // Let's use something a little more secure
  1665 			// Let's use something a little more secure
  1666       $ur = @fopen('/dev/urandom', 'r');
  1666 			$ur = @fopen('/dev/urandom', 'r');
  1667       if ( !$ur )
  1667 			if ( !$ur )
  1668         return self::randkey_safe($len);
  1668 				return self::randkey_safe($len);
  1669       $ukey = @fread($ur, $len);
  1669 			$ukey = @fread($ur, $len);
  1670       fclose($ur);
  1670 			fclose($ur);
  1671       if ( strlen($ukey) != $len )
  1671 			if ( strlen($ukey) != $len )
  1672         return self::randkey_safe($len);
  1672 				return self::randkey_safe($len);
  1673       return $ukey;
  1673 			return $ukey;
  1674     }
  1674 		}
  1675     return self::randkey_safe($len);
  1675 		return self::randkey_safe($len);
  1676   }
  1676 	}
  1677   
  1677 	
  1678   static function randkey_safe($len = 32)
  1678 	static function randkey_safe($len = 32)
  1679   {
  1679 	{
  1680     $key = '';
  1680 		$key = '';
  1681     for($i=0;$i<$len;$i++)
  1681 		for($i=0;$i<$len;$i++)
  1682     {
  1682 		{
  1683       $key .= chr(mt_rand(0, 255));
  1683 			$key .= chr(mt_rand(0, 255));
  1684     }
  1684 		}
  1685     return $key;
  1685 		return $key;
  1686   }
  1686 	}
  1687   
  1687 	
  1688   function gen_readymade_key()
  1688 	function gen_readymade_key()
  1689   {
  1689 	{
  1690     $key = librijndael2::string2hex($this->randkey(AES_BITS / 8));
  1690 		$key = librijndael2::string2hex($this->randkey(AES_BITS / 8));
  1691     return $key;
  1691 		return $key;
  1692   }
  1692 	}
  1693 }
  1693 }
  1694 
  1694 
  1695 function aes_decrypt_cache_store($encrypted, $decrypted, $key)
  1695 function aes_decrypt_cache_store($encrypted, $decrypted, $key)
  1696 {
  1696 {
  1697   if ( getConfig('cache_thumbs') != '1' )
  1697 	if ( getConfig('cache_thumbs') != '1' )
  1698     return false;
  1698 		return false;
  1699   
  1699 	
  1700   $cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1700 	$cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1701   // only cache if $decrypted is long enough to actually warrant caching
  1701 	// only cache if $decrypted is long enough to actually warrant caching
  1702   if ( strlen($decrypted) < 32 )
  1702 	if ( strlen($decrypted) < 32 )
  1703   {
  1703 	{
  1704     profiler_log("AES: Skipped caching a string (probably a password, we dunno) because it's too short");
  1704 		profiler_log("AES: Skipped caching a string (probably a password, we dunno) because it's too short");
  1705     return false;
  1705 		return false;
  1706   }
  1706 	}
  1707   if ( file_exists($cache_file) )
  1707 	if ( file_exists($cache_file) )
  1708   {
  1708 	{
  1709     require_once($cache_file);
  1709 		require_once($cache_file);
  1710     global $aes_decrypt_cache;
  1710 		global $aes_decrypt_cache;
  1711     $cachekey = sha1($encrypted . '::' . $key);
  1711 		$cachekey = sha1($encrypted . '::' . $key);
  1712     $aes_decrypt_cache[$cachekey] = $decrypted;
  1712 		$aes_decrypt_cache[$cachekey] = $decrypted;
  1713     
  1713 		
  1714     if ( count($aes_decrypt_cache) > 5000 )
  1714 		if ( count($aes_decrypt_cache) > 5000 )
  1715     {
  1715 		{
  1716       // we've got a lot of strings in the cache, clear out a few
  1716 			// we've got a lot of strings in the cache, clear out a few
  1717       $keys = array_keys($aes_decrypt_cache);
  1717 			$keys = array_keys($aes_decrypt_cache);
  1718       for ( $i = 0; $i < 2500; $i++ )
  1718 			for ( $i = 0; $i < 2500; $i++ )
  1719       {
  1719 			{
  1720         unset($aes_decrypt_cache[$keys[$i]]);
  1720 				unset($aes_decrypt_cache[$keys[$i]]);
  1721         unset($aes_decrypt_cache[$keys[$i]]);
  1721 				unset($aes_decrypt_cache[$keys[$i]]);
  1722       }
  1722 			}
  1723     }
  1723 		}
  1724   }
  1724 	}
  1725   else
  1725 	else
  1726   {
  1726 	{
  1727     $aes_decrypt_cache = array(
  1727 		$aes_decrypt_cache = array(
  1728       sha1($encrypted . '::' . $key) => $decrypted
  1728 			sha1($encrypted . '::' . $key) => $decrypted
  1729     );
  1729 		);
  1730   }
  1730 	}
  1731   // call var_export and collect contents
  1731 	// call var_export and collect contents
  1732   ob_start();
  1732 	ob_start();
  1733   var_export($aes_decrypt_cache);
  1733 	var_export($aes_decrypt_cache);
  1734   $dec_cache_string = ob_get_contents();
  1734 	$dec_cache_string = ob_get_contents();
  1735   ob_end_clean();
  1735 	ob_end_clean();
  1736   $f = @fopen($cache_file, 'w');
  1736 	$f = @fopen($cache_file, 'w');
  1737   if ( !$f )
  1737 	if ( !$f )
  1738     return false;
  1738 		return false;
  1739   fwrite($f, "<?php
  1739 	fwrite($f, "<?php
  1740 \$GLOBALS['aes_decrypt_cache'] = $dec_cache_string;
  1740 \$GLOBALS['aes_decrypt_cache'] = $dec_cache_string;
  1741 ");
  1741 ");
  1742   fclose($f);
  1742 	fclose($f);
  1743   return true;
  1743 	return true;
  1744 }
  1744 }
  1745 
  1745 
  1746 function aes_decrypt_cache_fetch($hash)
  1746 function aes_decrypt_cache_fetch($hash)
  1747 {
  1747 {
  1748   $cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1748 	$cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1749   if ( !file_exists($cache_file) )
  1749 	if ( !file_exists($cache_file) )
  1750     return false;
  1750 		return false;
  1751   
  1751 	
  1752   require_once($cache_file);
  1752 	require_once($cache_file);
  1753   global $aes_decrypt_cache;
  1753 	global $aes_decrypt_cache;
  1754   if ( isset($aes_decrypt_cache[$hash]) )
  1754 	if ( isset($aes_decrypt_cache[$hash]) )
  1755   {
  1755 	{
  1756     profiler_log("AES: Loaded cached decrypted string, hash is $hash");
  1756 		profiler_log("AES: Loaded cached decrypted string, hash is $hash");
  1757     return $aes_decrypt_cache[$hash];
  1757 		return $aes_decrypt_cache[$hash];
  1758   }
  1758 	}
  1759   
  1759 	
  1760   return false;
  1760 	return false;
  1761 }
  1761 }
  1762 
  1762 
  1763 function aes_decrypt_cache_destroy($hash)
  1763 function aes_decrypt_cache_destroy($hash)
  1764 {
  1764 {
  1765   $cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1765 	$cache_file = ENANO_ROOT . '/cache/aes_decrypt.php';
  1766   if ( !file_exists($cache_file) )
  1766 	if ( !file_exists($cache_file) )
  1767     return false;
  1767 		return false;
  1768   
  1768 	
  1769   require_once($cache_file);
  1769 	require_once($cache_file);
  1770   global $aes_decrypt_cache;
  1770 	global $aes_decrypt_cache;
  1771   
  1771 	
  1772   if ( isset($aes_decrypt_cache[$hash]) )
  1772 	if ( isset($aes_decrypt_cache[$hash]) )
  1773     unset($aes_decrypt_cache[$hash]);
  1773 		unset($aes_decrypt_cache[$hash]);
  1774   
  1774 	
  1775   // call var_export and collect contents
  1775 	// call var_export and collect contents
  1776   ob_start();
  1776 	ob_start();
  1777   var_export($aes_decrypt_cache);
  1777 	var_export($aes_decrypt_cache);
  1778   $dec_cache_string = ob_get_contents();
  1778 	$dec_cache_string = ob_get_contents();
  1779   ob_end_clean();
  1779 	ob_end_clean();
  1780   $f = @fopen($cache_file, 'w');
  1780 	$f = @fopen($cache_file, 'w');
  1781   if ( !$f )
  1781 	if ( !$f )
  1782     return false;
  1782 		return false;
  1783   fwrite($f, "<?php
  1783 	fwrite($f, "<?php
  1784 \$GLOBALS['aes_decrypt_cache'] = $dec_cache_string;
  1784 \$GLOBALS['aes_decrypt_cache'] = $dec_cache_string;
  1785 ");
  1785 ");
  1786   fclose($f);
  1786 	fclose($f);
  1787   return true;
  1787 	return true;
  1788 }
  1788 }
  1789 
  1789 
  1790 ?>
  1790 ?>