PHP Classes

File: tests/unit/AEGISTest.php

Recommend this page to a friend!
  Classes of Scott Arciszewski   PHP Sodium Compat   tests/unit/AEGISTest.php   Download  
File: tests/unit/AEGISTest.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:
Date: 15 days ago
Size: 17,821 bytes
 

Contents

Class file image Download
<?php use PHPUnit\Framework\TestCase; class AEGISTest extends TestCase { /** * @before */ public function before(): void { ParagonIE_Sodium_Compat::$disableFallbackForUnitTests = true; } public function testAegis128lUpdate(): void { $state = ParagonIE_Sodium_Core_AEGIS_State128L::initForUnitTests(array( ParagonIE_Sodium_Core_Util::hex2bin('9b7e60b24cc873ea894ecc07911049a3'), ParagonIE_Sodium_Core_Util::hex2bin('330be08f35300faa2ebf9a7b0d274658'), ParagonIE_Sodium_Core_Util::hex2bin('7bbd5bd2b049f7b9b515cf26fbe7756c'), ParagonIE_Sodium_Core_Util::hex2bin('c35a00f55ea86c3886ec5e928f87db18'), ParagonIE_Sodium_Core_Util::hex2bin('9ebccafce87cab446396c4334592c91f'), ParagonIE_Sodium_Core_Util::hex2bin('58d83e31f256371e60fc6bb257114601'), ParagonIE_Sodium_Core_Util::hex2bin('1639b56ea322c88568a176585bc915de'), ParagonIE_Sodium_Core_Util::hex2bin('640818ffb57dc0fbc2e72ae93457e39a') )); $m0 = ParagonIE_Sodium_Core_Util::hex2bin('033e6975b94816879e42917650955aa0'); $m1 = ParagonIE_Sodium_Core_Util::hex2bin('033e6975b94816879e42917650955aa0'); $state->update($m0, $m1); $s = $state->getState(); $expected = array( ParagonIE_Sodium_Core_Util::hex2bin('596ab773e4433ca0127c73f60536769d'), ParagonIE_Sodium_Core_Util::hex2bin('790394041a3d26ab697bde865014652d'), ParagonIE_Sodium_Core_Util::hex2bin('38cf49e4b65248acd533041b64dd0611'), ParagonIE_Sodium_Core_Util::hex2bin('16d8e58748f437bfff1797f780337cee'), ParagonIE_Sodium_Core_Util::hex2bin('69761320f7dd738b281cc9f335ac2f5a'), ParagonIE_Sodium_Core_Util::hex2bin('a21746bb193a569e331e1aa985d0d729'), ParagonIE_Sodium_Core_Util::hex2bin('09d714e6fcf9177a8ed1cde7e3d259a6'), ParagonIE_Sodium_Core_Util::hex2bin('61279ba73167f0ab76f0a11bf203bdff') ); $this->assertSame($s, $expected); } public function testAegis256lUpdate(): void { $state = ParagonIE_Sodium_Core_AEGIS_State256::initForUnitTests(array( ParagonIE_Sodium_Core_Util::hex2bin('1fa1207ed76c86f2c4bb40e8b395b43e'), ParagonIE_Sodium_Core_Util::hex2bin('b44c375e6c1e1978db64bcd12e9e332f'), ParagonIE_Sodium_Core_Util::hex2bin('0dab84bfa9f0226432ff630f233d4e5b'), ParagonIE_Sodium_Core_Util::hex2bin('d7ef65c9b93e8ee60c75161407b066e7'), ParagonIE_Sodium_Core_Util::hex2bin('a760bb3da073fbd92bdc24734b1f56fb'), ParagonIE_Sodium_Core_Util::hex2bin('a828a18d6a964497ac6e7e53c5f55c73') )); $m = ParagonIE_Sodium_Core_Util::hex2bin('b165617ed04ab738afb2612c6d18a1ec'); $state->update($m); $s = $state->getState(); $expected = array( ParagonIE_Sodium_Core_Util::hex2bin('e6bc643bae82dfa3d991b1b323839dcd'), ParagonIE_Sodium_Core_Util::hex2bin('648578232ba0f2f0a3677f617dc052c3'), ParagonIE_Sodium_Core_Util::hex2bin('ea788e0e572044a46059212dd007a789'), ParagonIE_Sodium_Core_Util::hex2bin('2f1498ae19b80da13fba698f088a8590'), ParagonIE_Sodium_Core_Util::hex2bin('a54c2ee95e8c2a2c3dae2ec743ae6b86'), ParagonIE_Sodium_Core_Util::hex2bin('a3240fceb68e32d5d114df1b5363ab67') ); $this->assertSame($s, $expected); } /** * @return array[] * * name, key, nonce, tag, ciphertext, plaintext, aad, expect_fail? */ public function aegis128lVectors() { return array( array( 'AEGIS-128L test vector 1', '10010000000000000000000000000000', '10000200000000000000000000000000', '25835bfbb21632176cf03840687cb968cace4617af1bd0f7d064c639a5c79ee4', 'c1c0e58bd913006feba00f4b3cc3594e', '00000000000000000000000000000000', '', false ), array( 'AEGIS-128L test vector 2', '10010000000000000000000000000000', '10000200000000000000000000000000', '1360dc9db8ae42455f6e5b6a9d488ea4f2184c4e12120249335c4ee84bafe25d', '', '', '', false ), array( 'AEGIS-128L test vector 3', '10010000000000000000000000000000', '10000200000000000000000000000000', '022cb796fe7e0ae1197525ff67e309484cfbab6528ddef89f17d74ef8ecd82b3', '79d94593d8c2119d7e8fd9b8fc77845c5c077a05b2528b6ac54b563aed8efe84', '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', '0001020304050607', false ), array( 'AEGIS-128L test vector 4', '10010000000000000000000000000000', '10000200000000000000000000000000', '86f1b80bfb463aba711d15405d094baf4a55a15dbfec81a76f35ed0b9c8b04ac', '79d94593d8c2119d7e8fd9b8fc77', '000102030405060708090a0b0c0d', '0001020304050607', false ), array( 'AEGIS-128L test vector 5', '10010000000000000000000000000000', '10000200000000000000000000000000', 'b91e2947a33da8bee89b6794e647baf0fc835ff574aca3fc27c33be0db2aff98', 'b31052ad1cca4e291abcf2df3502e6bdb1bfd6db36798be3607b1f94d34478aa7ede7f7a990fec10', '101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637', '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829', false ), array( 'AEGIS-128L test vector 6', '10000200000000000000000000000000', '10010000000000000000000000000000', '86f1b80bfb463aba711d15405d094baf4a55a15dbfec81a76f35ed0b9c8b04ac', '79d94593d8c2119d7e8fd9b8fc77', '', '0001020304050607', true ), array( 'AEGIS-128L test vector 7', '10010000000000000000000000000000', '10000200000000000000000000000000', '86f1b80bfb463aba711d15405d094baf4a55a15dbfec81a76f35ed0b9c8b04ac', '79d94593d8c2119d7e8fd9b8fc78', '', '0001020304050607', true ), array( 'AEGIS-128L test vector 8', '10010000000000000000000000000000', '10000200000000000000000000000000', '86f1b80bfb463aba711d15405d094baf4a55a15dbfec81a76f35ed0b9c8b04ac', '79d94593d8c2119d7e8fd9b8fc77', '', '0001020304050608', true ), array( 'AEGIS-128L test vector 9', '10010000000000000000000000000000', '10000200000000000000000000000000', '86f1b80bfb463aba711d15405d094baf4a55a15dbfec81a76f35ed0b9c8b04ad', '79d94593d8c2119d7e8fd9b8fc77', '', '0001020304050607', true ), ); } /** * @return array[] * * name, key, nonce, tag, ciphertext, plaintext, aad, expect_fail? */ public function aegis256Vectors() { return array( array( 'AEGIS-256 test vector 1', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '1181a1d18091082bf0266f66297d167d2e68b845f61a3b0527d31fc7b7b89f13', '754fc3d8c973246dcc6d741412a4b236', '00000000000000000000000000000000', '', false ), array( 'AEGIS-256 test vector 2', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '6a348c930adbd654896e1666aad67de989ea75ebaa2b82fb588977b1ffec864a', '', '', '', false ), array( 'AEGIS-256 test vector 3', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', 'b7d28d0c3c0ebd409fd22b44160503073a547412da0854bfb9723020dab8da1a', 'f373079ed84b2709faee373584585d60accd191db310ef5d8b11833df9dec711', '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f', '0001020304050607', false ), array( 'AEGIS-256 test vector 4', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '8c1cc703c81281bee3f6d9966e14948b4a175b2efbdc31e61a98b4465235c2d9', 'f373079ed84b2709faee37358458', '000102030405060708090a0b0c0d', '0001020304050607', false ), array( 'AEGIS-256 test vector 5', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', 'a3aca270c006094d71c20e6910b5161c0826df233d08919a566ec2c05990f734', '57754a7d09963e7c787583a2e7b859bb24fa1e04d49fd550b2511a358e3bca252a9b1b8b30cc4a67', '101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637', '000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829', false ), array( 'AEGIS-256 test vector 6', '1000020000000000000000000000000000000000000000000000000000000000', '1001000000000000000000000000000000000000000000000000000000000000', '8c1cc703c81281bee3f6d9966e14948b4a175b2efbdc31e61a98b4465235c2d9', 'f373079ed84b2709faee37358458', '', '0001020304050607', true ), array( 'AEGIS-256 test vector 7', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '8c1cc703c81281bee3f6d9966e14948b4a175b2efbdc31e61a98b4465235c2d9', 'f373079ed84b2709faee37358459', '', '0001020304050607', true ), array( 'AEGIS-256 test vector 8', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '8c1cc703c81281bee3f6d9966e14948b4a175b2efbdc31e61a98b4465235c2d9', 'f373079ed84b2709faee37358458', '', '0001020304050608', true ), array( 'AEGIS-256 test vector 9', '1001000000000000000000000000000000000000000000000000000000000000', '1000020000000000000000000000000000000000000000000000000000000000', '8c1cc703c81281bee3f6d9966e14948b4a175b2efbdc31e61a98b4465235c2da', 'f373079ed84b2709faee37358458', '', '0001020304050607', true ) ); } /** * @dataProvider aegis128lVectors * @param string $key_hex * @param string $nonce_hex * @param string $expected_tag_hex * @param string $expected_ct_hex * @param string $msg_hex * @param string $ad_hex * @param bool $expect_fail * @return void * @throws SodiumException */ public function testAegis128lVectors( $name, $key_hex, $nonce_hex, $expected_tag_hex, $expected_ct_hex, $msg_hex = '', $ad_hex = '', $expect_fail = false ): void { $key = ParagonIE_Sodium_Core_Util::hex2bin($key_hex); $nonce = ParagonIE_Sodium_Core_Util::hex2bin($nonce_hex); $expTag = ParagonIE_Sodium_Core_Util::hex2bin($expected_tag_hex); $expCt = ParagonIE_Sodium_Core_Util::hex2bin($expected_ct_hex); $ad = ParagonIE_Sodium_Core_Util::hex2bin($ad_hex); if ($expect_fail) { $failed = false; try { ParagonIE_Sodium_Core_AEGIS128L::decrypt($expCt, $expTag, $ad, $key, $nonce); } catch (SodiumException $ex) { $failed = true; } $this->assertTrue($failed, 'Expected decryption to fail but it did not'); return; } $msg = ParagonIE_Sodium_Core_Util::hex2bin($msg_hex); list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS128L::encrypt($msg, $ad, $key, $nonce); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($expCt), ParagonIE_Sodium_Core_Util::bin2hex($ct), $name ); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($expTag), ParagonIE_Sodium_Core_Util::bin2hex($tag), $name ); $this->assertSame($expCt, $ct, $name); $this->assertSame($expTag, $tag, $name); $got_pt = ParagonIE_Sodium_Core_AEGIS128L::decrypt($expCt, $expTag, $ad, $key, $nonce); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($got_pt), $msg_hex, $name ); $this->assertSame($got_pt, $msg, $name); } /** * @dataProvider aegis256Vectors * @param string $key_hex * @param string $nonce_hex * @param string $expected_tag_hex * @param string $expected_ct_hex * @param string $msg_hex * @param string $ad_hex * @param bool $expect_fail * @return void * @throws SodiumException */ public function testAegis256Vectors( $name, $key_hex, $nonce_hex, $expected_tag_hex, $expected_ct_hex, $msg_hex = '', $ad_hex = '', $expect_fail = false ): void { $key = ParagonIE_Sodium_Core_Util::hex2bin($key_hex); $nonce = ParagonIE_Sodium_Core_Util::hex2bin($nonce_hex); $expTag = ParagonIE_Sodium_Core_Util::hex2bin($expected_tag_hex); $expCt = ParagonIE_Sodium_Core_Util::hex2bin($expected_ct_hex); $ad = ParagonIE_Sodium_Core_Util::hex2bin($ad_hex); if ($expect_fail) { $failed = false; try { ParagonIE_Sodium_Core_AEGIS256::decrypt($expCt, $expTag, $ad, $key, $nonce); } catch (SodiumException $ex) { $failed = true; } $this->assertTrue($failed, 'Expected decryption to fail but it did not'); return; } $msg = ParagonIE_Sodium_Core_Util::hex2bin($msg_hex); list($ct, $tag) = ParagonIE_Sodium_Core_AEGIS256::encrypt($msg, $ad, $key, $nonce); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($expCt), ParagonIE_Sodium_Core_Util::bin2hex($ct), $name ); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($expTag), ParagonIE_Sodium_Core_Util::bin2hex($tag), $name ); $this->assertSame($expCt, $ct, $name); $this->assertSame($expTag, $tag, $name); $got_pt = ParagonIE_Sodium_Core_AEGIS256::decrypt($expCt, $expTag, $ad, $key, $nonce); $this->assertSame( ParagonIE_Sodium_Core_Util::bin2hex($got_pt), $msg_hex, $name ); $this->assertSame($got_pt, $msg, $name); } public function testPublicAegis128l(): void { $msg = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::randombytes_uniform(999) + 1); $nonce = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::CRYPTO_AEAD_AEGIS128L_NPUBBYTES); $ad = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::randombytes_uniform(999) + 1); $key = ParagonIE_Sodium_Compat::crypto_aead_aegis128l_keygen(); $ciphertext = ParagonIE_Sodium_Compat::crypto_aead_aegis128l_encrypt($msg, $ad, $nonce, $key); $msg2 = ParagonIE_Sodium_Compat::crypto_aead_aegis128l_decrypt($ciphertext, $ad, $nonce, $key); $this->assertSame($msg, $msg2); } public function testPublicAegis256(): void { $msg = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::randombytes_uniform(999) + 1); $nonce = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::CRYPTO_AEAD_AEGIS256_NPUBBYTES); $ad = ParagonIE_Sodium_Compat::randombytes_buf(ParagonIE_Sodium_Compat::randombytes_uniform(999) + 1); $key = ParagonIE_Sodium_Compat::crypto_aead_aegis256_keygen(); $ciphertext = ParagonIE_Sodium_Compat::crypto_aead_aegis256_encrypt($msg, $ad, $nonce, $key); $msg2 = ParagonIE_Sodium_Compat::crypto_aead_aegis256_decrypt($ciphertext, $ad, $nonce, $key); $this->assertSame($msg, $msg2); } }