2 /** @package php-gpg::GPG */
\r
4 /** require supporting files */
\r
5 require_once("Cipher.php");
\r
8 * @package php-gpg::GPG
\r
10 class Expanded_Key {
\r
14 function Expanded_Key($key) {
\r
15 $RCON = GPG_Cipher::$RCON;
\r
16 $S = GPG_Cipher::$S;
\r
18 $maxkc = GPG_Cipher::$maxkc;
\r
19 $maxrk = GPG_Cipher::$maxrk;
\r
27 $keySched = array_fill(0, $maxrk + 1, 0);
\r
28 $keylen = strlen($key);
\r
29 $k = array_fill(0, $maxkc, 0);
\r
30 $tk = array_fill(0, $maxkc, 0);
\r
33 if ($keylen == 16) {
\r
36 } else if ($keylen == 24) {
\r
39 } else if ($keylen == 32) {
\r
46 for($i = 0; $i < $maxrk + 1; $i++) $keySched[$i] = array_fill(0, 4, 0);
\r
47 for($i = 0, $j = 0; $j < $keylen; $j++, $i += 4) {
\r
49 $k[$j] = ord($key[$i]) | (ord($key[$i + 1]) << 0x8) |
\r
50 (ord($key[$i + 2]) << 0x10) | (ord($key[$i + 3]) << 0x18);
\r
55 for($j = $kc - 1; $j >= 0; $j--) $tk[$j] = $k[$j];
\r
59 for($j = 0; ($j < $kc) && ($r < $rounds + 1); ) {
\r
60 for(; ($j < $kc) && ($t < 4); $j++, $t++) {
\r
61 $keySched[$r][$t] = $tk[$j];
\r
69 while($r < $rounds + 1) {
\r
70 $temp = $tk[$kc - 1];
\r
72 $tk[0] ^= $S[GPG_Utility::B1($temp)] | ($S[GPG_Utility::B2($temp)] << 0x8) |
\r
73 ($S[GPG_Utility::B3($temp)] << 0x10) | ($S[GPG_Utility::B0($temp)] << 0x18);
\r
74 $tk[0] ^= $RCON[$rconpointer++];
\r
77 for($j = 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];
\r
79 for($j = 1; $j < $kc / 2; $j++) $tk[$j] ^= $tk[$j - 1];
\r
81 $temp = $tk[$kc / 2 - 1];
\r
82 $tk[$kc / 2] ^= $S[GPG_Utility::B0($temp)] | ($S[GPG_Utility::B1($temp)] << 0x8) |
\r
83 ($S[GPG_Utility::B2($temp)] << 0x10) | ($S[GPG_Utility::B3($temp)] << 0x18);
\r
85 for($j = $kc / 2 + 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];
\r
88 for($j = 0; ($j < $kc) && ($r < $rounds + 1); ) {
\r
89 for(; ($j < $kc) && ($t < 4); $j++, $t++) {
\r
90 $keySched[$r][$t] = $tk[$j];
\r
99 $this->rounds = $rounds;
\r
100 $this->rk = $keySched;
\r