: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
* Class ParagonIE_Sodium_Core32_Int64
* Encapsulates a 64-bit integer.
* These are immutable. It always returns a new instance.
class ParagonIE_Sodium_Core32_Int64
* @var array<int, int> - four 16-bit integers
public $limbs = array(0, 0, 0, 0);
public $unsignedInt = false;
* ParagonIE_Sodium_Core32_Int64 constructor.
* @param bool $unsignedInt
public function __construct($array = array(0, 0, 0, 0), $unsignedInt = false)
$this->unsignedInt = $unsignedInt;
* @param ParagonIE_Sodium_Core32_Int64 $addend
* @return ParagonIE_Sodium_Core32_Int64
public function addInt64(ParagonIE_Sodium_Core32_Int64 $addend)
$r3 = $i3 + ($j3 & 0xffff);
$r2 = $i2 + ($j2 & 0xffff) + $carry;
$r1 = $i1 + ($j1 & 0xffff) + $carry;
$r0 = $i0 + ($j0 & 0xffff) + $carry;
$return = new ParagonIE_Sodium_Core32_Int64(
array($r0, $r1, $r2, $r3)
$return->overflow = $carry;
$return->unsignedInt = $this->unsignedInt;
* Adds a normal integer to an int64 object
* @return ParagonIE_Sodium_Core32_Int64
* @throws SodiumException
public function addInt($int)
ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
$r3 = $i3 + ($int & 0xffff);
$r2 = $i2 + (($int >> 16) & 0xffff) + $carry;
$return = new ParagonIE_Sodium_Core32_Int64(
array($r0, $r1, $r2, $r3)
$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;
public function isGreaterThan($b = 0)
return $this->compareInt($b) > 0;
public function isLessThanInt($b = 0)
return $this->compareInt($b) < 0;
* @return ParagonIE_Sodium_Core32_Int64
public function mask64($hi = 0, $lo = 0)
$a = ($hi >> 16) & 0xffff;
$c = ($lo >> 16) & 0xffff;
return new ParagonIE_Sodium_Core32_Int64(
* @return ParagonIE_Sodium_Core32_Int64
* @throws SodiumException
* @psalm-suppress MixedAssignment
public function mulInt($int = 0, $size = 0)
if (ParagonIE_Sodium_Compat::$fastMult) {
return $this->mulIntFast($int);
ParagonIE_Sodium_Core32_Util::declareScalarType($int, 'int', 1);
ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
$return = new ParagonIE_Sodium_Core32_Int64();
$return->unsignedInt = $this->unsignedInt;
for ($i = $size; $i >= 0; --$i) {
$return->limbs[0] = $ret0;
$return->limbs[1] = $ret1;
$return->limbs[2] = $ret2;
$return->limbs[3] = $ret3;
* @param ParagonIE_Sodium_Core32_Int64 $A
* @param ParagonIE_Sodium_Core32_Int64 $B
* @return array<int, ParagonIE_Sodium_Core32_Int64>
* @throws SodiumException
* @psalm-suppress MixedInferredReturnType
public static function ctSelect(
ParagonIE_Sodium_Core32_Int64 $A,
ParagonIE_Sodium_Core32_Int64 $B
$aNeg = ($a->limbs[0] >> 15) & 1;
$bNeg = ($b->limbs[0] >> 15) & 1;
$m = (-($aNeg & $bNeg)) | 1;
} elseif($bNeg && $aNeg) {
$x = $a->xorInt64($b)->mask64($d, $d);
$a->xorInt64($x)->mulInt($m),
$b->xorInt64($x)->mulInt($m)
* @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_Int64
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 < 4; ++$i) {
$a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 4; ++$i) {
$b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
$res = $this->multiplyLong($a, $b);
// Re-apply negation to results
for ($i = 0; $i < 4; ++$i) {
$res[$i] = (0xffff ^ $res[$i]) & 0xffff;
// Handle integer overflow
for ($i = 0; $i < 4; ++$i) {
$return = new ParagonIE_Sodium_Core32_Int64();
$return->overflow = $res[4] & 0xffff;
$return->unsignedInt = $this->unsignedInt;
* @param ParagonIE_Sodium_Core32_Int64 $right
* @return ParagonIE_Sodium_Core32_Int64
public function mulInt64Fast(ParagonIE_Sodium_Core32_Int64 $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 < 4; ++$i) {
$a[$i] = ($a[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 4; ++$i) {
$b[$i] = ($b[$i] ^ 0xffff) & 0xffff;
$res = $this->multiplyLong($a, $b);
for ($i = 0; $i < 4; ++$i) {
$res[$i] = ($res[$i] ^ 0xffff) & 0xffff;
for ($i = 0; $i < 4; ++$i) {
$return = new ParagonIE_Sodium_Core32_Int64();
$return->overflow = $res[4];
* @param ParagonIE_Sodium_Core32_Int64 $int
* @return ParagonIE_Sodium_Core32_Int64
* @throws SodiumException
* @psalm-suppress MixedAssignment
public function mulInt64(ParagonIE_Sodium_Core32_Int64 $int, $size = 0)
if (ParagonIE_Sodium_Compat::$fastMult) {
return $this->mulInt64Fast($int);
ParagonIE_Sodium_Core32_Util::declareScalarType($size, 'int', 2);
list($a, $b) = self::ctSelect($this, $int);
$return = new ParagonIE_Sodium_Core32_Int64();
$return->unsignedInt = $this->unsignedInt;
for ($i = (int) $size; $i >= 0; --$i) {