]> git.mxchange.org Git - friendica-addons.git/blobdiff - securemail/php-gpg/libs/GPG/Expanded_Key.php
New experimental plugin 'secure mail'
[friendica-addons.git] / securemail / php-gpg / libs / GPG / Expanded_Key.php
diff --git a/securemail/php-gpg/libs/GPG/Expanded_Key.php b/securemail/php-gpg/libs/GPG/Expanded_Key.php
new file mode 100644 (file)
index 0000000..fdc69b2
--- /dev/null
@@ -0,0 +1,105 @@
+<?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