]> git.mxchange.org Git - friendica-addons.git/blob - securemail/php-gpg/libs/GPG/Expanded_Key.php
New experimental plugin 'secure mail'
[friendica-addons.git] / securemail / php-gpg / libs / GPG / Expanded_Key.php
1 <?php\r
2 /** @package    php-gpg::GPG */\r
3 \r
4 /** require supporting files */\r
5 require_once("Cipher.php");\r
6 \r
7 /**\r
8  * @package    php-gpg::GPG\r
9  */\r
10 class Expanded_Key {\r
11     var $rounds;\r
12     var $rk;\r
13 \r
14         function Expanded_Key($key) {\r
15         $RCON = GPG_Cipher::$RCON;\r
16         $S = GPG_Cipher::$S;\r
17 \r
18                 $maxkc = GPG_Cipher::$maxkc;\r
19                 $maxrk = GPG_Cipher::$maxrk;\r
20 \r
21         $kc = 0;\r
22         $i = 0;\r
23         $j = 0;\r
24         $r = 0;\r
25         $t = 0;\r
26         $rounds = 0;\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
31         $rconpointer = 0;\r
32 \r
33         if ($keylen == 16) {\r
34             $rounds = 10;\r
35             $kc = 4;\r
36         } else if ($keylen == 24) {\r
37             $rounds = 12;\r
38             $kc = 6;\r
39         } else if ($keylen == 32) {\r
40             $rounds = 14;\r
41             $kc = 8;\r
42         } else {\r
43             return;\r
44         }\r
45 \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
48                 if ($i < $keylen) {\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
51                 } else {\r
52                     $k[$j] = 0;\r
53                 }\r
54         }\r
55         for($j = $kc - 1; $j >= 0; $j--) $tk[$j] = $k[$j];\r
56 \r
57         $r = 0;\r
58         $t = 0;\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
62             }\r
63             if($t == 4) {\r
64                 $r++;\r
65                 $t = 0;\r
66             }\r
67         }\r
68 \r
69         while($r < $rounds + 1) {\r
70             $temp = $tk[$kc - 1];\r
71 \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
75 \r
76             if ($kc != 8) {\r
77                 for($j = 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];\r
78             } else {\r
79                 for($j = 1; $j < $kc / 2; $j++) $tk[$j] ^= $tk[$j - 1];\r
80  \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
84 \r
85                 for($j = $kc / 2 + 1; $j < $kc; $j++) $tk[$j] ^= $tk[$j - 1];\r
86             }\r
87 \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
91                 }\r
92                 if($t == 4) {\r
93                     $r++;\r
94                     $t = 0;\r
95                 }\r
96             }\r
97         }\r
98     \r
99         $this->rounds = $rounds;\r
100         $this->rk = $keySched;\r
101         return $this;\r
102     }\r
103 }\r
104 \r
105 ?>