rebase on oct-10-2023
This commit is contained in:
@@ -28,19 +28,19 @@
|
||||
*/
|
||||
|
||||
if (!is_callable('RandomCompat_intval')) {
|
||||
|
||||
|
||||
/**
|
||||
* Cast to an integer if we can, safely.
|
||||
*
|
||||
*
|
||||
* If you pass it a float in the range (~PHP_INT_MAX, PHP_INT_MAX)
|
||||
* (non-inclusive), it will sanely cast it to an int. If you it's equal to
|
||||
* ~PHP_INT_MAX or PHP_INT_MAX, we let it fail as not an integer. Floats
|
||||
* lose precision, so the <= and => operators might accidentally let a float
|
||||
* through.
|
||||
*
|
||||
*
|
||||
* @param int|float $number The number we want to convert to an int
|
||||
* @param bool $fail_open Set to true to not throw an exception
|
||||
*
|
||||
*
|
||||
* @return float|int
|
||||
* @psalm-suppress InvalidReturnType
|
||||
*
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
@@ -31,7 +31,7 @@ if (!class_exists('Error', false)) {
|
||||
// We can't really avoid making this extend Exception in PHP 5.
|
||||
class Error extends Exception
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,12 +39,12 @@ if (!class_exists('TypeError', false)) {
|
||||
if (is_subclass_of('Error', 'Exception')) {
|
||||
class TypeError extends Error
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
} else {
|
||||
class TypeError extends Exception
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -55,9 +55,9 @@ if (!defined('RANDOM_COMPAT_READ_BUFFER')) {
|
||||
|
||||
$RandomCompatDIR = dirname(__FILE__);
|
||||
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'byte_safe_strings.php';
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'cast_to_int.php';
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'error_polyfill.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'byte_safe_strings.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'cast_to_int.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'error_polyfill.php';
|
||||
|
||||
if (!is_callable('random_bytes')) {
|
||||
/**
|
||||
@@ -77,9 +77,9 @@ if (!is_callable('random_bytes')) {
|
||||
if (extension_loaded('libsodium')) {
|
||||
// See random_bytes_libsodium.php
|
||||
if (PHP_VERSION_ID >= 50300 && is_callable('\\Sodium\\randombytes_buf')) {
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium.php';
|
||||
} elseif (method_exists('Sodium', 'randombytes_buf')) {
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_libsodium_legacy.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_libsodium_legacy.php';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ if (!is_callable('random_bytes')) {
|
||||
// place, that is not helpful to us here.
|
||||
|
||||
// See random_bytes_dev_urandom.php
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_dev_urandom.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_dev_urandom.php';
|
||||
}
|
||||
// Unset variables after use
|
||||
$RandomCompat_basedir = null;
|
||||
@@ -160,7 +160,7 @@ if (!is_callable('random_bytes')) {
|
||||
extension_loaded('mcrypt')
|
||||
) {
|
||||
// See random_bytes_mcrypt.php
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_mcrypt.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_mcrypt.php';
|
||||
}
|
||||
$RandomCompatUrandom = null;
|
||||
|
||||
@@ -183,9 +183,10 @@ if (!is_callable('random_bytes')) {
|
||||
if (!in_array('com', $RandomCompat_disabled_classes)) {
|
||||
try {
|
||||
$RandomCompatCOMtest = new COM('CAPICOM.Utilities.1');
|
||||
if (method_exists($RandomCompatCOMtest, 'GetRandom')) {
|
||||
/** @psalm-suppress TypeDoesNotContainType */
|
||||
if (is_callable(array($RandomCompatCOMtest, 'GetRandom'))) {
|
||||
// See random_bytes_com_dotnet.php
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_bytes_com_dotnet.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_bytes_com_dotnet.php';
|
||||
}
|
||||
} catch (com_exception $e) {
|
||||
// Don't try to use it.
|
||||
@@ -220,7 +221,7 @@ if (!is_callable('random_bytes')) {
|
||||
}
|
||||
|
||||
if (!is_callable('random_int')) {
|
||||
require_once $RandomCompatDIR . DIRECTORY_SEPARATOR . 'random_int.php';
|
||||
require_once $RandomCompatDIR.DIRECTORY_SEPARATOR.'random_int.php';
|
||||
}
|
||||
|
||||
$RandomCompatDIR = null;
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
@@ -89,4 +89,4 @@ if (!is_callable('random_bytes')) {
|
||||
'Could not gather sufficient random data'
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
@@ -37,6 +37,7 @@ if (!is_callable('random_bytes')) {
|
||||
* random numbers in accordance with best practices
|
||||
*
|
||||
* Why we use /dev/urandom and not /dev/random
|
||||
* @ref https://www.2uo.de/myths-about-urandom
|
||||
* @ref http://sockpuppet.org/blog/2014/02/25/safely-generate-random-numbers
|
||||
*
|
||||
* @param int $bytes
|
||||
@@ -55,17 +56,35 @@ if (!is_callable('random_bytes')) {
|
||||
*/
|
||||
if (empty($fp)) {
|
||||
/**
|
||||
* We use /dev/urandom if it is a char device.
|
||||
* We never fall back to /dev/random
|
||||
* We don't want to ever read C:\dev\random, only /dev/urandom on
|
||||
* Unix-like operating systems. While we guard against this
|
||||
* condition in random.php, it doesn't hurt to be defensive in depth
|
||||
* here.
|
||||
*
|
||||
* To that end, we only try to open /dev/urandom if we're on a Unix-
|
||||
* like operating system (which means the directory separator is set
|
||||
* to "/" not "\".
|
||||
*/
|
||||
/** @var resource|bool $fp */
|
||||
$fp = fopen('/dev/urandom', 'rb');
|
||||
if (is_resource($fp)) {
|
||||
/** @var array<string, int> $st */
|
||||
$st = fstat($fp);
|
||||
if (($st['mode'] & 0170000) !== 020000) {
|
||||
fclose($fp);
|
||||
$fp = false;
|
||||
if (DIRECTORY_SEPARATOR === '/') {
|
||||
if (!is_readable('/dev/urandom')) {
|
||||
throw new Exception(
|
||||
'Environment misconfiguration: ' .
|
||||
'/dev/urandom cannot be read.'
|
||||
);
|
||||
}
|
||||
/**
|
||||
* We use /dev/urandom if it is a char device.
|
||||
* We never fall back to /dev/random
|
||||
*/
|
||||
/** @var resource|bool $fp */
|
||||
$fp = fopen('/dev/urandom', 'rb');
|
||||
if (is_resource($fp)) {
|
||||
/** @var array<string, int> $st */
|
||||
$st = fstat($fp);
|
||||
if (($st['mode'] & 0170000) !== 020000) {
|
||||
fclose($fp);
|
||||
$fp = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,29 +148,28 @@ if (!is_callable('random_bytes')) {
|
||||
*/
|
||||
$read = fread($fp, $remaining);
|
||||
if (!is_string($read)) {
|
||||
if ($read === false) {
|
||||
/**
|
||||
* We cannot safely read from the file. Exit the
|
||||
* do-while loop and trigger the exception condition
|
||||
*
|
||||
* @var string|bool
|
||||
*/
|
||||
$buf = false;
|
||||
break;
|
||||
}
|
||||
/**
|
||||
* We cannot safely read from the file. Exit the
|
||||
* do-while loop and trigger the exception condition
|
||||
*
|
||||
* @var string|bool
|
||||
*/
|
||||
$buf = false;
|
||||
break;
|
||||
}
|
||||
/**
|
||||
* Decrease the number of bytes returned from remaining
|
||||
*/
|
||||
$remaining -= RandomCompat_strlen($read);
|
||||
/**
|
||||
* @var string|bool
|
||||
* @var string $buf
|
||||
*/
|
||||
$buf = $buf . $read;
|
||||
$buf .= $read;
|
||||
} while ($remaining > 0);
|
||||
|
||||
/**
|
||||
* Is our result valid?
|
||||
* @var string|bool $buf
|
||||
*/
|
||||
if (is_string($buf)) {
|
||||
if (RandomCompat_strlen($buf) === $bytes) {
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
|
||||
@@ -1,23 +1,23 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
/**
|
||||
* Random_* Compatibility Library
|
||||
* Random_* Compatibility Library
|
||||
* for using the new PHP 7 random_* API in PHP 5 projects
|
||||
*
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2015 - 2018 Paragon Initiative Enterprises
|
||||
*
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
require_once 'lib/byte_safe_strings.php';
|
||||
require_once 'lib/cast_to_int.php';
|
||||
require_once 'lib/error_polyfill.php';
|
||||
require_once 'other/ide_stubs/libsodium.php';
|
||||
require_once 'lib/random.php';
|
||||
|
||||
$int = random_int(0, 65536);
|
||||
@@ -1,21 +1,16 @@
|
||||
/*
|
||||
* ISC License
|
||||
*
|
||||
* Copyright (c) 2016-2019
|
||||
* Paragon Initiative Enterprises <security at paragonie dot com>
|
||||
*
|
||||
* Copyright (c) 2013-2019
|
||||
* Frank Denis <j at pureftpd dot org>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
ISC License
|
||||
|
||||
Copyright (c) 2016-2023, Paragon Initiative Enterprises <security at paragonie dot com>
|
||||
Copyright (c) 2013-2019, Frank Denis <j at pureftpd dot org>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
require_once 'autoload.php';
|
||||
ParagonIE_Sodium_Compat::$fastMult = true;
|
||||
@@ -1,7 +0,0 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
require_once 'autoload.php';
|
||||
define('DO_PEDANTIC_TEST', true);
|
||||
|
||||
ParagonIE_Sodium_Compat::$fastMult = true;
|
||||
@@ -1,8 +0,0 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
require_once (dirname(__FILE__) . '/vendor/autoload.php');
|
||||
|
||||
if (PHP_VERSION_ID >= 50300) {
|
||||
require_once (dirname(__FILE__) . '/tests/phpunit-shim.php');
|
||||
}
|
||||
@@ -42,6 +42,11 @@ if (PHP_VERSION_ID < 70000) {
|
||||
require_once dirname(__FILE__) . '/autoload-php7.php';
|
||||
}
|
||||
|
||||
/* Explicitly, always load the Compat class: */
|
||||
if (!class_exists('ParagonIE_Sodium_Compat', false)) {
|
||||
require_once dirname(__FILE__) . '/src/Compat.php';
|
||||
}
|
||||
|
||||
if (!class_exists('SodiumException', false)) {
|
||||
require_once dirname(__FILE__) . '/src/SodiumException.php';
|
||||
}
|
||||
@@ -62,5 +67,10 @@ if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) {
|
||||
} else {
|
||||
assert(class_exists('ParagonIE_Sodium_Compat'));
|
||||
}
|
||||
require_once (dirname(__FILE__) . '/lib/php72compat.php');
|
||||
require_once(dirname(__FILE__) . '/lib/php72compat.php');
|
||||
} elseif (!function_exists('sodium_crypto_stream_xchacha20_xor')) {
|
||||
// Older versions of {PHP, ext/sodium} will not define these
|
||||
require_once(dirname(__FILE__) . '/lib/php72compat.php');
|
||||
}
|
||||
require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php');
|
||||
require_once(dirname(__FILE__) . '/lib/ristretto255.php');
|
||||
|
||||
@@ -95,6 +95,8 @@ foreach (array(
|
||||
'CRYPTO_SIGN_KEYPAIRBYTES',
|
||||
'CRYPTO_STREAM_KEYBYTES',
|
||||
'CRYPTO_STREAM_NONCEBYTES',
|
||||
'CRYPTO_STREAM_XCHACHA20_KEYBYTES',
|
||||
'CRYPTO_STREAM_XCHACHA20_NONCEBYTES',
|
||||
'LIBRARY_MAJOR_VERSION',
|
||||
'LIBRARY_MINOR_VERSION',
|
||||
'LIBRARY_VERSION_MAJOR',
|
||||
@@ -109,14 +111,14 @@ foreach (array(
|
||||
if (!is_callable('sodium_add')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::add()
|
||||
* @param string $val
|
||||
* @param string $addv
|
||||
* @param string $string1
|
||||
* @param string $string2
|
||||
* @return void
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_add(&$val, $addv)
|
||||
function sodium_add(&$string1, $string2)
|
||||
{
|
||||
ParagonIE_Sodium_Compat::add($val, $addv);
|
||||
ParagonIE_Sodium_Compat::add($string1, $string2);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_base642bin')) {
|
||||
@@ -164,33 +166,41 @@ if (!is_callable('sodium_bin2hex')) {
|
||||
if (!is_callable('sodium_compare')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::compare()
|
||||
* @param string $a
|
||||
* @param string $b
|
||||
* @param string $string1
|
||||
* @param string $string2
|
||||
* @return int
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_compare($a, $b)
|
||||
function sodium_compare($string1, $string2)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::compare($a, $b);
|
||||
return ParagonIE_Sodium_Compat::compare($string1, $string2);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_aead_aes256gcm_decrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $ciphertext
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_aead_aes256gcm_decrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt(
|
||||
$ciphertext,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
if (($ex instanceof SodiumException) && ($ex->getMessage() === 'AES-256-GCM is not available')) {
|
||||
throw $ex;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -199,16 +209,16 @@ if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_aead_aes256gcm_encrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) {
|
||||
@@ -224,16 +234,21 @@ if (!is_callable('sodium_crypto_aead_aes256gcm_is_available')) {
|
||||
if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $ciphertext
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_aead_chacha20poly1305_decrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt(
|
||||
$ciphertext,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -245,16 +260,21 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_aead_chacha20poly1305_encrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt(
|
||||
$message,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_aead_chacha20poly1305_keygen')) {
|
||||
@@ -272,15 +292,20 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_aead_chacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_chacha20poly1305_ietf_decrypt($message, $additional_data, $nonce, $key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt(
|
||||
$message,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -292,16 +317,21 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt(
|
||||
$message,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) {
|
||||
@@ -318,16 +348,22 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_keygen')) {
|
||||
if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $ciphertext
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key)
|
||||
function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt($message, $assocData, $nonce, $key, true);
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt(
|
||||
$ciphertext,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key,
|
||||
true
|
||||
);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -339,16 +375,26 @@ if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt()
|
||||
* @param string $message
|
||||
* @param string $assocData
|
||||
* @param string $additional_data
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt($message, $assocData, $nonce, $key, true);
|
||||
function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt(
|
||||
$message,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key
|
||||
) {
|
||||
return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt(
|
||||
$message,
|
||||
$additional_data,
|
||||
$nonce,
|
||||
$key,
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_keygen')) {
|
||||
@@ -407,14 +453,14 @@ if (!is_callable('sodium_crypto_box')) {
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box()
|
||||
* @param string $message
|
||||
* @param string $nonce
|
||||
* @param string $kp
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box($message, $nonce, $kp)
|
||||
function sodium_crypto_box($message, $nonce, $key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $kp);
|
||||
return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_keypair')) {
|
||||
@@ -432,29 +478,29 @@ if (!is_callable('sodium_crypto_box_keypair')) {
|
||||
if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey()
|
||||
* @param string $sk
|
||||
* @param string $pk
|
||||
* @param string $secret_key
|
||||
* @param string $public_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box_keypair_from_secretkey_and_publickey($sk, $pk)
|
||||
function sodium_crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($sk, $pk);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_open')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_open()
|
||||
* @param string $message
|
||||
* @param string $ciphertext
|
||||
* @param string $nonce
|
||||
* @param string $kp
|
||||
* @param string $key_pair
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_box_open($message, $nonce, $kp)
|
||||
function sodium_crypto_box_open($ciphertext, $nonce, $key_pair)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_box_open($message, $nonce, $kp);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -465,55 +511,55 @@ if (!is_callable('sodium_crypto_box_open')) {
|
||||
if (!is_callable('sodium_crypto_box_publickey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_publickey()
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box_publickey($keypair)
|
||||
function sodium_crypto_box_publickey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box_publickey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey()
|
||||
* @param string $sk
|
||||
* @param string $secret_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box_publickey_from_secretkey($sk)
|
||||
function sodium_crypto_box_publickey_from_secretkey($secret_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($sk);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_seal')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_seal()
|
||||
* @param string $message
|
||||
* @param string $publicKey
|
||||
* @param string $public_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box_seal($message, $publicKey)
|
||||
function sodium_crypto_box_seal($message, $public_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box_seal($message, $publicKey);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_seal_open')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_seal_open()
|
||||
* @param string $message
|
||||
* @param string $kp
|
||||
* @param string $key_pair
|
||||
* @return string|bool
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_box_seal_open($message, $kp)
|
||||
function sodium_crypto_box_seal_open($message, $key_pair)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $kp);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair);
|
||||
} catch (SodiumException $ex) {
|
||||
if ($ex->getMessage() === 'Argument 2 must be CRYPTO_BOX_KEYPAIRBYTES long.') {
|
||||
throw $ex;
|
||||
@@ -525,14 +571,14 @@ if (!is_callable('sodium_crypto_box_seal_open')) {
|
||||
if (!is_callable('sodium_crypto_box_secretkey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_box_secretkey()
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_box_secretkey($keypair)
|
||||
function sodium_crypto_box_secretkey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_box_secretkey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_box_seed_keypair')) {
|
||||
@@ -553,42 +599,42 @@ if (!is_callable('sodium_crypto_generichash')) {
|
||||
* @see ParagonIE_Sodium_Compat::crypto_generichash()
|
||||
* @param string $message
|
||||
* @param string|null $key
|
||||
* @param int $outLen
|
||||
* @param int $length
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_generichash($message, $key = null, $outLen = 32)
|
||||
function sodium_crypto_generichash($message, $key = null, $length = 32)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $outLen);
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_generichash_final')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_generichash_final()
|
||||
* @param string|null $ctx
|
||||
* @param string|null $state
|
||||
* @param int $outputLength
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_generichash_final(&$ctx, $outputLength = 32)
|
||||
function sodium_crypto_generichash_final(&$state, $outputLength = 32)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash_final($ctx, $outputLength);
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash_final($state, $outputLength);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_generichash_init')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_generichash_init()
|
||||
* @param string|null $key
|
||||
* @param int $outLen
|
||||
* @param int $length
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_generichash_init($key = null, $outLen = 32)
|
||||
function sodium_crypto_generichash_init($key = null, $length = 32)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $outLen);
|
||||
return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_generichash_keygen')) {
|
||||
@@ -605,15 +651,15 @@ if (!is_callable('sodium_crypto_generichash_keygen')) {
|
||||
if (!is_callable('sodium_crypto_generichash_update')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_generichash_update()
|
||||
* @param string|null $ctx
|
||||
* @param string|null $state
|
||||
* @param string $message
|
||||
* @return void
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_generichash_update(&$ctx, $message = '')
|
||||
function sodium_crypto_generichash_update(&$state, $message = '')
|
||||
{
|
||||
ParagonIE_Sodium_Compat::crypto_generichash_update($ctx, $message);
|
||||
ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_kdf_keygen')) {
|
||||
@@ -630,17 +676,17 @@ if (!is_callable('sodium_crypto_kdf_keygen')) {
|
||||
if (!is_callable('sodium_crypto_kdf_derive_from_key')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key()
|
||||
* @param int $subkey_len
|
||||
* @param int $subkey_length
|
||||
* @param int $subkey_id
|
||||
* @param string $context
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
function sodium_crypto_kdf_derive_from_key($subkey_len, $subkey_id, $context, $key)
|
||||
function sodium_crypto_kdf_derive_from_key($subkey_length, $subkey_id, $context, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key(
|
||||
$subkey_len,
|
||||
$subkey_length,
|
||||
$subkey_id,
|
||||
$context,
|
||||
$key
|
||||
@@ -691,54 +737,54 @@ if (!is_callable('sodium_crypto_kx_keypair')) {
|
||||
}
|
||||
if (!is_callable('sodium_crypto_kx_client_session_keys')) {
|
||||
/**
|
||||
* @param string $keypair
|
||||
* @param string $serverPublicKey
|
||||
* @param string $client_key_pair
|
||||
* @param string $server_key
|
||||
* @return array{0: string, 1: string}
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_kx_client_session_keys($keypair, $serverPublicKey)
|
||||
function sodium_crypto_kx_client_session_keys($client_key_pair, $server_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($keypair, $serverPublicKey);
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_kx_server_session_keys')) {
|
||||
/**
|
||||
* @param string $keypair
|
||||
* @param string $clientPublicKey
|
||||
* @param string $server_key_pair
|
||||
* @param string $client_key
|
||||
* @return array{0: string, 1: string}
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_kx_server_session_keys($keypair, $clientPublicKey)
|
||||
function sodium_crypto_kx_server_session_keys($server_key_pair, $client_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($keypair, $clientPublicKey);
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_kx_secretkey')) {
|
||||
/**
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
function sodium_crypto_kx_secretkey($keypair)
|
||||
function sodium_crypto_kx_secretkey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_secretkey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_kx_publickey')) {
|
||||
/**
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
function sodium_crypto_kx_publickey($keypair)
|
||||
function sodium_crypto_kx_publickey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_publickey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_pwhash')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_pwhash()
|
||||
* @param int $outlen
|
||||
* @param int $length
|
||||
* @param string $passwd
|
||||
* @param string $salt
|
||||
* @param int $opslimit
|
||||
@@ -748,9 +794,9 @@ if (!is_callable('sodium_crypto_pwhash')) {
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $algo = null)
|
||||
function sodium_crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo = null)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_pwhash($outlen, $passwd, $salt, $opslimit, $memlimit, $algo);
|
||||
return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_pwhash_str')) {
|
||||
@@ -800,7 +846,7 @@ if (!is_callable('sodium_crypto_pwhash_str_verify')) {
|
||||
if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256()
|
||||
* @param int $outlen
|
||||
* @param int $length
|
||||
* @param string $passwd
|
||||
* @param string $salt
|
||||
* @param int $opslimit
|
||||
@@ -809,9 +855,15 @@ if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) {
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit)
|
||||
function sodium_crypto_pwhash_scryptsalsa208sha256($length, $passwd, $salt, $opslimit, $memlimit)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256($outlen, $passwd, $salt, $opslimit, $memlimit);
|
||||
return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256(
|
||||
$length,
|
||||
$passwd,
|
||||
$salt,
|
||||
$opslimit,
|
||||
$memlimit
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) {
|
||||
@@ -899,15 +951,15 @@ if (!is_callable('sodium_crypto_secretbox_keygen')) {
|
||||
if (!is_callable('sodium_crypto_secretbox_open')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_secretbox_open()
|
||||
* @param string $message
|
||||
* @param string $ciphertext
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_secretbox_open($message, $nonce, $key)
|
||||
function sodium_crypto_secretbox_open($ciphertext, $nonce, $key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_secretbox_open($message, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -929,15 +981,24 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) {
|
||||
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) {
|
||||
/**
|
||||
* @param string $state
|
||||
* @param string $msg
|
||||
* @param string $aad
|
||||
* @param string $message
|
||||
* @param string $additional_data
|
||||
* @param int $tag
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_secretstream_xchacha20poly1305_push(&$state, $msg, $aad = '', $tag = 0)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push($state, $msg, $aad, $tag);
|
||||
function sodium_crypto_secretstream_xchacha20poly1305_push(
|
||||
&$state,
|
||||
$message,
|
||||
$additional_data = '',
|
||||
$tag = 0
|
||||
) {
|
||||
return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_push(
|
||||
$state,
|
||||
$message,
|
||||
$additional_data,
|
||||
$tag
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) {
|
||||
@@ -955,14 +1016,18 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) {
|
||||
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) {
|
||||
/**
|
||||
* @param string $state
|
||||
* @param string $cipher
|
||||
* @param string $aad
|
||||
* @param string $ciphertext
|
||||
* @param string $additional_data
|
||||
* @return bool|array{0: string, 1: int}
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $cipher, $aad = '')
|
||||
function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $ciphertext, $additional_data = '')
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull($state, $cipher, $aad);
|
||||
return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull(
|
||||
$state,
|
||||
$ciphertext,
|
||||
$additional_data
|
||||
);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) {
|
||||
@@ -1015,42 +1080,42 @@ if (!is_callable('sodium_crypto_sign')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign()
|
||||
* @param string $message
|
||||
* @param string $sk
|
||||
* @param string $secret_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign($message, $sk)
|
||||
function sodium_crypto_sign($message, $secret_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign($message, $sk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_detached')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_detached()
|
||||
* @param string $message
|
||||
* @param string $sk
|
||||
* @param string $secret_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_detached($message, $sk)
|
||||
function sodium_crypto_sign_detached($message, $secret_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $sk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey()
|
||||
* @param string $sk
|
||||
* @param string $pk
|
||||
* @param string $secret_key
|
||||
* @param string $public_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk)
|
||||
function sodium_crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($sk, $pk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_keypair')) {
|
||||
@@ -1069,13 +1134,13 @@ if (!is_callable('sodium_crypto_sign_open')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_open()
|
||||
* @param string $signedMessage
|
||||
* @param string $pk
|
||||
* @param string $public_key
|
||||
* @return string|bool
|
||||
*/
|
||||
function sodium_crypto_sign_open($signedMessage, $pk)
|
||||
function sodium_crypto_sign_open($signedMessage, $public_key)
|
||||
{
|
||||
try {
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $pk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_open($signedMessage, $public_key);
|
||||
} catch (Error $ex) {
|
||||
return false;
|
||||
} catch (Exception $ex) {
|
||||
@@ -1086,40 +1151,40 @@ if (!is_callable('sodium_crypto_sign_open')) {
|
||||
if (!is_callable('sodium_crypto_sign_publickey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_publickey()
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_publickey($keypair)
|
||||
function sodium_crypto_sign_publickey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_publickey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey()
|
||||
* @param string $sk
|
||||
* @param string $secret_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_publickey_from_secretkey($sk)
|
||||
function sodium_crypto_sign_publickey_from_secretkey($secret_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($sk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_secretkey')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_secretkey()
|
||||
* @param string $keypair
|
||||
* @param string $key_pair
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_secretkey($keypair)
|
||||
function sodium_crypto_sign_secretkey($key_pair)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_secretkey($keypair);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_seed_keypair')) {
|
||||
@@ -1140,55 +1205,55 @@ if (!is_callable('sodium_crypto_sign_verify_detached')) {
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_verify_detached()
|
||||
* @param string $signature
|
||||
* @param string $message
|
||||
* @param string $pk
|
||||
* @param string $public_key
|
||||
* @return bool
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_verify_detached($signature, $message, $pk)
|
||||
function sodium_crypto_sign_verify_detached($signature, $message, $public_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $pk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_verify_detached($signature, $message, $public_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_ed25519_pk_to_curve25519')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519()
|
||||
* @param string $pk
|
||||
* @param string $public_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_ed25519_pk_to_curve25519($pk)
|
||||
function sodium_crypto_sign_ed25519_pk_to_curve25519($public_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($pk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_ed25519_pk_to_curve25519($public_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519()
|
||||
* @param string $sk
|
||||
* @param string $secret_key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_sign_ed25519_sk_to_curve25519($sk)
|
||||
function sodium_crypto_sign_ed25519_sk_to_curve25519($secret_key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($sk);
|
||||
return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_stream')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_stream()
|
||||
* @param int $len
|
||||
* @param int $length
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_stream($len, $nonce, $key)
|
||||
function sodium_crypto_stream($length, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_stream($len, $nonce, $key);
|
||||
return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_stream_keygen')) {
|
||||
@@ -1217,17 +1282,19 @@ if (!is_callable('sodium_crypto_stream_xor')) {
|
||||
return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key);
|
||||
}
|
||||
}
|
||||
require_once dirname(__FILE__) . '/stream-xchacha20.php';
|
||||
if (!is_callable('sodium_hex2bin')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::hex2bin()
|
||||
* @param string $string
|
||||
* @param string $ignore
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_hex2bin($string)
|
||||
function sodium_hex2bin($string, $ignore = '')
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::hex2bin($string);
|
||||
return ParagonIE_Sodium_Compat::hex2bin($string, $ignore);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_increment')) {
|
||||
@@ -1276,56 +1343,58 @@ if (!is_callable('sodium_version_string')) {
|
||||
if (!is_callable('sodium_memcmp')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::memcmp()
|
||||
* @param string $a
|
||||
* @param string $b
|
||||
* @param string $string1
|
||||
* @param string $string2
|
||||
* @return int
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_memcmp($a, $b)
|
||||
function sodium_memcmp($string1, $string2)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::memcmp($a, $b);
|
||||
return ParagonIE_Sodium_Compat::memcmp($string1, $string2);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_memzero')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::memzero()
|
||||
* @param string $str
|
||||
* @param string $string
|
||||
* @return void
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*
|
||||
* @psalm-suppress ReferenceConstraintViolation
|
||||
*/
|
||||
function sodium_memzero(&$str)
|
||||
function sodium_memzero(&$string)
|
||||
{
|
||||
ParagonIE_Sodium_Compat::memzero($str);
|
||||
ParagonIE_Sodium_Compat::memzero($string);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_pad')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::pad()
|
||||
* @param string $unpadded
|
||||
* @param int $blockSize
|
||||
* @return int
|
||||
* @param int $block_size
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_pad($unpadded, $blockSize)
|
||||
function sodium_pad($unpadded, $block_size)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::pad($unpadded, $blockSize, true);
|
||||
return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_unpad')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::pad()
|
||||
* @param string $padded
|
||||
* @param int $blockSize
|
||||
* @return int
|
||||
* @param int $block_size
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_unpad($padded, $blockSize)
|
||||
function sodium_unpad($padded, $block_size)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::unpad($padded, $blockSize, true);
|
||||
return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_randombytes_buf')) {
|
||||
|
||||
@@ -89,3 +89,5 @@ const SODIUM_CRYPTO_SIGN_SECRETKEYBYTES = 64;
|
||||
const SODIUM_CRYPTO_SIGN_KEYPAIRBYTES = 96;
|
||||
const SODIUM_CRYPTO_STREAM_KEYBYTES = 32;
|
||||
const SODIUM_CRYPTO_STREAM_NONCEBYTES = 24;
|
||||
const SODIUM_CRYPTO_STREAM_XCHACHA20_KEYBYTES = 32;
|
||||
const SODIUM_CRYPTO_STREAM_XCHACHA20_NONCEBYTES = 24;
|
||||
|
||||
240
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/lib/ristretto255.php
vendored
Normal file
240
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/lib/ristretto255.php
vendored
Normal file
@@ -0,0 +1,240 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_BYTES
|
||||
);
|
||||
define('SODIUM_COMPAT_POLYFILLED_RISTRETTO255', true);
|
||||
}
|
||||
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_CORE_RISTRETTO255_HASHBYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_HASHBYTES
|
||||
);
|
||||
}
|
||||
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_CORE_RISTRETTO255_SCALARBYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_SCALARBYTES
|
||||
);
|
||||
}
|
||||
if (!defined('SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES
|
||||
);
|
||||
}
|
||||
if (!defined('SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES
|
||||
);
|
||||
}
|
||||
if (!defined('SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES')) {
|
||||
define(
|
||||
'SODIUM_CRYPTO_SCALARMULT_RISTRETTO255_BYTES',
|
||||
ParagonIE_Sodium_Compat::CRYPTO_SCALARMULT_RISTRETTO255_BYTES
|
||||
);
|
||||
}
|
||||
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_add')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_add()
|
||||
*
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_add($p, $q)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_add($p, $q, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_from_hash')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_from_hash()
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_from_hash($s)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_from_hash($s, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_is_valid_point')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_is_valid_point()
|
||||
*
|
||||
* @param string $s
|
||||
* @return bool
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_is_valid_point($s)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_is_valid_point($s, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_random')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_random()
|
||||
*
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_random()
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_random(true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_add')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_add()
|
||||
*
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_add($x, $y)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_add($x, $y, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_complement')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_complement()
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_complement($s)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_complement($s, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_invert')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_invert()
|
||||
*
|
||||
* @param string $p
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_invert($p)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_invert($p, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_mul')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_mul()
|
||||
*
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_mul($x, $y)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_mul($x, $y, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_negate')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_negate()
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_negate($s)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_negate($s, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_random')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_random()
|
||||
*
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_random()
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_random(true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_reduce')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_reduce()
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_reduce($s)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_reduce($s, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_scalar_sub')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_scalar_sub()
|
||||
*
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_scalar_sub($x, $y)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_scalar_sub($x, $y, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_core_ristretto255_sub')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::ristretto255_sub()
|
||||
*
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
function sodium_crypto_core_ristretto255_sub($p, $q)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::ristretto255_sub($p, $q, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_scalarmult_ristretto255')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_scalarmult_ristretto255()
|
||||
* @param string $n
|
||||
* @param string $p
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_scalarmult_ristretto255($n, $p)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::scalarmult_ristretto255($n, $p, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_scalarmult_ristretto255_base')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_scalarmult_ristretto255_base()
|
||||
* @param string $n
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_scalarmult_ristretto255_base($n)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::scalarmult_ristretto255_base($n, true);
|
||||
}
|
||||
}
|
||||
@@ -392,7 +392,8 @@ if (!is_callable('\\Sodium\\crypto_kx')) {
|
||||
$my_secret,
|
||||
$their_public,
|
||||
$client_public,
|
||||
$server_public
|
||||
$server_public,
|
||||
true
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -778,6 +779,10 @@ if (!is_callable('\\Sodium\\memzero')) {
|
||||
* @return void
|
||||
* @throws \SodiumException
|
||||
* @throws \TypeError
|
||||
*
|
||||
* @psalm-suppress MissingParamType
|
||||
* @psalm-suppress MissingReturnType
|
||||
* @psalm-suppress ReferenceConstraintViolation
|
||||
*/
|
||||
function memzero(&$str)
|
||||
{
|
||||
|
||||
60
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/lib/stream-xchacha20.php
vendored
Normal file
60
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/lib/stream-xchacha20.php
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
if (!is_callable('sodium_crypto_stream_xchacha20')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20()
|
||||
* @param int $len
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_stream_xchacha20($len, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_stream_xchacha20($len, $nonce, $key, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_stream_xchacha20_keygen')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_keygen()
|
||||
* @return string
|
||||
* @throws Exception
|
||||
*/
|
||||
function sodium_crypto_stream_xchacha20_keygen()
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_keygen();
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_stream_xchacha20_xor')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor()
|
||||
* @param string $message
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_stream_xchacha20_xor($message, $nonce, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor($message, $nonce, $key, true);
|
||||
}
|
||||
}
|
||||
if (!is_callable('sodium_crypto_stream_xchacha20_xor_ic')) {
|
||||
/**
|
||||
* @see ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor_ic()
|
||||
* @param string $message
|
||||
* @param string $nonce
|
||||
* @param int $counter
|
||||
* @param string $key
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
function sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key)
|
||||
{
|
||||
return ParagonIE_Sodium_Compat::crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key, true);
|
||||
}
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
useDocblockTypes="true"
|
||||
totallyTyped="true"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src" />
|
||||
</projectFiles>
|
||||
<issueHandlers>
|
||||
<InvalidFunctionCall errorLevel="suppress" />
|
||||
<!--
|
||||
Previous issue type is suppressed because we have to use a string
|
||||
as a function name for PHP 5.2 compatibility. When testing, be sure
|
||||
to change this to "info".
|
||||
-->
|
||||
|
||||
<UndefinedFunction errorLevel="info" />
|
||||
<!--
|
||||
Inconsistently erroneous.
|
||||
-->
|
||||
|
||||
<DuplicateClass errorLevel="info" />
|
||||
<!--
|
||||
Psalm isn't correctly identifying the guard conditions that return
|
||||
early if a class already exists.
|
||||
-->
|
||||
<RedundantConditionGivenDocblockType errorLevel="suppress" />
|
||||
|
||||
<TooFewArguments errorLevel="info" />
|
||||
|
||||
<DocblockTypeContradiction errorLevel="suppress" />
|
||||
<RedundantCondition errorLevel="info" />
|
||||
<!--
|
||||
Redundancy is good for PHP <7
|
||||
-->
|
||||
|
||||
<TypeDoesNotContainType errorLevel="info" />
|
||||
<!--
|
||||
This mostly fails on `PHP_INT_SIZE === 4`
|
||||
-->
|
||||
|
||||
<InternalMethod errorLevel="suppress" />
|
||||
<!--
|
||||
We mark methods as internal.
|
||||
-->
|
||||
<PossiblyNullArgument errorLevel="suppress" />
|
||||
<!--
|
||||
Not interesting
|
||||
-->
|
||||
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
@@ -1,43 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
useDocblockTypes="true"
|
||||
totallyTyped="true"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="src" />
|
||||
</projectFiles>
|
||||
<issueHandlers>
|
||||
<InvalidFunctionCall errorLevel="suppress" />
|
||||
<!--
|
||||
Previous issue type is suppressed because we have to use a string
|
||||
as a function name for PHP 5.2 compatibility. When testing, be sure
|
||||
to change this to "info".
|
||||
-->
|
||||
|
||||
<UndefinedFunction errorLevel="info" />
|
||||
<!--
|
||||
Inconsistently erroneous.
|
||||
-->
|
||||
|
||||
<DuplicateClass errorLevel="info" />
|
||||
<!--
|
||||
Psalm isn't correctly identifying the guard conditions that return
|
||||
early if a class already exists.
|
||||
-->
|
||||
<RedundantConditionGivenDocblockType errorLevel="suppress" />
|
||||
|
||||
<TooFewArguments errorLevel="info" />
|
||||
|
||||
<DocblockTypeContradiction errorLevel="info" />
|
||||
<RedundantCondition errorLevel="info" />
|
||||
<!--
|
||||
Redundancy is good for PHP <7
|
||||
-->
|
||||
|
||||
<TypeDoesNotContainType errorLevel="info" />
|
||||
<!--
|
||||
This mostly fails on `PHP_INT_SIZE === 4`
|
||||
-->
|
||||
|
||||
</issueHandlers>
|
||||
</psalm>
|
||||
@@ -81,6 +81,10 @@ class ParagonIE_Sodium_Compat
|
||||
const CRYPTO_BOX_MACBYTES = 16;
|
||||
const CRYPTO_BOX_NONCEBYTES = 24;
|
||||
const CRYPTO_BOX_SEEDBYTES = 32;
|
||||
const CRYPTO_CORE_RISTRETTO255_BYTES = 32;
|
||||
const CRYPTO_CORE_RISTRETTO255_SCALARBYTES = 32;
|
||||
const CRYPTO_CORE_RISTRETTO255_HASHBYTES = 64;
|
||||
const CRYPTO_CORE_RISTRETTO255_NONREDUCEDSCALARBYTES = 64;
|
||||
const CRYPTO_KDF_BYTES_MIN = 16;
|
||||
const CRYPTO_KDF_BYTES_MAX = 64;
|
||||
const CRYPTO_KDF_CONTEXTBYTES = 8;
|
||||
@@ -116,6 +120,8 @@ class ParagonIE_Sodium_Compat
|
||||
const CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_SENSITIVE = 1073741824;
|
||||
const CRYPTO_SCALARMULT_BYTES = 32;
|
||||
const CRYPTO_SCALARMULT_SCALARBYTES = 32;
|
||||
const CRYPTO_SCALARMULT_RISTRETTO255_BYTES = 32;
|
||||
const CRYPTO_SCALARMULT_RISTRETTO255_SCALARBYTES = 32;
|
||||
const CRYPTO_SHORTHASH_BYTES = 8;
|
||||
const CRYPTO_SHORTHASH_KEYBYTES = 16;
|
||||
const CRYPTO_SECRETBOX_KEYBYTES = 32;
|
||||
@@ -136,6 +142,8 @@ class ParagonIE_Sodium_Compat
|
||||
const CRYPTO_SIGN_KEYPAIRBYTES = 96;
|
||||
const CRYPTO_STREAM_KEYBYTES = 32;
|
||||
const CRYPTO_STREAM_NONCEBYTES = 24;
|
||||
const CRYPTO_STREAM_XCHACHA20_KEYBYTES = 32;
|
||||
const CRYPTO_STREAM_XCHACHA20_NONCEBYTES = 24;
|
||||
|
||||
/**
|
||||
* Add two numbers (little-endian unsigned), storing the value in the first
|
||||
@@ -728,7 +736,9 @@ class ParagonIE_Sodium_Compat
|
||||
) {
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
if (!is_null($assocData)) {
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
}
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);
|
||||
|
||||
@@ -815,7 +825,11 @@ class ParagonIE_Sodium_Compat
|
||||
) {
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($ciphertext, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
if (!is_null($assocData)) {
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
} else {
|
||||
$assocData = '';
|
||||
}
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);
|
||||
|
||||
@@ -886,7 +900,11 @@ class ParagonIE_Sodium_Compat
|
||||
) {
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($plaintext, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
if (!is_null($assocData)) {
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($assocData, 'string', 2);
|
||||
} else {
|
||||
$assocData = '';
|
||||
}
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 3);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);
|
||||
|
||||
@@ -1689,12 +1707,13 @@ class ParagonIE_Sodium_Compat
|
||||
* @param string $their_public
|
||||
* @param string $client_public
|
||||
* @param string $server_public
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress MixedArgument
|
||||
*/
|
||||
public static function crypto_kx($my_secret, $their_public, $client_public, $server_public)
|
||||
public static function crypto_kx($my_secret, $their_public, $client_public, $server_public, $dontFallback = false)
|
||||
{
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($my_secret, 'string', 1);
|
||||
@@ -1716,7 +1735,7 @@ class ParagonIE_Sodium_Compat
|
||||
throw new SodiumException('Argument 4 must be CRYPTO_BOX_PUBLICKEYBYTES long.');
|
||||
}
|
||||
|
||||
if (self::useNewSodiumAPI()) {
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
if (is_callable('sodium_crypto_kx')) {
|
||||
return (string) sodium_crypto_kx(
|
||||
$my_secret,
|
||||
@@ -2995,7 +3014,7 @@ class ParagonIE_Sodium_Compat
|
||||
/**
|
||||
* DANGER! UNAUTHENTICATED ENCRYPTION!
|
||||
*
|
||||
* Unless you are following expert advice, do not used this feature.
|
||||
* Unless you are following expert advice, do not use this feature.
|
||||
*
|
||||
* Algorithm: XSalsa20
|
||||
*
|
||||
@@ -3051,30 +3070,178 @@ class ParagonIE_Sodium_Compat
|
||||
return random_bytes(self::CRYPTO_STREAM_KEYBYTES);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Expand a key and nonce into a keystream of pseudorandom bytes.
|
||||
*
|
||||
* @param int $len Number of bytes desired
|
||||
* @param string $nonce Number to be used Once; must be 24 bytes
|
||||
* @param string $key XChaCha20 key
|
||||
* @param bool $dontFallback
|
||||
* @return string Pseudorandom stream that can be XORed with messages
|
||||
* to provide encryption (but not authentication; see
|
||||
* Poly1305 or crypto_auth() for that, which is not
|
||||
* optional for security)
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress MixedArgument
|
||||
*/
|
||||
public static function crypto_stream_xchacha20($len, $nonce, $key, $dontFallback = false)
|
||||
{
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($len, 'int', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);
|
||||
|
||||
/* Input validation: */
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
|
||||
throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
|
||||
}
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
|
||||
throw new SodiumException('Argument 3 must be CRYPTO_STREAM_XCHACHA20_KEYBYTES long.');
|
||||
}
|
||||
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_stream_xchacha20($len, $nonce, $key);
|
||||
}
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
return ParagonIE_Sodium_Core32_XChaCha20::stream($len, $nonce, $key);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_XChaCha20::stream($len, $nonce, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* DANGER! UNAUTHENTICATED ENCRYPTION!
|
||||
*
|
||||
* Unless you are following expert advice, do not use this feature.
|
||||
*
|
||||
* Algorithm: XChaCha20
|
||||
*
|
||||
* This DOES NOT provide ciphertext integrity.
|
||||
*
|
||||
* @param string $message Plaintext message
|
||||
* @param string $nonce Number to be used Once; must be 24 bytes
|
||||
* @param string $key Encryption key
|
||||
* @return string Encrypted text which is vulnerable to chosen-
|
||||
* ciphertext attacks unless you implement some
|
||||
* other mitigation to the ciphertext (i.e.
|
||||
* Encrypt then MAC)
|
||||
* @param bool $dontFallback
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress MixedArgument
|
||||
*/
|
||||
public static function crypto_stream_xchacha20_xor($message, $nonce, $key, $dontFallback = false)
|
||||
{
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 3);
|
||||
|
||||
/* Input validation: */
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
|
||||
throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
|
||||
}
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
|
||||
throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.');
|
||||
}
|
||||
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_stream_xchacha20_xor($message, $nonce, $key);
|
||||
}
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key);
|
||||
}
|
||||
|
||||
/**
|
||||
* DANGER! UNAUTHENTICATED ENCRYPTION!
|
||||
*
|
||||
* Unless you are following expert advice, do not use this feature.
|
||||
*
|
||||
* Algorithm: XChaCha20
|
||||
*
|
||||
* This DOES NOT provide ciphertext integrity.
|
||||
*
|
||||
* @param string $message Plaintext message
|
||||
* @param string $nonce Number to be used Once; must be 24 bytes
|
||||
* @param int $counter
|
||||
* @param string $key Encryption key
|
||||
* @return string Encrypted text which is vulnerable to chosen-
|
||||
* ciphertext attacks unless you implement some
|
||||
* other mitigation to the ciphertext (i.e.
|
||||
* Encrypt then MAC)
|
||||
* @param bool $dontFallback
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress MixedArgument
|
||||
*/
|
||||
public static function crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key, $dontFallback = false)
|
||||
{
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($message, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($nonce, 'string', 2);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($counter, 'int', 3);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($key, 'string', 4);
|
||||
|
||||
/* Input validation: */
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($nonce) !== self::CRYPTO_STREAM_XCHACHA20_NONCEBYTES) {
|
||||
throw new SodiumException('Argument 2 must be CRYPTO_SECRETBOX_XCHACHA20_NONCEBYTES long.');
|
||||
}
|
||||
if (ParagonIE_Sodium_Core_Util::strlen($key) !== self::CRYPTO_STREAM_XCHACHA20_KEYBYTES) {
|
||||
throw new SodiumException('Argument 3 must be CRYPTO_SECRETBOX_XCHACHA20_KEYBYTES long.');
|
||||
}
|
||||
|
||||
if (is_callable('sodium_crypto_stream_xchacha20_xor_ic') && !$dontFallback) {
|
||||
return sodium_crypto_stream_xchacha20_xor_ic($message, $nonce, $counter, $key);
|
||||
}
|
||||
|
||||
$ic = ParagonIE_Sodium_Core_Util::store64_le($counter);
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
return ParagonIE_Sodium_Core32_XChaCha20::streamXorIc($message, $nonce, $key, $ic);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_XChaCha20::streamXorIc($message, $nonce, $key, $ic);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a secure random key for use with crypto_stream_xchacha20
|
||||
*
|
||||
* @return string
|
||||
* @throws Exception
|
||||
* @throws Error
|
||||
*/
|
||||
public static function crypto_stream_xchacha20_keygen()
|
||||
{
|
||||
return random_bytes(self::CRYPTO_STREAM_XCHACHA20_KEYBYTES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cache-timing-safe implementation of hex2bin().
|
||||
*
|
||||
* @param string $string Hexadecimal string
|
||||
* @param string $ignore List of characters to ignore; useful for whitespace
|
||||
* @return string Raw binary string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress TooFewArguments
|
||||
* @psalm-suppress MixedArgument
|
||||
*/
|
||||
public static function hex2bin($string)
|
||||
public static function hex2bin($string, $ignore = '')
|
||||
{
|
||||
/* Type checks: */
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($string, 'string', 1);
|
||||
ParagonIE_Sodium_Core_Util::declareScalarType($ignore, 'string', 2);
|
||||
|
||||
if (self::useNewSodiumAPI()) {
|
||||
if (is_callable('sodium_hex2bin')) {
|
||||
return (string) sodium_hex2bin($string);
|
||||
return (string) sodium_hex2bin($string, $ignore);
|
||||
}
|
||||
}
|
||||
if (self::use_fallback('hex2bin')) {
|
||||
return (string) call_user_func('\\Sodium\\hex2bin', $string);
|
||||
return (string) call_user_func('\\Sodium\\hex2bin', $string, $ignore);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Util::hex2bin($string);
|
||||
return ParagonIE_Sodium_Core_Util::hex2bin($string, $ignore);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3115,6 +3282,21 @@ class ParagonIE_Sodium_Compat
|
||||
$var = $copy;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $str
|
||||
* @return bool
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function is_zero($str)
|
||||
{
|
||||
$d = 0;
|
||||
for ($i = 0; $i < 32; ++$i) {
|
||||
$d |= ParagonIE_Sodium_Core_Util::chrToInt($str[$i]);
|
||||
}
|
||||
return ((($d - 1) >> 31) & 1) === 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* The equivalent to the libsodium minor version we aim to be compatible
|
||||
* with (sans pwhash and memzero).
|
||||
@@ -3403,9 +3585,13 @@ class ParagonIE_Sodium_Compat
|
||||
);
|
||||
}
|
||||
}
|
||||
/** @var positive-int $numBytes */
|
||||
if (self::use_fallback('randombytes_buf')) {
|
||||
return (string) call_user_func('\\Sodium\\randombytes_buf', $numBytes);
|
||||
}
|
||||
if ($numBytes < 0) {
|
||||
throw new SodiumException("Number of bytes must be a positive integer");
|
||||
}
|
||||
return random_bytes($numBytes);
|
||||
}
|
||||
|
||||
@@ -3452,6 +3638,232 @@ class ParagonIE_Sodium_Compat
|
||||
return random_int(0, 65535);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @param bool $dontFallback
|
||||
* @return bool
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_is_valid_point($p, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_is_valid_point($p);
|
||||
}
|
||||
try {
|
||||
$r = ParagonIE_Sodium_Core_Ristretto255::ristretto255_frombytes($p);
|
||||
return $r['res'] === 0 &&
|
||||
ParagonIE_Sodium_Core_Ristretto255::ristretto255_point_is_canonical($p) === 1;
|
||||
} catch (SodiumException $ex) {
|
||||
if ($ex->getMessage() === 'S is not canonical') {
|
||||
return false;
|
||||
}
|
||||
throw $ex;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_add($p, $q, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_add($p, $q);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_add($p, $q);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_sub($p, $q, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_sub($p, $q);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_sub($p, $q);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $r
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_from_hash($r, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_from_hash($r);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_from_hash($r);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_random($dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_random();
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_random();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_random($dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_random();
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_random();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_invert($s, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_invert($s);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_invert($s);
|
||||
}
|
||||
/**
|
||||
* @param string $s
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_negate($s, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_negate($s);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_negate($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_complement($s, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_complement($s);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_complement($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_add($x, $y, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_add($x, $y);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_add($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_sub($x, $y, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_sub($x, $y);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_sub($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_mul($x, $y, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_mul($x, $y);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::ristretto255_scalar_mul($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $n
|
||||
* @param string $p
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalarmult_ristretto255($n, $p, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_scalarmult_ristretto255($n, $p);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255($n, $p);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $n
|
||||
* @param string $p
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalarmult_ristretto255_base($n, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_scalarmult_ristretto255_base($n);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::scalarmult_ristretto255_base($n);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @param bool $dontFallback
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_reduce($s, $dontFallback = false)
|
||||
{
|
||||
if (self::useNewSodiumAPI() && !$dontFallback) {
|
||||
return sodium_crypto_core_ristretto255_scalar_reduce($s);
|
||||
}
|
||||
return ParagonIE_Sodium_Core_Ristretto255::sc_reduce($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* Runtime testing method for 32-bit platforms.
|
||||
*
|
||||
@@ -3488,6 +3900,36 @@ class ParagonIE_Sodium_Compat
|
||||
return $diff < $maxTimeout;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add two numbers (little-endian unsigned), storing the value in the first
|
||||
* parameter.
|
||||
*
|
||||
* This mutates $val.
|
||||
*
|
||||
* @param string $val
|
||||
* @param string $addv
|
||||
* @return void
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function sub(&$val, $addv)
|
||||
{
|
||||
$val_len = ParagonIE_Sodium_Core_Util::strlen($val);
|
||||
$addv_len = ParagonIE_Sodium_Core_Util::strlen($addv);
|
||||
if ($val_len !== $addv_len) {
|
||||
throw new SodiumException('values must have the same length');
|
||||
}
|
||||
$A = ParagonIE_Sodium_Core_Util::stringToIntArray($val);
|
||||
$B = ParagonIE_Sodium_Core_Util::stringToIntArray($addv);
|
||||
|
||||
$c = 0;
|
||||
for ($i = 0; $i < $val_len; $i++) {
|
||||
$c = ($A[$i] - $B[$i] - $c);
|
||||
$A[$i] = ($c & 0xff);
|
||||
$c = ($c >> 8) & 1;
|
||||
}
|
||||
$val = ParagonIE_Sodium_Core_Util::intArrayToString($A);
|
||||
}
|
||||
|
||||
/**
|
||||
* This emulates libsodium's version_string() function, except ours is
|
||||
* prefixed with 'polyfill-'.
|
||||
|
||||
@@ -51,6 +51,9 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
public static function new64($high, $low)
|
||||
{
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
throw new SodiumException("Error, use 32-bit");
|
||||
}
|
||||
$i64 = new SplFixedArray(2);
|
||||
$i64[0] = $high & 0xffffffff;
|
||||
$i64[1] = $low & 0xffffffff;
|
||||
@@ -87,6 +90,9 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
protected static function add64($x, $y)
|
||||
{
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
throw new SodiumException("Error, use 32-bit");
|
||||
}
|
||||
$l = ($x[1] + $y[1]) & 0xffffffff;
|
||||
return self::new64(
|
||||
(int) ($x[0] + $y[0] + (
|
||||
@@ -120,6 +126,9 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
protected static function xor64(SplFixedArray $x, SplFixedArray $y)
|
||||
{
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
throw new SodiumException("Error, use 32-bit");
|
||||
}
|
||||
if (!is_numeric($x[0])) {
|
||||
throw new SodiumException('x[0] is not an integer');
|
||||
}
|
||||
@@ -148,6 +157,9 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
public static function rotr64($x, $c)
|
||||
{
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
throw new SodiumException("Error, use 32-bit");
|
||||
}
|
||||
if ($c >= 64) {
|
||||
$c %= 64;
|
||||
}
|
||||
@@ -165,8 +177,8 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
$l0 = 0;
|
||||
$c = 64 - $c;
|
||||
|
||||
/** @var int $c */
|
||||
if ($c < 32) {
|
||||
/** @var int $h0 */
|
||||
$h0 = ((int) ($x[0]) << $c) | (
|
||||
(
|
||||
(int) ($x[1]) & ((1 << $c) - 1)
|
||||
@@ -174,10 +186,8 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
(32 - $c)
|
||||
) >> (32 - $c)
|
||||
);
|
||||
/** @var int $l0 */
|
||||
$l0 = (int) ($x[1]) << $c;
|
||||
} else {
|
||||
/** @var int $h0 */
|
||||
$h0 = (int) ($x[1]) << ($c - 32);
|
||||
}
|
||||
|
||||
@@ -185,12 +195,9 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
$c1 = 64 - $c;
|
||||
|
||||
if ($c1 < 32) {
|
||||
/** @var int $h1 */
|
||||
$h1 = (int) ($x[0]) >> $c1;
|
||||
/** @var int $l1 */
|
||||
$l1 = ((int) ($x[1]) >> $c1) | ((int) ($x[0]) & ((1 << $c1) - 1)) << (32 - $c1);
|
||||
} else {
|
||||
/** @var int $l1 */
|
||||
$l1 = (int) ($x[0]) >> ($c1 - 32);
|
||||
}
|
||||
|
||||
@@ -645,6 +652,7 @@ abstract class ParagonIE_Sodium_Core_BLAKE2b extends ParagonIE_Sodium_Core_Util
|
||||
*
|
||||
* @param string $str
|
||||
* @return SplFixedArray
|
||||
* @psalm-suppress MixedArgumentTypeCoercion
|
||||
*/
|
||||
public static function stringToSplFixedArray($str = '')
|
||||
{
|
||||
|
||||
@@ -1,214 +0,0 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
/**
|
||||
* Class ParagonIE_Sodium_Core_Base64
|
||||
*
|
||||
* Copyright (c) 2016 - 2018 Paragon Initiative Enterprises.
|
||||
* Copyright (c) 2014 Steve "Sc00bz" Thomas (steve at tobtu dot com)
|
||||
*
|
||||
* We have to copy/paste the contents into the variant files because PHP 5.2
|
||||
* doesn't support late static binding, and we have no better workaround
|
||||
* available that won't break PHP 7+. Therefore, we're forced to duplicate code.
|
||||
*/
|
||||
abstract class ParagonIE_Sodium_Core_Base64_Common
|
||||
{
|
||||
/**
|
||||
* Encode into Base64
|
||||
*
|
||||
* Base64 character set "[A-Z][a-z][0-9]+/"
|
||||
*
|
||||
* @param string $src
|
||||
* @return string
|
||||
* @throws TypeError
|
||||
*/
|
||||
public static function encode($src)
|
||||
{
|
||||
return self::doEncode($src, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode into Base64, no = padding
|
||||
*
|
||||
* Base64 character set "[A-Z][a-z][0-9]+/"
|
||||
*
|
||||
* @param string $src
|
||||
* @return string
|
||||
* @throws TypeError
|
||||
*/
|
||||
public static function encodeUnpadded($src)
|
||||
{
|
||||
return self::doEncode($src, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $src
|
||||
* @param bool $pad Include = padding?
|
||||
* @return string
|
||||
* @throws TypeError
|
||||
*/
|
||||
protected static function doEncode($src, $pad = true)
|
||||
{
|
||||
$dest = '';
|
||||
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
|
||||
// Main loop (no padding):
|
||||
for ($i = 0; $i + 3 <= $srcLen; $i += 3) {
|
||||
/** @var array<int, int> $chunk */
|
||||
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 3));
|
||||
$b0 = $chunk[1];
|
||||
$b1 = $chunk[2];
|
||||
$b2 = $chunk[3];
|
||||
|
||||
$dest .=
|
||||
self::encode6Bits( $b0 >> 2 ) .
|
||||
self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
|
||||
self::encode6Bits((($b1 << 2) | ($b2 >> 6)) & 63) .
|
||||
self::encode6Bits( $b2 & 63);
|
||||
}
|
||||
// The last chunk, which may have padding:
|
||||
if ($i < $srcLen) {
|
||||
/** @var array<int, int> $chunk */
|
||||
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
|
||||
$b0 = $chunk[1];
|
||||
if ($i + 1 < $srcLen) {
|
||||
$b1 = $chunk[2];
|
||||
$dest .=
|
||||
self::encode6Bits($b0 >> 2) .
|
||||
self::encode6Bits((($b0 << 4) | ($b1 >> 4)) & 63) .
|
||||
self::encode6Bits(($b1 << 2) & 63);
|
||||
if ($pad) {
|
||||
$dest .= '=';
|
||||
}
|
||||
} else {
|
||||
$dest .=
|
||||
self::encode6Bits( $b0 >> 2) .
|
||||
self::encode6Bits(($b0 << 4) & 63);
|
||||
if ($pad) {
|
||||
$dest .= '==';
|
||||
}
|
||||
}
|
||||
}
|
||||
return $dest;
|
||||
}
|
||||
|
||||
/**
|
||||
* decode from base64 into binary
|
||||
*
|
||||
* Base64 character set "./[A-Z][a-z][0-9]"
|
||||
*
|
||||
* @param string $src
|
||||
* @param bool $strictPadding
|
||||
* @return string
|
||||
* @throws RangeException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress RedundantCondition
|
||||
*/
|
||||
public static function decode($src, $strictPadding = false)
|
||||
{
|
||||
// Remove padding
|
||||
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
|
||||
if ($srcLen === 0) {
|
||||
return '';
|
||||
}
|
||||
|
||||
if ($strictPadding) {
|
||||
if (($srcLen & 3) === 0) {
|
||||
if ($src[$srcLen - 1] === '=') {
|
||||
$srcLen--;
|
||||
if ($src[$srcLen - 1] === '=') {
|
||||
$srcLen--;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (($srcLen & 3) === 1) {
|
||||
throw new RangeException(
|
||||
'Incorrect padding'
|
||||
);
|
||||
}
|
||||
if ($src[$srcLen - 1] === '=') {
|
||||
throw new RangeException(
|
||||
'Incorrect padding'
|
||||
);
|
||||
}
|
||||
} else {
|
||||
$src = rtrim($src, '=');
|
||||
$srcLen = ParagonIE_Sodium_Core_Util::strlen($src);
|
||||
}
|
||||
|
||||
$err = 0;
|
||||
$dest = '';
|
||||
// Main loop (no padding):
|
||||
for ($i = 0; $i + 4 <= $srcLen; $i += 4) {
|
||||
/** @var array<int, int> $chunk */
|
||||
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, 4));
|
||||
$c0 = self::decode6Bits($chunk[1]);
|
||||
$c1 = self::decode6Bits($chunk[2]);
|
||||
$c2 = self::decode6Bits($chunk[3]);
|
||||
$c3 = self::decode6Bits($chunk[4]);
|
||||
|
||||
$dest .= pack(
|
||||
'CCC',
|
||||
((($c0 << 2) | ($c1 >> 4)) & 0xff),
|
||||
((($c1 << 4) | ($c2 >> 2)) & 0xff),
|
||||
((($c2 << 6) | $c3 ) & 0xff)
|
||||
);
|
||||
$err |= ($c0 | $c1 | $c2 | $c3) >> 8;
|
||||
}
|
||||
// The last chunk, which may have padding:
|
||||
if ($i < $srcLen) {
|
||||
/** @var array<int, int> $chunk */
|
||||
$chunk = unpack('C*', ParagonIE_Sodium_Core_Util::substr($src, $i, $srcLen - $i));
|
||||
$c0 = self::decode6Bits($chunk[1]);
|
||||
|
||||
if ($i + 2 < $srcLen) {
|
||||
$c1 = self::decode6Bits($chunk[2]);
|
||||
$c2 = self::decode6Bits($chunk[3]);
|
||||
$dest .= pack(
|
||||
'CC',
|
||||
((($c0 << 2) | ($c1 >> 4)) & 0xff),
|
||||
((($c1 << 4) | ($c2 >> 2)) & 0xff)
|
||||
);
|
||||
$err |= ($c0 | $c1 | $c2) >> 8;
|
||||
} elseif ($i + 1 < $srcLen) {
|
||||
$c1 = self::decode6Bits($chunk[2]);
|
||||
$dest .= pack(
|
||||
'C',
|
||||
((($c0 << 2) | ($c1 >> 4)) & 0xff)
|
||||
);
|
||||
$err |= ($c0 | $c1) >> 8;
|
||||
} elseif ($i < $srcLen && $strictPadding) {
|
||||
$err |= 1;
|
||||
}
|
||||
}
|
||||
/** @var bool $check */
|
||||
$check = ($err === 0);
|
||||
if (!$check) {
|
||||
throw new RangeException(
|
||||
'Base64::decode() only expects characters in the correct base64 alphabet'
|
||||
);
|
||||
}
|
||||
return $dest;
|
||||
}
|
||||
|
||||
/**
|
||||
* Uses bitwise operators instead of table-lookups to turn 6-bit integers
|
||||
* into 8-bit integers.
|
||||
*
|
||||
* Base64 character set:
|
||||
* [A-Z] [a-z] [0-9] + /
|
||||
* 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f
|
||||
*
|
||||
* @param int $src
|
||||
* @return int
|
||||
*/
|
||||
abstract protected static function decode6Bits($src);
|
||||
|
||||
/**
|
||||
* Uses bitwise operators instead of table-lookups to turn 8-bit integers
|
||||
* into 6-bit integers.
|
||||
*
|
||||
* @param int $src
|
||||
* @return string
|
||||
*/
|
||||
abstract protected static function encode6Bits($src);
|
||||
}
|
||||
@@ -70,6 +70,7 @@ class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util impl
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if (!is_int($offset)) {
|
||||
@@ -87,6 +88,7 @@ class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util impl
|
||||
* @param int $offset
|
||||
* @return bool
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->container[$offset]);
|
||||
@@ -99,6 +101,7 @@ class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util impl
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->container[$offset]);
|
||||
@@ -111,6 +114,7 @@ class ParagonIE_Sodium_Core_ChaCha20_Ctx extends ParagonIE_Sodium_Core_Util impl
|
||||
* @return mixed|null
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return isset($this->container[$offset])
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -61,6 +61,7 @@ class ParagonIE_Sodium_Core_Curve25519_Fe implements ArrayAccess
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if (!is_int($value)) {
|
||||
@@ -80,6 +81,7 @@ class ParagonIE_Sodium_Core_Curve25519_Fe implements ArrayAccess
|
||||
* @return bool
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->container[$offset]);
|
||||
@@ -92,6 +94,7 @@ class ParagonIE_Sodium_Core_Curve25519_Fe implements ArrayAccess
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->container[$offset]);
|
||||
@@ -104,6 +107,7 @@ class ParagonIE_Sodium_Core_Curve25519_Fe implements ArrayAccess
|
||||
* @return int
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
if (!isset($this->container[$offset])) {
|
||||
|
||||
@@ -1465,4 +1465,86 @@ class ParagonIE_Sodium_Core_Curve25519_H extends ParagonIE_Sodium_Core_Util
|
||||
326686,
|
||||
11406482
|
||||
);
|
||||
|
||||
/**
|
||||
* 1 / sqrt(a - d)
|
||||
*
|
||||
* @var array<int, int>
|
||||
*/
|
||||
protected static $invsqrtamd = array(
|
||||
6111485,
|
||||
4156064,
|
||||
-27798727,
|
||||
12243468,
|
||||
-25904040,
|
||||
120897,
|
||||
20826367,
|
||||
-7060776,
|
||||
6093568,
|
||||
-1986012
|
||||
);
|
||||
|
||||
/**
|
||||
* sqrt(ad - 1) with a = -1 (mod p)
|
||||
*
|
||||
* @var array<int, int>
|
||||
*/
|
||||
protected static $sqrtadm1 = array(
|
||||
24849947,
|
||||
-153582,
|
||||
-23613485,
|
||||
6347715,
|
||||
-21072328,
|
||||
-667138,
|
||||
-25271143,
|
||||
-15367704,
|
||||
-870347,
|
||||
14525639
|
||||
);
|
||||
|
||||
/**
|
||||
* 1 - d ^ 2
|
||||
*
|
||||
* @var array<int, int>
|
||||
*/
|
||||
protected static $onemsqd = array(
|
||||
6275446,
|
||||
-16617371,
|
||||
-22938544,
|
||||
-3773710,
|
||||
11667077,
|
||||
7397348,
|
||||
-27922721,
|
||||
1766195,
|
||||
-24433858,
|
||||
672203
|
||||
);
|
||||
|
||||
/**
|
||||
* (d - 1) ^ 2
|
||||
* @var array<int, int>
|
||||
*/
|
||||
protected static $sqdmone = array(
|
||||
15551795,
|
||||
-11097455,
|
||||
-13425098,
|
||||
-10125071,
|
||||
-11896535,
|
||||
10178284,
|
||||
-26634327,
|
||||
4729244,
|
||||
-5282110,
|
||||
-10116402
|
||||
);
|
||||
|
||||
|
||||
/*
|
||||
* 2^252+27742317777372353535851937790883648493
|
||||
static const unsigned char L[] = {
|
||||
0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7,
|
||||
0xa2, 0xde, 0xf9, 0xde, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10
|
||||
};
|
||||
*/
|
||||
const L = "\xed\xd3\xf5\x5c\x1a\x63\x12\x58\xd6\x9c\xf7\xa2\xde\xf9\xde\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10";
|
||||
}
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
if (class_exists('ParagonIE_Sodium_Core_Ed25519', false)) {
|
||||
return;
|
||||
}
|
||||
if (!class_exists('ParagonIE_Sodium_Core_Curve25519', false)) {
|
||||
require_once dirname(__FILE__) . '/Curve25519.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Class ParagonIE_Sodium_Core_Ed25519
|
||||
@@ -12,6 +15,7 @@ abstract class ParagonIE_Sodium_Core_Ed25519 extends ParagonIE_Sodium_Core_Curve
|
||||
{
|
||||
const KEYPAIR_BYTES = 96;
|
||||
const SEED_BYTES = 32;
|
||||
const SCALAR_BYTES = 32;
|
||||
|
||||
/**
|
||||
* @internal You should not use this directly from another application
|
||||
@@ -377,8 +381,8 @@ abstract class ParagonIE_Sodium_Core_Ed25519 extends ParagonIE_Sodium_Core_Curve
|
||||
*/
|
||||
public static function small_order($R)
|
||||
{
|
||||
/** @var array<int, array<int, int>> $blacklist */
|
||||
$blacklist = array(
|
||||
/** @var array<int, array<int, int>> $blocklist */
|
||||
$blocklist = array(
|
||||
/* 0 (order 4) */
|
||||
array(
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -464,13 +468,13 @@ abstract class ParagonIE_Sodium_Core_Ed25519 extends ParagonIE_Sodium_Core_Curve
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
)
|
||||
);
|
||||
/** @var int $countBlacklist */
|
||||
$countBlacklist = count($blacklist);
|
||||
/** @var int $countBlocklist */
|
||||
$countBlocklist = count($blocklist);
|
||||
|
||||
for ($i = 0; $i < $countBlacklist; ++$i) {
|
||||
for ($i = 0; $i < $countBlocklist; ++$i) {
|
||||
$c = 0;
|
||||
for ($j = 0; $j < 32; ++$j) {
|
||||
$c |= self::chrToInt($R[$j]) ^ (int) $blacklist[$i][$j];
|
||||
$c |= self::chrToInt($R[$j]) ^ (int) $blocklist[$i][$j];
|
||||
}
|
||||
if ($c === 0) {
|
||||
return true;
|
||||
@@ -478,4 +482,74 @@ abstract class ParagonIE_Sodium_Core_Ed25519 extends ParagonIE_Sodium_Core_Curve
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalar_complement($s)
|
||||
{
|
||||
$t_ = self::L . str_repeat("\x00", 32);
|
||||
sodium_increment($t_);
|
||||
$s_ = $s . str_repeat("\x00", 32);
|
||||
ParagonIE_Sodium_Compat::sub($t_, $s_);
|
||||
return self::sc_reduce($t_);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalar_random()
|
||||
{
|
||||
do {
|
||||
$r = ParagonIE_Sodium_Compat::randombytes_buf(self::SCALAR_BYTES);
|
||||
$r[self::SCALAR_BYTES - 1] = self::intToChr(
|
||||
self::chrToInt($r[self::SCALAR_BYTES - 1]) & 0x1f
|
||||
);
|
||||
} while (
|
||||
!self::check_S_lt_L($r) || ParagonIE_Sodium_Compat::is_zero($r)
|
||||
);
|
||||
return $r;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalar_negate($s)
|
||||
{
|
||||
$t_ = self::L . str_repeat("\x00", 32) ;
|
||||
$s_ = $s . str_repeat("\x00", 32) ;
|
||||
ParagonIE_Sodium_Compat::sub($t_, $s_);
|
||||
return self::sc_reduce($t_);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $a
|
||||
* @param string $b
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalar_add($a, $b)
|
||||
{
|
||||
$a_ = $a . str_repeat("\x00", 32);
|
||||
$b_ = $b . str_repeat("\x00", 32);
|
||||
ParagonIE_Sodium_Compat::add($a_, $b_);
|
||||
return self::sc_reduce($a_);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalar_sub($x, $y)
|
||||
{
|
||||
$yn = self::scalar_negate($y);
|
||||
return self::scalar_add($x, $yn);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -211,43 +211,43 @@ class ParagonIE_Sodium_Core_Poly1305_State extends ParagonIE_Sodium_Core_Util
|
||||
|
||||
/* h *= r */
|
||||
$d0 = (
|
||||
self::mul($h0, $r0, 25) +
|
||||
self::mul($s4, $h1, 26) +
|
||||
self::mul($s3, $h2, 26) +
|
||||
self::mul($s2, $h3, 26) +
|
||||
self::mul($s1, $h4, 26)
|
||||
self::mul($h0, $r0, 27) +
|
||||
self::mul($s4, $h1, 27) +
|
||||
self::mul($s3, $h2, 27) +
|
||||
self::mul($s2, $h3, 27) +
|
||||
self::mul($s1, $h4, 27)
|
||||
);
|
||||
|
||||
$d1 = (
|
||||
self::mul($h0, $r1, 25) +
|
||||
self::mul($h1, $r0, 25) +
|
||||
self::mul($s4, $h2, 26) +
|
||||
self::mul($s3, $h3, 26) +
|
||||
self::mul($s2, $h4, 26)
|
||||
self::mul($h0, $r1, 27) +
|
||||
self::mul($h1, $r0, 27) +
|
||||
self::mul($s4, $h2, 27) +
|
||||
self::mul($s3, $h3, 27) +
|
||||
self::mul($s2, $h4, 27)
|
||||
);
|
||||
|
||||
$d2 = (
|
||||
self::mul($h0, $r2, 25) +
|
||||
self::mul($h1, $r1, 25) +
|
||||
self::mul($h2, $r0, 25) +
|
||||
self::mul($s4, $h3, 26) +
|
||||
self::mul($s3, $h4, 26)
|
||||
self::mul($h0, $r2, 27) +
|
||||
self::mul($h1, $r1, 27) +
|
||||
self::mul($h2, $r0, 27) +
|
||||
self::mul($s4, $h3, 27) +
|
||||
self::mul($s3, $h4, 27)
|
||||
);
|
||||
|
||||
$d3 = (
|
||||
self::mul($h0, $r3, 25) +
|
||||
self::mul($h1, $r2, 25) +
|
||||
self::mul($h2, $r1, 25) +
|
||||
self::mul($h3, $r0, 25) +
|
||||
self::mul($s4, $h4, 26)
|
||||
self::mul($h0, $r3, 27) +
|
||||
self::mul($h1, $r2, 27) +
|
||||
self::mul($h2, $r1, 27) +
|
||||
self::mul($h3, $r0, 27) +
|
||||
self::mul($s4, $h4, 27)
|
||||
);
|
||||
|
||||
$d4 = (
|
||||
self::mul($h0, $r4, 25) +
|
||||
self::mul($h1, $r3, 25) +
|
||||
self::mul($h2, $r2, 25) +
|
||||
self::mul($h3, $r1, 25) +
|
||||
self::mul($h4, $r0, 25)
|
||||
self::mul($h0, $r4, 27) +
|
||||
self::mul($h1, $r3, 27) +
|
||||
self::mul($h2, $r2, 27) +
|
||||
self::mul($h3, $r1, 27) +
|
||||
self::mul($h4, $r0, 27)
|
||||
);
|
||||
|
||||
/* (partial) h %= p */
|
||||
|
||||
708
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/src/Core/Ristretto255.php
vendored
Normal file
708
wp/wp-content/plugins/wordfence/crypto/vendor/paragonie/sodium_compat/src/Core/Ristretto255.php
vendored
Normal file
@@ -0,0 +1,708 @@
|
||||
<?php
|
||||
// phpcs:ignoreFile -- compatibility library for PHP 5-7.1
|
||||
|
||||
/**
|
||||
* Class ParagonIE_Sodium_Core_Ristretto255
|
||||
*/
|
||||
class ParagonIE_Sodium_Core_Ristretto255 extends ParagonIE_Sodium_Core_Ed25519
|
||||
{
|
||||
const crypto_core_ristretto255_HASHBYTES = 64;
|
||||
const HASH_SC_L = 48;
|
||||
const CORE_H2C_SHA256 = 1;
|
||||
const CORE_H2C_SHA512 = 2;
|
||||
|
||||
/**
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $f
|
||||
* @param int $b
|
||||
* @return ParagonIE_Sodium_Core_Curve25519_Fe
|
||||
*/
|
||||
public static function fe_cneg(ParagonIE_Sodium_Core_Curve25519_Fe $f, $b)
|
||||
{
|
||||
$negf = self::fe_neg($f);
|
||||
return self::fe_cmov($f, $negf, $b);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $f
|
||||
* @return ParagonIE_Sodium_Core_Curve25519_Fe
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function fe_abs(ParagonIE_Sodium_Core_Curve25519_Fe $f)
|
||||
{
|
||||
return self::fe_cneg($f, self::fe_isnegative($f));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns 0 if this field element results in all NUL bytes.
|
||||
*
|
||||
* @internal You should not use this directly from another application
|
||||
*
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $f
|
||||
* @return int
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function fe_iszero(ParagonIE_Sodium_Core_Curve25519_Fe $f)
|
||||
{
|
||||
static $zero;
|
||||
if ($zero === null) {
|
||||
$zero = str_repeat("\x00", 32);
|
||||
}
|
||||
/** @var string $zero */
|
||||
$str = self::fe_tobytes($f);
|
||||
|
||||
$d = 0;
|
||||
for ($i = 0; $i < 32; ++$i) {
|
||||
$d |= self::chrToInt($str[$i]);
|
||||
}
|
||||
return (($d - 1) >> 31) & 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $u
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $v
|
||||
* @return array{x: ParagonIE_Sodium_Core_Curve25519_Fe, nonsquare: int}
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_sqrt_ratio_m1(
|
||||
ParagonIE_Sodium_Core_Curve25519_Fe $u,
|
||||
ParagonIE_Sodium_Core_Curve25519_Fe $v
|
||||
) {
|
||||
$sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
|
||||
|
||||
$v3 = self::fe_mul(
|
||||
self::fe_sq($v),
|
||||
$v
|
||||
); /* v3 = v^3 */
|
||||
$x = self::fe_mul(
|
||||
self::fe_mul(
|
||||
self::fe_sq($v3),
|
||||
$u
|
||||
),
|
||||
$v
|
||||
); /* x = uv^7 */
|
||||
|
||||
$x = self::fe_mul(
|
||||
self::fe_mul(
|
||||
self::fe_pow22523($x), /* x = (uv^7)^((q-5)/8) */
|
||||
$v3
|
||||
),
|
||||
$u
|
||||
); /* x = uv^3(uv^7)^((q-5)/8) */
|
||||
|
||||
$vxx = self::fe_mul(
|
||||
self::fe_sq($x),
|
||||
$v
|
||||
); /* vx^2 */
|
||||
|
||||
$m_root_check = self::fe_sub($vxx, $u); /* vx^2-u */
|
||||
$p_root_check = self::fe_add($vxx, $u); /* vx^2+u */
|
||||
$f_root_check = self::fe_mul($u, $sqrtm1); /* u*sqrt(-1) */
|
||||
$f_root_check = self::fe_add($vxx, $f_root_check); /* vx^2+u*sqrt(-1) */
|
||||
|
||||
$has_m_root = self::fe_iszero($m_root_check);
|
||||
$has_p_root = self::fe_iszero($p_root_check);
|
||||
$has_f_root = self::fe_iszero($f_root_check);
|
||||
|
||||
$x_sqrtm1 = self::fe_mul($x, $sqrtm1); /* x*sqrt(-1) */
|
||||
|
||||
$x = self::fe_abs(
|
||||
self::fe_cmov($x, $x_sqrtm1, $has_p_root | $has_f_root)
|
||||
);
|
||||
return array(
|
||||
'x' => $x,
|
||||
'nonsquare' => $has_m_root | $has_p_root
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return int
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_point_is_canonical($s)
|
||||
{
|
||||
$c = (self::chrToInt($s[31]) & 0x7f) ^ 0x7f;
|
||||
for ($i = 30; $i > 0; --$i) {
|
||||
$c |= self::chrToInt($s[$i]) ^ 0xff;
|
||||
}
|
||||
$c = ($c - 1) >> 8;
|
||||
$d = (0xed - 1 - self::chrToInt($s[0])) >> 8;
|
||||
$e = self::chrToInt($s[31]) >> 7;
|
||||
|
||||
return 1 - ((($c & $d) | $e | self::chrToInt($s[0])) & 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @param bool $skipCanonicalCheck
|
||||
* @return array{h: ParagonIE_Sodium_Core_Curve25519_Ge_P3, res: int}
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_frombytes($s, $skipCanonicalCheck = false)
|
||||
{
|
||||
if (!$skipCanonicalCheck) {
|
||||
if (!self::ristretto255_point_is_canonical($s)) {
|
||||
throw new SodiumException('S is not canonical');
|
||||
}
|
||||
}
|
||||
|
||||
$s_ = self::fe_frombytes($s);
|
||||
$ss = self::fe_sq($s_); /* ss = s^2 */
|
||||
|
||||
$u1 = self::fe_sub(self::fe_1(), $ss); /* u1 = 1-ss */
|
||||
$u1u1 = self::fe_sq($u1); /* u1u1 = u1^2 */
|
||||
|
||||
$u2 = self::fe_add(self::fe_1(), $ss); /* u2 = 1+ss */
|
||||
$u2u2 = self::fe_sq($u2); /* u2u2 = u2^2 */
|
||||
|
||||
$v = self::fe_mul(
|
||||
ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d),
|
||||
$u1u1
|
||||
); /* v = d*u1^2 */
|
||||
$v = self::fe_neg($v); /* v = -d*u1^2 */
|
||||
$v = self::fe_sub($v, $u2u2); /* v = -(d*u1^2)-u2^2 */
|
||||
$v_u2u2 = self::fe_mul($v, $u2u2); /* v_u2u2 = v*u2^2 */
|
||||
|
||||
// fe25519_1(one);
|
||||
// notsquare = ristretto255_sqrt_ratio_m1(inv_sqrt, one, v_u2u2);
|
||||
$one = self::fe_1();
|
||||
$result = self::ristretto255_sqrt_ratio_m1($one, $v_u2u2);
|
||||
$inv_sqrt = $result['x'];
|
||||
$notsquare = $result['nonsquare'];
|
||||
|
||||
$h = new ParagonIE_Sodium_Core_Curve25519_Ge_P3();
|
||||
|
||||
$h->X = self::fe_mul($inv_sqrt, $u2);
|
||||
$h->Y = self::fe_mul(self::fe_mul($inv_sqrt, $h->X), $v);
|
||||
|
||||
$h->X = self::fe_mul($h->X, $s_);
|
||||
$h->X = self::fe_abs(
|
||||
self::fe_add($h->X, $h->X)
|
||||
);
|
||||
$h->Y = self::fe_mul($u1, $h->Y);
|
||||
$h->Z = self::fe_1();
|
||||
$h->T = self::fe_mul($h->X, $h->Y);
|
||||
|
||||
$res = - ((1 - $notsquare) | self::fe_isnegative($h->T) | self::fe_iszero($h->Y));
|
||||
return array('h' => $h, 'res' => $res);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_p3_tobytes(ParagonIE_Sodium_Core_Curve25519_Ge_P3 $h)
|
||||
{
|
||||
$sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
|
||||
$invsqrtamd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$invsqrtamd);
|
||||
|
||||
$u1 = self::fe_add($h->Z, $h->Y); /* u1 = Z+Y */
|
||||
$zmy = self::fe_sub($h->Z, $h->Y); /* zmy = Z-Y */
|
||||
$u1 = self::fe_mul($u1, $zmy); /* u1 = (Z+Y)*(Z-Y) */
|
||||
$u2 = self::fe_mul($h->X, $h->Y); /* u2 = X*Y */
|
||||
|
||||
$u1_u2u2 = self::fe_mul(self::fe_sq($u2), $u1); /* u1_u2u2 = u1*u2^2 */
|
||||
$one = self::fe_1();
|
||||
|
||||
// fe25519_1(one);
|
||||
// (void) ristretto255_sqrt_ratio_m1(inv_sqrt, one, u1_u2u2);
|
||||
$result = self::ristretto255_sqrt_ratio_m1($one, $u1_u2u2);
|
||||
$inv_sqrt = $result['x'];
|
||||
|
||||
$den1 = self::fe_mul($inv_sqrt, $u1); /* den1 = inv_sqrt*u1 */
|
||||
$den2 = self::fe_mul($inv_sqrt, $u2); /* den2 = inv_sqrt*u2 */
|
||||
$z_inv = self::fe_mul($h->T, self::fe_mul($den1, $den2)); /* z_inv = den1*den2*T */
|
||||
|
||||
$ix = self::fe_mul($h->X, $sqrtm1); /* ix = X*sqrt(-1) */
|
||||
$iy = self::fe_mul($h->Y, $sqrtm1); /* iy = Y*sqrt(-1) */
|
||||
$eden = self::fe_mul($den1, $invsqrtamd);
|
||||
|
||||
$t_z_inv = self::fe_mul($h->T, $z_inv); /* t_z_inv = T*z_inv */
|
||||
$rotate = self::fe_isnegative($t_z_inv);
|
||||
|
||||
$x_ = self::fe_copy($h->X);
|
||||
$y_ = self::fe_copy($h->Y);
|
||||
$den_inv = self::fe_copy($den2);
|
||||
|
||||
$x_ = self::fe_cmov($x_, $iy, $rotate);
|
||||
$y_ = self::fe_cmov($y_, $ix, $rotate);
|
||||
$den_inv = self::fe_cmov($den_inv, $eden, $rotate);
|
||||
|
||||
$x_z_inv = self::fe_mul($x_, $z_inv);
|
||||
$y_ = self::fe_cneg($y_, self::fe_isnegative($x_z_inv));
|
||||
|
||||
|
||||
// fe25519_sub(s_, h->Z, y_);
|
||||
// fe25519_mul(s_, den_inv, s_);
|
||||
// fe25519_abs(s_, s_);
|
||||
// fe25519_tobytes(s, s_);
|
||||
return self::fe_tobytes(
|
||||
self::fe_abs(
|
||||
self::fe_mul(
|
||||
$den_inv,
|
||||
self::fe_sub($h->Z, $y_)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ParagonIE_Sodium_Core_Curve25519_Fe $t
|
||||
* @return ParagonIE_Sodium_Core_Curve25519_Ge_P3
|
||||
*
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_elligator(ParagonIE_Sodium_Core_Curve25519_Fe $t)
|
||||
{
|
||||
$sqrtm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtm1);
|
||||
$onemsqd = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$onemsqd);
|
||||
$d = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$d);
|
||||
$sqdmone = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqdmone);
|
||||
$sqrtadm1 = ParagonIE_Sodium_Core_Curve25519_Fe::fromArray(self::$sqrtadm1);
|
||||
|
||||
$one = self::fe_1();
|
||||
$r = self::fe_mul($sqrtm1, self::fe_sq($t)); /* r = sqrt(-1)*t^2 */
|
||||
$u = self::fe_mul(self::fe_add($r, $one), $onemsqd); /* u = (r+1)*(1-d^2) */
|
||||
$c = self::fe_neg(self::fe_1()); /* c = -1 */
|
||||
$rpd = self::fe_add($r, $d); /* rpd = r+d */
|
||||
|
||||
$v = self::fe_mul(
|
||||
self::fe_sub(
|
||||
$c,
|
||||
self::fe_mul($r, $d)
|
||||
),
|
||||
$rpd
|
||||
); /* v = (c-r*d)*(r+d) */
|
||||
|
||||
$result = self::ristretto255_sqrt_ratio_m1($u, $v);
|
||||
$s = $result['x'];
|
||||
$wasnt_square = 1 - $result['nonsquare'];
|
||||
|
||||
$s_prime = self::fe_neg(
|
||||
self::fe_abs(
|
||||
self::fe_mul($s, $t)
|
||||
)
|
||||
); /* s_prime = -|s*t| */
|
||||
$s = self::fe_cmov($s, $s_prime, $wasnt_square);
|
||||
$c = self::fe_cmov($c, $r, $wasnt_square);
|
||||
|
||||
// fe25519_sub(n, r, one); /* n = r-1 */
|
||||
// fe25519_mul(n, n, c); /* n = c*(r-1) */
|
||||
// fe25519_mul(n, n, ed25519_sqdmone); /* n = c*(r-1)*(d-1)^2 */
|
||||
// fe25519_sub(n, n, v); /* n = c*(r-1)*(d-1)^2-v */
|
||||
$n = self::fe_sub(
|
||||
self::fe_mul(
|
||||
self::fe_mul(
|
||||
self::fe_sub($r, $one),
|
||||
$c
|
||||
),
|
||||
$sqdmone
|
||||
),
|
||||
$v
|
||||
); /* n = c*(r-1)*(d-1)^2-v */
|
||||
|
||||
$w0 = self::fe_mul(
|
||||
self::fe_add($s, $s),
|
||||
$v
|
||||
); /* w0 = 2s*v */
|
||||
|
||||
$w1 = self::fe_mul($n, $sqrtadm1); /* w1 = n*sqrt(ad-1) */
|
||||
$ss = self::fe_sq($s); /* ss = s^2 */
|
||||
$w2 = self::fe_sub($one, $ss); /* w2 = 1-s^2 */
|
||||
$w3 = self::fe_add($one, $ss); /* w3 = 1+s^2 */
|
||||
|
||||
return new ParagonIE_Sodium_Core_Curve25519_Ge_P3(
|
||||
self::fe_mul($w0, $w3),
|
||||
self::fe_mul($w2, $w1),
|
||||
self::fe_mul($w1, $w3),
|
||||
self::fe_mul($w0, $w2)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $h
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_from_hash($h)
|
||||
{
|
||||
if (self::strlen($h) !== 64) {
|
||||
throw new SodiumException('Hash must be 64 bytes');
|
||||
}
|
||||
//fe25519_frombytes(r0, h);
|
||||
//fe25519_frombytes(r1, h + 32);
|
||||
$r0 = self::fe_frombytes(self::substr($h, 0, 32));
|
||||
$r1 = self::fe_frombytes(self::substr($h, 32, 32));
|
||||
|
||||
//ristretto255_elligator(&p0, r0);
|
||||
//ristretto255_elligator(&p1, r1);
|
||||
$p0 = self::ristretto255_elligator($r0);
|
||||
$p1 = self::ristretto255_elligator($r1);
|
||||
|
||||
//ge25519_p3_to_cached(&p1_cached, &p1);
|
||||
//ge25519_add_cached(&p_p1p1, &p0, &p1_cached);
|
||||
$p_p1p1 = self::ge_add(
|
||||
$p0,
|
||||
self::ge_p3_to_cached($p1)
|
||||
);
|
||||
|
||||
//ge25519_p1p1_to_p3(&p, &p_p1p1);
|
||||
//ristretto255_p3_tobytes(s, &p);
|
||||
return self::ristretto255_p3_tobytes(
|
||||
self::ge_p1p1_to_p3($p_p1p1)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @return int
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function is_valid_point($p)
|
||||
{
|
||||
$result = self::ristretto255_frombytes($p);
|
||||
if ($result['res'] !== 0) {
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_add($p, $q)
|
||||
{
|
||||
$p_res = self::ristretto255_frombytes($p);
|
||||
$q_res = self::ristretto255_frombytes($q);
|
||||
if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
|
||||
throw new SodiumException('Could not add points');
|
||||
}
|
||||
$p_p3 = $p_res['h'];
|
||||
$q_p3 = $q_res['h'];
|
||||
$q_cached = self::ge_p3_to_cached($q_p3);
|
||||
$r_p1p1 = self::ge_add($p_p3, $q_cached);
|
||||
$r_p3 = self::ge_p1p1_to_p3($r_p1p1);
|
||||
return self::ristretto255_p3_tobytes($r_p3);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $p
|
||||
* @param string $q
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_sub($p, $q)
|
||||
{
|
||||
$p_res = self::ristretto255_frombytes($p);
|
||||
$q_res = self::ristretto255_frombytes($q);
|
||||
if ($p_res['res'] !== 0 || $q_res['res'] !== 0) {
|
||||
throw new SodiumException('Could not add points');
|
||||
}
|
||||
$p_p3 = $p_res['h'];
|
||||
$q_p3 = $q_res['h'];
|
||||
$q_cached = self::ge_p3_to_cached($q_p3);
|
||||
$r_p1p1 = self::ge_sub($p_p3, $q_cached);
|
||||
$r_p3 = self::ge_p1p1_to_p3($r_p1p1);
|
||||
return self::ristretto255_p3_tobytes($r_p3);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param int $hLen
|
||||
* @param ?string $ctx
|
||||
* @param string $msg
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @psalm-suppress PossiblyInvalidArgument hash API
|
||||
*/
|
||||
protected static function h2c_string_to_hash_sha256($hLen, $ctx, $msg)
|
||||
{
|
||||
$h = array_fill(0, $hLen, 0);
|
||||
$ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
|
||||
if ($hLen > 0xff) {
|
||||
throw new SodiumException('Hash must be less than 256 bytes');
|
||||
}
|
||||
|
||||
if ($ctx_len > 0xff) {
|
||||
$st = hash_init('sha256');
|
||||
self::hash_update($st, "H2C-OVERSIZE-DST-");
|
||||
self::hash_update($st, $ctx);
|
||||
$ctx = hash_final($st, true);
|
||||
$ctx_len = 32;
|
||||
}
|
||||
$t = array(0, $hLen, 0);
|
||||
$ux = str_repeat("\0", 64);
|
||||
$st = hash_init('sha256');
|
||||
self::hash_update($st, $ux);
|
||||
self::hash_update($st, $msg);
|
||||
self::hash_update($st, self::intArrayToString($t));
|
||||
self::hash_update($st, $ctx);
|
||||
self::hash_update($st, self::intToChr($ctx_len));
|
||||
$u0 = hash_final($st, true);
|
||||
|
||||
for ($i = 0; $i < $hLen; $i += 64) {
|
||||
$ux = self::xorStrings($ux, $u0);
|
||||
++$t[2];
|
||||
$st = hash_init('sha256');
|
||||
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, 64);
|
||||
for ($j = 0; $j < $amount; ++$j) {
|
||||
$h[$i + $j] = self::chrToInt($ux[$i]);
|
||||
}
|
||||
}
|
||||
return self::intArrayToString(array_slice($h, 0, $hLen));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $hLen
|
||||
* @param ?string $ctx
|
||||
* @param string $msg
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @psalm-suppress PossiblyInvalidArgument hash API
|
||||
*/
|
||||
protected static function h2c_string_to_hash_sha512($hLen, $ctx, $msg)
|
||||
{
|
||||
$h = array_fill(0, $hLen, 0);
|
||||
$ctx_len = !is_null($ctx) ? self::strlen($ctx) : 0;
|
||||
if ($hLen > 0xff) {
|
||||
throw new SodiumException('Hash must be less than 256 bytes');
|
||||
}
|
||||
|
||||
if ($ctx_len > 0xff) {
|
||||
$st = hash_init('sha256');
|
||||
self::hash_update($st, "H2C-OVERSIZE-DST-");
|
||||
self::hash_update($st, $ctx);
|
||||
$ctx = hash_final($st, true);
|
||||
$ctx_len = 32;
|
||||
}
|
||||
$t = array(0, $hLen, 0);
|
||||
$ux = str_repeat("\0", 128);
|
||||
$st = hash_init('sha512');
|
||||
self::hash_update($st, $ux);
|
||||
self::hash_update($st, $msg);
|
||||
self::hash_update($st, self::intArrayToString($t));
|
||||
self::hash_update($st, $ctx);
|
||||
self::hash_update($st, self::intToChr($ctx_len));
|
||||
$u0 = hash_final($st, true);
|
||||
|
||||
for ($i = 0; $i < $hLen; $i += 128) {
|
||||
$ux = self::xorStrings($ux, $u0);
|
||||
++$t[2];
|
||||
$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));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param int $hLen
|
||||
* @param ?string $ctx
|
||||
* @param string $msg
|
||||
* @param int $hash_alg
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function h2c_string_to_hash($hLen, $ctx, $msg, $hash_alg)
|
||||
{
|
||||
switch ($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);
|
||||
default:
|
||||
throw new SodiumException('Invalid H2C hash algorithm');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param ?string $ctx
|
||||
* @param string $msg
|
||||
* @param int $hash_alg
|
||||
* @return string
|
||||
* @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)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws Exception
|
||||
*/
|
||||
public static function ristretto255_random()
|
||||
{
|
||||
return self::ristretto255_from_hash(
|
||||
ParagonIE_Sodium_Compat::randombytes_buf(self::crypto_core_ristretto255_HASHBYTES)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_random()
|
||||
{
|
||||
return self::scalar_random();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_complement($s)
|
||||
{
|
||||
return self::scalar_complement($s);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
*/
|
||||
public static function ristretto255_scalar_invert($s)
|
||||
{
|
||||
return self::sc25519_invert($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function ristretto255_scalar_negate($s)
|
||||
{
|
||||
return self::scalar_negate($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
*/
|
||||
public static function ristretto255_scalar_add($x, $y)
|
||||
{
|
||||
return self::scalar_add($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
*/
|
||||
public static function ristretto255_scalar_sub($x, $y)
|
||||
{
|
||||
return self::scalar_sub($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $x
|
||||
* @param string $y
|
||||
* @return string
|
||||
*/
|
||||
public static function ristretto255_scalar_mul($x, $y)
|
||||
{
|
||||
return self::sc25519_mul($x, $y);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $ctx
|
||||
* @param string $msg
|
||||
* @param int $hash_alg
|
||||
* @return string
|
||||
* @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));
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $s
|
||||
* @return string
|
||||
*/
|
||||
public static function ristretto255_scalar_reduce($s)
|
||||
{
|
||||
return self::sc_reduce($s);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $n
|
||||
* @param string $p
|
||||
* @return string
|
||||
* @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');
|
||||
}
|
||||
$P = $result['h'];
|
||||
|
||||
$t = self::stringToIntArray($n);
|
||||
$t[31] &= 0x7f;
|
||||
$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');
|
||||
}
|
||||
return $q;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $n
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
*/
|
||||
public static function scalarmult_ristretto255_base($n)
|
||||
{
|
||||
$t = self::stringToIntArray($n);
|
||||
$t[31] &= 0x7f;
|
||||
$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');
|
||||
}
|
||||
return $q;
|
||||
}
|
||||
}
|
||||
@@ -17,6 +17,7 @@ class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
|
||||
*
|
||||
* @param int[] $v
|
||||
* @return int[]
|
||||
*
|
||||
*/
|
||||
public static function sipRound(array $v)
|
||||
{
|
||||
@@ -27,27 +28,27 @@ class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
|
||||
);
|
||||
|
||||
# v1=ROTL(v1,13);
|
||||
list($v[2], $v[3]) = self::rotl_64($v[2], $v[3], 13);
|
||||
list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 13);
|
||||
|
||||
# v1 ^= v0;
|
||||
$v[2] ^= $v[0];
|
||||
$v[3] ^= $v[1];
|
||||
$v[2] = (int) $v[2] ^ (int) $v[0];
|
||||
$v[3] = (int) $v[3] ^ (int) $v[1];
|
||||
|
||||
# v0=ROTL(v0,32);
|
||||
list($v[0], $v[1]) = self::rotl_64((int) $v[0], (int) $v[1], 32);
|
||||
|
||||
# v2 += v3;
|
||||
list($v[4], $v[5]) = self::add(
|
||||
array($v[4], $v[5]),
|
||||
array($v[6], $v[7])
|
||||
array((int) $v[4], (int) $v[5]),
|
||||
array((int) $v[6], (int) $v[7])
|
||||
);
|
||||
|
||||
# v3=ROTL(v3,16);
|
||||
list($v[6], $v[7]) = self::rotl_64($v[6], $v[7], 16);
|
||||
list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 16);
|
||||
|
||||
# v3 ^= v2;
|
||||
$v[6] ^= $v[4];
|
||||
$v[7] ^= $v[5];
|
||||
$v[6] = (int) $v[6] ^ (int) $v[4];
|
||||
$v[7] = (int) $v[7] ^ (int) $v[5];
|
||||
|
||||
# v0 += v3;
|
||||
list($v[0], $v[1]) = self::add(
|
||||
@@ -59,8 +60,8 @@ class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
|
||||
list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 21);
|
||||
|
||||
# v3 ^= v0;
|
||||
$v[6] ^= $v[0];
|
||||
$v[7] ^= $v[1];
|
||||
$v[6] = (int) $v[6] ^ (int) $v[0];
|
||||
$v[7] = (int) $v[7] ^ (int) $v[1];
|
||||
|
||||
# v2 += v1;
|
||||
list($v[4], $v[5]) = self::add(
|
||||
@@ -72,8 +73,8 @@ class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
|
||||
list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 17);
|
||||
|
||||
# v1 ^= v2;;
|
||||
$v[2] ^= $v[4];
|
||||
$v[3] ^= $v[5];
|
||||
$v[2] = (int) $v[2] ^ (int) $v[4];
|
||||
$v[3] = (int) $v[3] ^ (int) $v[5];
|
||||
|
||||
# v2=ROTL(v2,32)
|
||||
list($v[4], $v[5]) = self::rotl_64((int) $v[4], (int) $v[5], 32);
|
||||
|
||||
@@ -287,6 +287,22 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
return $left === $right;
|
||||
}
|
||||
|
||||
/**
|
||||
* Catch hash_update() failures and throw instead of silently proceeding
|
||||
*
|
||||
* @param HashContext|resource &$hs
|
||||
* @param string $data
|
||||
* @return void
|
||||
* @throws SodiumException
|
||||
* @psalm-suppress PossiblyInvalidArgument
|
||||
*/
|
||||
protected static function hash_update(&$hs, $data)
|
||||
{
|
||||
if (!hash_update($hs, $data)) {
|
||||
throw new SodiumException('hash_update() failed');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert a hexadecimal string into a binary string without cache-timing
|
||||
* leaks
|
||||
@@ -294,27 +310,26 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
* @internal You should not use this directly from another application
|
||||
*
|
||||
* @param string $hexString
|
||||
* @param string $ignore
|
||||
* @param bool $strictPadding
|
||||
* @return string (raw binary)
|
||||
* @throws RangeException
|
||||
* @throws TypeError
|
||||
*/
|
||||
public static function hex2bin($hexString, $strictPadding = false)
|
||||
public static function hex2bin($hexString, $ignore = '', $strictPadding = false)
|
||||
{
|
||||
/* Type checks: */
|
||||
if (!is_string($hexString)) {
|
||||
throw new TypeError('Argument 1 must be a string, ' . gettype($hexString) . ' given.');
|
||||
}
|
||||
if (!is_string($ignore)) {
|
||||
throw new TypeError('Argument 2 must be a string, ' . gettype($hexString) . ' given.');
|
||||
}
|
||||
|
||||
/** @var int $hex_pos */
|
||||
$hex_pos = 0;
|
||||
/** @var string $bin */
|
||||
$bin = '';
|
||||
/** @var int $c_acc */
|
||||
$c_acc = 0;
|
||||
/** @var int $hex_len */
|
||||
$hex_len = self::strlen($hexString);
|
||||
/** @var int $state */
|
||||
$state = 0;
|
||||
if (($hex_len & 1) !== 0) {
|
||||
if ($strictPadding) {
|
||||
@@ -332,20 +347,18 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
++$hex_pos;
|
||||
/** @var int $c */
|
||||
$c = $chunk[$hex_pos];
|
||||
/** @var int $c_num */
|
||||
$c_num = $c ^ 48;
|
||||
/** @var int $c_num0 */
|
||||
$c_num0 = ($c_num - 10) >> 8;
|
||||
/** @var int $c_alpha */
|
||||
$c_alpha = ($c & ~32) - 55;
|
||||
/** @var int $c_alpha0 */
|
||||
$c_alpha0 = (($c_alpha - 10) ^ ($c_alpha - 16)) >> 8;
|
||||
if (($c_num0 | $c_alpha0) === 0) {
|
||||
if ($ignore && $state === 0 && strpos($ignore, self::intToChr($c)) !== false) {
|
||||
continue;
|
||||
}
|
||||
throw new RangeException(
|
||||
'hex2bin() only expects hexadecimal characters'
|
||||
);
|
||||
}
|
||||
/** @var int $c_val */
|
||||
$c_val = ($c_num0 & $c_num) | ($c_alpha & $c_alpha0);
|
||||
if ($state === 0) {
|
||||
$c_acc = $c_val * 16;
|
||||
@@ -367,7 +380,6 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
public static function intArrayToString(array $ints)
|
||||
{
|
||||
/** @var array<int, int> $args */
|
||||
$args = $ints;
|
||||
foreach ($args as $i => $v) {
|
||||
$args[$i] = (int) ($v & 0xff);
|
||||
@@ -443,7 +455,7 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
}
|
||||
/** @var array<int, int> $unpacked */
|
||||
$unpacked = unpack('V', $string);
|
||||
return (int) ($unpacked[1] & 0xffffffff);
|
||||
return (int) $unpacked[1];
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -571,6 +583,7 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
$a <<= 1;
|
||||
$b >>= 1;
|
||||
}
|
||||
$c = (int) @($c & -1);
|
||||
|
||||
/**
|
||||
* If $b was negative, we then apply the same value to $c here.
|
||||
@@ -597,7 +610,11 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
{
|
||||
$high = 0;
|
||||
/** @var int $low */
|
||||
$low = $num & 0xffffffff;
|
||||
if (PHP_INT_SIZE === 4) {
|
||||
$low = (int) $num;
|
||||
} else {
|
||||
$low = $num & 0xffffffff;
|
||||
}
|
||||
|
||||
if ((+(abs($num))) >= 1) {
|
||||
if ($num > 0) {
|
||||
@@ -904,6 +921,9 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
*
|
||||
* @internal You should not use this directly from another application
|
||||
*
|
||||
* Note: MB_OVERLOAD_STRING === 2, but we don't reference the constant
|
||||
* (for nuisance-free PHP 8 support)
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected static function isMbStringOverride()
|
||||
@@ -911,10 +931,15 @@ abstract class ParagonIE_Sodium_Core_Util
|
||||
static $mbstring = null;
|
||||
|
||||
if ($mbstring === null) {
|
||||
if (!defined('MB_OVERLOAD_STRING')) {
|
||||
$mbstring = false;
|
||||
return $mbstring;
|
||||
}
|
||||
$mbstring = extension_loaded('mbstring')
|
||||
&& defined('MB_OVERLOAD_STRING')
|
||||
&&
|
||||
((int) (ini_get('mbstring.func_overload')) & MB_OVERLOAD_STRING);
|
||||
((int) (ini_get('mbstring.func_overload')) & 2);
|
||||
// MB_OVERLOAD_STRING === 2
|
||||
}
|
||||
/** @var bool $mbstring */
|
||||
|
||||
|
||||
@@ -578,6 +578,7 @@ abstract class ParagonIE_Sodium_Core32_BLAKE2b extends ParagonIE_Sodium_Core_Uti
|
||||
*
|
||||
* @param string $str
|
||||
* @return SplFixedArray
|
||||
* @psalm-suppress MixedArgumentTypeCoercion
|
||||
*/
|
||||
public static function stringToSplFixedArray($str = '')
|
||||
{
|
||||
|
||||
@@ -71,6 +71,7 @@ class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util
|
||||
* @param int|ParagonIE_Sodium_Core32_Int32 $value
|
||||
* @return void
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if (!is_int($offset)) {
|
||||
@@ -94,6 +95,7 @@ class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util
|
||||
* @return bool
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->container[$offset]);
|
||||
@@ -106,6 +108,7 @@ class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->container[$offset]);
|
||||
@@ -118,6 +121,7 @@ class ParagonIE_Sodium_Core32_ChaCha20_Ctx extends ParagonIE_Sodium_Core32_Util
|
||||
* @return mixed|null
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return isset($this->container[$offset])
|
||||
|
||||
@@ -326,25 +326,15 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
$carry9 = $f[9]->shiftRight(25);
|
||||
$f[9] = $f[9]->subInt64($carry9->shiftLeft(25));
|
||||
|
||||
/** @var int $h0 */
|
||||
$h0 = $f[0]->toInt32()->toInt();
|
||||
/** @var int $h1 */
|
||||
$h1 = $f[1]->toInt32()->toInt();
|
||||
/** @var int $h2 */
|
||||
$h2 = $f[2]->toInt32()->toInt();
|
||||
/** @var int $h3 */
|
||||
$h3 = $f[3]->toInt32()->toInt();
|
||||
/** @var int $h4 */
|
||||
$h4 = $f[4]->toInt32()->toInt();
|
||||
/** @var int $h5 */
|
||||
$h5 = $f[5]->toInt32()->toInt();
|
||||
/** @var int $h6 */
|
||||
$h6 = $f[6]->toInt32()->toInt();
|
||||
/** @var int $h7 */
|
||||
$h7 = $f[7]->toInt32()->toInt();
|
||||
/** @var int $h8 */
|
||||
$h8 = $f[8]->toInt32()->toInt();
|
||||
/** @var int $h9 */
|
||||
$h9 = $f[9]->toInt32()->toInt();
|
||||
|
||||
/**
|
||||
@@ -419,7 +409,6 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
if ($zero === null) {
|
||||
$zero = str_repeat("\x00", 32);
|
||||
}
|
||||
/** @var string $str */
|
||||
$str = self::fe_tobytes($f);
|
||||
/** @var string $zero */
|
||||
return !self::verify_32($str, $zero);
|
||||
@@ -498,15 +487,10 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
$g7_19 = $g7->mulInt(19, 5);
|
||||
$g8_19 = $g8->mulInt(19, 5);
|
||||
$g9_19 = $g9->mulInt(19, 5);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f1_2 */
|
||||
$f1_2 = $f1->shiftLeft(1);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f3_2 */
|
||||
$f3_2 = $f3->shiftLeft(1);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f5_2 */
|
||||
$f5_2 = $f5->shiftLeft(1);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f7_2 */
|
||||
$f7_2 = $f7->shiftLeft(1);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f9_2 */
|
||||
$f9_2 = $f9->shiftLeft(1);
|
||||
$f0g0 = $f0->mulInt64($g0, 27);
|
||||
$f0g1 = $f0->mulInt64($g1, 27);
|
||||
@@ -776,28 +760,17 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
*/
|
||||
public static function fe_sq(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
|
||||
{
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f0 */
|
||||
$f0 = $f[0]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f1 */
|
||||
$f1 = $f[1]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f2 */
|
||||
$f2 = $f[2]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f3 */
|
||||
$f3 = $f[3]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f4 */
|
||||
$f4 = $f[4]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f5 */
|
||||
$f5 = $f[5]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f6 */
|
||||
$f6 = $f[6]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f7 */
|
||||
$f7 = $f[7]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f8 */
|
||||
$f8 = $f[8]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f9 */
|
||||
$f9 = $f[9]->toInt64();
|
||||
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f0_2 */
|
||||
$f0_2 = $f0->shiftLeft(1);
|
||||
$f1_2 = $f1->shiftLeft(1);
|
||||
$f2_2 = $f2->shiftLeft(1);
|
||||
@@ -811,7 +784,7 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
$f7_38 = $f7->mulInt(38, 6);
|
||||
$f8_19 = $f8->mulInt(19, 5);
|
||||
$f9_38 = $f9->mulInt(38, 6);
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f0f0*/
|
||||
|
||||
$f0f0 = $f0->mulInt64($f0, 28);
|
||||
$f0f1_2 = $f0_2->mulInt64($f1, 28);
|
||||
$f0f2_2 = $f0_2->mulInt64($f2, 28);
|
||||
@@ -980,25 +953,15 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
*/
|
||||
public static function fe_sq2(ParagonIE_Sodium_Core32_Curve25519_Fe $f)
|
||||
{
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f0 */
|
||||
$f0 = $f[0]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f1 */
|
||||
$f1 = $f[1]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f2 */
|
||||
$f2 = $f[2]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f3 */
|
||||
$f3 = $f[3]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f4 */
|
||||
$f4 = $f[4]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f5 */
|
||||
$f5 = $f[5]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f6 */
|
||||
$f6 = $f[6]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f7 */
|
||||
$f7 = $f[7]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f8 */
|
||||
$f8 = $f[8]->toInt64();
|
||||
/** @var ParagonIE_Sodium_Core32_Int64 $f9 */
|
||||
$f9 = $f[9]->toInt64();
|
||||
|
||||
$f0_2 = $f0->shiftLeft(1);
|
||||
@@ -1480,7 +1443,6 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
{
|
||||
static $d = null;
|
||||
if (!$d) {
|
||||
/** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */
|
||||
$d = ParagonIE_Sodium_Core32_Curve25519_Fe::fromArray(
|
||||
array(
|
||||
ParagonIE_Sodium_Core32_Int32::fromInt(self::$d[0]),
|
||||
@@ -1496,6 +1458,7 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
)
|
||||
);
|
||||
}
|
||||
/** @var ParagonIE_Sodium_Core32_Curve25519_Fe $d */
|
||||
|
||||
# fe_frombytes(h->Y,s);
|
||||
# fe_1(h->Z);
|
||||
@@ -1834,7 +1797,14 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
*/
|
||||
public static function equal($b, $c)
|
||||
{
|
||||
return (int) ((($b ^ $c) - 1 & 0xffffffff) >> 31);
|
||||
$b0 = $b & 0xffff;
|
||||
$b1 = ($b >> 16) & 0xffff;
|
||||
$c0 = $c & 0xffff;
|
||||
$c1 = ($c >> 16) & 0xffff;
|
||||
|
||||
$d0 = (($b0 ^ $c0) - 1) >> 31;
|
||||
$d1 = (($b1 ^ $c1) - 1) >> 31;
|
||||
return ($d0 & $d1) & 1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1851,7 +1821,6 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
return $char < 0 ? 1 : 0;
|
||||
}
|
||||
/** @var string $char */
|
||||
/** @var int $x */
|
||||
$x = self::chrToInt(self::substr($char, 0, 1));
|
||||
return (int) ($x >> 31);
|
||||
}
|
||||
@@ -1957,7 +1926,6 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
}
|
||||
|
||||
$bnegative = self::negative($b);
|
||||
/** @var int $babs */
|
||||
$babs = $b - (((-$bnegative) & $b) << 1);
|
||||
|
||||
$t = self::ge_precomp_0();
|
||||
@@ -1965,7 +1933,7 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
$t = self::cmov(
|
||||
$t,
|
||||
$base[$pos][$i],
|
||||
self::equal($babs, $i + 1)
|
||||
-self::equal($babs, $i + 1)
|
||||
);
|
||||
}
|
||||
$minusT = new ParagonIE_Sodium_Core32_Curve25519_Ge_Precomp(
|
||||
@@ -2231,9 +2199,7 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
$carry = 0;
|
||||
for ($i = 0; $i < 63; ++$i) {
|
||||
$e[$i] += $carry;
|
||||
/** @var int $carry */
|
||||
$carry = $e[$i] + 8;
|
||||
/** @var int $carry */
|
||||
$carry >>= 4;
|
||||
$e[$i] -= $carry << 4;
|
||||
}
|
||||
@@ -3141,7 +3107,6 @@ abstract class ParagonIE_Sodium_Core32_Curve25519 extends ParagonIE_Sodium_Core3
|
||||
*/
|
||||
public static function ge_mul_l(ParagonIE_Sodium_Core32_Curve25519_Ge_P3 $A)
|
||||
{
|
||||
/** @var array<int, int> $aslide */
|
||||
$aslide = array(
|
||||
13, 0, 0, 0, 0, -1, 0, 0, 0, 0, -11, 0, 0, 0, 0, 0, 0, -5, 0, 0, 0,
|
||||
0, 0, 0, -3, 0, 0, 0, 0, -13, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 3, 0,
|
||||
|
||||
@@ -49,6 +49,9 @@ class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
|
||||
}
|
||||
} else {
|
||||
for ($i = 0; $i < $count; ++$i) {
|
||||
if (!($array[$i] instanceof ParagonIE_Sodium_Core32_Int32)) {
|
||||
throw new TypeError('Expected ParagonIE_Sodium_Core32_Int32');
|
||||
}
|
||||
$array[$i]->overflow = 0;
|
||||
$obj->offsetSet($i, $array[$i]);
|
||||
}
|
||||
@@ -105,6 +108,7 @@ class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
if (!($value instanceof ParagonIE_Sodium_Core32_Int32)) {
|
||||
@@ -125,6 +129,7 @@ class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
|
||||
* @return bool
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->container[$offset]);
|
||||
@@ -137,6 +142,7 @@ class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
|
||||
* @return void
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->container[$offset]);
|
||||
@@ -149,6 +155,7 @@ class ParagonIE_Sodium_Core32_Curve25519_Fe implements ArrayAccess
|
||||
* @return ParagonIE_Sodium_Core32_Int32
|
||||
* @psalm-suppress MixedArrayOffset
|
||||
*/
|
||||
#[ReturnTypeWillChange]
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
if (!isset($this->container[$offset])) {
|
||||
|
||||
@@ -4,6 +4,9 @@
|
||||
if (class_exists('ParagonIE_Sodium_Core32_Ed25519', false)) {
|
||||
return;
|
||||
}
|
||||
if (!class_exists('ParagonIE_Sodium_Core32_Curve25519')) {
|
||||
require_once dirname(__FILE__) . '/Curve25519.php';
|
||||
}
|
||||
|
||||
/**
|
||||
* Class ParagonIE_Sodium_Core32_Ed25519
|
||||
@@ -208,6 +211,7 @@ abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_C
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
* @psalm-suppress PossiblyInvalidArgument
|
||||
*/
|
||||
public static function sign_detached($message, $sk)
|
||||
{
|
||||
@@ -225,8 +229,8 @@ abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_C
|
||||
# crypto_hash_sha512_update(&hs, m, mlen);
|
||||
# crypto_hash_sha512_final(&hs, nonce);
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($az, 32, 32));
|
||||
hash_update($hs, $message);
|
||||
self::hash_update($hs, self::substr($az, 32, 32));
|
||||
self::hash_update($hs, $message);
|
||||
$nonceHash = hash_final($hs, true);
|
||||
|
||||
# memmove(sig + 32, sk + 32, 32);
|
||||
@@ -245,9 +249,9 @@ abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_C
|
||||
# crypto_hash_sha512_update(&hs, m, mlen);
|
||||
# crypto_hash_sha512_final(&hs, hram);
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($sig, 0, 32));
|
||||
hash_update($hs, self::substr($pk, 0, 32));
|
||||
hash_update($hs, $message);
|
||||
self::hash_update($hs, self::substr($sig, 0, 32));
|
||||
self::hash_update($hs, self::substr($pk, 0, 32));
|
||||
self::hash_update($hs, $message);
|
||||
$hramHash = hash_final($hs, true);
|
||||
|
||||
# sc_reduce(hram);
|
||||
@@ -379,7 +383,7 @@ abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_C
|
||||
*/
|
||||
public static function small_order($R)
|
||||
{
|
||||
static $blacklist = array(
|
||||
static $blocklist = array(
|
||||
/* 0 (order 4) */
|
||||
array(
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
@@ -465,13 +469,13 @@ abstract class ParagonIE_Sodium_Core32_Ed25519 extends ParagonIE_Sodium_Core32_C
|
||||
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
|
||||
)
|
||||
);
|
||||
/** @var array<int, array<int, int>> $blacklist */
|
||||
$countBlacklist = count($blacklist);
|
||||
/** @var array<int, array<int, int>> $blocklist */
|
||||
$countBlocklist = count($blocklist);
|
||||
|
||||
for ($i = 0; $i < $countBlacklist; ++$i) {
|
||||
for ($i = 0; $i < $countBlocklist; ++$i) {
|
||||
$c = 0;
|
||||
for ($j = 0; $j < 32; ++$j) {
|
||||
$c |= self::chrToInt($R[$j]) ^ $blacklist[$i][$j];
|
||||
$c |= self::chrToInt($R[$j]) ^ $blocklist[$i][$j];
|
||||
}
|
||||
if ($c === 0) {
|
||||
return true;
|
||||
|
||||
@@ -139,9 +139,10 @@ class ParagonIE_Sodium_Core32_Int32
|
||||
public function mask($m = 0)
|
||||
{
|
||||
/** @var int $hi */
|
||||
$hi = ($m >> 16) & 0xffff;
|
||||
$hi = ((int) $m >> 16);
|
||||
$hi &= 0xffff;
|
||||
/** @var int $lo */
|
||||
$lo = ($m & 0xffff);
|
||||
$lo = ((int) $m) & 0xffff;
|
||||
return new ParagonIE_Sodium_Core32_Int32(
|
||||
array(
|
||||
(int) ($this->limbs[0] & $hi),
|
||||
@@ -169,8 +170,8 @@ class ParagonIE_Sodium_Core32_Int32
|
||||
for ($j = 0; $j < $a_l; ++$j) {
|
||||
$b_j = $b[$j];
|
||||
$product = ($a_i * $b_j) + $r[$i + $j];
|
||||
$carry = ($product >> $baseLog2 & 0xffff);
|
||||
$r[$i + $j] = ($product - (int) ($carry * $base)) & 0xffff;
|
||||
$carry = ((int) $product >> $baseLog2 & 0xffff);
|
||||
$r[$i + $j] = ((int) $product - (int) ($carry * $base)) & 0xffff;
|
||||
$r[$i + $j + 1] += $carry;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -338,9 +338,9 @@ class ParagonIE_Sodium_Core32_Int64
|
||||
$a_i = $a[$i];
|
||||
for ($j = 0; $j < $a_l; ++$j) {
|
||||
$b_j = $b[$j];
|
||||
$product = ($a_i * $b_j) + $r[$i + $j];
|
||||
$carry = ($product >> $baseLog2 & 0xffff);
|
||||
$r[$i + $j] = ($product - (int) ($carry * $base)) & 0xffff;
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,39 +256,39 @@ class ParagonIE_Sodium_Core32_Poly1305_State extends ParagonIE_Sodium_Core32_Uti
|
||||
|
||||
/* h *= r */
|
||||
$d0 = $zero
|
||||
->addInt64($h0->mulInt64($r0, 25))
|
||||
->addInt64($s4->mulInt64($h1, 26))
|
||||
->addInt64($s3->mulInt64($h2, 26))
|
||||
->addInt64($s2->mulInt64($h3, 26))
|
||||
->addInt64($s1->mulInt64($h4, 26));
|
||||
->addInt64($h0->mulInt64($r0, 27))
|
||||
->addInt64($s4->mulInt64($h1, 27))
|
||||
->addInt64($s3->mulInt64($h2, 27))
|
||||
->addInt64($s2->mulInt64($h3, 27))
|
||||
->addInt64($s1->mulInt64($h4, 27));
|
||||
|
||||
$d1 = $zero
|
||||
->addInt64($h0->mulInt64($r1, 25))
|
||||
->addInt64($h1->mulInt64($r0, 25))
|
||||
->addInt64($s4->mulInt64($h2, 26))
|
||||
->addInt64($s3->mulInt64($h3, 26))
|
||||
->addInt64($s2->mulInt64($h4, 26));
|
||||
->addInt64($h0->mulInt64($r1, 27))
|
||||
->addInt64($h1->mulInt64($r0, 27))
|
||||
->addInt64($s4->mulInt64($h2, 27))
|
||||
->addInt64($s3->mulInt64($h3, 27))
|
||||
->addInt64($s2->mulInt64($h4, 27));
|
||||
|
||||
$d2 = $zero
|
||||
->addInt64($h0->mulInt64($r2, 25))
|
||||
->addInt64($h1->mulInt64($r1, 25))
|
||||
->addInt64($h2->mulInt64($r0, 25))
|
||||
->addInt64($s4->mulInt64($h3, 26))
|
||||
->addInt64($s3->mulInt64($h4, 26));
|
||||
->addInt64($h0->mulInt64($r2, 27))
|
||||
->addInt64($h1->mulInt64($r1, 27))
|
||||
->addInt64($h2->mulInt64($r0, 27))
|
||||
->addInt64($s4->mulInt64($h3, 27))
|
||||
->addInt64($s3->mulInt64($h4, 27));
|
||||
|
||||
$d3 = $zero
|
||||
->addInt64($h0->mulInt64($r3, 25))
|
||||
->addInt64($h1->mulInt64($r2, 25))
|
||||
->addInt64($h2->mulInt64($r1, 25))
|
||||
->addInt64($h3->mulInt64($r0, 25))
|
||||
->addInt64($s4->mulInt64($h4, 26));
|
||||
->addInt64($h0->mulInt64($r3, 27))
|
||||
->addInt64($h1->mulInt64($r2, 27))
|
||||
->addInt64($h2->mulInt64($r1, 27))
|
||||
->addInt64($h3->mulInt64($r0, 27))
|
||||
->addInt64($s4->mulInt64($h4, 27));
|
||||
|
||||
$d4 = $zero
|
||||
->addInt64($h0->mulInt64($r4, 25))
|
||||
->addInt64($h1->mulInt64($r3, 25))
|
||||
->addInt64($h2->mulInt64($r2, 25))
|
||||
->addInt64($h3->mulInt64($r1, 25))
|
||||
->addInt64($h4->mulInt64($r0, 25));
|
||||
->addInt64($h0->mulInt64($r4, 27))
|
||||
->addInt64($h1->mulInt64($r3, 27))
|
||||
->addInt64($h2->mulInt64($r2, 27))
|
||||
->addInt64($h3->mulInt64($r1, 27))
|
||||
->addInt64($h4->mulInt64($r0, 27));
|
||||
|
||||
/* (partial) h %= p */
|
||||
$c = $d0->shiftRight(26);
|
||||
@@ -420,7 +420,7 @@ class ParagonIE_Sodium_Core32_Poly1305_State extends ParagonIE_Sodium_Core32_Uti
|
||||
$g4 = $g4->mask($mask);
|
||||
|
||||
/** @var int $mask */
|
||||
$mask = (~$mask) & 0xffffffff;
|
||||
$mask = ~$mask;
|
||||
|
||||
$h0 = $h0->mask($mask)->orInt32($g0);
|
||||
$h1 = $h1->mask($mask)->orInt32($g1);
|
||||
|
||||
@@ -62,4 +62,27 @@ class ParagonIE_Sodium_Core32_XChaCha20 extends ParagonIE_Sodium_Core32_HChaCha2
|
||||
$message
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @internal You should not use this directly from another application
|
||||
*
|
||||
* @param string $message
|
||||
* @param string $nonce
|
||||
* @param string $key
|
||||
* @param string $ic
|
||||
* @return string
|
||||
* @throws SodiumException
|
||||
* @throws TypeError
|
||||
*/
|
||||
public static function ietfStreamXorIc($message, $nonce = '', $key = '', $ic = '')
|
||||
{
|
||||
return self::encryptBytes(
|
||||
new ParagonIE_Sodium_Core32_ChaCha20_IetfCtx(
|
||||
self::hChaCha20(self::substr($nonce, 0, 16), $key),
|
||||
"\x00\x00\x00\x00" . self::substr($nonce, 16, 8),
|
||||
$ic
|
||||
),
|
||||
$message
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -244,6 +244,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
ParagonIE_Sodium_Compat::memzero($nonce);
|
||||
ParagonIE_Sodium_Compat::memzero($ephKeypair);
|
||||
} catch (SodiumException $ex) {
|
||||
/** @psalm-suppress PossiblyUndefinedVariable */
|
||||
unset($ephKeypair);
|
||||
}
|
||||
return $res;
|
||||
@@ -542,6 +543,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
try {
|
||||
ParagonIE_Sodium_Compat::memzero($key);
|
||||
} catch (SodiumException $ex) {
|
||||
/** @psalm-suppress PossiblyUndefinedVariable */
|
||||
unset($key);
|
||||
}
|
||||
return $res;
|
||||
@@ -596,7 +598,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
$az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($az, 32, 32));
|
||||
self::hash_update($hs, self::substr($az, 32, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
|
||||
@@ -615,8 +617,8 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($sig, 0, 32));
|
||||
hash_update($hs, self::substr($pk, 0, 32));
|
||||
self::hash_update($hs, self::substr($sig, 0, 32));
|
||||
self::hash_update($hs, self::substr($pk, 0, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
|
||||
@@ -727,8 +729,8 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
$A = ParagonIE_Sodium_Core_Ed25519::ge_frombytes_negate_vartime($publicKey);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($sig, 0, 32));
|
||||
hash_update($hs, self::substr($publicKey, 0, 32));
|
||||
self::hash_update($hs, self::substr($sig, 0, 32));
|
||||
self::hash_update($hs, self::substr($publicKey, 0, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
/** @var string $hDigest */
|
||||
@@ -1082,7 +1084,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
* Update a hash context with the contents of a file, without
|
||||
* loading the entire file into memory.
|
||||
*
|
||||
* @param resource|object $hash
|
||||
* @param resource|HashContext $hash
|
||||
* @param resource $fp
|
||||
* @param int $size
|
||||
* @return resource|object Resource on PHP < 7.2, HashContext object on PHP >= 7.2
|
||||
@@ -1132,7 +1134,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
}
|
||||
/** @var string $message */
|
||||
/** @psalm-suppress InvalidArgument */
|
||||
hash_update($hash, $message);
|
||||
self::hash_update($hash, $message);
|
||||
}
|
||||
// Reset file pointer's position
|
||||
fseek($fp, $originalPosition, SEEK_SET);
|
||||
@@ -1153,19 +1155,15 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
*/
|
||||
private static function sign_core32($filePath, $secretKey)
|
||||
{
|
||||
/** @var int|bool $size */
|
||||
$size = filesize($filePath);
|
||||
if (!is_int($size)) {
|
||||
throw new SodiumException('Could not obtain the file size');
|
||||
}
|
||||
/** @var int $size */
|
||||
|
||||
/** @var resource|bool $fp */
|
||||
$fp = fopen($filePath, 'rb');
|
||||
if (!is_resource($fp)) {
|
||||
throw new SodiumException('Could not open input file for reading');
|
||||
}
|
||||
/** @var resource $fp */
|
||||
|
||||
/** @var string $az */
|
||||
$az = hash('sha512', self::substr($secretKey, 0, 32), true);
|
||||
@@ -1174,37 +1172,27 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
$az[31] = self::intToChr((self::chrToInt($az[31]) & 63) | 64);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($az, 32, 32));
|
||||
self::hash_update($hs, self::substr($az, 32, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
|
||||
/** @var string $nonceHash */
|
||||
$nonceHash = hash_final($hs, true);
|
||||
|
||||
/** @var string $pk */
|
||||
$pk = self::substr($secretKey, 32, 32);
|
||||
|
||||
/** @var string $nonce */
|
||||
$nonce = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($nonceHash) . self::substr($nonceHash, 32);
|
||||
|
||||
/** @var string $sig */
|
||||
$sig = ParagonIE_Sodium_Core32_Ed25519::ge_p3_tobytes(
|
||||
ParagonIE_Sodium_Core32_Ed25519::ge_scalarmult_base($nonce)
|
||||
);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($sig, 0, 32));
|
||||
hash_update($hs, self::substr($pk, 0, 32));
|
||||
self::hash_update($hs, self::substr($sig, 0, 32));
|
||||
self::hash_update($hs, self::substr($pk, 0, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
|
||||
/** @var string $hramHash */
|
||||
$hramHash = hash_final($hs, true);
|
||||
|
||||
/** @var string $hram */
|
||||
$hram = ParagonIE_Sodium_Core32_Ed25519::sc_reduce($hramHash);
|
||||
|
||||
/** @var string $sigAfter */
|
||||
$sigAfter = ParagonIE_Sodium_Core32_Ed25519::sc_muladd($hram, $az, $nonce);
|
||||
|
||||
/** @var string $sig */
|
||||
@@ -1242,6 +1230,7 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
if (ParagonIE_Sodium_Core32_Ed25519::small_order($sig)) {
|
||||
throw new SodiumException('Signature is on too small of an order');
|
||||
}
|
||||
|
||||
if ((self::chrToInt($sig[63]) & 224) !== 0) {
|
||||
throw new SodiumException('Invalid signature');
|
||||
}
|
||||
@@ -1277,8 +1266,8 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
$A = ParagonIE_Sodium_Core32_Ed25519::ge_frombytes_negate_vartime($publicKey);
|
||||
|
||||
$hs = hash_init('sha512');
|
||||
hash_update($hs, self::substr($sig, 0, 32));
|
||||
hash_update($hs, self::substr($publicKey, 0, 32));
|
||||
self::hash_update($hs, self::substr($sig, 0, 32));
|
||||
self::hash_update($hs, self::substr($publicKey, 0, 32));
|
||||
/** @var resource $hs */
|
||||
$hs = self::updateHashWithFile($hs, $fp, $size);
|
||||
/** @var string $hDigest */
|
||||
@@ -1526,12 +1515,6 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
/** @var int $pos */
|
||||
$pos = self::ftell($ifp);
|
||||
|
||||
/** @var int $iter */
|
||||
$iter = 1;
|
||||
|
||||
/** @var int $incr */
|
||||
$incr = self::BUFFER_SIZE >> 6;
|
||||
|
||||
while ($mlen > 0) {
|
||||
$blockSize = $mlen > self::BUFFER_SIZE
|
||||
? self::BUFFER_SIZE
|
||||
@@ -1542,7 +1525,6 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util
|
||||
}
|
||||
$state->update($ciphertext);
|
||||
$mlen -= $blockSize;
|
||||
$iter += $incr;
|
||||
}
|
||||
$res = ParagonIE_Sodium_Core32_Util::verify_16($tag, $state->finish());
|
||||
|
||||
|
||||
@@ -103,6 +103,7 @@ class SplFixedArray implements Iterator, ArrayAccess, Countable
|
||||
*/
|
||||
public function offsetGet($index)
|
||||
{
|
||||
/** @psalm-suppress MixedReturnStatement */
|
||||
return $this->internalArray[(int) $index];
|
||||
}
|
||||
|
||||
@@ -143,6 +144,7 @@ class SplFixedArray implements Iterator, ArrayAccess, Countable
|
||||
*/
|
||||
public function current()
|
||||
{
|
||||
/** @psalm-suppress MixedReturnStatement */
|
||||
return current($this->internalArray);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user