1
0
mirror of https://github.com/danog/phpseclib.git synced 2024-11-27 04:46:26 +01:00

DES: make sboxes static

This commit is contained in:
terrafrost 2018-12-02 13:59:42 -06:00
parent 4679cb7bf7
commit b278bc7e7e

View File

@ -161,7 +161,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $shuffle = [ protected static $shuffle = [
"\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF",
"\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF",
"\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF",
@ -300,7 +300,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $ipmap = [ protected static $ipmap = [
0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31,
0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33,
0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71,
@ -342,7 +342,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $invipmap = [ protected static $invipmap = [
0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
@ -386,7 +386,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox1 = [ protected static $sbox1 = [
0x00808200, 0x00000000, 0x00008000, 0x00808202, 0x00808200, 0x00000000, 0x00008000, 0x00808202,
0x00808002, 0x00008202, 0x00000002, 0x00008000, 0x00808002, 0x00008202, 0x00000002, 0x00008000,
0x00000200, 0x00808200, 0x00808202, 0x00000200, 0x00000200, 0x00808200, 0x00808202, 0x00000200,
@ -411,7 +411,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox2 = [ protected static $sbox2 = [
0x40084010, 0x40004000, 0x00004000, 0x00084010, 0x40084010, 0x40004000, 0x00004000, 0x00084010,
0x00080000, 0x00000010, 0x40080010, 0x40004010, 0x00080000, 0x00000010, 0x40080010, 0x40004010,
0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40000010, 0x40084010, 0x40084000, 0x40000000,
@ -436,7 +436,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox3 = [ protected static $sbox3 = [
0x00000104, 0x04010100, 0x00000000, 0x04010004, 0x00000104, 0x04010100, 0x00000000, 0x04010004,
0x04000100, 0x00000000, 0x00010104, 0x04000100, 0x04000100, 0x00000000, 0x00010104, 0x04000100,
0x00010004, 0x04000004, 0x04000004, 0x00010000, 0x00010004, 0x04000004, 0x04000004, 0x00010000,
@ -461,7 +461,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox4 = [ protected static $sbox4 = [
0x80401000, 0x80001040, 0x80001040, 0x00000040, 0x80401000, 0x80001040, 0x80001040, 0x00000040,
0x00401040, 0x80400040, 0x80400000, 0x80001000, 0x00401040, 0x80400040, 0x80400000, 0x80001000,
0x00000000, 0x00401000, 0x00401000, 0x80401040, 0x00000000, 0x00401000, 0x00401000, 0x80401040,
@ -486,7 +486,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox5 = [ protected static $sbox5 = [
0x00000080, 0x01040080, 0x01040000, 0x21000080, 0x00000080, 0x01040080, 0x01040000, 0x21000080,
0x00040000, 0x00000080, 0x20000000, 0x01040000, 0x00040000, 0x00000080, 0x20000000, 0x01040000,
0x20040080, 0x00040000, 0x01000080, 0x20040080, 0x20040080, 0x00040000, 0x01000080, 0x20040080,
@ -511,7 +511,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox6 = [ protected static $sbox6 = [
0x10000008, 0x10200000, 0x00002000, 0x10202008, 0x10000008, 0x10200000, 0x00002000, 0x10202008,
0x10200000, 0x00000008, 0x10202008, 0x00200000, 0x10200000, 0x00000008, 0x10202008, 0x00200000,
0x10002000, 0x00202008, 0x00200000, 0x10000008, 0x10002000, 0x00202008, 0x00200000, 0x10000008,
@ -536,7 +536,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox7 = [ protected static $sbox7 = [
0x00100000, 0x02100001, 0x02000401, 0x00000000, 0x00100000, 0x02100001, 0x02000401, 0x00000000,
0x00000400, 0x02000401, 0x00100401, 0x02100400, 0x00000400, 0x02000401, 0x00100401, 0x02100400,
0x02100401, 0x00100000, 0x00000000, 0x02000001, 0x02100401, 0x00100000, 0x00000000, 0x02000001,
@ -561,7 +561,7 @@ class DES extends BlockCipher
* @var array * @var array
* @access private * @access private
*/ */
protected $sbox8 = [ protected static $sbox8 = [
0x08000820, 0x00000800, 0x00020000, 0x08020820, 0x08000820, 0x00000800, 0x00020000, 0x08020820,
0x08000000, 0x08000820, 0x00000020, 0x08000000, 0x08000000, 0x08000820, 0x00000020, 0x08000000,
0x00020020, 0x08020000, 0x08020820, 0x00020800, 0x00020020, 0x08020000, 0x08020820, 0x00020800,
@ -687,18 +687,18 @@ class DES extends BlockCipher
{ {
static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
if (!$sbox1) { if (!$sbox1) {
$sbox1 = array_map("intval", $this->sbox1); $sbox1 = array_map('intval', self::$sbox1);
$sbox2 = array_map("intval", $this->sbox2); $sbox2 = array_map('intval', self::$sbox2);
$sbox3 = array_map("intval", $this->sbox3); $sbox3 = array_map('intval', self::$sbox3);
$sbox4 = array_map("intval", $this->sbox4); $sbox4 = array_map('intval', self::$sbox4);
$sbox5 = array_map("intval", $this->sbox5); $sbox5 = array_map('intval', self::$sbox5);
$sbox6 = array_map("intval", $this->sbox6); $sbox6 = array_map('intval', self::$sbox6);
$sbox7 = array_map("intval", $this->sbox7); $sbox7 = array_map('intval', self::$sbox7);
$sbox8 = array_map("intval", $this->sbox8); $sbox8 = array_map('intval', self::$sbox8);
/* Merge $shuffle with $[inv]ipmap */ /* Merge $shuffle with $[inv]ipmap */
for ($i = 0; $i < 256; ++$i) { for ($i = 0; $i < 256; ++$i) {
$shuffleip[] = $this->shuffle[$this->ipmap[$i]]; $shuffleip[] = self::$shuffle[self::$ipmap[$i]];
$shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]];
} }
} }
@ -1229,14 +1229,14 @@ class DES extends BlockCipher
// Perform the PC/1 transformation and compute C and D. // Perform the PC/1 transformation and compute C and D.
$t = unpack('Nl/Nr', $key); $t = unpack('Nl/Nr', $key);
list($l, $r) = [$t['l'], $t['r']]; list($l, $r) = [$t['l'], $t['r']];
$key = ($this->shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | $key = (self::$shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") |
($this->shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | (self::$shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") |
($this->shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | (self::$shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") |
($this->shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | (self::$shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") |
($this->shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | (self::$shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") |
($this->shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | (self::$shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") |
($this->shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | (self::$shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") |
($this->shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); (self::$shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00");
$key = unpack('Nc/Nd', $key); $key = unpack('Nc/Nd', $key);
$c = ( $key['c'] >> 4) & 0x0FFFFFFF; $c = ( $key['c'] >> 4) & 0x0FFFFFFF;
$d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F);
@ -1308,18 +1308,18 @@ class DES extends BlockCipher
$init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip;
if (!$sbox1) { if (!$sbox1) {
$sbox1 = array_map("intval", $this->sbox1); $sbox1 = array_map("intval", self::$sbox1);
$sbox2 = array_map("intval", $this->sbox2); $sbox2 = array_map("intval", self::$sbox2);
$sbox3 = array_map("intval", $this->sbox3); $sbox3 = array_map("intval", self::$sbox3);
$sbox4 = array_map("intval", $this->sbox4); $sbox4 = array_map("intval", self::$sbox4);
$sbox5 = array_map("intval", $this->sbox5); $sbox5 = array_map("intval", self::$sbox5);
$sbox6 = array_map("intval", $this->sbox6); $sbox6 = array_map("intval", self::$sbox6);
$sbox7 = array_map("intval", $this->sbox7); $sbox7 = array_map("intval", self::$sbox7);
$sbox8 = array_map("intval", $this->sbox8);' $sbox8 = array_map("intval", self::$sbox8);'
/* Merge $shuffle with $[inv]ipmap */ . ' /* Merge $shuffle with $[inv]ipmap */ . '
for ($i = 0; $i < 256; ++$i) { for ($i = 0; $i < 256; ++$i) {
$shuffleip[] = $this->shuffle[$this->ipmap[$i]]; $shuffleip[] = self::$shuffle[self::$ipmap[$i]];
$shuffleinvip[] = $this->shuffle[$this->invipmap[$i]]; $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]];
} }
} }
'; ';