| 
<?phpuse ParagonIE\Halite\Alerts\CannotPerformOperation;
 use ParagonIE\Halite\Util;
 
 /**
 * Halite Util test case
 *
 * @category   HaliteTest
 * @package    Halite
 * @author     Stefanie Schmidt <[email protected]>
 * @license    http://opensource.org/licenses/GPL-3.0 GPL 3
 * @link       https://paragonie.com/project/halite
 */
 class UtilTest extends PHPUnit_Framework_TestCase
 {
 /**
 * Test our HKDF-esque construct built atop BLAKE2b
 *
 * @covers Util::hkdfBlake2b()
 */
 public function testBlake2bKDF()
 {
 $ikm = 'YELLOW SUBMARINE';
 $len = 32;
 $info = 'TESTING HKDF-BLAKE2B';
 $salt = str_repeat("\x80", 32);
 
 $test = Util::hkdfBlake2b($ikm, $len, $info, $salt);
 $this->assertEquals(
 $test,
 "\x7b\xaf\xb1\x11\x1c\xda\xce\x81\xd1\xb0\x73\xff\x6e\x68\x8f\xc3".
 "\x6f\xb5\xa2\xc7\xbd\x53\xf6\xf1\xb4\x2f\x80\x71\x29\x4b\xb7\xf7"
 );
 // Let's change the IKM
 $ikmB = 'YELLOW SUBMARINF';
 $testIkm = Util::hkdfBlake2b($ikmB, $len, $info, $salt);
 $this->assertNotEquals($test, $testIkm);
 
 // Let's change the info
 $infoB = 'TESTING HKDF-BLAKE2C';
 $testInfo = Util::hkdfBlake2b($ikm, $len, $infoB, $salt);
 $this->assertNotEquals($test, $testInfo);
 
 // Let's change the salt
 $saltB = str_repeat("\x80", 31) . "\x81";
 $testSalt = Util::hkdfBlake2b($ikm, $len, $info, $saltB);
 $this->assertNotEquals($test, $testSalt);
 }
 
 /**
 * @covers Util::safeStrlen()
 */
 public function testSafeStrlen()
 {
 $valid = "\xF0\x9D\x92\xB3"; // One 4-byte UTF-8 character
 $this->assertEquals(Util::safeStrlen($valid), 4);
 }
 
 /**
 * test safeStrlen() with illegal parameter. We expect to see an exception
 * @return void
 * @throws CannotPerformOperation
 *
 * @covers Util::safeStrlen()
 */
 public function testSafeStrlenFail()
 {
 $this->setExpectedException('\ParagonIE\Halite\Alerts\HaliteAlert');
 
 $teststring = []; // is not a string, will provoke a warning
 
 Util::safeStrlen($teststring);
 }
 
 /**
 * Verify that safeSubstr() operates over binary data.
 *
 * @covers Util::safeSubstr()
 */
 public function testSafeSubstr()
 {
 $string = \str_repeat("\xF0\x9D\x92\xB3", 4);
 $this->assertEquals(Util::safeSubstr($string, 0, 1), "\xF0");
 $this->assertEquals(Util::safeSubstr($string, 1, 1), "\x9D");
 $this->assertEquals(Util::safeSubstr($string, 2, 1), "\x92");
 $this->assertEquals(Util::safeSubstr($string, 3, 1), "\xB3");
 $this->assertEquals(Util::safeSubstr($string, 0, 2), "\xF0\x9D");
 $this->assertEquals(Util::safeSubstr($string, 2, 2), "\x92\xB3");
 }
 }
 
 |