PHP Classes

File: tests/unit/SipHashTest.php

Recommend this page to a friend!
  Classes of Scott Arciszewski   PHP Sodium Compat   tests/unit/SipHashTest.php   Download  
File: tests/unit/SipHashTest.php
Role: Class source
Content type: text/plain
Description: Class source
Class: PHP Sodium Compat
Cryptographic functions of libsodium in pure PHP
Author: By
Last change: Fix myriad bugs with PHP 8.1 on x86

Related to #140, determined from local testing as per https://github.com/paragonie/sodium_compat/issues/140#issuecomment-1076132051
Date: 1 year ago
Size: 7,679 bytes
 

Contents

Class file image Download
<?php

class SipHashTest extends PHPUnit_Framework_TestCase
{
   
/**
     * @before
     */
   
public function before()
    {
       
ParagonIE_Sodium_Compat::$disableFallbackForUnitTests = true;
    }

   
/**
     * @covers ParagonIE_Sodium_Core_SipHash::add()
     */
   
public function testAdd()
    {
        if (
PHP_INT_SIZE === 4) {
           
$this->markTestSkipped('Test is not relevant to 32-bit');
        }

       
$vectors = array(
            array(
               
0x0123456789abcdef,
               
0x456789abcdef0123,
               
0x468acf13579acf12
           
),
            array(
               
0x0000000100000000,
               
0x0000000000000100,
               
0x0000000100000100
           
),
            array(
               
0x0000000100000000,
               
0x0000000000000100,
               
0x0000000100000100
           
),
            array(
               
0x0fffffffffffffff,
               
0x0000000000000001,
               
0x1000000000000000
           
)
        );
        foreach (
$vectors as $v) {
            list(
$a, $b, $c) = $v;
           
# $this->assertSame($c, PHP_INT_MAX & ($a + $b));

           
$sA = array(
               
$a >> 32,
               
$a & 0xffffffff
           
);
           
$sB = array(
               
$b >> 32,
               
$b & 0xffffffff
           
);
           
$sC = array(
                (
$c >> 32) & 0xffffffff,
               
$c & 0xffffffff
           
);
           
$this->assertSame(
               
$sC,
               
ParagonIE_Sodium_Core_SipHash::add($sA, $sB)
            );
        }
    }

   
/**
     * @covers ParagonIE_Sodium_Core_SipHash::rotl_64()
     */
   
public function testRotl64()
    {
        if (
PHP_INT_SIZE === 4) {
           
$this->markTestSkipped('Test is not relevant to 32-bit');
        }
       
$this->assertSame(
            array(
0x00010000, 0x00000000),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 16),
           
'rotl_64 by 16'
       
);
       
$this->assertSame(
            array(
0x80000000, 0x00000000),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 31),
           
'rotl_64 by 31'
       
);
       
$this->assertSame(
            array(
0x80000000, 0x00000000),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 95),
           
'rotl_64 by 95 (reduce to 31)'
       
);
       
$this->assertSame(
            array(
0x00000000, 0x00000001),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 32),
           
'rotl_64 by 32'
       
);
       
$this->assertSame(
            array(
0x00000000, 0x00000008),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 35),
           
'rotl_64 by 35'
       
);
       
$this->assertSame(
            array(
0x00000000, 0x80000000),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 63),
           
'rotl_64 by 63'
       
);
       
$this->assertSame(
            array(
0x00000001, 0x00000000),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0x00000001, 0x00000000, 64),
           
'rotl_64 by 64'
       
);
       
$this->assertSame(
            array(
0x7DDF575A, 0x3BD5BD5B),
           
ParagonIE_Sodium_Core_SipHash::rotl_64(0xDEADBEEF, 0xABAD1DEA, 17),
           
'rotl_64 by 64'
       
);
    }

    public function
testSipRound()
    {
        if (
PHP_INT_SIZE === 8) {
           
$v = array(
               
0x736f6d65, // 0
               
0x70736575, // 1
               
0x646f7261, // 2
               
0x6e646f6d, // 3
               
0x6c796765, // 4
               
0x6e657261, // 5
               
0x74656462, // 6
               
0x79746573 // 7
           
);
           
$v = ParagonIE_Sodium_Core_SipHash::sipRound($v);
           
$result = array(
               
ParagonIE_Sodium_Core_Util::bin2hex(
                   
ParagonIE_Sodium_Core_Util::store32_le($v[1]) .
                   
ParagonIE_Sodium_Core_Util::store32_le($v[0])
                ),
               
ParagonIE_Sodium_Core_Util::bin2hex(
                   
ParagonIE_Sodium_Core_Util::store32_le($v[3]) .
                   
ParagonIE_Sodium_Core_Util::store32_le($v[2])
                ),
               
ParagonIE_Sodium_Core_Util::bin2hex(
                   
ParagonIE_Sodium_Core_Util::store32_le($v[5]) .
                   
ParagonIE_Sodium_Core_Util::store32_le($v[4])
                ),
               
ParagonIE_Sodium_Core_Util::bin2hex(
                   
ParagonIE_Sodium_Core_Util::store32_le($v[7]) .
                   
ParagonIE_Sodium_Core_Util::store32_le($v[6])
                )
            );
        } else {
           
$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)
                )
            );
           
/**
             * @var array<int, ParagonIE_Sodium_Core32_Int64> $step
             */
           
$step = ParagonIE_Sodium_Core32_SipHash::sipRound($v);
            if (!(
$step[0] instanceof ParagonIE_Sodium_Core32_Int64)) {
               
$this->fail('Type Error');
            }
            if (!(
$step[1] instanceof ParagonIE_Sodium_Core32_Int64)) {
               
$this->fail('Type Error');
            }
            if (!(
$step[2] instanceof ParagonIE_Sodium_Core32_Int64)) {
               
$this->fail('Type Error');
            }
            if (!(
$step[3] instanceof ParagonIE_Sodium_Core32_Int64)) {
               
$this->fail('Type Error');
            }
           
$result = array(
               
ParagonIE_Sodium_Core_Util::bin2hex($step[0]->toReverseString()),
               
ParagonIE_Sodium_Core_Util::bin2hex($step[1]->toReverseString()),
               
ParagonIE_Sodium_Core_Util::bin2hex($step[2]->toReverseString()),
               
ParagonIE_Sodium_Core_Util::bin2hex($step[3]->toReverseString())
            );
        }

       
$this->assertEquals(
            array(
               
'7783895a96879463',
               
'6623cacba61b65fe',
               
'd2bd711a4350143b',
               
'e114b92cc2d2e435'
           
),
           
$result
       
);
    }

   
/**
     * @covers ParagonIE_Sodium_Core_SipHash::sipHash24()
     */
   
public function testEvenBlock()
    {
       
$message = str_repeat("\xff", 32);
       
$key = "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10";

       
$this->assertSame(
           
'7f965c8b580df016',
           
ParagonIE_Sodium_Core_Util::bin2hex(
               
PHP_INT_SIZE === 4
                   
? ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key)
                    :
ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key)
            )
        );
    }

   
/**
     * @covers ParagonIE_Sodium_Core_SipHash::sipHash24()
     */
   
public function testCryptoShorthash()
    {
       
$message = 'this is just a test message';
       
$key = str_repeat("\x80", 16);

       
$this->assertSame(
           
'3f188259b01151a7',
           
ParagonIE_Sodium_Core_Util::bin2hex(
               
PHP_INT_SIZE === 4
                   
? ParagonIE_Sodium_Core32_SipHash::sipHash24($message, $key)
                    :
ParagonIE_Sodium_Core_SipHash::sipHash24($message, $key)
            )
        );
    }
}