: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Class ParagonIE_Sodium_Core32_Int32
* Encapsulates a 32-bit integer.
* These are immutable. It always returns a new instance.
class ParagonIE_Sodium_Core32_Int32
* @var array<int, int> - two 16-bit integers
* 0 is the higher 16 bits
public $limbs = array(0, 0);
public $unsignedInt = false;
* ParagonIE_Sodium_Core32_Int32 constructor.
* @param bool $unsignedInt
public function __construct($array = array(0, 0), $unsignedInt = false)
$this->unsignedInt = $unsignedInt;
* @param ParagonIE_Sodium_Core32_Int32 $addend
* @return ParagonIE_Sodium_Core32_Int32
public function addInt32(ParagonIE_Sodium_Core32_Int32 $addend)
$r1 = $i1 + ($j1 & 0xffff);
$r0 = $i0 + ($j0 & 0xffff) + $carry;
$return = new ParagonIE_Sodium_Core32_Int32(
$return->overflow = $carry;
$return->unsignedInt = $this->unsignedInt;
* Adds a normal integer to an int32 object
* @return ParagonIE_Sodium_Core32_Int32
* @throws SodiumException
public function addInt($int)
ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
$r1 = $i1 + ($int & 0xffff);
$r0 = $i0 + (($int >> 16) & 0xffff) + $carry;
$return = new ParagonIE_Sodium_Core32_Int32(
$return->overflow = $carry;
$return->unsignedInt = $this->unsignedInt;
public function compareInt($b = 0)
$x2 = ($b >> ($j << 4)) & 0xffff;
$gt |= (($x2 - $x1) >> 8) & $eq;
$eq &= (($x2 ^ $x1) - 1) >> 8;
return ($gt + $gt - $eq) + 1;
* @return ParagonIE_Sodium_Core32_Int32
public function mask($m = 0)
$lo = ((int) $m) & 0xffff;
return new ParagonIE_Sodium_Core32_Int32(
(int) ($this->limbs[0] & $hi),
(int) ($this->limbs[1] & $lo)
* @param array<int, int> $a
* @param array<int, int> $b
* @return array<int, int>
public function multiplyLong(array $a, array $b, $baseLog2 = 16)
/** @var array<int, int> $r */
$r = array_fill(0, $a_l + $b_l + 1, 0);
for ($i = 0; $i < $a_l; ++$i) {
for ($j = 0; $j < $a_l; ++$j) {
$product = ($a_i * $b_j) + $r[$i + $j];
$carry = ((int) $product >> $baseLog2 & 0xffff);
$r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff;
$r[$i + $j + 1] += $carry;
return array_slice($r, 0, 5);
* @return ParagonIE_Sodium_Core32_Int32
public function mulIntFast($int)
// Handle negative numbers
$aNeg = ($this->limbs[0] >> 15) & 1;
$bNeg = ($int >> 31) & 1;
$a = array_reverse($this->limbs);
for ($i = 0; $i < 2; ++$i) {
$a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 2; ++$i) {
$b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
$res = $this->multiplyLong($a, $b);
// Re-apply negation to results
for ($i = 0; $i < 2; ++$i) {
$res[$i] = (0xffff ^ $res[$i]) & 0xffff;
// Handle integer overflow
for ($i = 0; $i < 2; ++$i) {
$return = new ParagonIE_Sodium_Core32_Int32();
$return->overflow = $res[2] & 0xffff;
$return->unsignedInt = $this->unsignedInt;
* @param ParagonIE_Sodium_Core32_Int32 $right
* @return ParagonIE_Sodium_Core32_Int32
public function mulInt32Fast(ParagonIE_Sodium_Core32_Int32 $right)
$aNeg = ($this->limbs[0] >> 15) & 1;
$bNeg = ($right->limbs[0] >> 15) & 1;
$a = array_reverse($this->limbs);
$b = array_reverse($right->limbs);
for ($i = 0; $i < 2; ++$i) {
$a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 2; ++$i) {
$b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
$res = $this->multiplyLong($a, $b);
for ($i = 0; $i < 2; ++$i) {
$res[$i] = ($res[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 2; ++$i) {
$return = new ParagonIE_Sodium_Core32_Int32();
$return->overflow = $res[2];
* @return ParagonIE_Sodium_Core32_Int32
* @throws SodiumException
public function mulInt($int = 0, $size = 0)
ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
if (ParagonIE_Sodium_Compat::$fastMult) {
return $this->mulIntFast((int) $int);
$return = new ParagonIE_Sodium_Core32_Int32();
$return->unsignedInt = $this->unsignedInt;
for ($i = $size; $i >= 0; --$i) {
$m = (int) (-($int & 1));
$return->limbs[0] = $ret0;
$return->limbs[1] = $ret1;
* @param ParagonIE_Sodium_Core32_Int32 $int
* @return ParagonIE_Sodium_Core32_Int32
* @throws SodiumException
public function mulInt32(ParagonIE_Sodium_Core32_Int32 $int, $size = 0)
ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
if (ParagonIE_Sodium_Compat::$fastMult) {
return $this->mulInt32Fast($int);
$return = new ParagonIE_Sodium_Core32_Int32();
$return->unsignedInt = $this->unsignedInt;
for ($i = $size; $i >= 0; --$i) {
$b1 = (($b1 | $x0) >> 1);
$return->limbs[0] = $ret0;
$return->limbs[1] = $ret1;
* OR this 32-bit integer with another.
* @param ParagonIE_Sodium_Core32_Int32 $b
* @return ParagonIE_Sodium_Core32_Int32
public function orInt32(ParagonIE_Sodium_Core32_Int32 $b)
$return = new ParagonIE_Sodium_Core32_Int32();
$return->unsignedInt = $this->unsignedInt;
(int) ($this->limbs[0] | $b->limbs[0]),
(int) ($this->limbs[1] | $b->limbs[1])
$return->overflow = $this->overflow | $b->overflow;
public function isGreaterThan($b = 0)
return $this->compareInt($b) > 0;
public function isLessThanInt($b = 0)
return $this->compareInt($b) < 0;
* @return ParagonIE_Sodium_Core32_Int32
* @throws SodiumException
* @psalm-suppress MixedArrayAccess
public function rotateLeft($c = 0)
ParagonIE_Sodium_Core32_Util::declareScalarType($c, 'int', 1);
$return = new ParagonIE_Sodium_Core32_Int32();
$return->unsignedInt = $this->unsignedInt;
// NOP, but we want a copy.
$return->limbs = $this->limbs;
/** @var int $idx_shift */
$idx_shift = ($c >> 4) & 1;
/** @var int $sub_shift */
/** @var array<int, int> $limbs */
$limbs =& $return->limbs;
/** @var array<int, int> $myLimbs */
$myLimbs =& $this->limbs;
for ($i = 1; $i >= 0; --$i) {
$j = ($i + $idx_shift) & 1;
$k = ($i + $idx_shift + 1) & 1;
((int) ($myLimbs[$j]) << $sub_shift)
((int) ($myLimbs[$k]) >> (16 - $sub_shift))