From 18e042c4b566e465152bbeb3ca7b25d84a359725 Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 7 Aug 2024 14:37:09 +0200 Subject: [PATCH] Update the composer dependencies --- .../files/lib/system/api/composer.json | 4 +- .../files/lib/system/api/composer.lock | 90 +- .../lib/system/api/composer/installed.json | 32 +- .../lib/system/api/composer/installed.php | 42 +- .../api/minishlink/web-push/composer.json | 4 +- .../api/minishlink/web-push/src/WebPush.php | 38 +- .../api/paragonie/sodium_compat/README.md | 51 +- .../api/paragonie/sodium_compat/autoload.php | 6 + .../sodium_compat/lib/php72compat.php | 498 ++++++++--- .../sodium_compat/lib/php84compat.php | 130 +++ .../sodium_compat/lib/php84compat_const.php | 10 + .../sodium_compat/lib/ristretto255.php | 90 +- .../sodium_compat/lib/sodium_compat.php | 352 ++++++-- .../sodium_compat/lib/stream-xchacha20.php | 27 +- .../paragonie/sodium_compat/src/Compat.php | 825 ++++++++++++++---- .../src/Core/AEGIS/State128L.php | 284 ++++++ .../sodium_compat/src/Core/AEGIS/State256.php | 240 +++++ .../sodium_compat/src/Core/AEGIS128L.php | 119 +++ .../sodium_compat/src/Core/AEGIS256.php | 118 +++ .../paragonie/sodium_compat/src/Core/AES.php | 518 +++++++++++ .../sodium_compat/src/Core/AES/Block.php | 343 ++++++++ .../sodium_compat/src/Core/AES/Expanded.php | 14 + .../src/Core/AES/KeySchedule.php | 82 ++ .../src/Core/Curve25519/Ge/Cached.php | 20 +- .../src/Core/Curve25519/Ge/P1p1.php | 20 +- .../src/Core/Curve25519/Ge/P2.php | 15 +- .../src/Core/Curve25519/Ge/P3.php | 20 +- .../src/Core/Curve25519/Ge/Precomp.php | 15 +- .../paragonie/sodium_compat/src/Core/Util.php | 24 + .../api/paragonie/sodium_compat/src/File.php | 74 +- 30 files changed, 3548 insertions(+), 557 deletions(-) create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php84compat.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php84compat_const.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS/State128L.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS/State256.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS128L.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS256.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Block.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Expanded.php create mode 100644 wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/KeySchedule.php diff --git a/wcfsetup/install/files/lib/system/api/composer.json b/wcfsetup/install/files/lib/system/api/composer.json index ff9c1bca3d..b5304b6a3c 100644 --- a/wcfsetup/install/files/lib/system/api/composer.json +++ b/wcfsetup/install/files/lib/system/api/composer.json @@ -14,8 +14,8 @@ "dragonmantank/cron-expression": "^3.3.3", "erusev/parsedown": "^1.7.4", "ezyang/htmlpurifier": "^4.17", - "guzzlehttp/guzzle": "^7.8.1", - "guzzlehttp/psr7": "^2.6.2", + "guzzlehttp/guzzle": "^7.9.2", + "guzzlehttp/psr7": "^2.7.0", "laminas/laminas-diactoros": "^3.3.1", "laminas/laminas-httphandlerrunner": "^2.10.0", "laminas/laminas-progressbar": "^2.13", diff --git a/wcfsetup/install/files/lib/system/api/composer.lock b/wcfsetup/install/files/lib/system/api/composer.lock index 6aab412957..f30ffc5941 100644 --- a/wcfsetup/install/files/lib/system/api/composer.lock +++ b/wcfsetup/install/files/lib/system/api/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "82986c8114047ba330847c579ead7db9", + "content-hash": "70268093034722fc94f786ec6395a6bf", "packages": [ { "name": "brick/math", @@ -313,22 +313,22 @@ }, { "name": "guzzlehttp/guzzle", - "version": "7.8.1", + "version": "7.9.2", "source": { "type": "git", "url": "https://github.com/guzzle/guzzle.git", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + "reference": "d281ed313b989f213357e3be1a179f02196ac99b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", - "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/d281ed313b989f213357e3be1a179f02196ac99b", + "reference": "d281ed313b989f213357e3be1a179f02196ac99b", "shasum": "" }, "require": { "ext-json": "*", - "guzzlehttp/promises": "^1.5.3 || ^2.0.1", - "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "guzzlehttp/promises": "^1.5.3 || ^2.0.3", + "guzzlehttp/psr7": "^2.7.0", "php": "^7.2.5 || ^8.0", "psr/http-client": "^1.0", "symfony/deprecation-contracts": "^2.2 || ^3.0" @@ -339,9 +339,9 @@ "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", "ext-curl": "*", - "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "guzzle/client-integration-tests": "3.0.2", "php-http/message-factory": "^1.1", - "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "phpunit/phpunit": "^8.5.39 || ^9.6.20", "psr/log": "^1.1 || ^2.0 || ^3.0" }, "suggest": { @@ -419,7 +419,7 @@ ], "support": { "issues": "https://github.com/guzzle/guzzle/issues", - "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + "source": "https://github.com/guzzle/guzzle/tree/7.9.2" }, "funding": [ { @@ -435,20 +435,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:35:24+00:00" + "time": "2024-07-24T11:22:20+00:00" }, { "name": "guzzlehttp/promises", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/guzzle/promises.git", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", - "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "url": "https://api.github.com/repos/guzzle/promises/zipball/6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", + "reference": "6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8", "shasum": "" }, "require": { @@ -456,7 +456,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "type": "library", "extra": { @@ -502,7 +502,7 @@ ], "support": { "issues": "https://github.com/guzzle/promises/issues", - "source": "https://github.com/guzzle/promises/tree/2.0.2" + "source": "https://github.com/guzzle/promises/tree/2.0.3" }, "funding": [ { @@ -518,20 +518,20 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:19:20+00:00" + "time": "2024-07-18T10:29:17+00:00" }, { "name": "guzzlehttp/psr7", - "version": "2.6.2", + "version": "2.7.0", "source": { "type": "git", "url": "https://github.com/guzzle/psr7.git", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", - "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/a70f5c95fb43bc83f07c9c948baa0dc1829bf201", + "reference": "a70f5c95fb43bc83f07c9c948baa0dc1829bf201", "shasum": "" }, "require": { @@ -546,8 +546,8 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.8.2", - "http-interop/http-factory-tests": "^0.9", - "phpunit/phpunit": "^8.5.36 || ^9.6.15" + "http-interop/http-factory-tests": "0.9.0", + "phpunit/phpunit": "^8.5.39 || ^9.6.20" }, "suggest": { "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" @@ -618,7 +618,7 @@ ], "support": { "issues": "https://github.com/guzzle/psr7/issues", - "source": "https://github.com/guzzle/psr7/tree/2.6.2" + "source": "https://github.com/guzzle/psr7/tree/2.7.0" }, "funding": [ { @@ -634,7 +634,7 @@ "type": "tidelift" } ], - "time": "2023-12-03T20:05:35+00:00" + "time": "2024-07-18T11:15:46+00:00" }, { "name": "laminas/laminas-diactoros", @@ -910,16 +910,16 @@ }, { "name": "minishlink/web-push", - "version": "v9.0.0-rc2", + "version": "v9.0.1", "source": { "type": "git", "url": "https://github.com/web-push-libs/web-push-php.git", - "reference": "9d36211c435baecded11d7a227f5caa098f52f80" + "reference": "761adf330860aa6cd05e5f6945c427c76a07c420" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-push-libs/web-push-php/zipball/9d36211c435baecded11d7a227f5caa098f52f80", - "reference": "9d36211c435baecded11d7a227f5caa098f52f80", + "url": "https://api.github.com/repos/web-push-libs/web-push-php/zipball/761adf330860aa6cd05e5f6945c427c76a07c420", + "reference": "761adf330860aa6cd05e5f6945c427c76a07c420", "shasum": "" }, "require": { @@ -930,7 +930,7 @@ "guzzlehttp/guzzle": "^7.4.5", "php": ">=8.1", "spomky-labs/base64url": "^2.0.4", - "web-token/jwt-library": "^3.3.0" + "web-token/jwt-library": "^3.3.0|^4.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^v3.48.0", @@ -969,9 +969,9 @@ ], "support": { "issues": "https://github.com/web-push-libs/web-push-php/issues", - "source": "https://github.com/web-push-libs/web-push-php/tree/v9.0.0-rc2" + "source": "https://github.com/web-push-libs/web-push-php/tree/v9.0.1" }, - "time": "2024-06-18T16:26:43+00:00" + "time": "2024-07-30T12:24:56+00:00" }, { "name": "nikic/fast-route", @@ -1105,16 +1105,16 @@ }, { "name": "paragonie/sodium_compat", - "version": "v1.20.0", + "version": "v1.21.1", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6" + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/e592a3e06d1fa0d43988c7c7d9948ca836f644b6", - "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bb312875dcdd20680419564fe42ba1d9564b9e37", + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37", "shasum": "" }, "require": { @@ -1185,9 +1185,9 @@ ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v1.20.0" + "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.1" }, - "time": "2023-04-30T00:54:53+00:00" + "time": "2024-04-22T22:05:04+00:00" }, { "name": "pelago/emogrifier", @@ -1785,16 +1785,16 @@ }, { "name": "sabberworm/php-css-parser", - "version": "v8.5.1", + "version": "v8.6.0", "source": { "type": "git", "url": "https://github.com/MyIntervals/PHP-CSS-Parser.git", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152" + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/4a3d572b0f8b28bb6fd016ae8bbfc445facef152", - "reference": "4a3d572b0f8b28bb6fd016ae8bbfc445facef152", + "url": "https://api.github.com/repos/MyIntervals/PHP-CSS-Parser/zipball/d2fb94a9641be84d79c7548c6d39bbebba6e9a70", + "reference": "d2fb94a9641be84d79c7548c6d39bbebba6e9a70", "shasum": "" }, "require": { @@ -1844,9 +1844,9 @@ ], "support": { "issues": "https://github.com/MyIntervals/PHP-CSS-Parser/issues", - "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.5.1" + "source": "https://github.com/MyIntervals/PHP-CSS-Parser/tree/v8.6.0" }, - "time": "2024-02-15T16:41:13+00:00" + "time": "2024-07-01T07:33:21+00:00" }, { "name": "scssphp/scssphp", diff --git a/wcfsetup/install/files/lib/system/api/composer/installed.json b/wcfsetup/install/files/lib/system/api/composer/installed.json index 2e60e32cc6..351d1eb825 100644 --- a/wcfsetup/install/files/lib/system/api/composer/installed.json +++ b/wcfsetup/install/files/lib/system/api/composer/installed.json @@ -940,17 +940,17 @@ }, { "name": "minishlink/web-push", - "version": "v9.0.0-rc2", - "version_normalized": "9.0.0.0-RC2", + "version": "v9.0.1", + "version_normalized": "9.0.1.0", "source": { "type": "git", "url": "https://github.com/web-push-libs/web-push-php.git", - "reference": "9d36211c435baecded11d7a227f5caa098f52f80" + "reference": "761adf330860aa6cd05e5f6945c427c76a07c420" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/web-push-libs/web-push-php/zipball/9d36211c435baecded11d7a227f5caa098f52f80", - "reference": "9d36211c435baecded11d7a227f5caa098f52f80", + "url": "https://api.github.com/repos/web-push-libs/web-push-php/zipball/761adf330860aa6cd05e5f6945c427c76a07c420", + "reference": "761adf330860aa6cd05e5f6945c427c76a07c420", "shasum": "" }, "require": { @@ -961,7 +961,7 @@ "guzzlehttp/guzzle": "^7.4.5", "php": ">=8.1", "spomky-labs/base64url": "^2.0.4", - "web-token/jwt-library": "^3.3.0" + "web-token/jwt-library": "^3.3.0|^4.0.0" }, "require-dev": { "friendsofphp/php-cs-fixer": "^v3.48.0", @@ -972,7 +972,7 @@ "ext-bcmath": "Optional for performance.", "ext-gmp": "Optional for performance." }, - "time": "2024-06-18T16:26:43+00:00", + "time": "2024-07-30T12:24:56+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1002,7 +1002,7 @@ ], "support": { "issues": "https://github.com/web-push-libs/web-push-php/issues", - "source": "https://github.com/web-push-libs/web-push-php/tree/v9.0.0-rc2" + "source": "https://github.com/web-push-libs/web-push-php/tree/v9.0.1" }, "install-path": "../minishlink/web-push" }, @@ -1144,17 +1144,17 @@ }, { "name": "paragonie/sodium_compat", - "version": "v1.20.0", - "version_normalized": "1.20.0.0", + "version": "v1.21.1", + "version_normalized": "1.21.1.0", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6" + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/e592a3e06d1fa0d43988c7c7d9948ca836f644b6", - "reference": "e592a3e06d1fa0d43988c7c7d9948ca836f644b6", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bb312875dcdd20680419564fe42ba1d9564b9e37", + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37", "shasum": "" }, "require": { @@ -1168,7 +1168,7 @@ "ext-libsodium": "PHP < 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security.", "ext-sodium": "PHP >= 7.0: Better performance, password hashing (Argon2i), secure memory management (memzero), and better security." }, - "time": "2023-04-30T00:54:53+00:00", + "time": "2024-04-22T22:05:04+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -1227,7 +1227,7 @@ ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v1.20.0" + "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.1" }, "install-path": "../paragonie/sodium_compat" }, @@ -2776,6 +2776,6 @@ "install-path": "../willdurand/negotiation" } ], - "dev": true, + "dev": false, "dev-package-names": [] } diff --git a/wcfsetup/install/files/lib/system/api/composer/installed.php b/wcfsetup/install/files/lib/system/api/composer/installed.php index 821009d480..0e4c28ec32 100644 --- a/wcfsetup/install/files/lib/system/api/composer/installed.php +++ b/wcfsetup/install/files/lib/system/api/composer/installed.php @@ -3,17 +3,17 @@ 'name' => '__root__', 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '61419dc7a402fe006c3045548fb7a426f354e6ab', + 'reference' => '37708311277ea8a294ac6ee74bfe8f055446016b', 'type' => 'project', 'install_path' => __DIR__ . '/../', 'aliases' => array(), - 'dev' => true, + 'dev' => false, ), 'versions' => array( '__root__' => array( 'pretty_version' => 'dev-master', 'version' => 'dev-master', - 'reference' => '61419dc7a402fe006c3045548fb7a426f354e6ab', + 'reference' => '37708311277ea8a294ac6ee74bfe8f055446016b', 'type' => 'project', 'install_path' => __DIR__ . '/../', 'aliases' => array(), @@ -65,27 +65,27 @@ 'dev_requirement' => false, ), 'guzzlehttp/guzzle' => array( - 'pretty_version' => '7.8.1', - 'version' => '7.8.1.0', - 'reference' => '41042bc7ab002487b876a0683fc8dce04ddce104', + 'pretty_version' => '7.9.2', + 'version' => '7.9.2.0', + 'reference' => 'd281ed313b989f213357e3be1a179f02196ac99b', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/guzzle', 'aliases' => array(), 'dev_requirement' => false, ), 'guzzlehttp/promises' => array( - 'pretty_version' => '2.0.2', - 'version' => '2.0.2.0', - 'reference' => 'bbff78d96034045e58e13dedd6ad91b5d1253223', + 'pretty_version' => '2.0.3', + 'version' => '2.0.3.0', + 'reference' => '6ea8dd08867a2a42619d65c3deb2c0fcbf81c8f8', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/promises', 'aliases' => array(), 'dev_requirement' => false, ), 'guzzlehttp/psr7' => array( - 'pretty_version' => '2.6.2', - 'version' => '2.6.2.0', - 'reference' => '45b30f99ac27b5ca93cb4831afe16285f57b8221', + 'pretty_version' => '2.7.0', + 'version' => '2.7.0.0', + 'reference' => 'a70f5c95fb43bc83f07c9c948baa0dc1829bf201', 'type' => 'library', 'install_path' => __DIR__ . '/../guzzlehttp/psr7', 'aliases' => array(), @@ -128,9 +128,9 @@ 'dev_requirement' => false, ), 'minishlink/web-push' => array( - 'pretty_version' => 'v9.0.0-rc2', - 'version' => '9.0.0.0-RC2', - 'reference' => '9d36211c435baecded11d7a227f5caa098f52f80', + 'pretty_version' => 'v9.0.1', + 'version' => '9.0.1.0', + 'reference' => '761adf330860aa6cd05e5f6945c427c76a07c420', 'type' => 'library', 'install_path' => __DIR__ . '/../minishlink/web-push', 'aliases' => array(), @@ -167,9 +167,9 @@ ), ), 'paragonie/sodium_compat' => array( - 'pretty_version' => 'v1.20.0', - 'version' => '1.20.0.0', - 'reference' => 'e592a3e06d1fa0d43988c7c7d9948ca836f644b6', + 'pretty_version' => 'v1.21.1', + 'version' => '1.21.1.0', + 'reference' => 'bb312875dcdd20680419564fe42ba1d9564b9e37', 'type' => 'library', 'install_path' => __DIR__ . '/../paragonie/sodium_compat', 'aliases' => array(), @@ -295,9 +295,9 @@ 'dev_requirement' => false, ), 'sabberworm/php-css-parser' => array( - 'pretty_version' => 'v8.5.1', - 'version' => '8.5.1.0', - 'reference' => '4a3d572b0f8b28bb6fd016ae8bbfc445facef152', + 'pretty_version' => 'v8.6.0', + 'version' => '8.6.0.0', + 'reference' => 'd2fb94a9641be84d79c7548c6d39bbebba6e9a70', 'type' => 'library', 'install_path' => __DIR__ . '/../sabberworm/php-css-parser', 'aliases' => array(), diff --git a/wcfsetup/install/files/lib/system/api/minishlink/web-push/composer.json b/wcfsetup/install/files/lib/system/api/minishlink/web-push/composer.json index b9b34b97d4..c938240af0 100644 --- a/wcfsetup/install/files/lib/system/api/minishlink/web-push/composer.json +++ b/wcfsetup/install/files/lib/system/api/minishlink/web-push/composer.json @@ -34,7 +34,7 @@ "ext-mbstring": "*", "ext-openssl": "*", "guzzlehttp/guzzle": "^7.4.5", - "web-token/jwt-library": "^3.3.0", + "web-token/jwt-library": "^3.3.0|^4.0.0", "spomky-labs/base64url": "^2.0.4" }, "suggest": { @@ -51,4 +51,4 @@ "Minishlink\\WebPush\\": "src" } } -} \ No newline at end of file +} diff --git a/wcfsetup/install/files/lib/system/api/minishlink/web-push/src/WebPush.php b/wcfsetup/install/files/lib/system/api/minishlink/web-push/src/WebPush.php index 8739a98d5e..5d6aebe032 100644 --- a/wcfsetup/install/files/lib/system/api/minishlink/web-push/src/WebPush.php +++ b/wcfsetup/install/files/lib/system/api/minishlink/web-push/src/WebPush.php @@ -16,8 +16,10 @@ namespace Minishlink\WebPush; use Base64Url\Base64Url; use GuzzleHttp\Client; use GuzzleHttp\Pool; +use GuzzleHttp\Exception\ConnectException; use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Psr7\Request; +use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; class WebPush @@ -152,17 +154,11 @@ class WebPush foreach ($requests as $request) { $promises[] = $this->client->sendAsync($request) ->then(function ($response) use ($request) { - /** @var ResponseInterface $response * */ + /** @var ResponseInterface $response **/ return new MessageSentReport($request, $response); }) ->otherwise(function ($reason) { - /** @var RequestException $reason **/ - if (method_exists($reason, 'getResponse')) { - $response = $reason->getResponse(); - } else { - $response = null; - } - return new MessageSentReport($reason->getRequest(), $response, false, $reason->getMessage()); + return $this->createRejectedReport($reason); }); } @@ -205,17 +201,12 @@ class WebPush $pool = new Pool($this->client, $batch, [ 'requestConcurrency' => $requestConcurrency, 'fulfilled' => function (ResponseInterface $response, int $index) use ($callback, $batch) { - /** @var \Psr\Http\Message\RequestInterface $request **/ + /** @var RequestInterface $request **/ $request = $batch[$index]; $callback(new MessageSentReport($request, $response)); }, - 'rejected' => function (RequestException $reason) use ($callback) { - if (method_exists($reason, 'getResponse')) { - $response = $reason->getResponse(); - } else { - $response = null; - } - $callback(new MessageSentReport($reason->getRequest(), $response, false, $reason->getMessage())); + 'rejected' => function ($reason) use ($callback) { + $callback($this->createRejectedReport($reason)); }, ]); @@ -228,6 +219,21 @@ class WebPush } } + /** + * @param RequestException|ConnectException $reason + * @return MessageSentReport + */ + protected function createRejectedReport($reason): MessageSentReport + { + if ($reason instanceof RequestException) { + $response = $reason->getResponse(); + } else { + $response = null; + } + + return new MessageSentReport($reason->getRequest(), $response, false, $reason->getMessage()); + } + /** * @throws \ErrorException|\Random\RandomException */ diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/README.md b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/README.md index 88e762922e..36cc3c2860 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/README.md +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/README.md @@ -11,12 +11,47 @@ Sodium Compat is a pure PHP polyfill for the Sodium cryptography library (libsodium), a core extension in PHP 7.2.0+ and otherwise [available in PECL](https://pecl.php.net/package/libsodium). -This library tentatively supports PHP 5.2.4 - 8.x (latest), but officially -only supports [non-EOL'd versions of PHP](https://secure.php.net/supported-versions.php). - If you have the PHP extension installed, Sodium Compat will opportunistically and transparently use the PHP extension instead of our implementation. +## Major Versions and Branches + +sodium_compat v1.21.0 was the last v1.x release from the master branch. From now +on, all future releases that support PHP 5.2 - 5.6 and 32-bit integers will be +[in the `v1.x` branch](v1.x). + +Newer versions of sodium_compat (i.e., v2.0.0) will continue to live in the master +branch, unless a new major version is needed. The goal of this work is to improve +code readability and performance, while reducing boilerplate code. + +When in doubt, refer to the README file in [the master branch](https://github.com/paragonie/sodium_compat/blob/master/README.md) +for the latest in version information. + +### Which version should I use? + +| sodium_compat version | PHP versions supported | 32-bit support? | Branch | +|-----------------------|------------------------|-----------------|---------------------------------------------------------------| +| `v1.x.y` | 5.2.4 - LATEST | YES | [v1.x](https://github.com/paragonie/sodium_compat/tree/v1.x) | +| `v2.x.y` | 7.2 - LATEST | NO | **master** | + +If you need 32-bit PHP support (`PHP_INT_SIZE == 4`), continue using sodium_compat v1.x. +If you want improved performance and smaller dependencies, use v2.x. + +We recommend libraries and frameworks set a Composer version constraint as follows: + +```javascript +{ + "require": { + /* ... */ + "paragonie/sodium_compat": ">= 1" + /* ... */ + } +} +``` + +Applications should, conversely, specify the actual version that matters to them +and their deployments. + ## IMPORTANT! This cryptography library has not been formally audited by an independent third @@ -266,6 +301,10 @@ insightful technical information you may find helpful. * `crypto_sign()` * `crypto_sign_open()` * PECL Libsodium Features + * `crypto_aead_aegis128l_encrypt()` + * `crypto_aead_aegis128l_decrypt()` + * `crypto_aead_aegis256_encrypt()` + * `crypto_aead_aegis256_decrypt()` * `crypto_aead_aes256gcm_encrypt()` * `crypto_aead_aes256gcm_decrypt()` * `crypto_aead_chacha20poly1305_encrypt()` @@ -343,13 +382,13 @@ insightful technical information you may find helpful. ### Features Excluded from this Polyfill -* `\Sodium\memzero()` - Although we expose this API endpoint, we can't reliably +* `sodium_memzero()` - Although we expose this API endpoint, we can't reliably zero buffers from PHP. If you have the PHP extension installed, sodium_compat will use the native implementation to zero out the string provided. Otherwise it will throw a `SodiumException`. -* `\Sodium\crypto_pwhash()` - It's not feasible to polyfill scrypt or Argon2 +* `sodium_crypto_pwhash()` - It's not feasible to polyfill scrypt or Argon2 into PHP and get reasonable performance. Users would feel motivated to select parameters that downgrade security to avoid denial of service (DoS) attacks. @@ -361,6 +400,8 @@ insightful technical information you may find helpful. To detect support for Argon2i at runtime, use `ParagonIE_Sodium_Compat::crypto_pwhash_is_available()`, which returns a boolean value (`TRUE` or `FALSE`). +* Libsodium's HKDF API (`crypto_kdf_hkdf_*()`) is not included because PHP has + its own [HMAC features](https://php.met/hash_hmac) amd it was not deemed necessary. ### PHPCompatibility Ruleset diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/autoload.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/autoload.php index fd12f87b20..bfd9e4a034 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/autoload.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/autoload.php @@ -54,6 +54,9 @@ if (PHP_VERSION_ID >= 50300) { // unless PHP >= 5.3.0 require_once dirname(__FILE__) . '/lib/namespaced.php'; require_once dirname(__FILE__) . '/lib/sodium_compat.php'; + if (!defined('SODIUM_CRYPTO_AEAD_AEGIS128L_KEYBYTES')) { + require_once dirname(__FILE__) . '/lib/php84compat_const.php'; + } } else { require_once dirname(__FILE__) . '/src/PHP52/SplFixedArray.php'; } @@ -71,5 +74,8 @@ if (PHP_VERSION_ID < 70200 || !extension_loaded('sodium')) { // Older versions of {PHP, ext/sodium} will not define these require_once(dirname(__FILE__) . '/lib/php72compat.php'); } +if (PHP_VERSION_ID < 80400 || !extension_loaded('sodium')) { + require_once dirname(__FILE__) . '/lib/php84compat.php'; +} require_once(dirname(__FILE__) . '/lib/stream-xchacha20.php'); require_once(dirname(__FILE__) . '/lib/ristretto255.php'); diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php72compat.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php72compat.php index e949dbdc68..b9da5e0365 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php72compat.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php72compat.php @@ -14,14 +14,14 @@ foreach (array( 'BASE64_VARIANT_ORIGINAL_NO_PADDING', 'BASE64_VARIANT_URLSAFE', 'BASE64_VARIANT_URLSAFE_NO_PADDING', - 'CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES', - 'CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES', - 'CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES', - 'CRYPTO_AEAD_CHACHA20POLY1305_ABYTES', 'CRYPTO_AEAD_AES256GCM_KEYBYTES', 'CRYPTO_AEAD_AES256GCM_NSECBYTES', 'CRYPTO_AEAD_AES256GCM_NPUBBYTES', 'CRYPTO_AEAD_AES256GCM_ABYTES', + 'CRYPTO_AEAD_CHACHA20POLY1305_KEYBYTES', + 'CRYPTO_AEAD_CHACHA20POLY1305_NSECBYTES', + 'CRYPTO_AEAD_CHACHA20POLY1305_NPUBBYTES', + 'CRYPTO_AEAD_CHACHA20POLY1305_ABYTES', 'CRYPTO_AEAD_CHACHA20POLY1305_IETF_KEYBYTES', 'CRYPTO_AEAD_CHACHA20POLY1305_IETF_NSECBYTES', 'CRYPTO_AEAD_CHACHA20POLY1305_IETF_NPUBBYTES', @@ -115,8 +115,12 @@ if (!is_callable('sodium_add')) { * @return void * @throws SodiumException */ - function sodium_add(&$string1, $string2) - { + function sodium_add( + #[\SensitiveParameter] + &$string1, + #[\SensitiveParameter] + $string2 + ) { ParagonIE_Sodium_Compat::add($string1, $string2); } } @@ -130,8 +134,12 @@ if (!is_callable('sodium_base642bin')) { * @throws SodiumException * @throws TypeError */ - function sodium_base642bin($string, $variant, $ignore ='') - { + function sodium_base642bin( + #[\SensitiveParameter] + $string, + $variant, + $ignore ='' + ) { return ParagonIE_Sodium_Compat::base642bin($string, $variant, $ignore); } } @@ -144,8 +152,11 @@ if (!is_callable('sodium_bin2base64')) { * @throws SodiumException * @throws TypeError */ - function sodium_bin2base64($string, $variant) - { + function sodium_bin2base64( + #[\SensitiveParameter] + $string, + $variant + ) { return ParagonIE_Sodium_Compat::bin2base64($string, $variant); } } @@ -157,8 +168,10 @@ if (!is_callable('sodium_bin2hex')) { * @throws SodiumException * @throws TypeError */ - function sodium_bin2hex($string) - { + function sodium_bin2hex( + #[\SensitiveParameter] + $string + ) { return ParagonIE_Sodium_Compat::bin2hex($string); } } @@ -171,8 +184,12 @@ if (!is_callable('sodium_compare')) { * @throws SodiumException * @throws TypeError */ - function sodium_compare($string1, $string2) - { + function sodium_compare( + #[\SensitiveParameter] + $string1, + #[\SensitiveParameter] + $string2 + ) { return ParagonIE_Sodium_Compat::compare($string1, $string2); } } @@ -185,8 +202,13 @@ if (!is_callable('sodium_crypto_aead_aes256gcm_decrypt')) { * @param string $key * @return string|bool */ - function sodium_crypto_aead_aes256gcm_decrypt($ciphertext, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_aes256gcm_decrypt( + $ciphertext, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { try { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt( $ciphertext, @@ -215,8 +237,14 @@ if (!is_callable('sodium_crypto_aead_aes256gcm_encrypt')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_aes256gcm_encrypt( + #[\SensitiveParameter] + $message, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_encrypt($message, $additional_data, $nonce, $key); } } @@ -239,8 +267,13 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_decrypt')) { * @param string $key * @return string|bool */ - function sodium_crypto_aead_chacha20poly1305_decrypt($ciphertext, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_chacha20poly1305_decrypt( + $ciphertext, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_decrypt( $ciphertext, @@ -266,8 +299,14 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_encrypt')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_aead_chacha20poly1305_encrypt($message, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_chacha20poly1305_encrypt( + #[\SensitiveParameter] + $message, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_encrypt( $message, $additional_data, @@ -296,8 +335,13 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_decrypt')) { * @param string $key * @return string|bool */ - function sodium_crypto_aead_chacha20poly1305_ietf_decrypt($message, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_chacha20poly1305_ietf_decrypt( + $message, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { try { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_decrypt( $message, @@ -323,8 +367,14 @@ if (!is_callable('sodium_crypto_aead_chacha20poly1305_ietf_encrypt')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_aead_chacha20poly1305_ietf_encrypt($message, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_chacha20poly1305_ietf_encrypt( + #[\SensitiveParameter] + $message, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_aead_chacha20poly1305_ietf_encrypt( $message, $additional_data, @@ -353,8 +403,13 @@ if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_decrypt')) { * @param string $key * @return string|bool */ - function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt($ciphertext, $additional_data, $nonce, $key) - { + function sodium_crypto_aead_xchacha20poly1305_ietf_decrypt( + $ciphertext, + $additional_data, + $nonce, + #[\SensitiveParameter] + $key + ) { try { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_decrypt( $ciphertext, @@ -382,9 +437,11 @@ if (!is_callable('sodium_crypto_aead_xchacha20poly1305_ietf_encrypt')) { * @throws TypeError */ function sodium_crypto_aead_xchacha20poly1305_ietf_encrypt( + #[\SensitiveParameter] $message, $additional_data, $nonce, + #[\SensitiveParameter] $key ) { return ParagonIE_Sodium_Compat::crypto_aead_xchacha20poly1305_ietf_encrypt( @@ -416,8 +473,11 @@ if (!is_callable('sodium_crypto_auth')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_auth($message, $key) - { + function sodium_crypto_auth( + $message, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_auth($message, $key); } } @@ -442,8 +502,12 @@ if (!is_callable('sodium_crypto_auth_verify')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_auth_verify($mac, $message, $key) - { + function sodium_crypto_auth_verify( + $mac, + $message, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_auth_verify($mac, $message, $key); } } @@ -457,8 +521,13 @@ if (!is_callable('sodium_crypto_box')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box($message, $nonce, $key_pair) - { + function sodium_crypto_box( + #[\SensitiveParameter] + $message, + $nonce, + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_box($message, $nonce, $key_pair); } } @@ -483,8 +552,11 @@ if (!is_callable('sodium_crypto_box_keypair_from_secretkey_and_publickey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key) - { + function sodium_crypto_box_keypair_from_secretkey_and_publickey( + #[\SensitiveParameter] + $secret_key, + $public_key + ) { return ParagonIE_Sodium_Compat::crypto_box_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } @@ -496,8 +568,12 @@ if (!is_callable('sodium_crypto_box_open')) { * @param string $key_pair * @return string|bool */ - function sodium_crypto_box_open($ciphertext, $nonce, $key_pair) - { + function sodium_crypto_box_open( + $ciphertext, + $nonce, + #[\SensitiveParameter] + $key_pair + ) { try { return ParagonIE_Sodium_Compat::crypto_box_open($ciphertext, $nonce, $key_pair); } catch (Error $ex) { @@ -515,8 +591,10 @@ if (!is_callable('sodium_crypto_box_publickey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_publickey($key_pair) - { + function sodium_crypto_box_publickey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_box_publickey($key_pair); } } @@ -528,8 +606,10 @@ if (!is_callable('sodium_crypto_box_publickey_from_secretkey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_publickey_from_secretkey($secret_key) - { + function sodium_crypto_box_publickey_from_secretkey( + #[\SensitiveParameter] + $secret_key + ) { return ParagonIE_Sodium_Compat::crypto_box_publickey_from_secretkey($secret_key); } } @@ -542,8 +622,11 @@ if (!is_callable('sodium_crypto_box_seal')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_seal($message, $public_key) - { + function sodium_crypto_box_seal( + #[\SensitiveParameter] + $message, + $public_key + ) { return ParagonIE_Sodium_Compat::crypto_box_seal($message, $public_key); } } @@ -555,8 +638,11 @@ if (!is_callable('sodium_crypto_box_seal_open')) { * @return string|bool * @throws SodiumException */ - function sodium_crypto_box_seal_open($message, $key_pair) - { + function sodium_crypto_box_seal_open( + $message, + #[\SensitiveParameter] + $key_pair + ) { try { return ParagonIE_Sodium_Compat::crypto_box_seal_open($message, $key_pair); } catch (SodiumException $ex) { @@ -575,8 +661,10 @@ if (!is_callable('sodium_crypto_box_secretkey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_secretkey($key_pair) - { + function sodium_crypto_box_secretkey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_box_secretkey($key_pair); } } @@ -588,8 +676,10 @@ if (!is_callable('sodium_crypto_box_seed_keypair')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_box_seed_keypair($seed) - { + function sodium_crypto_box_seed_keypair( + #[\SensitiveParameter] + $seed + ) { return ParagonIE_Sodium_Compat::crypto_box_seed_keypair($seed); } } @@ -603,8 +693,12 @@ if (!is_callable('sodium_crypto_generichash')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_generichash($message, $key = null, $length = 32) - { + function sodium_crypto_generichash( + $message, + #[\SensitiveParameter] + $key = null, + $length = 32 + ) { return ParagonIE_Sodium_Compat::crypto_generichash($message, $key, $length); } } @@ -631,8 +725,11 @@ if (!is_callable('sodium_crypto_generichash_init')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_generichash_init($key = null, $length = 32) - { + function sodium_crypto_generichash_init( + #[\SensitiveParameter] + $key = null, + $length = 32 + ) { return ParagonIE_Sodium_Compat::crypto_generichash_init($key, $length); } } @@ -656,8 +753,11 @@ if (!is_callable('sodium_crypto_generichash_update')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_generichash_update(&$state, $message = '') - { + function sodium_crypto_generichash_update( + #[\SensitiveParameter] + &$state, + $message = '' + ) { ParagonIE_Sodium_Compat::crypto_generichash_update($state, $message); } } @@ -682,8 +782,13 @@ if (!is_callable('sodium_crypto_kdf_derive_from_key')) { * @return string * @throws Exception */ - function sodium_crypto_kdf_derive_from_key($subkey_length, $subkey_id, $context, $key) - { + function sodium_crypto_kdf_derive_from_key( + $subkey_length, + $subkey_id, + $context, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_kdf_derive_from_key( $subkey_length, $subkey_id, @@ -703,8 +808,13 @@ if (!is_callable('sodium_crypto_kx')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_kx($my_secret, $their_public, $client_public, $server_public) - { + function sodium_crypto_kx( + #[\SensitiveParameter] + $my_secret, + $their_public, + $client_public, + $server_public + ) { return ParagonIE_Sodium_Compat::crypto_kx( $my_secret, $their_public, @@ -719,8 +829,10 @@ if (!is_callable('sodium_crypto_kx_seed_keypair')) { * @return string * @throws Exception */ - function sodium_crypto_kx_seed_keypair($seed) - { + function sodium_crypto_kx_seed_keypair( + #[\SensitiveParameter] + $seed + ) { return ParagonIE_Sodium_Compat::crypto_kx_seed_keypair($seed); } } @@ -741,8 +853,11 @@ if (!is_callable('sodium_crypto_kx_client_session_keys')) { * @return array{0: string, 1: string} * @throws SodiumException */ - function sodium_crypto_kx_client_session_keys($client_key_pair, $server_key) - { + function sodium_crypto_kx_client_session_keys( + #[\SensitiveParameter] + $client_key_pair, + $server_key + ) { return ParagonIE_Sodium_Compat::crypto_kx_client_session_keys($client_key_pair, $server_key); } } @@ -753,8 +868,11 @@ if (!is_callable('sodium_crypto_kx_server_session_keys')) { * @return array{0: string, 1: string} * @throws SodiumException */ - function sodium_crypto_kx_server_session_keys($server_key_pair, $client_key) - { + function sodium_crypto_kx_server_session_keys( + #[\SensitiveParameter] + $server_key_pair, + $client_key + ) { return ParagonIE_Sodium_Compat::crypto_kx_server_session_keys($server_key_pair, $client_key); } } @@ -764,8 +882,10 @@ if (!is_callable('sodium_crypto_kx_secretkey')) { * @return string * @throws Exception */ - function sodium_crypto_kx_secretkey($key_pair) - { + function sodium_crypto_kx_secretkey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_kx_secretkey($key_pair); } } @@ -775,8 +895,10 @@ if (!is_callable('sodium_crypto_kx_publickey')) { * @return string * @throws Exception */ - function sodium_crypto_kx_publickey($key_pair) - { + function sodium_crypto_kx_publickey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_kx_publickey($key_pair); } } @@ -793,8 +915,15 @@ if (!is_callable('sodium_crypto_pwhash')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo = null) - { + function sodium_crypto_pwhash( + $length, + #[\SensitiveParameter] + $passwd, + $salt, + $opslimit, + $memlimit, + $algo = null + ) { return ParagonIE_Sodium_Compat::crypto_pwhash($length, $passwd, $salt, $opslimit, $memlimit, $algo); } } @@ -808,8 +937,12 @@ if (!is_callable('sodium_crypto_pwhash_str')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash_str($passwd, $opslimit, $memlimit) - { + function sodium_crypto_pwhash_str( + #[\SensitiveParameter] + $passwd, + $opslimit, + $memlimit + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str($passwd, $opslimit, $memlimit); } } @@ -823,8 +956,12 @@ if (!is_callable('sodium_crypto_pwhash_str_needs_rehash')) { * * @throws SodiumException */ - function sodium_crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit) - { + function sodium_crypto_pwhash_str_needs_rehash( + #[\SensitiveParameter] + $hash, + $opslimit, + $memlimit + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_needs_rehash($hash, $opslimit, $memlimit); } } @@ -837,8 +974,12 @@ if (!is_callable('sodium_crypto_pwhash_str_verify')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash_str_verify($passwd, $hash) - { + function sodium_crypto_pwhash_str_verify( + #[\SensitiveParameter] + $passwd, + #[\SensitiveParameter] + $hash + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_str_verify($passwd, $hash); } } @@ -854,8 +995,14 @@ if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash_scryptsalsa208sha256($length, $passwd, $salt, $opslimit, $memlimit) - { + function sodium_crypto_pwhash_scryptsalsa208sha256( + $length, + #[\SensitiveParameter] + $passwd, + $salt, + $opslimit, + $memlimit + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256( $length, $passwd, @@ -875,8 +1022,12 @@ if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit) - { + function sodium_crypto_pwhash_scryptsalsa208sha256_str( + #[\SensitiveParameter] + $passwd, + $opslimit, + $memlimit + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str($passwd, $opslimit, $memlimit); } } @@ -889,8 +1040,12 @@ if (!is_callable('sodium_crypto_pwhash_scryptsalsa208sha256_str_verify')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash) - { + function sodium_crypto_pwhash_scryptsalsa208sha256_str_verify( + #[\SensitiveParameter] + $passwd, + #[\SensitiveParameter] + $hash + ) { return ParagonIE_Sodium_Compat::crypto_pwhash_scryptsalsa208sha256_str_verify($passwd, $hash); } } @@ -903,8 +1058,11 @@ if (!is_callable('sodium_crypto_scalarmult')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_scalarmult($n, $p) - { + function sodium_crypto_scalarmult( + #[\SensitiveParameter] + $n, + $p + ) { return ParagonIE_Sodium_Compat::crypto_scalarmult($n, $p); } } @@ -916,8 +1074,10 @@ if (!is_callable('sodium_crypto_scalarmult_base')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_scalarmult_base($n) - { + function sodium_crypto_scalarmult_base( + #[\SensitiveParameter] + $n + ) { return ParagonIE_Sodium_Compat::crypto_scalarmult_base($n); } } @@ -931,8 +1091,13 @@ if (!is_callable('sodium_crypto_secretbox')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_secretbox($message, $nonce, $key) - { + function sodium_crypto_secretbox( + #[\SensitiveParameter] + $message, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_secretbox($message, $nonce, $key); } } @@ -955,8 +1120,12 @@ if (!is_callable('sodium_crypto_secretbox_open')) { * @param string $key * @return string|bool */ - function sodium_crypto_secretbox_open($ciphertext, $nonce, $key) - { + function sodium_crypto_secretbox_open( + $ciphertext, + $nonce, + #[\SensitiveParameter] + $key + ) { try { return ParagonIE_Sodium_Compat::crypto_secretbox_open($ciphertext, $nonce, $key); } catch (Error $ex) { @@ -972,8 +1141,10 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_push')) { * @return array * @throws SodiumException */ - function sodium_crypto_secretstream_xchacha20poly1305_init_push($key) - { + function sodium_crypto_secretstream_xchacha20poly1305_init_push( + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_push($key); } } @@ -987,7 +1158,9 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_push')) { * @throws SodiumException */ function sodium_crypto_secretstream_xchacha20poly1305_push( + #[\SensitiveParameter] &$state, + #[\SensitiveParameter] $message, $additional_data = '', $tag = 0 @@ -1007,8 +1180,11 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_init_pull')) { * @return string * @throws Exception */ - function sodium_crypto_secretstream_xchacha20poly1305_init_pull($header, $key) - { + function sodium_crypto_secretstream_xchacha20poly1305_init_pull( + $header, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_init_pull($header, $key); } } @@ -1020,8 +1196,12 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_pull')) { * @return bool|array{0: string, 1: int} * @throws SodiumException */ - function sodium_crypto_secretstream_xchacha20poly1305_pull(&$state, $ciphertext, $additional_data = '') - { + function sodium_crypto_secretstream_xchacha20poly1305_pull( + #[\SensitiveParameter] + &$state, + $ciphertext, + $additional_data = '' + ) { return ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_pull( $state, $ciphertext, @@ -1035,8 +1215,10 @@ if (!is_callable('sodium_crypto_secretstream_xchacha20poly1305_rekey')) { * @return void * @throws SodiumException */ - function sodium_crypto_secretstream_xchacha20poly1305_rekey(&$state) - { + function sodium_crypto_secretstream_xchacha20poly1305_rekey( + #[\SensitiveParameter] + &$state + ) { ParagonIE_Sodium_Compat::crypto_secretstream_xchacha20poly1305_rekey($state); } } @@ -1059,8 +1241,11 @@ if (!is_callable('sodium_crypto_shorthash')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_shorthash($message, $key = '') - { + function sodium_crypto_shorthash( + $message, + #[\SensitiveParameter] + $key = '' + ) { return ParagonIE_Sodium_Compat::crypto_shorthash($message, $key); } } @@ -1084,8 +1269,11 @@ if (!is_callable('sodium_crypto_sign')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign($message, $secret_key) - { + function sodium_crypto_sign( + $message, + #[\SensitiveParameter] + $secret_key + ) { return ParagonIE_Sodium_Compat::crypto_sign($message, $secret_key); } } @@ -1098,8 +1286,11 @@ if (!is_callable('sodium_crypto_sign_detached')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_detached($message, $secret_key) - { + function sodium_crypto_sign_detached( + $message, + #[\SensitiveParameter] + $secret_key + ) { return ParagonIE_Sodium_Compat::crypto_sign_detached($message, $secret_key); } } @@ -1112,8 +1303,11 @@ if (!is_callable('sodium_crypto_sign_keypair_from_secretkey_and_publickey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key) - { + function sodium_crypto_sign_keypair_from_secretkey_and_publickey( + #[\SensitiveParameter] + $secret_key, + $public_key + ) { return ParagonIE_Sodium_Compat::crypto_sign_keypair_from_secretkey_and_publickey($secret_key, $public_key); } } @@ -1155,8 +1349,10 @@ if (!is_callable('sodium_crypto_sign_publickey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_publickey($key_pair) - { + function sodium_crypto_sign_publickey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey($key_pair); } } @@ -1168,8 +1364,10 @@ if (!is_callable('sodium_crypto_sign_publickey_from_secretkey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_publickey_from_secretkey($secret_key) - { + function sodium_crypto_sign_publickey_from_secretkey( + #[\SensitiveParameter] + $secret_key + ) { return ParagonIE_Sodium_Compat::crypto_sign_publickey_from_secretkey($secret_key); } } @@ -1181,8 +1379,10 @@ if (!is_callable('sodium_crypto_sign_secretkey')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_secretkey($key_pair) - { + function sodium_crypto_sign_secretkey( + #[\SensitiveParameter] + $key_pair + ) { return ParagonIE_Sodium_Compat::crypto_sign_secretkey($key_pair); } } @@ -1194,8 +1394,10 @@ if (!is_callable('sodium_crypto_sign_seed_keypair')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_seed_keypair($seed) - { + function sodium_crypto_sign_seed_keypair( + #[\SensitiveParameter] + $seed + ) { return ParagonIE_Sodium_Compat::crypto_sign_seed_keypair($seed); } } @@ -1235,8 +1437,10 @@ if (!is_callable('sodium_crypto_sign_ed25519_sk_to_curve25519')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_sign_ed25519_sk_to_curve25519($secret_key) - { + function sodium_crypto_sign_ed25519_sk_to_curve25519( + #[\SensitiveParameter] + $secret_key + ) { return ParagonIE_Sodium_Compat::crypto_sign_ed25519_sk_to_curve25519($secret_key); } } @@ -1250,8 +1454,12 @@ if (!is_callable('sodium_crypto_stream')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_stream($length, $nonce, $key) - { + function sodium_crypto_stream( + $length, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_stream($length, $nonce, $key); } } @@ -1276,8 +1484,13 @@ if (!is_callable('sodium_crypto_stream_xor')) { * @throws SodiumException * @throws TypeError */ - function sodium_crypto_stream_xor($message, $nonce, $key) - { + function sodium_crypto_stream_xor( + #[\SensitiveParameter] + $message, + $nonce, + #[\SensitiveParameter] + $key + ) { return ParagonIE_Sodium_Compat::crypto_stream_xor($message, $nonce, $key); } } @@ -1291,8 +1504,11 @@ if (!is_callable('sodium_hex2bin')) { * @throws SodiumException * @throws TypeError */ - function sodium_hex2bin($string, $ignore = '') - { + function sodium_hex2bin( + #[\SensitiveParameter] + $string, + $ignore = '' + ) { return ParagonIE_Sodium_Compat::hex2bin($string, $ignore); } } @@ -1304,8 +1520,10 @@ if (!is_callable('sodium_increment')) { * @throws SodiumException * @throws TypeError */ - function sodium_increment(&$string) - { + function sodium_increment( + #[\SensitiveParameter] + &$string + ) { ParagonIE_Sodium_Compat::increment($string); } } @@ -1348,8 +1566,12 @@ if (!is_callable('sodium_memcmp')) { * @throws SodiumException * @throws TypeError */ - function sodium_memcmp($string1, $string2) - { + function sodium_memcmp( + #[\SensitiveParameter] + $string1, + #[\SensitiveParameter] + $string2 + ) { return ParagonIE_Sodium_Compat::memcmp($string1, $string2); } } @@ -1363,8 +1585,10 @@ if (!is_callable('sodium_memzero')) { * * @psalm-suppress ReferenceConstraintViolation */ - function sodium_memzero(&$string) - { + function sodium_memzero( + #[\SensitiveParameter] + &$string + ) { ParagonIE_Sodium_Compat::memzero($string); } } @@ -1377,8 +1601,11 @@ if (!is_callable('sodium_pad')) { * @throws SodiumException * @throws TypeError */ - function sodium_pad($unpadded, $block_size) - { + function sodium_pad( + #[\SensitiveParameter] + $unpadded, + $block_size + ) { return ParagonIE_Sodium_Compat::pad($unpadded, $block_size, true); } } @@ -1391,8 +1618,11 @@ if (!is_callable('sodium_unpad')) { * @throws SodiumException * @throws TypeError */ - function sodium_unpad($padded, $block_size) - { + function sodium_unpad( + #[\SensitiveParameter] + $padded, + $block_size + ) { return ParagonIE_Sodium_Compat::unpad($padded, $block_size, true); } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php84compat.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php84compat.php new file mode 100644 index 0000000000..ee172a08d0 --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/lib/php84compat.php @@ -0,0 +1,130 @@ + $state */ + protected $state; + public function __construct() + { + $this->state = array_fill(0, 8, ''); + } + + /** + * @internal Only use this for unit tests! + * @return string[] + */ + public function getState() + { + return array_values($this->state); + } + + /** + * @param array $input + * @return self + * @throws SodiumException + * + * @internal Only for unit tests + */ + public static function initForUnitTests(array $input) + { + if (count($input) < 8) { + throw new SodiumException('invalid input'); + } + $state = new self(); + for ($i = 0; $i < 8; ++$i) { + $state->state[$i] = $input[$i]; + } + return $state; + } + + /** + * @param string $key + * @param string $nonce + * @return self + */ + public static function init($key, $nonce) + { + $state = new self(); + + // S0 = key ^ nonce + $state->state[0] = $key ^ $nonce; + // S1 = C1 + $state->state[1] = SODIUM_COMPAT_AEGIS_C1; + // S2 = C0 + $state->state[2] = SODIUM_COMPAT_AEGIS_C0; + // S3 = C1 + $state->state[3] = SODIUM_COMPAT_AEGIS_C1; + // S4 = key ^ nonce + $state->state[4] = $key ^ $nonce; + // S5 = key ^ C0 + $state->state[5] = $key ^ SODIUM_COMPAT_AEGIS_C0; + // S6 = key ^ C1 + $state->state[6] = $key ^ SODIUM_COMPAT_AEGIS_C1; + // S7 = key ^ C0 + $state->state[7] = $key ^ SODIUM_COMPAT_AEGIS_C0; + + // Repeat(10, Update(nonce, key)) + for ($i = 0; $i < 10; ++$i) { + $state->update($nonce, $key); + } + return $state; + } + + /** + * @param string $ai + * @return self + */ + public function absorb($ai) + { + if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 32) { + throw new SodiumException('Input must be two AES blocks in size'); + } + $t0 = ParagonIE_Sodium_Core_Util::substr($ai, 0, 16); + $t1 = ParagonIE_Sodium_Core_Util::substr($ai, 16, 16); + return $this->update($t0, $t1); + } + + + /** + * @param string $ci + * @return string + * @throws SodiumException + */ + public function dec($ci) + { + if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 32) { + throw new SodiumException('Input must be two AES blocks in size'); + } + + // z0 = S6 ^ S1 ^ (S2 & S3) + $z0 = $this->state[6] + ^ $this->state[1] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + // z1 = S2 ^ S5 ^ (S6 & S7) + $z1 = $this->state[2] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); + + // t0, t1 = Split(xi, 128) + $t0 = ParagonIE_Sodium_Core_Util::substr($ci, 0, 16); + $t1 = ParagonIE_Sodium_Core_Util::substr($ci, 16, 16); + + // out0 = t0 ^ z0 + // out1 = t1 ^ z1 + $out0 = $t0 ^ $z0; + $out1 = $t1 ^ $z1; + + // Update(out0, out1) + // xi = out0 || out1 + $this->update($out0, $out1); + return $out0 . $out1; + } + + /** + * @param string $cn + * @return string + */ + public function decPartial($cn) + { + $len = ParagonIE_Sodium_Core_Util::strlen($cn); + + // z0 = S6 ^ S1 ^ (S2 & S3) + $z0 = $this->state[6] + ^ $this->state[1] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + // z1 = S2 ^ S5 ^ (S6 & S7) + $z1 = $this->state[2] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); + + // t0, t1 = Split(ZeroPad(cn, 256), 128) + $cn = str_pad($cn, 32, "\0", STR_PAD_RIGHT); + $t0 = ParagonIE_Sodium_Core_Util::substr($cn, 0, 16); + $t1 = ParagonIE_Sodium_Core_Util::substr($cn, 16, 16); + // out0 = t0 ^ z0 + // out1 = t1 ^ z1 + $out0 = $t0 ^ $z0; + $out1 = $t1 ^ $z1; + + // xn = Truncate(out0 || out1, |cn|) + $xn = ParagonIE_Sodium_Core_Util::substr($out0 . $out1, 0, $len); + + // v0, v1 = Split(ZeroPad(xn, 256), 128) + $padded = str_pad($xn, 32, "\0", STR_PAD_RIGHT); + $v0 = ParagonIE_Sodium_Core_Util::substr($padded, 0, 16); + $v1 = ParagonIE_Sodium_Core_Util::substr($padded, 16, 16); + // Update(v0, v1) + $this->update($v0, $v1); + + // return xn + return $xn; + } + + /** + * @param string $xi + * @return string + * @throws SodiumException + */ + public function enc($xi) + { + if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 32) { + throw new SodiumException('Input must be two AES blocks in size'); + } + + // z0 = S6 ^ S1 ^ (S2 & S3) + $z0 = $this->state[6] + ^ $this->state[1] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + // z1 = S2 ^ S5 ^ (S6 & S7) + $z1 = $this->state[2] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[6], $this->state[7]); + + // t0, t1 = Split(xi, 128) + $t0 = ParagonIE_Sodium_Core_Util::substr($xi, 0, 16); + $t1 = ParagonIE_Sodium_Core_Util::substr($xi, 16, 16); + + // out0 = t0 ^ z0 + // out1 = t1 ^ z1 + $out0 = $t0 ^ $z0; + $out1 = $t1 ^ $z1; + + // Update(t0, t1) + // ci = out0 || out1 + $this->update($t0, $t1); + + // return ci + return $out0 . $out1; + } + + /** + * @param int $ad_len_bits + * @param int $msg_len_bits + * @return string + */ + public function finalize($ad_len_bits, $msg_len_bits) + { + $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . + ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); + $t = $this->state[2] ^ $encoded; + for ($i = 0; $i < 7; ++$i) { + $this->update($t, $t); + } + return ($this->state[0] ^ $this->state[1] ^ $this->state[2] ^ $this->state[3]) . + ($this->state[4] ^ $this->state[5] ^ $this->state[6] ^ $this->state[7]); + } + + /** + * @param string $m0 + * @param string $m1 + * @return self + */ + public function update($m0, $m1) + { + /* + S'0 = AESRound(S7, S0 ^ M0) + S'1 = AESRound(S0, S1) + S'2 = AESRound(S1, S2) + S'3 = AESRound(S2, S3) + S'4 = AESRound(S3, S4 ^ M1) + S'5 = AESRound(S4, S5) + S'6 = AESRound(S5, S6) + S'7 = AESRound(S6, S7) + */ + list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[7], $this->state[0] ^ $m0, + $this->state[0], $this->state[1] + ); + + list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[1], $this->state[2], + $this->state[2], $this->state[3] + ); + + list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[3], $this->state[4] ^ $m1, + $this->state[4], $this->state[5] + ); + list($s_6, $s_7) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[5], $this->state[6], + $this->state[6], $this->state[7] + ); + + /* + S0 = S'0 + S1 = S'1 + S2 = S'2 + S3 = S'3 + S4 = S'4 + S5 = S'5 + S6 = S'6 + S7 = S'7 + */ + $this->state[0] = $s_0; + $this->state[1] = $s_1; + $this->state[2] = $s_2; + $this->state[3] = $s_3; + $this->state[4] = $s_4; + $this->state[5] = $s_5; + $this->state[6] = $s_6; + $this->state[7] = $s_7; + return $this; + } +} \ No newline at end of file diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS/State256.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS/State256.php new file mode 100644 index 0000000000..6f88b828e1 --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS/State256.php @@ -0,0 +1,240 @@ + $state */ + protected $state; + public function __construct() + { + $this->state = array_fill(0, 6, ''); + } + + /** + * @internal Only use this for unit tests! + * @return string[] + */ + public function getState() + { + return array_values($this->state); + } + + /** + * @param array $input + * @return self + * @throws SodiumException + * + * @internal Only for unit tests + */ + public static function initForUnitTests(array $input) + { + if (count($input) < 6) { + throw new SodiumException('invalid input'); + } + $state = new self(); + for ($i = 0; $i < 6; ++$i) { + $state->state[$i] = $input[$i]; + } + return $state; + } + + /** + * @param string $key + * @param string $nonce + * @return self + */ + public static function init($key, $nonce) + { + $state = new self(); + $k0 = ParagonIE_Sodium_Core_Util::substr($key, 0, 16); + $k1 = ParagonIE_Sodium_Core_Util::substr($key, 16, 16); + $n0 = ParagonIE_Sodium_Core_Util::substr($nonce, 0, 16); + $n1 = ParagonIE_Sodium_Core_Util::substr($nonce, 16, 16); + + // S0 = k0 ^ n0 + // S1 = k1 ^ n1 + // S2 = C1 + // S3 = C0 + // S4 = k0 ^ C0 + // S5 = k1 ^ C1 + $k0_n0 = $k0 ^ $n0; + $k1_n1 = $k1 ^ $n1; + $state->state[0] = $k0_n0; + $state->state[1] = $k1_n1; + $state->state[2] = SODIUM_COMPAT_AEGIS_C1; + $state->state[3] = SODIUM_COMPAT_AEGIS_C0; + $state->state[4] = $k0 ^ SODIUM_COMPAT_AEGIS_C0; + $state->state[5] = $k1 ^ SODIUM_COMPAT_AEGIS_C1; + + // Repeat(4, + // Update(k0) + // Update(k1) + // Update(k0 ^ n0) + // Update(k1 ^ n1) + // ) + for ($i = 0; $i < 4; ++$i) { + $state->update($k0); + $state->update($k1); + $state->update($k0 ^ $n0); + $state->update($k1 ^ $n1); + } + return $state; + } + + /** + * @param string $ai + * @return self + * @throws SodiumException + */ + public function absorb($ai) + { + if (ParagonIE_Sodium_Core_Util::strlen($ai) !== 16) { + throw new SodiumException('Input must be an AES block in size'); + } + return $this->update($ai); + } + + /** + * @param string $ci + * @return string + * @throws SodiumException + */ + public function dec($ci) + { + if (ParagonIE_Sodium_Core_Util::strlen($ci) !== 16) { + throw new SodiumException('Input must be an AES block in size'); + } + // z = S1 ^ S4 ^ S5 ^ (S2 & S3) + $z = $this->state[1] + ^ $this->state[4] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + $xi = $ci ^ $z; + $this->update($xi); + return $xi; + } + + /** + * @param string $cn + * @return string + */ + public function decPartial($cn) + { + $len = ParagonIE_Sodium_Core_Util::strlen($cn); + // z = S1 ^ S4 ^ S5 ^ (S2 & S3) + $z = $this->state[1] + ^ $this->state[4] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + + // t = ZeroPad(cn, 128) + $t = str_pad($cn, 16, "\0", STR_PAD_RIGHT); + + // out = t ^ z + $out = $t ^ $z; + + // xn = Truncate(out, |cn|) + $xn = ParagonIE_Sodium_Core_Util::substr($out, 0, $len); + + // v = ZeroPad(xn, 128) + $v = str_pad($xn, 16, "\0", STR_PAD_RIGHT); + // Update(v) + $this->update($v); + + // return xn + return $xn; + } + + /** + * @param string $xi + * @return string + * @throws SodiumException + */ + public function enc($xi) + { + if (ParagonIE_Sodium_Core_Util::strlen($xi) !== 16) { + throw new SodiumException('Input must be an AES block in size'); + } + // z = S1 ^ S4 ^ S5 ^ (S2 & S3) + $z = $this->state[1] + ^ $this->state[4] + ^ $this->state[5] + ^ ParagonIE_Sodium_Core_Util::andStrings($this->state[2], $this->state[3]); + $this->update($xi); + return $xi ^ $z; + } + + /** + * @param int $ad_len_bits + * @param int $msg_len_bits + * @return string + */ + public function finalize($ad_len_bits, $msg_len_bits) + { + $encoded = ParagonIE_Sodium_Core_Util::store64_le($ad_len_bits) . + ParagonIE_Sodium_Core_Util::store64_le($msg_len_bits); + $t = $this->state[3] ^ $encoded; + + for ($i = 0; $i < 7; ++$i) { + $this->update($t); + } + + return ($this->state[0] ^ $this->state[1] ^ $this->state[2]) . + ($this->state[3] ^ $this->state[4] ^ $this->state[5]); + } + + /** + * @param string $m + * @return self + */ + public function update($m) + { + /* + S'0 = AESRound(S5, S0 ^ M) + S'1 = AESRound(S0, S1) + S'2 = AESRound(S1, S2) + S'3 = AESRound(S2, S3) + S'4 = AESRound(S3, S4) + S'5 = AESRound(S4, S5) + */ + list($s_0, $s_1) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[5],$this->state[0] ^ $m, + $this->state[0], $this->state[1] + ); + + list($s_2, $s_3) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[1], $this->state[2], + $this->state[2], $this->state[3] + ); + list($s_4, $s_5) = ParagonIE_Sodium_Core_AES::doubleRound( + $this->state[3], $this->state[4], + $this->state[4], $this->state[5] + ); + + /* + S0 = S'0 + S1 = S'1 + S2 = S'2 + S3 = S'3 + S4 = S'4 + S5 = S'5 + */ + $this->state[0] = $s_0; + $this->state[1] = $s_1; + $this->state[2] = $s_2; + $this->state[3] = $s_3; + $this->state[4] = $s_4; + $this->state[5] = $s_5; + return $this; + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS128L.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS128L.php new file mode 100644 index 0000000000..ad1e85d324 --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS128L.php @@ -0,0 +1,119 @@ +> 5; + for ($i = 0; $i < $ad_blocks; ++$i) { + $ai = self::substr($ad, $i << 5, 32); + if (self::strlen($ai) < 32) { + $ai = str_pad($ai, 32, "\0", STR_PAD_RIGHT); + } + $state->absorb($ai); + } + + $msg = ''; + $cn = self::strlen($ct) & 31; + $ct_blocks = self::strlen($ct) >> 5; + for ($i = 0; $i < $ct_blocks; ++$i) { + $msg .= $state->dec(self::substr($ct, $i << 5, 32)); + } + if ($cn) { + $start = $ct_blocks << 5; + $msg .= $state->decPartial(self::substr($ct, $start, $cn)); + } + $expected_tag = $state->finalize( + self::strlen($ad) << 3, + self::strlen($msg) << 3 + ); + if (!self::hashEquals($expected_tag, $tag)) { + try { + // The RFC says to erase msg, so we shall try: + ParagonIE_Sodium_Compat::memzero($msg); + } catch (SodiumException $ex) { + // Do nothing if we cannot memzero + } + throw new SodiumException('verification failed'); + } + return $msg; + } + + /** + * @param string $msg + * @param string $ad + * @param string $key + * @param string $nonce + * @return array + * + * @throws SodiumException + */ + public static function encrypt($msg, $ad, $key, $nonce) + { + $state = self::init($key, $nonce); + // ad_blocks = Split(ZeroPad(ad, 256), 256) + // for ai in ad_blocks: + // Absorb(ai) + $ad_len = self::strlen($ad); + $msg_len = self::strlen($msg); + $ad_blocks = ($ad_len + 31) >> 5; + for ($i = 0; $i < $ad_blocks; ++$i) { + $ai = self::substr($ad, $i << 5, 32); + if (self::strlen($ai) < 32) { + $ai = str_pad($ai, 32, "\0", STR_PAD_RIGHT); + } + $state->absorb($ai); + } + + // msg_blocks = Split(ZeroPad(msg, 256), 256) + // for xi in msg_blocks: + // ct = ct || Enc(xi) + $ct = ''; + $msg_blocks = ($msg_len + 31) >> 5; + for ($i = 0; $i < $msg_blocks; ++$i) { + $xi = self::substr($msg, $i << 5, 32); + if (self::strlen($xi) < 32) { + $xi = str_pad($xi, 32, "\0", STR_PAD_RIGHT); + } + $ct .= $state->enc($xi); + } + // tag = Finalize(|ad|, |msg|) + // ct = Truncate(ct, |msg|) + $tag = $state->finalize( + $ad_len << 3, + $msg_len << 3 + ); + // return ct and tag + return array( + self::substr($ct, 0, $msg_len), + $tag + ); + } + + /** + * @param string $key + * @param string $nonce + * @return ParagonIE_Sodium_Core_AEGIS_State128L + */ + public static function init($key, $nonce) + { + return ParagonIE_Sodium_Core_AEGIS_State128L::init($key, $nonce); + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS256.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS256.php new file mode 100644 index 0000000000..605bbcafde --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AEGIS256.php @@ -0,0 +1,118 @@ +> 4; + // for ai in ad_blocks: + // Absorb(ai) + for ($i = 0; $i < $ad_blocks; ++$i) { + $ai = self::substr($ad, $i << 4, 16); + if (self::strlen($ai) < 16) { + $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT); + } + $state->absorb($ai); + } + + $msg = ''; + $cn = self::strlen($ct) & 15; + $ct_blocks = self::strlen($ct) >> 4; + // ct_blocks = Split(ZeroPad(ct, 128), 128) + // cn = Tail(ct, |ct| mod 128) + for ($i = 0; $i < $ct_blocks; ++$i) { + $msg .= $state->dec(self::substr($ct, $i << 4, 16)); + } + // if cn is not empty: + // msg = msg || DecPartial(cn) + if ($cn) { + $start = $ct_blocks << 4; + $msg .= $state->decPartial(self::substr($ct, $start, $cn)); + } + $expected_tag = $state->finalize( + self::strlen($ad) << 3, + self::strlen($msg) << 3 + ); + if (!self::hashEquals($expected_tag, $tag)) { + try { + // The RFC says to erase msg, so we shall try: + ParagonIE_Sodium_Compat::memzero($msg); + } catch (SodiumException $ex) { + // Do nothing if we cannot memzero + } + throw new SodiumException('verification failed'); + } + return $msg; + } + + /** + * @param string $msg + * @param string $ad + * @param string $key + * @param string $nonce + * @return array + * @throws SodiumException + */ + public static function encrypt($msg, $ad, $key, $nonce) + { + $state = self::init($key, $nonce); + $ad_len = self::strlen($ad); + $msg_len = self::strlen($msg); + $ad_blocks = ($ad_len + 15) >> 4; + for ($i = 0; $i < $ad_blocks; ++$i) { + $ai = self::substr($ad, $i << 4, 16); + if (self::strlen($ai) < 16) { + $ai = str_pad($ai, 16, "\0", STR_PAD_RIGHT); + } + $state->absorb($ai); + } + + $ct = ''; + $msg_blocks = ($msg_len + 15) >> 4; + for ($i = 0; $i < $msg_blocks; ++$i) { + $xi = self::substr($msg, $i << 4, 16); + if (self::strlen($xi) < 16) { + $xi = str_pad($xi, 16, "\0", STR_PAD_RIGHT); + } + $ct .= $state->enc($xi); + } + $tag = $state->finalize( + $ad_len << 3, + $msg_len << 3 + ); + return array( + self::substr($ct, 0, $msg_len), + $tag + ); + + } + + /** + * @param string $key + * @param string $nonce + * @return ParagonIE_Sodium_Core_AEGIS_State256 + */ + public static function init($key, $nonce) + { + return ParagonIE_Sodium_Core_AEGIS_State256::init($key, $nonce); + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES.php new file mode 100644 index 0000000000..d86cff1a5b --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES.php @@ -0,0 +1,518 @@ +orthogonalize(); + self::sbox($q); + $q->orthogonalize(); + return $q[0] & self::U32_MAX; + } + + /** + * Calculate the key schedule from a given random key + * + * @param string $key + * @return ParagonIE_Sodium_Core_AES_KeySchedule + * @throws SodiumException + */ + public static function keySchedule($key) + { + $key_len = self::strlen($key); + switch ($key_len) { + case 16: + $num_rounds = 10; + break; + case 24: + $num_rounds = 12; + break; + case 32: + $num_rounds = 14; + break; + default: + throw new SodiumException('Invalid key length: ' . $key_len); + } + $skey = array(); + $comp_skey = array(); + $nk = $key_len >> 2; + $nkf = ($num_rounds + 1) << 2; + $tmp = 0; + + for ($i = 0; $i < $nk; ++$i) { + $tmp = self::load_4(self::substr($key, $i << 2, 4)); + $skey[($i << 1)] = $tmp; + $skey[($i << 1) + 1] = $tmp; + } + + for ($i = $nk, $j = 0, $k = 0; $i < $nkf; ++$i) { + if ($j === 0) { + $tmp = (($tmp & 0xff) << 24) | ($tmp >> 8); + $tmp = (self::subWord($tmp) ^ self::$Rcon[$k]) & self::U32_MAX; + } elseif ($nk > 6 && $j === 4) { + $tmp = self::subWord($tmp); + } + $tmp ^= $skey[($i - $nk) << 1]; + $skey[($i << 1)] = $tmp & self::U32_MAX; + $skey[($i << 1) + 1] = $tmp & self::U32_MAX; + if (++$j === $nk) { + /** @psalm-suppress LoopInvalidation */ + $j = 0; + ++$k; + } + } + for ($i = 0; $i < $nkf; $i += 4) { + $q = ParagonIE_Sodium_Core_AES_Block::fromArray( + array_slice($skey, $i << 1, 8) + ); + $q->orthogonalize(); + // We have to overwrite $skey since we're not using C pointers like BearSSL did + for ($j = 0; $j < 8; ++$j) { + $skey[($i << 1) + $j] = $q[$j]; + } + } + for ($i = 0, $j = 0; $i < $nkf; ++$i, $j += 2) { + $comp_skey[$i] = ($skey[$j] & 0x55555555) + | ($skey[$j + 1] & 0xAAAAAAAA); + } + return new ParagonIE_Sodium_Core_AES_KeySchedule($comp_skey, $num_rounds); + } + + /** + * Mutates $q + * + * @param ParagonIE_Sodium_Core_AES_KeySchedule $skey + * @param ParagonIE_Sodium_Core_AES_Block $q + * @param int $offset + * @return void + */ + public static function addRoundKey( + ParagonIE_Sodium_Core_AES_Block $q, + ParagonIE_Sodium_Core_AES_KeySchedule $skey, + $offset = 0 + ) { + $block = $skey->getRoundKey($offset); + for ($j = 0; $j < 8; ++$j) { + $q[$j] = ($q[$j] ^ $block[$j]) & ParagonIE_Sodium_Core_Util::U32_MAX; + } + } + + /** + * This mainly exists for testing, as we need the round key features for AEGIS. + * + * @param string $message + * @param string $key + * @return string + * @throws SodiumException + */ + public static function decryptBlockECB($message, $key) + { + if (self::strlen($message) !== 16) { + throw new SodiumException('decryptBlockECB() expects a 16 byte message'); + } + $skey = self::keySchedule($key)->expand(); + $q = ParagonIE_Sodium_Core_AES_Block::init(); + $q[0] = self::load_4(self::substr($message, 0, 4)); + $q[2] = self::load_4(self::substr($message, 4, 4)); + $q[4] = self::load_4(self::substr($message, 8, 4)); + $q[6] = self::load_4(self::substr($message, 12, 4)); + + $q->orthogonalize(); + self::bitsliceDecryptBlock($skey, $q); + $q->orthogonalize(); + + return self::store32_le($q[0]) . + self::store32_le($q[2]) . + self::store32_le($q[4]) . + self::store32_le($q[6]); + } + + /** + * This mainly exists for testing, as we need the round key features for AEGIS. + * + * @param string $message + * @param string $key + * @return string + * @throws SodiumException + */ + public static function encryptBlockECB($message, $key) + { + if (self::strlen($message) !== 16) { + throw new SodiumException('encryptBlockECB() expects a 16 byte message'); + } + $comp_skey = self::keySchedule($key); + $skey = $comp_skey->expand(); + $q = ParagonIE_Sodium_Core_AES_Block::init(); + $q[0] = self::load_4(self::substr($message, 0, 4)); + $q[2] = self::load_4(self::substr($message, 4, 4)); + $q[4] = self::load_4(self::substr($message, 8, 4)); + $q[6] = self::load_4(self::substr($message, 12, 4)); + + $q->orthogonalize(); + self::bitsliceEncryptBlock($skey, $q); + $q->orthogonalize(); + + return self::store32_le($q[0]) . + self::store32_le($q[2]) . + self::store32_le($q[4]) . + self::store32_le($q[6]); + } + + /** + * Mutates $q + * + * @param ParagonIE_Sodium_Core_AES_Expanded $skey + * @param ParagonIE_Sodium_Core_AES_Block $q + * @return void + */ + public static function bitsliceEncryptBlock( + ParagonIE_Sodium_Core_AES_Expanded $skey, + ParagonIE_Sodium_Core_AES_Block $q + ) { + self::addRoundKey($q, $skey); + for ($u = 1; $u < $skey->getNumRounds(); ++$u) { + self::sbox($q); + $q->shiftRows(); + $q->mixColumns(); + self::addRoundKey($q, $skey, ($u << 3)); + } + self::sbox($q); + $q->shiftRows(); + self::addRoundKey($q, $skey, ($skey->getNumRounds() << 3)); + } + + /** + * @param string $x + * @param string $y + * @return string + */ + public static function aesRound($x, $y) + { + $q = ParagonIE_Sodium_Core_AES_Block::init(); + $q[0] = self::load_4(self::substr($x, 0, 4)); + $q[2] = self::load_4(self::substr($x, 4, 4)); + $q[4] = self::load_4(self::substr($x, 8, 4)); + $q[6] = self::load_4(self::substr($x, 12, 4)); + + $rk = ParagonIE_Sodium_Core_AES_Block::init(); + $rk[0] = $rk[1] = self::load_4(self::substr($y, 0, 4)); + $rk[2] = $rk[3] = self::load_4(self::substr($y, 4, 4)); + $rk[4] = $rk[5] = self::load_4(self::substr($y, 8, 4)); + $rk[6] = $rk[7] = self::load_4(self::substr($y, 12, 4)); + + $q->orthogonalize(); + self::sbox($q); + $q->shiftRows(); + $q->mixColumns(); + $q->orthogonalize(); + // add round key without key schedule: + for ($i = 0; $i < 8; ++$i) { + $q[$i] ^= $rk[$i]; + } + return self::store32_le($q[0]) . + self::store32_le($q[2]) . + self::store32_le($q[4]) . + self::store32_le($q[6]); + } + + /** + * Process two AES blocks in one shot. + * + * @param string $b0 First AES block + * @param string $rk0 First round key + * @param string $b1 Second AES block + * @param string $rk1 Second round key + * @return string[] + */ + public static function doubleRound($b0, $rk0, $b1, $rk1) + { + $q = ParagonIE_Sodium_Core_AES_Block::init(); + // First block + $q[0] = self::load_4(self::substr($b0, 0, 4)); + $q[2] = self::load_4(self::substr($b0, 4, 4)); + $q[4] = self::load_4(self::substr($b0, 8, 4)); + $q[6] = self::load_4(self::substr($b0, 12, 4)); + // Second block + $q[1] = self::load_4(self::substr($b1, 0, 4)); + $q[3] = self::load_4(self::substr($b1, 4, 4)); + $q[5] = self::load_4(self::substr($b1, 8, 4)); + $q[7] = self::load_4(self::substr($b1, 12, 4));; + + $rk = ParagonIE_Sodium_Core_AES_Block::init(); + // First round key + $rk[0] = self::load_4(self::substr($rk0, 0, 4)); + $rk[2] = self::load_4(self::substr($rk0, 4, 4)); + $rk[4] = self::load_4(self::substr($rk0, 8, 4)); + $rk[6] = self::load_4(self::substr($rk0, 12, 4)); + // Second round key + $rk[1] = self::load_4(self::substr($rk1, 0, 4)); + $rk[3] = self::load_4(self::substr($rk1, 4, 4)); + $rk[5] = self::load_4(self::substr($rk1, 8, 4)); + $rk[7] = self::load_4(self::substr($rk1, 12, 4)); + + $q->orthogonalize(); + self::sbox($q); + $q->shiftRows(); + $q->mixColumns(); + $q->orthogonalize(); + // add round key without key schedule: + for ($i = 0; $i < 8; ++$i) { + $q[$i] ^= $rk[$i]; + } + return array( + self::store32_le($q[0]) . self::store32_le($q[2]) . self::store32_le($q[4]) . self::store32_le($q[6]), + self::store32_le($q[1]) . self::store32_le($q[3]) . self::store32_le($q[5]) . self::store32_le($q[7]), + ); + } + + /** + * @param ParagonIE_Sodium_Core_AES_Expanded $skey + * @param ParagonIE_Sodium_Core_AES_Block $q + * @return void + */ + public static function bitsliceDecryptBlock( + ParagonIE_Sodium_Core_AES_Expanded $skey, + ParagonIE_Sodium_Core_AES_Block $q + ) { + self::addRoundKey($q, $skey, ($skey->getNumRounds() << 3)); + for ($u = $skey->getNumRounds() - 1; $u > 0; --$u) { + $q->inverseShiftRows(); + self::invSbox($q); + self::addRoundKey($q, $skey, ($u << 3)); + $q->inverseMixColumns(); + } + $q->inverseShiftRows(); + self::invSbox($q); + self::addRoundKey($q, $skey, ($u << 3)); + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Block.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Block.php new file mode 100644 index 0000000000..070eb8d329 --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Block.php @@ -0,0 +1,343 @@ + + */ + protected $values = array(); + + /** + * @var int + */ + protected $size; + + /** + * @param int $size + */ + public function __construct($size = 8) + { + parent::__construct($size); + $this->size = $size; + $this->values = array_fill(0, $size, 0); + } + + /** + * @return self + */ + public static function init() + { + return new self(8); + } + + /** + * @internal You should not use this directly from another application + * + * @param array $array + * @param bool $save_indexes + * @return self + * + * @psalm-suppress MethodSignatureMismatch + */ + #[ReturnTypeWillChange] + public static function fromArray($array, $save_indexes = null) + { + $count = count($array); + if ($save_indexes) { + $keys = array_keys($array); + } else { + $keys = range(0, $count - 1); + } + $array = array_values($array); + /** @var array $keys */ + + $obj = new ParagonIE_Sodium_Core_AES_Block(); + if ($save_indexes) { + for ($i = 0; $i < $count; ++$i) { + $obj->offsetSet($keys[$i], $array[$i]); + } + } else { + for ($i = 0; $i < $count; ++$i) { + $obj->offsetSet($i, $array[$i]); + } + } + return $obj; + } + + + /** + * @internal You should not use this directly from another application + * + * @param int|null $offset + * @param int $value + * @return void + * + * @psalm-suppress MethodSignatureMismatch + * @psalm-suppress MixedArrayOffset + */ + #[ReturnTypeWillChange] + public function offsetSet($offset, $value) + { + if (!is_int($value)) { + throw new InvalidArgumentException('Expected an integer'); + } + if (is_null($offset)) { + $this->values[] = $value; + } else { + $this->values[$offset] = $value; + } + } + + /** + * @internal You should not use this directly from another application + * + * @param int $offset + * @return bool + * + * @psalm-suppress MethodSignatureMismatch + * @psalm-suppress MixedArrayOffset + */ + #[ReturnTypeWillChange] + public function offsetExists($offset) + { + return isset($this->values[$offset]); + } + + /** + * @internal You should not use this directly from another application + * + * @param int $offset + * @return void + * + * @psalm-suppress MethodSignatureMismatch + * @psalm-suppress MixedArrayOffset + */ + #[ReturnTypeWillChange] + public function offsetUnset($offset) + { + unset($this->values[$offset]); + } + + /** + * @internal You should not use this directly from another application + * + * @param int $offset + * @return int + * + * @psalm-suppress MethodSignatureMismatch + * @psalm-suppress MixedArrayOffset + */ + #[ReturnTypeWillChange] + public function offsetGet($offset) + { + if (!isset($this->values[$offset])) { + $this->values[$offset] = 0; + } + return (int) ($this->values[$offset]); + } + + /** + * @internal You should not use this directly from another application + * + * @return array + */ + public function __debugInfo() + { + $out = array(); + foreach ($this->values as $v) { + $out[] = str_pad(dechex($v), 8, '0', STR_PAD_LEFT); + } + return array(implode(', ', $out)); + /* + return array(implode(', ', $this->values)); + */ + } + + /** + * @param int $cl low bit mask + * @param int $ch high bit mask + * @param int $s shift + * @param int $x index 1 + * @param int $y index 2 + * @return self + */ + public function swapN($cl, $ch, $s, $x, $y) + { + static $u32mask = ParagonIE_Sodium_Core_Util::U32_MAX; + $a = $this->values[$x] & $u32mask; + $b = $this->values[$y] & $u32mask; + // (x) = (a & cl) | ((b & cl) << (s)); + $this->values[$x] = ($a & $cl) | ((($b & $cl) << $s) & $u32mask); + // (y) = ((a & ch) >> (s)) | (b & ch); + $this->values[$y] = ((($a & $ch) & $u32mask) >> $s) | ($b & $ch); + return $this; + } + + /** + * @param int $x index 1 + * @param int $y index 2 + * @return self + */ + public function swap2($x, $y) + { + return $this->swapN(0x55555555, 0xAAAAAAAA, 1, $x, $y); + } + + /** + * @param int $x index 1 + * @param int $y index 2 + * @return self + */ + public function swap4($x, $y) + { + return $this->swapN(0x33333333, 0xCCCCCCCC, 2, $x, $y); + } + + /** + * @param int $x index 1 + * @param int $y index 2 + * @return self + */ + public function swap8($x, $y) + { + return $this->swapN(0x0F0F0F0F, 0xF0F0F0F0, 4, $x, $y); + } + + /** + * @return self + */ + public function orthogonalize() + { + return $this + ->swap2(0, 1) + ->swap2(2, 3) + ->swap2(4, 5) + ->swap2(6, 7) + + ->swap4(0, 2) + ->swap4(1, 3) + ->swap4(4, 6) + ->swap4(5, 7) + + ->swap8(0, 4) + ->swap8(1, 5) + ->swap8(2, 6) + ->swap8(3, 7); + } + + /** + * @return self + */ + public function shiftRows() + { + for ($i = 0; $i < 8; ++$i) { + $x = $this->values[$i] & ParagonIE_Sodium_Core_Util::U32_MAX; + $this->values[$i] = ( + ($x & 0x000000FF) + | (($x & 0x0000FC00) >> 2) | (($x & 0x00000300) << 6) + | (($x & 0x00F00000) >> 4) | (($x & 0x000F0000) << 4) + | (($x & 0xC0000000) >> 6) | (($x & 0x3F000000) << 2) + ) & ParagonIE_Sodium_Core_Util::U32_MAX; + } + return $this; + } + + /** + * @param int $x + * @return int + */ + public static function rotr16($x) + { + return (($x << 16) & ParagonIE_Sodium_Core_Util::U32_MAX) | ($x >> 16); + } + + /** + * @return self + */ + public function mixColumns() + { + $q0 = $this->values[0]; + $q1 = $this->values[1]; + $q2 = $this->values[2]; + $q3 = $this->values[3]; + $q4 = $this->values[4]; + $q5 = $this->values[5]; + $q6 = $this->values[6]; + $q7 = $this->values[7]; + $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + + $this->values[0] = $q7 ^ $r7 ^ $r0 ^ self::rotr16($q0 ^ $r0); + $this->values[1] = $q0 ^ $r0 ^ $q7 ^ $r7 ^ $r1 ^ self::rotr16($q1 ^ $r1); + $this->values[2] = $q1 ^ $r1 ^ $r2 ^ self::rotr16($q2 ^ $r2); + $this->values[3] = $q2 ^ $r2 ^ $q7 ^ $r7 ^ $r3 ^ self::rotr16($q3 ^ $r3); + $this->values[4] = $q3 ^ $r3 ^ $q7 ^ $r7 ^ $r4 ^ self::rotr16($q4 ^ $r4); + $this->values[5] = $q4 ^ $r4 ^ $r5 ^ self::rotr16($q5 ^ $r5); + $this->values[6] = $q5 ^ $r5 ^ $r6 ^ self::rotr16($q6 ^ $r6); + $this->values[7] = $q6 ^ $r6 ^ $r7 ^ self::rotr16($q7 ^ $r7); + return $this; + } + + /** + * @return self + */ + public function inverseMixColumns() + { + $q0 = $this->values[0]; + $q1 = $this->values[1]; + $q2 = $this->values[2]; + $q3 = $this->values[3]; + $q4 = $this->values[4]; + $q5 = $this->values[5]; + $q6 = $this->values[6]; + $q7 = $this->values[7]; + $r0 = (($q0 >> 8) | ($q0 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r1 = (($q1 >> 8) | ($q1 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r2 = (($q2 >> 8) | ($q2 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r3 = (($q3 >> 8) | ($q3 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r4 = (($q4 >> 8) | ($q4 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r5 = (($q5 >> 8) | ($q5 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r6 = (($q6 >> 8) | ($q6 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $r7 = (($q7 >> 8) | ($q7 << 24)) & ParagonIE_Sodium_Core_Util::U32_MAX; + + $this->values[0] = $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r5 ^ $r7 ^ self::rotr16($q0 ^ $q5 ^ $q6 ^ $r0 ^ $r5); + $this->values[1] = $q0 ^ $q5 ^ $r0 ^ $r1 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q5 ^ $q7 ^ $r1 ^ $r5 ^ $r6); + $this->values[2] = $q0 ^ $q1 ^ $q6 ^ $r1 ^ $r2 ^ $r6 ^ $r7 ^ self::rotr16($q0 ^ $q2 ^ $q6 ^ $r2 ^ $r6 ^ $r7); + $this->values[3] = $q0 ^ $q1 ^ $q2 ^ $q5 ^ $q6 ^ $r0 ^ $r2 ^ $r3 ^ $r5 ^ self::rotr16($q0 ^ $q1 ^ $q3 ^ $q5 ^ $q6 ^ $q7 ^ $r0 ^ $r3 ^ $r5 ^ $r7); + $this->values[4] = $q1 ^ $q2 ^ $q3 ^ $q5 ^ $r1 ^ $r3 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q1 ^ $q2 ^ $q4 ^ $q5 ^ $q7 ^ $r1 ^ $r4 ^ $r5 ^ $r6); + $this->values[5] = $q2 ^ $q3 ^ $q4 ^ $q6 ^ $r2 ^ $r4 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q2 ^ $q3 ^ $q5 ^ $q6 ^ $r2 ^ $r5 ^ $r6 ^ $r7); + $this->values[6] = $q3 ^ $q4 ^ $q5 ^ $q7 ^ $r3 ^ $r5 ^ $r6 ^ $r7 ^ self::rotr16($q3 ^ $q4 ^ $q6 ^ $q7 ^ $r3 ^ $r6 ^ $r7); + $this->values[7] = $q4 ^ $q5 ^ $q6 ^ $r4 ^ $r6 ^ $r7 ^ self::rotr16($q4 ^ $q5 ^ $q7 ^ $r4 ^ $r7); + return $this; + } + + /** + * @return self + */ + public function inverseShiftRows() + { + for ($i = 0; $i < 8; ++$i) { + $x = $this->values[$i]; + $this->values[$i] = ParagonIE_Sodium_Core_Util::U32_MAX & ( + ($x & 0x000000FF) + | (($x & 0x00003F00) << 2) | (($x & 0x0000C000) >> 6) + | (($x & 0x000F0000) << 4) | (($x & 0x00F00000) >> 4) + | (($x & 0x03000000) << 6) | (($x & 0xFC000000) >> 2) + ); + } + return $this; + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Expanded.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Expanded.php new file mode 100644 index 0000000000..84a6a47658 --- /dev/null +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/AES/Expanded.php @@ -0,0 +1,14 @@ + $skey -- has size 120 */ + protected $skey; + + /** @var bool $expanded */ + protected $expanded = false; + + /** @var int $numRounds */ + private $numRounds; + + /** + * @param array $skey + * @param int $numRounds + */ + public function __construct(array $skey, $numRounds = 10) + { + $this->skey = $skey; + $this->numRounds = $numRounds; + } + + /** + * Get a value at an arbitrary index. Mostly used for unit testing. + * + * @param int $i + * @return int + */ + public function get($i) + { + return $this->skey[$i]; + } + + /** + * @return int + */ + public function getNumRounds() + { + return $this->numRounds; + } + + /** + * @param int $offset + * @return ParagonIE_Sodium_Core_AES_Block + */ + public function getRoundKey($offset) + { + return ParagonIE_Sodium_Core_AES_Block::fromArray( + array_slice($this->skey, $offset, 8) + ); + } + + /** + * Return an expanded key schedule + * + * @return ParagonIE_Sodium_Core_AES_Expanded + */ + public function expand() + { + $exp = new ParagonIE_Sodium_Core_AES_Expanded( + array_fill(0, 120, 0), + $this->numRounds + ); + $n = ($exp->numRounds + 1) << 2; + for ($u = 0, $v = 0; $u < $n; ++$u, $v += 2) { + $x = $y = $this->skey[$u]; + $x &= 0x55555555; + $exp->skey[$v] = ($x | ($x << 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; + $y &= 0xAAAAAAAA; + $exp->skey[$v + 1] = ($y | ($y >> 1)) & ParagonIE_Sodium_Core_Util::U32_MAX; + } + return $exp; + } +} diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php index 39bf897776..06774ba4fd 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Cached.php @@ -40,26 +40,38 @@ class ParagonIE_Sodium_Core_Curve25519_Ge_Cached * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $T2d */ public function __construct( - ParagonIE_Sodium_Core_Curve25519_Fe $YplusX = null, - ParagonIE_Sodium_Core_Curve25519_Fe $YminusX = null, - ParagonIE_Sodium_Core_Curve25519_Fe $Z = null, - ParagonIE_Sodium_Core_Curve25519_Fe $T2d = null + $YplusX = null, + $YminusX = null, + $Z = null, + $T2d = null ) { if ($YplusX === null) { $YplusX = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($YplusX instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 1 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->YplusX = $YplusX; if ($YminusX === null) { $YminusX = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($YminusX instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->YminusX = $YminusX; if ($Z === null) { $Z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($Z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Z = $Z; if ($T2d === null) { $T2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($T2d instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->T2d = $T2d; } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php index a63d6ab232..62d36eb05c 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P1p1.php @@ -39,26 +39,38 @@ class ParagonIE_Sodium_Core_Curve25519_Ge_P1p1 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t */ public function __construct( - ParagonIE_Sodium_Core_Curve25519_Fe $x = null, - ParagonIE_Sodium_Core_Curve25519_Fe $y = null, - ParagonIE_Sodium_Core_Curve25519_Fe $z = null, - ParagonIE_Sodium_Core_Curve25519_Fe $t = null + $x = null, + $y = null, + $z = null, + $t = null ) { if ($x === null) { $x = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($x instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 1 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($t instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->T = $t; } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php index aee4000d14..029be720c1 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P2.php @@ -34,21 +34,30 @@ class ParagonIE_Sodium_Core_Curve25519_Ge_P2 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $z */ public function __construct( - ParagonIE_Sodium_Core_Curve25519_Fe $x = null, - ParagonIE_Sodium_Core_Curve25519_Fe $y = null, - ParagonIE_Sodium_Core_Curve25519_Fe $z = null + $x = null, + $y = null, + $z = null ) { if ($x === null) { $x = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($x instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 1 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Z = $z; } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php index 00f5b27a4b..e5b2fe4599 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/P3.php @@ -40,26 +40,38 @@ class ParagonIE_Sodium_Core_Curve25519_Ge_P3 * @param ParagonIE_Sodium_Core_Curve25519_Fe|null $t */ public function __construct( - ParagonIE_Sodium_Core_Curve25519_Fe $x = null, - ParagonIE_Sodium_Core_Curve25519_Fe $y = null, - ParagonIE_Sodium_Core_Curve25519_Fe $z = null, - ParagonIE_Sodium_Core_Curve25519_Fe $t = null + $x = null, + $y = null, + $z = null, + $t = null ) { if ($x === null) { $x = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($x instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 1 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->X = $x; if ($y === null) { $y = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($y instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Y = $y; if ($z === null) { $z = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($z instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->Z = $z; if ($t === null) { $t = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($t instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 4 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->T = $t; } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php index 59611c1036..2503d7a6a8 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Curve25519/Ge/Precomp.php @@ -34,21 +34,30 @@ class ParagonIE_Sodium_Core_Curve25519_Ge_Precomp * @param ParagonIE_Sodium_Core_Curve25519_Fe $xy2d */ public function __construct( - ParagonIE_Sodium_Core_Curve25519_Fe $yplusx = null, - ParagonIE_Sodium_Core_Curve25519_Fe $yminusx = null, - ParagonIE_Sodium_Core_Curve25519_Fe $xy2d = null + $yplusx = null, + $yminusx = null, + $xy2d = null ) { if ($yplusx === null) { $yplusx = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($yplusx instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 1 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->yplusx = $yplusx; if ($yminusx === null) { $yminusx = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($yminusx instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 2 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->yminusx = $yminusx; if ($xy2d === null) { $xy2d = new ParagonIE_Sodium_Core_Curve25519_Fe(); } + if (!($xy2d instanceof ParagonIE_Sodium_Core_Curve25519_Fe)) { + throw new TypeError('Argument 3 must be an instance of ParagonIE_Sodium_Core_Curve25519_Fe'); + } $this->xy2d = $xy2d; } } diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Util.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Util.php index 73e463f298..e5d96dcdce 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Util.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/Core/Util.php @@ -9,6 +9,8 @@ if (class_exists('ParagonIE_Sodium_Core_Util', false)) { */ abstract class ParagonIE_Sodium_Core_Util { + const U32_MAX = 0xFFFFFFFF; + /** * @param int $integer * @param int $size (16, 32, 64) @@ -33,6 +35,28 @@ abstract class ParagonIE_Sodium_Core_Util ); } + /** + * @param string $a + * @param string $b + * @return string + * @throws SodiumException + */ + public static function andStrings($a, $b) + { + /* Type checks: */ + if (!is_string($a)) { + throw new TypeError('Argument 1 must be a string'); + } + if (!is_string($b)) { + throw new TypeError('Argument 2 must be a string'); + } + $len = self::strlen($a); + if (self::strlen($b) !== $len) { + throw new SodiumException('Both strings must be of equal length to combine with bitwise AND'); + } + return $a & $b; + } + /** * Convert a binary string into a hexadecimal string without cache-timing * leaks diff --git a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/File.php b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/File.php index e8622c7eba..1b02fc4be6 100644 --- a/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/File.php +++ b/wcfsetup/install/files/lib/system/api/paragonie/sodium_compat/src/File.php @@ -25,8 +25,13 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function box($inputFile, $outputFile, $nonce, $keyPair) - { + public static function box( + $inputFile, + $outputFile, + $nonce, + #[\SensitiveParameter] + $keyPair + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); @@ -91,8 +96,13 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function box_open($inputFile, $outputFile, $nonce, $keypair) - { + public static function box_open( + $inputFile, + $outputFile, + $nonce, + #[\SensitiveParameter] + $keypair + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); @@ -161,8 +171,12 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function box_seal($inputFile, $outputFile, $publicKey) - { + public static function box_seal( + $inputFile, + $outputFile, + #[\SensitiveParameter] + $publicKey + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); @@ -265,8 +279,12 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function box_seal_open($inputFile, $outputFile, $ecdhKeypair) - { + public static function box_seal_open( + $inputFile, + $outputFile, + #[\SensitiveParameter] + $ecdhKeypair + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); @@ -350,8 +368,12 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws TypeError * @psalm-suppress FailedTypeResolution */ - public static function generichash($filePath, $key = '', $outputLength = 32) - { + public static function generichash( + $filePath, + #[\SensitiveParameter] + $key = '', + $outputLength = 32 + ) { /* Type checks: */ if (!is_string($filePath)) { throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); @@ -428,8 +450,13 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function secretbox($inputFile, $outputFile, $nonce, $key) - { + public static function secretbox( + $inputFile, + $outputFile, + $nonce, + #[\SensitiveParameter] + $key + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given..'); @@ -493,8 +520,13 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function secretbox_open($inputFile, $outputFile, $nonce, $key) - { + public static function secretbox_open( + $inputFile, + $outputFile, + $nonce, + #[\SensitiveParameter] + $key + ) { /* Type checks: */ if (!is_string($inputFile)) { throw new TypeError('Argument 1 must be a string, ' . gettype($inputFile) . ' given.'); @@ -560,8 +592,11 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws SodiumException * @throws TypeError */ - public static function sign($filePath, $secretKey) - { + public static function sign( + $filePath, + #[\SensitiveParameter] + $secretKey + ) { /* Type checks: */ if (!is_string($filePath)) { throw new TypeError('Argument 1 must be a string, ' . gettype($filePath) . ' given.'); @@ -656,8 +691,11 @@ class ParagonIE_Sodium_File extends ParagonIE_Sodium_Core_Util * @throws TypeError * @throws Exception */ - public static function verify($sig, $filePath, $publicKey) - { + public static function verify( + $sig, + $filePath, + $publicKey + ) { /* Type checks: */ if (!is_string($sig)) { throw new TypeError('Argument 1 must be a string, ' . gettype($sig) . ' given.'); -- 2.20.1