public static function ParagonIE_Sodium_Core32_SipHash::sipHash24 in Automatic Updates 7
Same name and namespace in other branches
- 8 vendor/paragonie/sodium_compat/src/Core32/SipHash.php \ParagonIE_Sodium_Core32_SipHash::sipHash24()
@internal You should not use this directly from another application
Parameters
string $in:
string $key:
Return value
string
Throws
SodiumException
TypeError
1 call to ParagonIE_Sodium_Core32_SipHash::sipHash24()
- ParagonIE_Sodium_Compat::crypto_shorthash in vendor/
paragonie/ sodium_compat/ src/ Compat.php - Calculates a SipHash-2-4 hash of a message for a given key.
File
- vendor/
paragonie/ sodium_compat/ src/ Core32/ SipHash.php, line 76
Class
- ParagonIE_Sodium_Core32_SipHash
- Class ParagonIE_SodiumCompat_Core32_SipHash
Code
public static function sipHash24($in, $key) {
$inlen = self::strlen($in);
# /* "somepseudorandomlygeneratedbytes" */
# u64 v0 = 0x736f6d6570736575ULL;
# u64 v1 = 0x646f72616e646f6dULL;
# u64 v2 = 0x6c7967656e657261ULL;
# u64 v3 = 0x7465646279746573ULL;
$v = array(
new ParagonIE_Sodium_Core32_Int64(array(
0x736f,
0x6d65,
0x7073,
0x6575,
)),
new ParagonIE_Sodium_Core32_Int64(array(
0x646f,
0x7261,
0x6e64,
0x6f6d,
)),
new ParagonIE_Sodium_Core32_Int64(array(
0x6c79,
0x6765,
0x6e65,
0x7261,
)),
new ParagonIE_Sodium_Core32_Int64(array(
0x7465,
0x6462,
0x7974,
0x6573,
)),
);
# u64 k0 = LOAD64_LE( k );
# u64 k1 = LOAD64_LE( k + 8 );
$k = array(
ParagonIE_Sodium_Core32_Int64::fromReverseString(self::substr($key, 0, 8)),
ParagonIE_Sodium_Core32_Int64::fromReverseString(self::substr($key, 8, 8)),
);
# b = ( ( u64 )inlen ) << 56;
$b = new ParagonIE_Sodium_Core32_Int64(array(
$inlen << 8 & 0xffff,
0,
0,
0,
));
# v3 ^= k1;
$v[3] = $v[3]
->xorInt64($k[1]);
# v2 ^= k0;
$v[2] = $v[2]
->xorInt64($k[0]);
# v1 ^= k1;
$v[1] = $v[1]
->xorInt64($k[1]);
# v0 ^= k0;
$v[0] = $v[0]
->xorInt64($k[0]);
$left = $inlen;
# for ( ; in != end; in += 8 )
while ($left >= 8) {
# m = LOAD64_LE( in );
$m = ParagonIE_Sodium_Core32_Int64::fromReverseString(self::substr($in, 0, 8));
# v3 ^= m;
$v[3] = $v[3]
->xorInt64($m);
# SIPROUND;
# SIPROUND;
$v = self::sipRound($v);
$v = self::sipRound($v);
# v0 ^= m;
$v[0] = $v[0]
->xorInt64($m);
$in = self::substr($in, 8);
$left -= 8;
}
# switch( left )
# {
# case 7: b |= ( ( u64 )in[ 6] ) << 48;
# case 6: b |= ( ( u64 )in[ 5] ) << 40;
# case 5: b |= ( ( u64 )in[ 4] ) << 32;
# case 4: b |= ( ( u64 )in[ 3] ) << 24;
# case 3: b |= ( ( u64 )in[ 2] ) << 16;
# case 2: b |= ( ( u64 )in[ 1] ) << 8;
# case 1: b |= ( ( u64 )in[ 0] ); break;
# case 0: break;
# }
switch ($left) {
case 7:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(0, self::chrToInt($in[6]) << 16));
case 6:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(0, self::chrToInt($in[5]) << 8));
case 5:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(0, self::chrToInt($in[4])));
case 4:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(self::chrToInt($in[3]) << 24, 0));
case 3:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(self::chrToInt($in[2]) << 16, 0));
case 2:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(self::chrToInt($in[1]) << 8, 0));
case 1:
$b = $b
->orInt64(ParagonIE_Sodium_Core32_Int64::fromInts(self::chrToInt($in[0]), 0));
case 0:
break;
}
# v3 ^= b;
$v[3] = $v[3]
->xorInt64($b);
# SIPROUND;
# SIPROUND;
$v = self::sipRound($v);
$v = self::sipRound($v);
# v0 ^= b;
$v[0] = $v[0]
->xorInt64($b);
// Flip the lower 8 bits of v2 which is ($v[4], $v[5]) in our implementation
# v2 ^= 0xff;
$v[2]->limbs[3] ^= 0xff;
# SIPROUND;
# SIPROUND;
# SIPROUND;
# SIPROUND;
$v = self::sipRound($v);
$v = self::sipRound($v);
$v = self::sipRound($v);
$v = self::sipRound($v);
# b = v0 ^ v1 ^ v2 ^ v3;
# STORE64_LE( out, b );
return $v[0]
->xorInt64($v[1])
->xorInt64($v[2])
->xorInt64($v[3])
->toReverseString();
}