mirror of
https://github.com/phpseclib/phpseclib.git
synced 2024-12-29 04:23:34 +00:00
Merge branch '2.0'
This commit is contained in:
commit
19a46748a2
@ -424,12 +424,12 @@ class Blowfish extends BlockCipher
|
|||||||
|
|
||||||
for ($i = 0; $i < 16; $i+= 2) {
|
for ($i = 0; $i < 16; $i+= 2) {
|
||||||
$l^= $p[$i];
|
$l^= $p[$i];
|
||||||
$r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
|
$r^= self::safe_intval((self::safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
|
||||||
$sb_2[$l >> 8 & 0xff]) +
|
$sb_2[$l >> 8 & 0xff]) +
|
||||||
$sb_3[$l & 0xff]);
|
$sb_3[$l & 0xff]);
|
||||||
|
|
||||||
$r^= $p[$i + 1];
|
$r^= $p[$i + 1];
|
||||||
$l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
|
$l^= self::safe_intval((self::safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
|
||||||
$sb_2[$r >> 8 & 0xff]) +
|
$sb_2[$r >> 8 & 0xff]) +
|
||||||
$sb_3[$r & 0xff]);
|
$sb_3[$r & 0xff]);
|
||||||
}
|
}
|
||||||
@ -457,12 +457,12 @@ class Blowfish extends BlockCipher
|
|||||||
|
|
||||||
for ($i = 17; $i > 2; $i-= 2) {
|
for ($i = 17; $i > 2; $i-= 2) {
|
||||||
$l^= $p[$i];
|
$l^= $p[$i];
|
||||||
$r^= $this->safe_intval(($this->safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
|
$r^= self::safe_intval((self::safe_intval($sb_0[$l >> 24 & 0xff] + $sb_1[$l >> 16 & 0xff]) ^
|
||||||
$sb_2[$l >> 8 & 0xff]) +
|
$sb_2[$l >> 8 & 0xff]) +
|
||||||
$sb_3[$l & 0xff]);
|
$sb_3[$l & 0xff]);
|
||||||
|
|
||||||
$r^= $p[$i - 1];
|
$r^= $p[$i - 1];
|
||||||
$l^= $this->safe_intval(($this->safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
|
$l^= self::safe_intval((self::safe_intval($sb_0[$r >> 24 & 0xff] + $sb_1[$r >> 16 & 0xff]) ^
|
||||||
$sb_2[$r >> 8 & 0xff]) +
|
$sb_2[$r >> 8 & 0xff]) +
|
||||||
$sb_3[$r & 0xff]);
|
$sb_3[$r & 0xff]);
|
||||||
}
|
}
|
||||||
@ -488,15 +488,7 @@ class Blowfish extends BlockCipher
|
|||||||
}
|
}
|
||||||
';
|
';
|
||||||
|
|
||||||
switch (true) {
|
$safeint = self::safe_intval_inline();
|
||||||
case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8:
|
|
||||||
case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
|
|
||||||
$safeint = '%s';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
$safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | ';
|
|
||||||
$safeint.= '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))';
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generating encrypt code:
|
// Generating encrypt code:
|
||||||
$encrypt_block = '
|
$encrypt_block = '
|
||||||
@ -561,24 +553,4 @@ class Blowfish extends BlockCipher
|
|||||||
]
|
]
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert float to int
|
|
||||||
*
|
|
||||||
* On ARM CPUs converting floats to ints doesn't always work
|
|
||||||
*
|
|
||||||
* @access private
|
|
||||||
* @param string $x
|
|
||||||
* @return int
|
|
||||||
*/
|
|
||||||
function safe_intval($x)
|
|
||||||
{
|
|
||||||
switch (true) {
|
|
||||||
case is_int($x):
|
|
||||||
case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
|
|
||||||
return $x;
|
|
||||||
}
|
|
||||||
return (fmod($x, 0x80000000) & 0x7FFFFFFF) |
|
|
||||||
((fmod(floor($x / 0x80000000), 2) & 1) << 31);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2739,4 +2739,44 @@ abstract class SymmetricKey
|
|||||||
|
|
||||||
return \Closure::bind($func, $this, static::class);
|
return \Closure::bind($func, $this, static::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert float to int
|
||||||
|
*
|
||||||
|
* On ARM CPUs converting floats to ints doesn't always work
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @param string $x
|
||||||
|
* @return int
|
||||||
|
*/
|
||||||
|
protected static function safe_intval($x)
|
||||||
|
{
|
||||||
|
switch (true) {
|
||||||
|
case is_int($x):
|
||||||
|
// PHP 5.3, per http://php.net/releases/5_3_0.php, introduced "more consistent float rounding"
|
||||||
|
case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
|
||||||
|
return $x;
|
||||||
|
}
|
||||||
|
return (fmod($x, 0x80000000) & 0x7FFFFFFF) |
|
||||||
|
((fmod(floor($x / 0x80000000), 2) & 1) << 31);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* eval()'able string for in-line float to int
|
||||||
|
*
|
||||||
|
* @access private
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
protected static function safe_intval_inline()
|
||||||
|
{
|
||||||
|
switch (true) {
|
||||||
|
case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8:
|
||||||
|
case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM':
|
||||||
|
return '%s';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | ';
|
||||||
|
return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))';
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -472,8 +472,10 @@ class Twofish extends BlockCipher
|
|||||||
$m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^
|
$m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^
|
||||||
$m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]];
|
$m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]];
|
||||||
$B = ($B << 8) | ($B >> 24 & 0xff);
|
$B = ($B << 8) | ($B >> 24 & 0xff);
|
||||||
$K[] = $A+= $B;
|
$A = self::safe_intval($A + $B);
|
||||||
$K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
|
$K[] = $A;
|
||||||
|
$A = self::safe_intval($A + $B);
|
||||||
|
$K[] = ($A << 9 | $A >> 23 & 0x1ff);
|
||||||
}
|
}
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
for ($i = 0; $i < 256; ++$i) {
|
||||||
$S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0];
|
$S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0];
|
||||||
@ -496,8 +498,10 @@ class Twofish extends BlockCipher
|
|||||||
$m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
|
$m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
|
||||||
$m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]];
|
$m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]];
|
||||||
$B = ($B << 8) | ($B >> 24 & 0xff);
|
$B = ($B << 8) | ($B >> 24 & 0xff);
|
||||||
$K[] = $A+= $B;
|
$A = self::safe_intval($A + $B);
|
||||||
$K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
|
$K[] = $A;
|
||||||
|
$A = self::safe_intval($A + $B);
|
||||||
|
$K[] = ($A << 9 | $A >> 23 & 0x1ff);
|
||||||
}
|
}
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
for ($i = 0; $i < 256; ++$i) {
|
||||||
$S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0];
|
$S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0];
|
||||||
@ -521,8 +525,10 @@ class Twofish extends BlockCipher
|
|||||||
$m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
|
$m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^
|
||||||
$m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]];
|
$m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]];
|
||||||
$B = ($B << 8) | ($B >> 24 & 0xff);
|
$B = ($B << 8) | ($B >> 24 & 0xff);
|
||||||
$K[] = $A+= $B;
|
$A = self::safe_intval($A + $B);
|
||||||
$K[] = (($A+= $B) << 9 | $A >> 23 & 0x1ff);
|
$K[] = $A;
|
||||||
|
$A = self::safe_intval($A + $B);
|
||||||
|
$K[] = ($A << 9 | $A >> 23 & 0x1ff);
|
||||||
}
|
}
|
||||||
for ($i = 0; $i < 256; ++$i) {
|
for ($i = 0; $i < 256; ++$i) {
|
||||||
$S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0];
|
$S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0];
|
||||||
@ -618,9 +624,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[ $R1 & 0xff] ^
|
$S1[ $R1 & 0xff] ^
|
||||||
$S2[($R1 >> 8) & 0xff] ^
|
$S2[($R1 >> 8) & 0xff] ^
|
||||||
$S3[($R1 >> 16) & 0xff];
|
$S3[($R1 >> 16) & 0xff];
|
||||||
$R2^= $t0 + $t1 + $K[++$ki];
|
$R2^= self::safe_intval($t0 + $t1 + $K[++$ki]);
|
||||||
$R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
|
$R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
|
||||||
$R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
|
$R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]);
|
||||||
|
|
||||||
$t0 = $S0[ $R2 & 0xff] ^
|
$t0 = $S0[ $R2 & 0xff] ^
|
||||||
$S1[($R2 >> 8) & 0xff] ^
|
$S1[($R2 >> 8) & 0xff] ^
|
||||||
@ -630,9 +636,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[ $R3 & 0xff] ^
|
$S1[ $R3 & 0xff] ^
|
||||||
$S2[($R3 >> 8) & 0xff] ^
|
$S2[($R3 >> 8) & 0xff] ^
|
||||||
$S3[($R3 >> 16) & 0xff];
|
$S3[($R3 >> 16) & 0xff];
|
||||||
$R0^= ($t0 + $t1 + $K[++$ki]);
|
$R0^= self::safe_intval($t0 + $t1 + $K[++$ki]);
|
||||||
$R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
|
$R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
|
||||||
$R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + $K[++$ki]);
|
$R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @codingStandardsIgnoreStart
|
// @codingStandardsIgnoreStart
|
||||||
@ -674,9 +680,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[$R1 & 0xff] ^
|
$S1[$R1 & 0xff] ^
|
||||||
$S2[$R1 >> 8 & 0xff] ^
|
$S2[$R1 >> 8 & 0xff] ^
|
||||||
$S3[$R1 >> 16 & 0xff];
|
$S3[$R1 >> 16 & 0xff];
|
||||||
$R3^= $t0 + ($t1 << 1) + $K[--$ki];
|
$R3^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]);
|
||||||
$R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
|
$R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
|
||||||
$R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + $K[--$ki]);
|
$R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]);
|
||||||
|
|
||||||
$t0 = $S0[$R2 & 0xff] ^
|
$t0 = $S0[$R2 & 0xff] ^
|
||||||
$S1[$R2 >> 8 & 0xff] ^
|
$S1[$R2 >> 8 & 0xff] ^
|
||||||
@ -686,9 +692,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[$R3 & 0xff] ^
|
$S1[$R3 & 0xff] ^
|
||||||
$S2[$R3 >> 8 & 0xff] ^
|
$S2[$R3 >> 8 & 0xff] ^
|
||||||
$S3[$R3 >> 16 & 0xff];
|
$S3[$R3 >> 16 & 0xff];
|
||||||
$R1^= $t0 + ($t1 << 1) + $K[--$ki];
|
$R1^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]);
|
||||||
$R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
|
$R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
|
||||||
$R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + $K[--$ki]);
|
$R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]);
|
||||||
}
|
}
|
||||||
|
|
||||||
// @codingStandardsIgnoreStart
|
// @codingStandardsIgnoreStart
|
||||||
@ -720,6 +726,8 @@ class Twofish extends BlockCipher
|
|||||||
}
|
}
|
||||||
';
|
';
|
||||||
|
|
||||||
|
$safeint = self::safe_intval_inline();
|
||||||
|
|
||||||
// Generating encrypt code:
|
// Generating encrypt code:
|
||||||
$encrypt_block = '
|
$encrypt_block = '
|
||||||
$in = unpack("V4", $in);
|
$in = unpack("V4", $in);
|
||||||
@ -738,9 +746,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[ $R1 & 0xff] ^
|
$S1[ $R1 & 0xff] ^
|
||||||
$S2[($R1 >> 8) & 0xff] ^
|
$S2[($R1 >> 8) & 0xff] ^
|
||||||
$S3[($R1 >> 16) & 0xff];
|
$S3[($R1 >> 16) & 0xff];
|
||||||
$R2^= ($t0 + $t1 + '.$K[++$ki].');
|
$R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . ';
|
||||||
$R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
|
$R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31);
|
||||||
$R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].');
|
$R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . ';
|
||||||
|
|
||||||
$t0 = $S0[ $R2 & 0xff] ^
|
$t0 = $S0[ $R2 & 0xff] ^
|
||||||
$S1[($R2 >> 8) & 0xff] ^
|
$S1[($R2 >> 8) & 0xff] ^
|
||||||
@ -750,9 +758,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[ $R3 & 0xff] ^
|
$S1[ $R3 & 0xff] ^
|
||||||
$S2[($R3 >> 8) & 0xff] ^
|
$S2[($R3 >> 8) & 0xff] ^
|
||||||
$S3[($R3 >> 16) & 0xff];
|
$S3[($R3 >> 16) & 0xff];
|
||||||
$R0^= ($t0 + $t1 + '.$K[++$ki].');
|
$R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . ';
|
||||||
$R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
|
$R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31);
|
||||||
$R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ($t0 + ($t1 << 1) + '.$K[++$ki].');
|
$R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . ';
|
||||||
';
|
';
|
||||||
}
|
}
|
||||||
$encrypt_block.= '
|
$encrypt_block.= '
|
||||||
@ -780,9 +788,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[$R1 & 0xff] ^
|
$S1[$R1 & 0xff] ^
|
||||||
$S2[$R1 >> 8 & 0xff] ^
|
$S2[$R1 >> 8 & 0xff] ^
|
||||||
$S3[$R1 >> 16 & 0xff];
|
$S3[$R1 >> 16 & 0xff];
|
||||||
$R3^= $t0 + ($t1 << 1) + '.$K[--$ki].';
|
$R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . ';
|
||||||
$R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
|
$R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31;
|
||||||
$R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ($t0 + $t1 + '.$K[--$ki].');
|
$R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . ';
|
||||||
|
|
||||||
$t0 = $S0[$R2 & 0xff] ^
|
$t0 = $S0[$R2 & 0xff] ^
|
||||||
$S1[$R2 >> 8 & 0xff] ^
|
$S1[$R2 >> 8 & 0xff] ^
|
||||||
@ -792,9 +800,9 @@ class Twofish extends BlockCipher
|
|||||||
$S1[$R3 & 0xff] ^
|
$S1[$R3 & 0xff] ^
|
||||||
$S2[$R3 >> 8 & 0xff] ^
|
$S2[$R3 >> 8 & 0xff] ^
|
||||||
$S3[$R3 >> 16 & 0xff];
|
$S3[$R3 >> 16 & 0xff];
|
||||||
$R1^= $t0 + ($t1 << 1) + '.$K[--$ki].';
|
$R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . ';
|
||||||
$R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
|
$R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31;
|
||||||
$R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ($t0 + $t1 + '.$K[--$ki].');
|
$R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + '.$K[--$ki] . ')') . ';
|
||||||
';
|
';
|
||||||
}
|
}
|
||||||
$decrypt_block.= '
|
$decrypt_block.= '
|
||||||
|
Loading…
Reference in New Issue
Block a user