--- 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) {