mirror of
https://github.com/phpseclib/phpseclib.git
synced 2025-01-13 18:02:58 +00:00
bcscale($x), for $x > 0, made this library produce bad results
git-svn-id: http://phpseclib.svn.sourceforge.net/svnroot/phpseclib/trunk@82 21d32557-59b3-4da0-833f-c5933fad653e
This commit is contained in:
parent
f96700960a
commit
ea4fd863d4
@ -67,7 +67,7 @@
|
||||
* @author Jim Wigginton <terrafrost@php.net>
|
||||
* @copyright MMVI Jim Wigginton
|
||||
* @license http://www.gnu.org/licenses/lgpl.txt
|
||||
* @version $Id: BigInteger.php,v 1.27 2010-01-26 23:57:27 terrafrost Exp $
|
||||
* @version $Id: BigInteger.php,v 1.28 2010-02-07 01:54:51 terrafrost Exp $
|
||||
* @link http://pear.php.net/package/Math_BigInteger
|
||||
*/
|
||||
|
||||
@ -317,8 +317,8 @@ class Math_BigInteger {
|
||||
$x = str_pad($x, $len, chr(0), STR_PAD_LEFT);
|
||||
|
||||
for ($i = 0; $i < $len; $i+= 4) {
|
||||
$this->value = bcmul($this->value, '4294967296'); // 4294967296 == 2**32
|
||||
$this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])));
|
||||
$this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32
|
||||
$this->value = bcadd($this->value, 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord($x[$i + 2]) << 8) | ord($x[$i + 3])), 0);
|
||||
}
|
||||
|
||||
if ($this->is_negative) {
|
||||
@ -515,10 +515,10 @@ class Math_BigInteger {
|
||||
$current = substr($current, 1);
|
||||
}
|
||||
|
||||
while (bccomp($current, '0') > 0) {
|
||||
while (bccomp($current, '0', 0) > 0) {
|
||||
$temp = bcmod($current, 0x1000000);
|
||||
$value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value;
|
||||
$current = bcdiv($current, 0x1000000);
|
||||
$current = bcdiv($current, 0x1000000, 0);
|
||||
}
|
||||
|
||||
return $this->precision > 0 ?
|
||||
@ -787,7 +787,7 @@ class Math_BigInteger {
|
||||
return $this->_normalize($temp);
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp = new Math_BigInteger();
|
||||
$temp->value = bcadd($this->value, $y->value);
|
||||
$temp->value = bcadd($this->value, $y->value, 0);
|
||||
|
||||
return $this->_normalize($temp);
|
||||
}
|
||||
@ -918,7 +918,7 @@ class Math_BigInteger {
|
||||
return $this->_normalize($temp);
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp = new Math_BigInteger();
|
||||
$temp->value = bcsub($this->value, $y->value);
|
||||
$temp->value = bcsub($this->value, $y->value, 0);
|
||||
|
||||
return $this->_normalize($temp);
|
||||
}
|
||||
@ -1053,7 +1053,7 @@ class Math_BigInteger {
|
||||
return $this->_normalize($temp);
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp = new Math_BigInteger();
|
||||
$temp->value = bcmul($this->value, $x->value);
|
||||
$temp->value = bcmul($this->value, $x->value, 0);
|
||||
|
||||
return $this->_normalize($temp);
|
||||
}
|
||||
@ -1348,11 +1348,11 @@ class Math_BigInteger {
|
||||
$quotient = new Math_BigInteger();
|
||||
$remainder = new Math_BigInteger();
|
||||
|
||||
$quotient->value = bcdiv($this->value, $y->value);
|
||||
$quotient->value = bcdiv($this->value, $y->value, 0);
|
||||
$remainder->value = bcmod($this->value, $y->value);
|
||||
|
||||
if ($remainder->value[0] == '-') {
|
||||
$remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value);
|
||||
$remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0);
|
||||
}
|
||||
|
||||
return array($this->_normalize($quotient), $this->_normalize($remainder));
|
||||
@ -1591,7 +1591,7 @@ class Math_BigInteger {
|
||||
return $this->_normalize($temp);
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp = new Math_BigInteger();
|
||||
$temp->value = bcpowmod($this->value, $e->value, $n->value);
|
||||
$temp->value = bcpowmod($this->value, $e->value, $n->value, 0);
|
||||
|
||||
return $this->_normalize($temp);
|
||||
}
|
||||
@ -2396,20 +2396,20 @@ class Math_BigInteger {
|
||||
$c = '0';
|
||||
$d = '1';
|
||||
|
||||
while (bccomp($v, '0') != 0) {
|
||||
$q = bcdiv($u, $v);
|
||||
while (bccomp($v, '0', 0) != 0) {
|
||||
$q = bcdiv($u, $v, 0);
|
||||
|
||||
$temp = $u;
|
||||
$u = $v;
|
||||
$v = bcsub($temp, bcmul($v, $q));
|
||||
$v = bcsub($temp, bcmul($v, $q, 0), 0);
|
||||
|
||||
$temp = $a;
|
||||
$a = $c;
|
||||
$c = bcsub($temp, bcmul($a, $q));
|
||||
$c = bcsub($temp, bcmul($a, $q, 0), 0);
|
||||
|
||||
$temp = $b;
|
||||
$b = $d;
|
||||
$d = bcsub($temp, bcmul($b, $q));
|
||||
$d = bcsub($temp, bcmul($b, $q, 0), 0);
|
||||
}
|
||||
|
||||
return array(
|
||||
@ -2524,7 +2524,7 @@ class Math_BigInteger {
|
||||
$temp->value = gmp_abs($this->value);
|
||||
break;
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp->value = (bccomp($this->value, '0') < 0) ? substr($this->value, 1) : $this->value;
|
||||
$temp->value = (bccomp($this->value, '0', 0) < 0) ? substr($this->value, 1) : $this->value;
|
||||
break;
|
||||
default:
|
||||
$temp->value = $this->value;
|
||||
@ -2557,7 +2557,7 @@ class Math_BigInteger {
|
||||
case MATH_BIGINTEGER_MODE_GMP:
|
||||
return gmp_cmp($this->value, $y->value);
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
return bccomp($this->value, $y->value);
|
||||
return bccomp($this->value, $y->value, 0);
|
||||
}
|
||||
|
||||
return $this->_compare($this->value, $this->is_negative, $y->value, $y->is_negative);
|
||||
@ -2634,7 +2634,7 @@ class Math_BigInteger {
|
||||
if ( MATH_BIGINTEGER_MODE != MATH_BIGINTEGER_MODE_BCMATH ) {
|
||||
$this->bitmask = new Math_BigInteger(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256);
|
||||
} else {
|
||||
$this->bitmask = new Math_BigInteger(bcpow('2', $bits));
|
||||
$this->bitmask = new Math_BigInteger(bcpow('2', $bits, 0));
|
||||
}
|
||||
|
||||
$temp = $this->_normalize($this);
|
||||
@ -2824,7 +2824,7 @@ class Math_BigInteger {
|
||||
|
||||
break;
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp->value = bcdiv($this->value, bcpow('2', $shift));
|
||||
$temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0);
|
||||
|
||||
break;
|
||||
default: // could just replace _lshift with this, but then all _lshift() calls would need to be rewritten
|
||||
@ -2862,7 +2862,7 @@ class Math_BigInteger {
|
||||
|
||||
break;
|
||||
case MATH_BIGINTEGER_MODE_BCMATH:
|
||||
$temp->value = bcmul($this->value, bcpow('2', $shift));
|
||||
$temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0);
|
||||
|
||||
break;
|
||||
default: // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten
|
||||
@ -3229,7 +3229,7 @@ class Math_BigInteger {
|
||||
$s = 0;
|
||||
// if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals($one) check earlier
|
||||
while ($r->value[strlen($r->value) - 1] % 2 == 0) {
|
||||
$r->value = bcdiv($r->value, 2);
|
||||
$r->value = bcdiv($r->value, 2, 0);
|
||||
++$s;
|
||||
}
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user