123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 |
- <?php
- namespace Tests\RNCryptor;
- use PHPUnit\Framework\TestCase;
- use RNCryptor\RNCryptor\Cryptor;
- use RNCryptor\RNCryptor\Encryptor;
- class VectorBase extends TestCase
- {
- /**
- * Base directory for the test vector files,
- * relative to __DIR__
- */
- const PARALLEL_VECTOR_DIR = '/../../../spec/vectors/CURRENT';
- const SUBPACKAGE_VECTOR_DIR = '/../../vendor/rncryptor/spec/vectors/CURRENT';
- public function testKdfVectorAllFieldsEmptyOrZero()
- {
- $vector = $this->getVectors('kdf')[0];
- $cryptor = new Cryptor;
- $key = $cryptor->generateKey(
- $this->prettyHexToBin($vector['salt_hex']),
- $vector['password'],
- $vector['version']
- );
- $this->assertEquals($this->prettyHexToBin($vector['key_hex']), $key);
- }
- public function testKdfVectorOneByte()
- {
- $vector = $this->getVectors('kdf')[1];
- $cryptor = new Cryptor;
- $key = $cryptor->generateKey(
- $this->prettyHexToBin($vector['salt_hex']),
- $vector['password'],
- $vector['version']
- );
- $this->assertEquals($this->prettyHexToBin($vector['key_hex']), $key);
- }
- public function testKdfVectorExactlyOneBlock()
- {
- $vector = $this->getVectors('kdf')[2];
- $cryptor = new Cryptor;
- $key = $cryptor->generateKey(
- $this->prettyHexToBin($vector['salt_hex']),
- $vector['password'],
- $vector['version']
- );
- $this->assertEquals($this->prettyHexToBin($vector['key_hex']), $key);
- }
- public function testKdfVectorMoreThanOneBlock()
- {
- $vector = $this->getVectors('kdf')[3];
- $cryptor = new Cryptor;
- $key = $cryptor->generateKey(
- $this->prettyHexToBin($vector['salt_hex']),
- $vector['password'],
- $vector['version']
- );
- $this->assertEquals($this->prettyHexToBin($vector['key_hex']), $key);
- }
- public function testKeyVectorAllFieldsEmptyOrZero()
- {
- $vector = $this->getVectors('key')[0];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitraryKeys(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $this->prettyHexToBin($vector['enc_key_hex']),
- $this->prettyHexToBin($vector['hmac_key_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testKeyVectorOneByte()
- {
- $vector = $this->getVectors('key')[1];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitraryKeys(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $this->prettyHexToBin($vector['enc_key_hex']),
- $this->prettyHexToBin($vector['hmac_key_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testKeyVectorExactlyOneBlock()
- {
- $vector = $this->getVectors('key')[2];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitraryKeys(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $this->prettyHexToBin($vector['enc_key_hex']),
- $this->prettyHexToBin($vector['hmac_key_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testKeyVectorMoreThanOneBlock()
- {
- $vector = $this->getVectors('key')[3];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitraryKeys(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $this->prettyHexToBin($vector['enc_key_hex']),
- $this->prettyHexToBin($vector['hmac_key_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testPasswordVectorAllFieldsEmptyOrZero()
- {
- $vector = $this->getVectors('password')[0];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitrarySalts(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $vector['password'],
- $this->prettyHexToBin($vector['enc_salt_hex']),
- $this->prettyHexToBin($vector['hmac_salt_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testPasswordVectorOneByte()
- {
- $vector = $this->getVectors('password')[1];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitrarySalts(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $vector['password'],
- $this->prettyHexToBin($vector['enc_salt_hex']),
- $this->prettyHexToBin($vector['hmac_salt_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testPasswordVectorExactlyOneBlock()
- {
- $vector = $this->getVectors('password')[2];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitrarySalts(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $vector['password'],
- $this->prettyHexToBin($vector['enc_salt_hex']),
- $this->prettyHexToBin($vector['hmac_salt_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- public function testPasswordVectorMoreThanOneBlock()
- {
- $vector = $this->getVectors('password')[3];
- $encryptor = new Encryptor;
- $encryptedB64 = $encryptor->encryptWithArbitrarySalts(
- $this->prettyHexToBin($vector['plaintext_hex']),
- $vector['password'],
- $this->prettyHexToBin($vector['enc_salt_hex']),
- $this->prettyHexToBin($vector['hmac_salt_hex']),
- $this->prettyHexToBin($vector['iv_hex']),
- $vector['version']
- );
- $this->assertEquals($vector['ciphertext_hex'], $this->binToPrettyHex(base64_decode($encryptedB64)));
- }
- private function prettyHexToBin($data)
- {
- return hex2bin(preg_replace("/[^a-z0-9]/i", '', $data));
- }
- private function binToPrettyHex($data)
- {
- $hex = bin2hex($data);
- $prettyHex = '';
- foreach (str_split($hex, 8) as $index => $part) {
- $prettyHex .= ($index != 0 ? ' ' : '') . $part;
- }
- return $prettyHex;
- }
- private function getVectors($filename)
- {
- $absolutePath = __DIR__ . '/' . self::PARALLEL_VECTOR_DIR . '/' . $filename;
- if (!file_exists($absolutePath)) {
- $absolutePath = __DIR__ . '/' . self::SUBPACKAGE_VECTOR_DIR . '/' . $filename;
- if (!file_exists($absolutePath)) {
- throw new \Exception('No such file: ' . $absolutePath);
- }
- }
- $index = -1;
- $tests = array();
- $fd = fopen($absolutePath, 'r');
- while (!feof($fd)) {
- $line = trim(fgets($fd));
-
- if (preg_match("/^\s*(\w+)\s*\:\s*(.*)/", $line, $match)) {
- $key = strtolower($match[1]);
- $value = trim($match[2]);
-
- if ($key == 'title') {
- $index++;
- }
-
- $tests[$index][$key] = $value;
- }
- }
- fclose($fd);
-
- return $tests;
- }
- }
|