#!/usr/bin/perl use strict; use warnings; use Test::More 'no_plan'; use Test::Exception; # uses test vectors from http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf use ok qw(Crypt::EAX); sub test_vector { my %args = @_; my $obj = Crypt::EAX->new( key => pack("H*",$args{KEY}), header => pack("H*",$args{HEADER}), nonce => pack("H*",$args{NONCE}), ); my $ciphertext = $obj->encrypt( pack("H*", $args{MSG} ) ); { is( uc(unpack("H*", $ciphertext)), $args{CIPHER}, "ciphertext matches" ); } $obj->reset; my $decrypted; lives_ok { $decrypted = $obj->decrypt( $ciphertext ) } "decryption lives"; is( uc(unpack("H*", $decrypted ||'')), $args{MSG}, "decrypted" ); foreach my $mangling ( [ 0, 5, "moose" ], [ -5, 3, "foo" ] ) { my $mangled = $ciphertext; substr($mangled, $mangling->[0], $mangling->[1] ) ^= $mangling->[2]; dies_ok { $obj->decrypt($mangled) } "decryption fails"; } } test_vector( %$_) for ( { 'KEY' => '233952DEE4D5ED5F9B9C6D6FF80FF478', 'CIPHER' => 'E037830E8389F27B025A2D6527E79D01', 'HEADER' => '6BFB914FD07EAE6B', 'MSG' => '', 'NONCE' => '62EC67F9C3A4A407FCB2A8C49031A8B3' }, { 'KEY' => '91945D3F4DCBEE0BF45EF52255F095A4', 'CIPHER' => '19DD5C4C9331049D0BDAB0277408F67967E5', 'HEADER' => 'FA3BFD4806EB53FA', 'MSG' => 'F7FB', 'NONCE' => 'BECAF043B0A23D843194BA972C66DEBD' }, { 'KEY' => '01F74AD64077F2E704C0F60ADA3DD523', 'CIPHER' => 'D851D5BAE03A59F238A23E39199DC9266626C40F80', 'HEADER' => '234A3463C1264AC6', 'MSG' => '1A47CB4933', 'NONCE' => '70C3DB4F0D26368400A10ED05D2BFF5E' }, { 'KEY' => 'D07CF6CBB7F313BDDE66B727AFD3C5E8', 'CIPHER' => '632A9D131AD4C168A4225D8E1FF755939974A7BEDE', 'HEADER' => '33CCE2EABFF5A79D', 'MSG' => '481C9E39B1', 'NONCE' => '8408DFFF3C1A2B1292DC199E46B7D617' }, { 'KEY' => '35B6D0580005BBC12B0587124557D2C2', 'CIPHER' => '071DFE16C675CB0677E536F73AFE6A14B74EE49844DD', 'HEADER' => 'AEB96EAEBE2970E9', 'MSG' => '40D0C07DA5E4', 'NONCE' => 'FDB6B06676EEDC5C61D74276E1F8E816' }, { 'KEY' => 'BD8E6E11475E60B268784C38C62FEB22', 'CIPHER' => '835BB4F15D743E350E728414ABB8644FD6CCB86947C5E10590210A4F', 'HEADER' => 'D4482D1CA78DCE0F', 'MSG' => '4DE3B35C3FC039245BD1FB7D', 'NONCE' => '6EAC5C93072D8E8513F750935E46DA1B' }, { 'KEY' => '7C77D6E813BED5AC98BAA417477A2E7D', 'CIPHER' => '02083E3979DA014812F59F11D52630DA30137327D10649B0AA6E1C181DB617D7F2', 'HEADER' => '65D2017990D62528', 'MSG' => '8B0A79306C9CE7ED99DAE4F87F8DD61636', 'NONCE' => '1A8C98DCD73D38393B2BF1569DEEFC19' }, { 'KEY' => '5FFF20CAFAB119CA2FC73549E20F5B0D', 'CIPHER' => '2EC47B2C4954A489AFC7BA4897EDCDAE8CC33B60450599BD02C96382902AEF7F832A', 'HEADER' => '54B9F04E6A09189A', 'MSG' => '1BDA122BCE8A8DBAF1877D962B8592DD2D56', 'NONCE' => 'DDE59B97D722156D4D9AFF2BC7559826' }, { 'KEY' => 'A4A4782BCFFD3EC5E7EF6D8C34A56123', 'CIPHER' => '0DE18FD0FDD91E7AF19F1D8EE8733938B1E8E7F6D2231618102FDB7FE55FF1991700', 'HEADER' => '899A175897561D7E', 'MSG' => '6CF36720872B8513F6EAB1A8A44438D5EF11', 'NONCE' => 'B781FCF2F75FA5A8DE97A9CA48E522EC' }, { 'KEY' => '8395FCF1E95BEBD697BD010BC766AAC3', 'CIPHER' => 'CB8920F87A6C75CFF39627B56E3ED197C552D295A7CFC46AFC253B4652B1AF3795B124AB6E', 'HEADER' => '126735FCC320D25A', 'MSG' => 'CA40D7446E545FFAED3BD12A740A659FFBBB3CEAB7', 'NONCE' => '22E7ADD93CFC6393C57EC0B3C17D6B44' } );