The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use lib 't';
use Testdata;

my @w_extra_block  = qw(standard zeroes oneandzeroes null);
my @wo_extra_block = qw(rijndael_compat space none);

use Test::More tests => 2*@ciphers*(4+3) + 1;

BEGIN { use_ok (Crypt::ECB) }

my $ecb = Crypt::ECB->new;

foreach my $cipher (@ciphers)
{
	eval { $ecb->cipher($cipher) };
	SKIP: {	skip "$cipher not installed", 2 * (@w_extra_block + @wo_extra_block) if $@;

		my $ks = $ecb->keysize || 56;
		$ecb->key( substr($key, 0, $ks) );

		my $bs = $ecb->blocksize;
		my $text = "x" x $bs;

		my %padding = (
			'standard'		=> chr($bs) x $bs,
			'zeroes'		=> "\x00" x ($bs-1) . chr($bs),
			'oneandzeroes'		=> "\x80" . "\x00" x ($bs-1),
			'null'			=> "\x00" x $bs,
		);

		foreach my $padstyle (@w_extra_block)
		{
			$ecb->padding($padstyle);
			my $enc = $ecb->encrypt($text);
			ok($ecb->decrypt($enc) eq $text,			"$cipher, $padstyle padding: en-/decrypting one block ($bs bytes)");

			$ecb->padding('none');
			ok($ecb->decrypt($enc) eq $text . $padding{$padstyle},	"$cipher, $padstyle padding: extra block added");
		}

		foreach my $padstyle (@wo_extra_block)
		{
			$ecb->padding($padstyle);
			my $enc = $ecb->encrypt($text);
			ok($ecb->decrypt($enc) eq $text,			"$cipher, $padstyle padding: en-/decrypting one block ($bs bytes)");

			$ecb->padding('none');
			ok($ecb->decrypt($enc) eq $text,			"$cipher, $padstyle padding: no extra block added");
		}
	}
}