diff -r 3d4e9c994f10 -r a86126ab1dd4 wp/wp-includes/sodium_compat/src/Core32/BLAKE2b.php --- a/wp/wp-includes/sodium_compat/src/Core32/BLAKE2b.php Tue Oct 22 16:11:46 2019 +0200 +++ b/wp/wp-includes/sodium_compat/src/Core32/BLAKE2b.php Tue Dec 15 13:49:49 2020 +0100 @@ -223,12 +223,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]; @@ -482,6 +483,8 @@ * * @param SplFixedArray|null $key * @param int $outlen + * @param SplFixedArray|null $salt + * @param SplFixedArray|null $personal * @return SplFixedArray * @throws SodiumException * @throws TypeError @@ -491,8 +494,12 @@ * @psalm-suppress MixedArrayAssignment * @psalm-suppress MixedMethodCall */ - public static function init($key = null, $outlen = 64) - { + public static function init( + $key = null, + $outlen = 64, + $salt = null, + $personal = null + ) { self::pseudoConstructor(); $klen = 0; @@ -510,6 +517,7 @@ $ctx = self::context(); $p = new SplFixedArray(64); + // Zero our param buffer... for ($i = 64; --$i;) { $p[$i] = 0; } @@ -519,11 +527,34 @@ $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); for ($i = 128; $i--;) { @@ -533,6 +564,7 @@ $block[$i] = $key[$i]; } self::update($ctx, $block, 128); + $ctx[4] = 128; } return $ctx; @@ -595,7 +627,7 @@ } /** @var ParagonIE_Sodium_Core32_Int64 $ctxAi */ $ctxAi = $ctxA[$i]; - $str .= $ctxAi->toString(); + $str .= $ctxAi->toReverseString(); } # uint64_t t[2]; @@ -608,8 +640,8 @@ /** @var ParagonIE_Sodium_Core32_Int64 $ctxA2 */ $ctxA2 = $ctxA[1]; - $str .= $ctxA1->toString(); - $str .= $ctxA2->toString(); + $str .= $ctxA1->toReverseString(); + $str .= $ctxA2->toReverseString(); } # uint8_t buf[2 * 128]; @@ -624,13 +656,16 @@ self::intToChr(($ctx4 >> 8) & 0xff), self::intToChr(($ctx4 >> 16) & 0xff), self::intToChr(($ctx4 >> 24) & 0xff), + "\x00\x00\x00\x00" + /* self::intToChr(($ctx4 >> 32) & 0xff), self::intToChr(($ctx4 >> 40) & 0xff), self::intToChr(($ctx4 >> 48) & 0xff), self::intToChr(($ctx4 >> 56) & 0xff) + */ )); # uint8_t last_node; - return $str . "\x00"; + return $str . self::intToChr($ctx[5]) . str_repeat("\x00", 23); } /** @@ -652,7 +687,7 @@ # uint64_t h[8]; for ($i = 0; $i < 8; ++$i) { - $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromString( + $ctx[0][$i] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, (($i << 3) + 0), 8) ); } @@ -660,10 +695,10 @@ # uint64_t t[2]; # uint64_t f[2]; for ($i = 1; $i < 3; ++$i) { - $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromString( + $ctx[$i][1] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 72 + (($i - 1) << 4), 8) ); - $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromString( + $ctx[$i][0] = ParagonIE_Sodium_Core32_Int64::fromReverseString( self::substr($string, 64 + (($i - 1) << 4), 8) ); } @@ -671,7 +706,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) {