--- /dev/null
+<?php\r
+/** @package php-gpg::GPG */\r
+\r
+/** require supporting files */\r
+require_once("Cipher.php");\r
+\r
+/**\r
+ * @package php-gpg::GPG\r
+ */\r
+class Expanded_Key {\r
+ var $rounds;\r
+ var $rk;\r
+\r
+ function Expanded_Key($key) {\r
+ $RCON = GPG_Cipher::$RCON;\r
+ $S = GPG_Cipher::$S;\r
+\r
+ $maxkc = GPG_Cipher::$maxkc;\r
+ $maxrk = GPG_Cipher::$maxrk;\r
+\r
+ $kc = 0;\r
+ $i = 0;\r
+ $j = 0;\r
+ $r = 0;\r
+ $t = 0;\r
+ $rounds = 0;\r
+ $keySched = array_fill(0, $maxrk + 1, 0);\r
+ $keylen = strlen($key);\r
+ $k = array_fill(0, $maxkc, 0);\r
+ $tk = array_fill(0, $maxkc, 0);\r
+ $rconpointer = 0;\r
+\r
+ if ($keylen == 16) {\r
+ $rounds = 10;\r
+ $kc = 4;\r
+ } else if ($keylen == 24) {\r
+ $rounds = 12;\r
+ $kc = 6;\r
+ } else if ($keylen == 32) {\r
+ $rounds = 14;\r
+ $kc = 8;\r
+ } else {\r
+ return;\r
+ }\r
+\r
+ for($i = 0; $i < $maxrk + 1; $i++) $keySched[$i] = array_fill(0, 4, 0);\r
+ for($i = 0, $j = 0; $j < $keylen; $j++, $i += 4) {\r
+ if ($i < $keylen) {\r
+ $k[$j] = ord($key[$i]) | (ord($key[$i + 1]) << 0x8) |\r
+ (ord($key[$i + 2]) << 0x10) | (ord($key[$i + 3]) << 0x18);\r
+ } else {\r
+ $k[$j] = 0;\r
+ }\r
+ }\r
+ for($j = $kc - 1; $j >= 0; $j--) $tk[$j] = $k[$j];\r
+\r
+ $r = 0;\r
+ $t = 0;\r
+ for($j = 0; ($j < $kc) && ($r < $rounds + 1); ) {\r
+ for(; ($j < $kc) && ($t < 4); $j++, $t++) {\r
+ $keySched[$r][$t] = $tk[$j];\r
+ }\r
+ if($t == 4) {\r
+ $r++;\r
+ $t = 0;\r
+ }\r
+ }\r
+\r
+ while($r < $rounds + 1) {\r
+ $temp = $tk[$kc - 1];\r
+\r
+ $tk[0] ^= $S[GPG_Utility::B1($temp)] | ($S[GPG_Utility::B2($temp)] << 0x8) |\r
+ ($S[GPG_Utility::B3($temp)] << 0x10) | ($S[GPG_Utility::B0($temp)] << 0x18);\r
+ $tk[0] ^= $RCON[$rconpointer++];\r
+\r
+ if ($kc != 8) {\r
+ for($j = 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];\r
+ } else {\r
+ for($j = 1; $j < $kc / 2; $j++) $tk[$j] ^= $tk[$j - 1];\r
+ \r
+ $temp = $tk[$kc / 2 - 1];\r
+ $tk[$kc / 2] ^= $S[GPG_Utility::B0($temp)] | ($S[GPG_Utility::B1($temp)] << 0x8) |\r
+ ($S[GPG_Utility::B2($temp)] << 0x10) | ($S[GPG_Utility::B3($temp)] << 0x18);\r
+\r
+ for($j = $kc / 2 + 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];\r
+ }\r
+\r
+ for($j = 0; ($j < $kc) && ($r < $rounds + 1); ) {\r
+ for(; ($j < $kc) && ($t < 4); $j++, $t++) {\r
+ $keySched[$r][$t] = $tk[$j];\r
+ }\r
+ if($t == 4) {\r
+ $r++;\r
+ $t = 0;\r
+ }\r
+ }\r
+ }\r
+ \r
+ $this->rounds = $rounds;\r
+ $this->rk = $keySched;\r
+ return $this;\r
+ }\r
+}\r
+\r
+?>
\ No newline at end of file