diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/sodium_compat/src/Core/BLAKE2b.php --- a/wp/wp-includes/sodium_compat/src/Core/BLAKE2b.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/sodium_compat/src/Core/BLAKE2b.php Tue Dec 15 13:49:49 2020 +0100 @@ -88,10 +88,10 @@ { $l = ($x[1] + $y[1]) & 0xffffffff; return self::new64( - $x[0] + $y[0] + ( + (int) ($x[0] + $y[0] + ( ($l < $x[1]) ? 1 : 0 - ), - $l + )), + (int) $l ); } @@ -132,8 +132,8 @@ throw new SodiumException('y[1] is not an integer'); } return self::new64( - (int) ($x[0] ^ $y[0]), - (int) ($x[1] ^ $y[1]) + (int) (($x[0] ^ $y[0]) & 0xffffffff), + (int) (($x[1] ^ $y[1]) & 0xffffffff) ); } @@ -299,12 +299,13 @@ */ protected static function context() { - $ctx = new SplFixedArray(5); + $ctx = new SplFixedArray(6); $ctx[0] = new SplFixedArray(8); // h $ctx[1] = new SplFixedArray(2); // t $ctx[2] = new SplFixedArray(2); // f $ctx[3] = new SplFixedArray(256); // buf $ctx[4] = 0; // buflen + $ctx[5] = 0; // last_node (uint8_t) for ($i = 8; $i--;) { $ctx[0][$i] = self::$iv[$i]; @@ -550,6 +551,8 @@ * * @param SplFixedArray|null $key * @param int $outlen + * @param SplFixedArray|null $salt + * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError @@ -559,8 +562,12 @@ * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedArrayOffset */ - public static function init($key = null, $outlen = 64) - { + public static function init( + $key = null, + $outlen = 64, + $salt = null, + $personal = null + ) { self::pseudoConstructor(); $klen = 0; @@ -578,6 +585,7 @@ $ctx = self::context(); $p = new SplFixedArray(64); + // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } @@ -587,10 +595,32 @@ $p[2] = 1; // fanout $p[3] = 1; // depth + if ($salt instanceof SplFixedArray) { + // salt: [32] through [47] + for ($i = 0; $i < 16; ++$i) { + $p[32 + $i] = (int) $salt[$i]; + } + } + if ($personal instanceof SplFixedArray) { + // personal: [48] through [63] + for ($i = 0; $i < 16; ++$i) { + $p[48 + $i] = (int) $personal[$i]; + } + } + $ctx[0][0] = self::xor64( $ctx[0][0], self::load64($p, 0) ); + if ($salt instanceof SplFixedArray || $personal instanceof SplFixedArray) { + // We need to do what blake2b_init_param() does: + for ($i = 1; $i < 8; ++$i) { + $ctx[0][$i] = self::xor64( + $ctx[0][$i], + self::load64($p, $i << 3) + ); + } + } if ($klen > 0 && $key instanceof SplFixedArray) { $block = new SplFixedArray(128); @@ -601,6 +631,7 @@ $block[$i] = $key[$i]; } self::update($ctx, $block, 128); + $ctx[4] = 128; } return $ctx; @@ -693,7 +724,7 @@ self::intToChr(($ctx4 >> 56) & 0xff) )); # uint8_t last_node; - return $str . "\x00"; + return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** @@ -746,7 +777,6 @@ # uint8_t buf[2 * 128]; $ctx[3] = self::stringToSplFixedArray(self::substr($string, 96, 256)); - # uint8_t buf[2 * 128]; $int = 0; for ($i = 0; $i < 8; ++$i) {