File "SipHash.php"

Full path: /home/kosmetik/public_html/wp-includes/sodium_compat/src/Core/SipHash.php
File size: 4.13 B
MIME-type: text/x-php
Charset: utf-8

Download   Open   Edit   Advanced Editor   Back

<?php

if (class_exists('ParagonIE_Sodium_Core_SipHash', false)) {
    return;
}
class ParagonIE_Sodium_Core_SipHash extends ParagonIE_Sodium_Core_Util
{
    public static function sipRound(array $v)
    {
        list($v[0], $v[1]) = self::add(array($v[0], $v[1]), array($v[2], $v[3]));
        list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 13);
        $v[2] = (int) $v[2] ^ (int) $v[0];
        $v[3] = (int) $v[3] ^ (int) $v[1];
        list($v[0], $v[1]) = self::rotl_64((int) $v[0], (int) $v[1], 32);
        list($v[4], $v[5]) = self::add(array((int) $v[4], (int) $v[5]), array((int) $v[6], (int) $v[7]));
        list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 16);
        $v[6] = (int) $v[6] ^ (int) $v[4];
        $v[7] = (int) $v[7] ^ (int) $v[5];
        list($v[0], $v[1]) = self::add(array((int) $v[0], (int) $v[1]), array((int) $v[6], (int) $v[7]));
        list($v[6], $v[7]) = self::rotl_64((int) $v[6], (int) $v[7], 21);
        $v[6] = (int) $v[6] ^ (int) $v[0];
        $v[7] = (int) $v[7] ^ (int) $v[1];
        list($v[4], $v[5]) = self::add(array((int) $v[4], (int) $v[5]), array((int) $v[2], (int) $v[3]));
        list($v[2], $v[3]) = self::rotl_64((int) $v[2], (int) $v[3], 17);
        $v[2] = (int) $v[2] ^ (int) $v[4];
        $v[3] = (int) $v[3] ^ (int) $v[5];
        list($v[4], $v[5]) = self::rotl_64((int) $v[4], (int) $v[5], 32);
        return $v;
    }
    public static function add(array $a, array $b)
    {
        $x1 = $a[1] + $b[1];
        $c = $x1 >> 32;
        $x0 = $a[0] + $b[0] + $c;
        return array($x0 & 0xffffffff, $x1 & 0xffffffff);
    }
    public static function rotl_64($int0, $int1, $c)
    {
        $int0 &= 0xffffffff;
        $int1 &= 0xffffffff;
        $c &= 63;
        if ($c === 32) {
            return array($int1, $int0);
        }
        if ($c > 31) {
            $tmp = $int1;
            $int1 = $int0;
            $int0 = $tmp;
            $c &= 31;
        }
        if ($c === 0) {
            return array($int0, $int1);
        }
        return array(0xffffffff & ($int0 << $c | $int1 >> 32 - $c), 0xffffffff & ($int1 << $c | $int0 >> 32 - $c));
    }
    public static function sipHash24($in, $key)
    {
        $inlen = self::strlen($in);
        $v = array(0x736f6d65, 0x70736575, 0x646f7261, 0x6e646f6d, 0x6c796765, 0x6e657261, 0x74656462, 0x79746573);
        $k = array(self::load_4(self::substr($key, 4, 4)), self::load_4(self::substr($key, 0, 4)), self::load_4(self::substr($key, 12, 4)), self::load_4(self::substr($key, 8, 4)));
        $b = array($inlen << 24, 0);
        $v[6] ^= $k[2];
        $v[7] ^= $k[3];
        $v[4] ^= $k[0];
        $v[5] ^= $k[1];
        $v[2] ^= $k[2];
        $v[3] ^= $k[3];
        $v[0] ^= $k[0];
        $v[1] ^= $k[1];
        $left = $inlen;
        while ($left >= 8) {
            $m = array(self::load_4(self::substr($in, 4, 4)), self::load_4(self::substr($in, 0, 4)));
            $v[6] ^= $m[0];
            $v[7] ^= $m[1];
            $v = self::sipRound($v);
            $v = self::sipRound($v);
            $v[0] ^= $m[0];
            $v[1] ^= $m[1];
            $in = self::substr($in, 8);
            $left -= 8;
        }
        switch ($left) {
            case 7:
                $b[0] |= self::chrToInt($in[6]) << 16;
            case 6:
                $b[0] |= self::chrToInt($in[5]) << 8;
            case 5:
                $b[0] |= self::chrToInt($in[4]);
            case 4:
                $b[1] |= self::chrToInt($in[3]) << 24;
            case 3:
                $b[1] |= self::chrToInt($in[2]) << 16;
            case 2:
                $b[1] |= self::chrToInt($in[1]) << 8;
            case 1:
                $b[1] |= self::chrToInt($in[0]);
            case 0:
                break;
        }
        $v[6] ^= $b[0];
        $v[7] ^= $b[1];
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v[0] ^= $b[0];
        $v[1] ^= $b[1];
        $v[5] ^= 0xff;
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        $v = self::sipRound($v);
        return self::store32_le($v[1] ^ $v[3] ^ $v[5] ^ $v[7]) . self::store32_le($v[0] ^ $v[2] ^ $v[4] ^ $v[6]);
    }
}