* @copyright 2014 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ use phpseclib3\Crypt\Salsa20; class Unit_Crypt_Salsa20Test extends PhpseclibTestCase { public function engineVectors() { $engines = [ 'PHP', ]; // tests from http://www.ecrypt.eu.org/stream/svn/viewcvs.cgi/ecrypt/trunk/submissions/salsa20/full/verified.test-vectors?logsort=rev&rev=210&view=markup // more specifically, it's vector # 0 in each set $tests = [ // key size: 128 bits // set 1 [ 'key' => '80000000000000000000000000000000', 'iv' => '0000000000000000', 'result' => 'F7A274D268316790A67EC058F45C0F2A' . '067A99FCDE6236C0CEF8E056349FE54C' . '5F13AC74D2539570FD34FEAB06C57205' . '3949B59585742181A5A760223AFA22D4' ], // set 2 [ 'key' => '00000000000000000000000000000000', 'iv' => '0000000000000000', 'result' => '6D3937FFA13637648E477623277644AD' . 'AD3854E6B2B3E4D68155356F68B30490' . '842B2AEA2E32239BE84E613C6CE1B9BD' . '026094962CB1A6757AF5A13DDAF8252C' ], // set 3 [ 'key' => '000102030405060708090A0B0C0D0E0F', 'iv' => '0000000000000000', 'result' => 'F3BCF4D6381742839C5627050D4B227F' . 'EB1ECCC527BF605C4CB9D6FB0618F419' . 'B51846707550BBEEE381E44A50A406D0' . '20C8433D08B19C98EFC867ED9897EDBB' ], // set 4 [ 'key' => '0053A6F94C9FF24598EB3E91E4378ADD', 'iv' => '0000000000000000', 'result' => '196D1A0977F0585B23367497D449E11D' . 'E328ECD944BC133F786348C9591B35B7' . '189CDDD934757ED8F18FBC984DA377A8' . '07147F1A6A9A8759FD2A062FD76D275E' ], // set 5 [ 'key' => '00000000000000000000000000000000', 'iv' => '8000000000000000', 'result' => '104639D9F65C879F7DFF8A82A94C130C' . 'D6C727B3BC8127943ACDF0AB7AD6D28B' . 'F2ADF50D81F50C53D0FDFE15803854C7' . 'D67F6C9B4752275696E370A467A4C1F8' ], // set 6 [ 'key' => '0053A6F94C9FF24598EB3E91E4378ADD', 'iv' => '0D74DB42A91077DE', 'result' => '620BB4C2ED20F4152F0F86053D3F5595' . '8E1FBA48F5D86B25C8F31559F3158072' . '6E7ED8525D0B9EA5264BF97750713476' . '1EF65FE195274AFBF000938C03BA59A7' ], // key size: 256 bits // set 1 [ 'key' => '8000000000000000000000000000000000000000000000000000000000000000', 'iv' => '0000000000000000', 'result' => '50EC2485637DB19C6E795E9C73938280' . '6F6DB320FE3D0444D56707D7B456457F' . '3DB3E8D7065AF375A225A70951C8AB74' . '4EC4D595E85225F08E2BC03FE1C42567' ], // set 2 [ 'key' => '0000000000000000000000000000000000000000000000000000000000000000', 'iv' => '0000000000000000', 'result' => '7C3A1499A63B507B0BC75824ABEEAA26' . '109101C5B915F0F554DD9950045D02FA' . 'FF815CA8B2C7CFF3625765697B80B026' . '7EA87E25412564BD71DD05843A60465E' ], // set 3 [ 'key' => '000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F', 'iv' => '0000000000000000', 'result' => '8C03E9237FEE95D5041C753C204D2B35' . '764E4A53035A76F9EFBADD7E63E60B69' . 'BF23F7C5FD39B2249B0C628FB654D521' . '4EB588371E5D2F34BF51396AF3ACB666' ], // set 4 [ 'key' => '0053A6F94C9FF24598EB3E91E4378ADD3083D6297CCF2275C81B6EC11467BA0D', 'iv' => '0000000000000000', 'result' => '2052F9A2853E989133D10938222AC76D' . 'B8B4CBA135ACB59970DDF9C074C6271A' . '5C4E2A7A00D2D697EDFC9B1FF9B365C8' . '7347B23020663A30711A71E3A02AB00C' ], // set 5 [ 'key' => '0000000000000000000000000000000000000000000000000000000000000000', 'iv' => '8000000000000000', 'result' => 'FE40F57D1586D7664C2FCA5AB10BD7C7' . '9DE3234836E76949F9DC01CBFABC6D6C' . '42AB27DDC748B4DF7991092972AB4985' . 'CEC19B3E7C2C85D6E25A338DEC288282' ], // set 6 [ 'key' => '0053A6F94C9FF24598EB3E91E4378ADD3083D6297CCF2275C81B6EC11467BA0D', 'iv' => '0D74DB42A91077DE', 'result' => 'C349B6A51A3EC9B712EAED3F90D8BCEE' . '69B7628645F251A996F55260C62EF31F' . 'D6C6B0AEA94E136C9D984AD2DF3578F7' . '8E457527B03A0450580DD874F63B1AB9' ], ]; $result = []; foreach ($engines as $engine) { foreach ($tests as $test) { foreach ($test['output'] as $output) { $result[] = [$engine, $test['key'], $output['iv'], $output['result']]; } } } return $result; } /** * @dataProvider engineVectors */ public function testVectors($engine, $key, $iv, $expected) { $cipher = new Salsa(); $cipher->setPreferredEngine($engine); $cipher->setKey(pack('H*', $key)); $cipher->setNonce(pack('H*', $iv)); if ($cipher->getEngine() != $engine) { self::markTestSkipped('Unable to initialize ' . $engine . ' engine for ' . (strlen($key) * 8) . '-bit key'); } $result = $cipher->encrypt(str_repeat("\0", 64)); $this->assertEquals(bin2hex($result), $expected, "Failed asserting that key $key / $iv yielded expected output in $engine engine"); } }