: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
$st = hash_init('sha512');
self::hash_update($st, $ux);
self::hash_update($st, self::intToChr($t[2]));
self::hash_update($st, $ctx);
self::hash_update($st, self::intToChr($ctx_len));
$ux = hash_final($st, true);
$amount = min($hLen - $i, 128);
for ($j = 0; $j < $amount; ++$j) {
$h[$i + $j] = self::chrToInt($ux[$i]);
return self::intArrayToString(array_slice($h, 0, $hLen));
* @throws SodiumException
public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
case self::CORE_H2C_SHA256:
return self::h2c_string_to_hash_sha256($hLen, $ctx, $msg);
case self::CORE_H2C_SHA512:
return self::h2c_string_to_hash_sha512($hLen, $ctx, $msg);
throw new SodiumException('Invalid H2C hash algorithm');
* @throws SodiumException
protected static function _string_to_element($ctx, $msg, $hash_alg)
return self::ristretto255_from_hash(
self::h2c_string_to_hash(self::crypto_core_ristretto255_HASHBYTES, $ctx, $msg, $hash_alg)
* @throws SodiumException
public static function ristretto255_random()
return self::ristretto255_from_hash(
ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
* @throws SodiumException
public static function ristretto255_scalar_random()
return self::scalar_random();
* @throws SodiumException
public static function ristretto255_scalar_complement($s)
return self::scalar_complement($s);
public static function ristretto255_scalar_invert($s)
return self::sc25519_invert($s);
* @throws SodiumException
public static function ristretto255_scalar_negate($s)
return self::scalar_negate($s);
public static function ristretto255_scalar_add($x, $y)
return self::scalar_add($x, $y);
public static function ristretto255_scalar_sub($x, $y)
return self::scalar_sub($x, $y);
public static function ristretto255_scalar_mul($x, $y)
return self::sc25519_mul($x, $y);
* @throws SodiumException
public static function ristretto255_scalar_from_string($ctx, $msg, $hash_alg)
$h = array_fill(0, 64, 0);
$h_be = self::stringToIntArray(
self::h2c_string_to_hash(
self::HASH_SC_L, $ctx, $msg, $hash_alg
for ($i = 0; $i < self::HASH_SC_L; ++$i) {
$h[$i] = $h_be[self::HASH_SC_L - 1 - $i];
return self::ristretto255_scalar_reduce(self::intArrayToString($h));
public static function ristretto255_scalar_reduce($s)
return self::sc_reduce($s);
* @throws SodiumException
public static function scalarmult_ristretto255($n, $p)
if (self::strlen($n) !== 32) {
throw new SodiumException('Scalar must be 32 bytes, ' . self::strlen($p) . ' given.');
if (self::strlen($p) !== 32) {
throw new SodiumException('Point must be 32 bytes, ' . self::strlen($p) . ' given.');
$result = self::ristretto255_frombytes($p);
if ($result['res'] !== 0) {
throw new SodiumException('Could not multiply points');
$t = self::stringToIntArray($n);
$Q = self::ge_scalarmult(self::intArrayToString($t), $P);
$q = self::ristretto255_p3_tobytes($Q);
if (ParagonIE_Sodium_Compat::is_zero($q)) {
throw new SodiumException('An unknown error has occurred');
* @throws SodiumException
public static function scalarmult_ristretto255_base($n)
$t = self::stringToIntArray($n);
$Q = self::ge_scalarmult_base(self::intArrayToString($t));
$q = self::ristretto255_p3_tobytes($Q);
if (ParagonIE_Sodium_Compat::is_zero($q)) {
throw new SodiumException('An unknown error has occurred');