PHP Classes

File: test/unit/FileTest.php

Recommend this page to a friend!
  Classes of Scott Arciszewski   Halite   test/unit/FileTest.php   Download  
File: test/unit/FileTest.php
Role: Unit test script
Content type: text/plain
Description: Unit test script
Class: Halite
Perform cryptography operations with libsodium
Author: By
Last change: Limit the File API.
Date: 8 years ago
Size: 6,485 bytes
 

Contents

Class file image Download
<?php
use \ParagonIE\Halite\File;
use \
ParagonIE\Halite\Util;
use \
ParagonIE\Halite\KeyFactory;
use \
ParagonIE\Halite\EncryptionKeyPair;
use \
ParagonIE\Halite\SignatureKeyPair;
use \
ParagonIE\Halite\Symmetric\EncryptionKey;
use \
ParagonIE\Halite\Alerts as CryptoException;

/**
 * @backupGlobals disabled
 * @backupStaticAttributes disabled
 */
class FileTest extends PHPUnit_Framework_TestCase
{
    public function
testEncrypt()
    {
        \
touch(__DIR__.'/tmp/paragon_avatar.encrypted.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.encrypted.png', 0777);
        \
touch(__DIR__.'/tmp/paragon_avatar.decrypted.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.decrypted.png', 0777);
       
       
$key = new EncryptionKey(\str_repeat('B', 32));
       
File::encrypt(
           
__DIR__.'/tmp/paragon_avatar.png',
           
__DIR__.'/tmp/paragon_avatar.encrypted.png',
           
$key
       
);
       
       
File::decrypt(
           
__DIR__.'/tmp/paragon_avatar.encrypted.png',
           
__DIR__.'/tmp/paragon_avatar.decrypted.png',
           
$key
       
);
       
       
$this->assertEquals(
            \
hash_file('sha256', __DIR__.'/tmp/paragon_avatar.png'),
            \
hash_file('sha256', __DIR__.'/tmp/paragon_avatar.decrypted.png')
        );
        \
unlink(__DIR__.'/tmp/paragon_avatar.encrypted.png');
        \
unlink(__DIR__.'/tmp/paragon_avatar.decrypted.png');
    }
   
    public function
testEncryptFail()
    {
        \
touch(__DIR__.'/tmp/paragon_avatar.encrypt_fail.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.encrypt_fail.png', 0777);
        \
touch(__DIR__.'/tmp/paragon_avatar.decrypt_fail.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.decrypt_fail.png', 0777);
       
       
$key = new EncryptionKey(\str_repeat('B', 32));
       
File::encrypt(
           
__DIR__.'/tmp/paragon_avatar.png',
           
__DIR__.'/tmp/paragon_avatar.encrypt_fail.png',
           
$key
       
);
       
       
$fp = \fopen(__DIR__.'/tmp/paragon_avatar.encrypt_fail.png', 'ab');
        \
fwrite($fp, \Sodium\randombytes_buf(1));
       
fclose($fp);
           
        try {
           
File::decrypt(
               
__DIR__.'/tmp/paragon_avatar.encrypt_fail.png',
               
__DIR__.'/tmp/paragon_avatar.decrypt_fail.png',
               
$key
           
);
           
$this->fail(
               
'This should have thrown an InvalidMessage exception!'
           
);
        } catch (
CryptoException\InvalidMessage $e) {
           
$this->assertTrue($e instanceof CryptoException\InvalidMessage);
            \
unlink(__DIR__.'/tmp/paragon_avatar.encrypt_fail.png');
            \
unlink(__DIR__.'/tmp/paragon_avatar.decrypt_fail.png');
        }
    }
   
    public function
testSeal()
    {
        \
touch(__DIR__.'/tmp/paragon_avatar.sealed.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.sealed.png', 0777);
        \
touch(__DIR__.'/tmp/paragon_avatar.opened.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.opened.png', 0777);
       
       
$keypair = KeyFactory::generateEncryptionKeyPair();
           
$secretkey = $keypair->getSecretKey();
           
$publickey = $keypair->getPublicKey();
       
       
File::seal(
           
__DIR__.'/tmp/paragon_avatar.png',
           
__DIR__.'/tmp/paragon_avatar.sealed.png',
           
$publickey
       
);
       
       
File::unseal(
           
__DIR__.'/tmp/paragon_avatar.sealed.png',
           
__DIR__.'/tmp/paragon_avatar.opened.png',
           
$secretkey
       
);
       
       
$this->assertEquals(
            \
hash_file('sha256', __DIR__.'/tmp/paragon_avatar.png'),
            \
hash_file('sha256', __DIR__.'/tmp/paragon_avatar.opened.png')
        );
       
        \
unlink(__DIR__.'/tmp/paragon_avatar.sealed.png');
        \
unlink(__DIR__.'/tmp/paragon_avatar.opened.png');
    }
   
    public function
testSealFail()
    {
        \
touch(__DIR__.'/tmp/paragon_avatar.seal_fail.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.seal_fail.png', 0777);
        \
touch(__DIR__.'/tmp/paragon_avatar.open_fail.png');
        \
chmod(__DIR__.'/tmp/paragon_avatar.open_fail.png', 0777);
       
       
$keypair = KeyFactory::generateEncryptionKeyPair();
           
$secretkey = $keypair->getSecretKey();
           
$publickey = $keypair->getPublicKey();
       
       
File::seal(
           
__DIR__.'/tmp/paragon_avatar.png',
           
__DIR__.'/tmp/paragon_avatar.seal_fail.png',
           
$publickey
       
);
       
       
$fp = \fopen(__DIR__.'/tmp/paragon_avatar.seal_fail.png', 'ab');
        \
fwrite($fp, \Sodium\randombytes_buf(1));
        \
fclose($fp);
       
        try {
           
File::unseal(
               
__DIR__.'/tmp/paragon_avatar.seal_fail.png',
               
__DIR__.'/tmp/paragon_avatar.open_fail.png',
               
$secretkey
           
);
           
$this->fail(
               
'This should have thrown an InvalidMessage exception!'
           
);
        } catch (
CryptoException\InvalidMessage $e) {
           
$this->assertTrue($e instanceof CryptoException\InvalidMessage);
            \
unlink(__DIR__.'/tmp/paragon_avatar.seal_fail.png');
            \
unlink(__DIR__.'/tmp/paragon_avatar.open_fail.png');
        }
    }
   
    public function
testSign()
    {
       
$keypair = KeyFactory::generateSignatureKeyPair();
           
$secretkey = $keypair->getSecretKey();
           
$publickey = $keypair->getPublicKey();
       
       
$signature = File::sign(
           
__DIR__.'/tmp/paragon_avatar.png',
           
$secretkey
       
);
       
       
$this->assertTrue(
           
File::verify(
               
__DIR__.'/tmp/paragon_avatar.png',
               
$publickey,
               
$signature
           
)
        );
    }
   
    public function
testChecksum()
    {
       
$csum = File::checksum(__DIR__.'/tmp/paragon_avatar.png');
       
$this->assertEquals(
           
$csum,
           
"09f9f74a0e742d057ca08394db4c2e444be88c0c94fe9a914c3d3758c7eccafb".
           
"8dd286e3d6bc37f353e76c0c5aa2036d978ca28ffaccfa59f5dc1f076c5517a0"
       
);
       
       
$data = \Sodium\randombytes_buf(32);
        \
file_put_contents(__DIR__.'/tmp/garbage.dat', $data);
       
       
$hash = \Sodium\crypto_generichash($data, null, 64);
       
$file = File::checksum(__DIR__.'/tmp/garbage.dat', null, true);
       
$this->assertEquals(
           
$hash,
           
$file
       
);
        \
unlink(__DIR__.'/tmp/garbage.dat');
    }
}