use strict;
use warnings;
use Test::More tests => 46;
use Test::NoWarnings;
BEGIN {
$ENV{CRYPT_SKIP32_PP} = 1;
use_ok('Crypt::Skip32');
}
# Create cipher
my $cipher1 = new Crypt::Skip32 pack("H20", "DE2624BD4FFC4BF09DAB");
isa_ok($cipher1, 'Crypt::Skip32',
'new cipher1');
# Standard size methods
is($cipher1->blocksize, 4,
"blocksize is 4");
is($cipher1->keysize, 10,
"keysize is 10");
# Try out a few encrypt/decrypt
test($cipher1, 0, 78612854);
test($cipher1, 3, 3719912389);
test($cipher1, 21, 1463300585);
test($cipher1, 147, 1277082297);
test($cipher1, 1029, 2878029910);
test($cipher1, 7203, 4086218104);
test($cipher1, 50421, 2588160464);
test($cipher1, 352947, 2703568194);
test($cipher1, 2470629, 2600508864);
test($cipher1, 17294403, 4119915301);
test($cipher1, 121060821, 4266122367);
test($cipher1, 847425747, 2671425558);
test($cipher1, 4294967295, 949651845);
# Different cipher keys
my $cipher_text_1 = test($cipher1, 123456789, 2982653749);
my $cipher2 = new Crypt::Skip32 pack("H20", "EC1D4396C19C0E0A1CC8");
isa_ok($cipher2, 'Crypt::Skip32',
'new cipher2');
my $cipher_text_2 = test($cipher2, 123456789, 2798020216);
isnt($cipher_text_1, $cipher_text_2,
'different keys produce different encrypted text');
# Error conditions
eval { my $cipher3 = new Crypt::Skip32 'shortkey'; };
isnt($@, "", "new() dies correctly on key too short");
eval { my $cipher4 = new Crypt::Skip32 'keythatistoolong'; };
isnt($@, "", "new() dies correctly on key too long");
eval { $cipher1->encrypt('abc'); };
isnt($@, "", "encrypt() dies correctly on plaintext too short");
eval { $cipher1->encrypt('abcde'); };
isnt($@, "", "encrypt() dies correctly on plaintext too long");
eval { $cipher1->decrypt('abc'); };
isnt($@, "", "encrypt() dies correctly on ciphertext too short");
eval { $cipher1->decrypt('abcde'); };
isnt($@, "", "decrypt() dies correctly on ciphertext too long");
# Test based on the tests in the original C source.
my $cipher5 = new Crypt::Skip32 pack("H20", "00998877665544332211");
isa_ok($cipher5, 'Crypt::Skip32',
'new cipher5');
test($cipher5, 0x33221100, 0x819D5F1F);
exit 0;
sub test {
my ($cipher, $plain_number, $correct_cipher_number) = @_;
my $plain_text_1 = pack('N', $plain_number);
my $cipher_text = $cipher->encrypt($plain_text_1);
my $plain_text_2 = $cipher->decrypt($cipher_text);
my $cipher_number = unpack('N', $cipher_text);
is($cipher_number, $correct_cipher_number,
"Skip32 encrypt $plain_number -> $cipher_number");
is($plain_text_1, $plain_text_2,
"Skip32 decrypt $cipher_number -> $plain_number");
return $cipher_text;
}