File-KDBX-XS
view release on metacpan or search on metacpan
eg/benchmark.pl view on Meta::CPAN
#!/usr/bin/env perl
use warnings;
use strict;
use Crypt::Rijndael;
use Crypt::Cipher;
use File::KDBX::XS;
use Benchmark qw(:all :hireswallclock);
use Test::More;
my $iterations = shift // 50;
my $rounds = 500_000;
my $key = "\1" x 32;
my $seed = "\1" x 16;
my $expected = pack('H*', '3f7dfb512060cc8be094cd259c7ff03c');
sub xs {
my $result = File::KDBX::KDF::AES::_transform_half_xs($key, $seed, $rounds);
return $result;
}
sub cryptx {
my $cipher = Crypt::Cipher->new('AES', $key);
my $result = $seed;
for (my $i = 0; $i < $rounds; ++$i) {
$result = $cipher->encrypt($result);
}
return $result;
}
sub crypt_rijndael {
my $cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_ECB());
my $result = $seed;
for (my $i = 0; $i < $rounds; ++$i) {
$result = $cipher->encrypt($result);
}
return $result;
}
my $r = xs();
is $r, $expected, 'AES KDF transform works' or diag explain unpack('H*', $r);
is $r, cryptx(), 'XS transform agrees with CryptX';
is $r, crypt_rijndael(), 'XS transform agrees with Crypt::Rijndael';
done_testing;
my $timings = timethese($iterations, {
crypt_rijndael => \&crypt_rijndael,
cryptx => \&cryptx,
xs => \&xs,
});
cmpthese($timings);
( run in 0.665 second using v1.01-cache-2.11-cpan-71847e10f99 )