<?php 
use \ParagonIE\ConstantTime\Base32; 
use \ParagonIE\ConstantTime\Base32Hex; 
use \ParagonIE\ConstantTime\Base64; 
use \ParagonIE\ConstantTime\Base64DotSlash; 
use \ParagonIE\ConstantTime\Base64DotSlashOrdered; 
use \ParagonIE\ConstantTime\Base64UrlSafe; 
use \ParagonIE\ConstantTime\Encoding; 
use \ParagonIE\ConstantTime\Hex; 
 
class EncodingTest extends PHPUnit\Framework\TestCase 
{ 
    public function testBase32Encode() 
    { 
        $this->assertSame( 
            Encoding::base32Encode("\x00"), 
            'aa======' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\x00\x00"), 
            'aaaa====' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\x00\x00\x00"), 
            'aaaaa===' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\x00\x00\x00\x00"), 
            'aaaaaaa=' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\x00\x00\x00\x00\x00"), 
            'aaaaaaaa' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\x00\x00\x0F\xFF\xFF"), 
            'aaaa7777' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\xFF\xFF\xF0\x00\x00"), 
            '7777aaaa' 
        ); 
 
        $this->assertSame( 
            Encoding::base32Encode("\xce\x73\x9c\xe7\x39"), 
            'zzzzzzzz' 
        ); 
        $this->assertSame( 
            Encoding::base32Encode("\xd6\xb5\xad\x6b\x5a"), 
            '22222222' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00"), 
            'AA======' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00\x00"), 
            'AAAA====' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00\x00\x00"), 
            'AAAAA===' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00\x00\x00\x00"), 
            'AAAAAAA=' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00\x00\x00\x00\x00"), 
            'AAAAAAAA' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\x00\x00\x0F\xFF\xFF"), 
            'AAAA7777' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\xFF\xFF\xF0\x00\x00"), 
            '7777AAAA' 
        ); 
 
        $this->assertSame( 
            Base32::encodeUpper("\xce\x73\x9c\xe7\x39"), 
            'ZZZZZZZZ' 
        ); 
        $this->assertSame( 
            Base32::encodeUpper("\xd6\xb5\xad\x6b\x5a"), 
            '22222222' 
        ); 
    } 
 
    public function testBase32Hex() 
    { 
        $this->assertSame( 
            Base32Hex::encode("\x00"), 
            '00======' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\x00\x00"), 
            '0000====' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\x00\x00\x00"), 
            '00000===' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\x00\x00\x00\x00"), 
            '0000000=' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\x00\x00\x00\x00\x00"), 
            '00000000' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\x00\x00\x0F\xFF\xFF"), 
            '0000vvvv' 
        ); 
        $this->assertSame( 
            Base32Hex::encode("\xFF\xFF\xF0\x00\x00"), 
            'vvvv0000' 
        ); 
 
 
    } 
 
    /** 
     * Based on test vectors from RFC 4648 
     */ 
    public function testBase32Decode() 
    { 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaaaa======') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaaaaaa====') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaaaaaaa===') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaaaaaaaaa=') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaaaaaaaaaa') 
        ); 
        $this->assertSame( 
            "\x00", 
            Encoding::base32Decode('aa======') 
        ); 
        $this->assertSame( 
            "\x00\x00", 
            Encoding::base32Decode('aaaa====') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00", 
            Encoding::base32Decode('aaaaa===') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaa=') 
        ); 
        $this->assertSame( 
            "\x00\x00\x00\x00\x00", 
            Encoding::base32Decode('aaaaaaaa') 
        ); 
        $this->assertSame( 
            "\x00\x00\x0F\xFF\xFF", 
            Encoding::base32Decode('aaaa7777') 
        ); 
        $this->assertSame( 
            "\xFF\xFF\xF0\x00\x00", 
            Encoding::base32Decode('7777aaaa') 
        ); 
        $this->assertSame( 
            "\xce\x73\x9c\xe7\x39", 
            Encoding::base32Decode('zzzzzzzz') 
        ); 
        $this->assertSame( 
            "\xd6\xb5\xad\x6b\x5a", 
            Encoding::base32Decode('22222222') 
        ); 
        $this->assertSame( 
            'foobar', 
            Encoding::base32Decode('mzxw6ytboi======') 
        ); 
 
        $rand = random_bytes(9); 
        $enc = Encoding::base32Encode($rand); 
 
        $this->assertSame( 
            Encoding::base32Encode($rand), 
            Encoding::base32Encode(Encoding::base32Decode($enc)) 
        ); 
        $this->assertSame( 
            $rand, 
            Encoding::base32Decode($enc) 
        ); 
    } 
 
    /** 
     * @covers Encoding::hexDecode() 
     * @covers Encoding::hexEncode() 
     * @covers Encoding::base32Decode() 
     * @covers Encoding::base32Encode() 
     * @covers Encoding::base64Decode() 
     * @covers Encoding::base64Encode() 
     * @covers Encoding::base64DotSlashDecode() 
     * @covers Encoding::base64DotSlashEncode() 
     * @covers Encoding::base64DotSlashOrderedDecode() 
     * @covers Encoding::base64DotSlashOrderedEncode() 
     */ 
    public function testBasicEncoding() 
    { 
        // Re-run the test at least 3 times for each length 
        for ($j = 0; $j < 3; ++$j) { 
            for ($i = 1; $i < 84; ++$i) { 
                $rand = random_bytes($i); 
                $enc = Encoding::hexEncode($rand); 
                $this->assertSame( 
                    \bin2hex($rand), 
                    $enc, 
                    "Hex Encoding - Length: " . $i 
                ); 
                $this->assertSame( 
                    $rand, 
                    Encoding::hexDecode($enc), 
                    "Hex Encoding - Length: " . $i 
                ); 
 
                // Uppercase variant: 
                $enc = Hex::encodeUpper($rand); 
                $this->assertSame( 
                    \strtoupper(\bin2hex($rand)), 
                    $enc, 
                    "Hex Encoding - Length: " . $i 
                ); 
                $this->assertSame( 
                    $rand, 
                    Hex::decode($enc), 
                    "HexUpper Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base32Encode($rand); 
                $this->assertSame( 
                    $rand, 
                    Encoding::base32Decode($enc), 
                    "Base32 Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base32EncodeUpper($rand); 
                $this->assertSame( 
                    $rand, 
                    Encoding::base32DecodeUpper($enc), 
                    "Base32Upper Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base32HexEncode($rand); 
                $this->assertSame( 
                    bin2hex($rand), 
                    bin2hex(Encoding::base32HexDecode($enc)), 
                    "Base32Hex Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base32HexEncodeUpper($rand); 
                $this->assertSame( 
                    bin2hex($rand), 
                    bin2hex(Encoding::base32HexDecodeUpper($enc)), 
                    "Base32HexUpper Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base64Encode($rand); 
                $this->assertSame( 
                    $rand, 
                    Encoding::base64Decode($enc), 
                    "Base64 Encoding - Length: " . $i 
                ); 
 
                $enc = Encoding::base64EncodeDotSlash($rand); 
                $this->assertSame( 
                    $rand, 
                    Encoding::base64DecodeDotSlash($enc), 
                    "Base64 DotSlash Encoding - Length: " . $i 
                ); 
                $enc = Encoding::base64EncodeDotSlashOrdered($rand); 
                $this->assertSame( 
                    $rand, 
                    Encoding::base64DecodeDotSlashOrdered($enc), 
                    "Base64 Ordered DotSlash Encoding - Length: " . $i 
                ); 
 
                $enc = Base64UrlSafe::encode($rand); 
                $this->assertSame( 
                    \strtr(\base64_encode($rand), '+/', '-_'), 
                    $enc 
                ); 
                $this->assertSame( 
                    $rand, 
                    Base64UrlSafe::decode($enc) 
                ); 
            } 
        } 
    } 
}
 
 |