use Crypt::Cipher;
use Crypt::Digest qw(digest_data);
-use File::KDBX::Constants qw(:kdf);
+use File::KDBX::Constants qw(:bool :kdf);
use File::KDBX::Error;
use File::KDBX::Util qw(:load can_fork);
use namespace::clean;
my $FORK_OPTIMIZATION_THRESHOLD = 100_000;
BEGIN {
- load_xs;
-
- my $use_fork = 1;
- $use_fork = 0 if $ENV{NO_FORK} || !can_fork;
- *USE_FORK = $use_fork ? sub() { 1 } : sub() { 0 };
+ my $use_fork = $ENV{NO_FORK} || !can_fork ? FALSE : TRUE;
+ *_USE_FORK = sub() { $use_fork };
}
sub init {
my ($key_l, $key_r) = unpack('(a16)2', $key);
- goto NO_FORK if !USE_FORK || $rounds < $FORK_OPTIMIZATION_THRESHOLD;
+ goto NO_FORK if !_USE_FORK || $rounds < $FORK_OPTIMIZATION_THRESHOLD;
{
my $pid = open(my $read, '-|') // do { alert "fork failed: $!"; goto NO_FORK };
if ($pid == 0) { # child
return digest_data('SHA256', $l, $r);
}
- # FIXME: This used to work but now it crashes frequently. threads are discouraged anyway
+ # FIXME: This used to work but now it crashes frequently. Threads are now discouraged anyway, but it might
+ # be nice if this was available for no-fork platforms.
# if ($ENV{THREADS} && eval 'use threads; 1') {
# my $l = threads->create(\&_transform_half, $key_l, $seed, $rounds);
# my $r = _transform_half($key_r, $seed, $rounds);
return digest_data('SHA256', $l, $r);
}
-sub _transform_half {
- my $xs = __PACKAGE__->can('_transform_half_xs');
- goto $xs if $xs;
-
+sub _transform_half_pp {
my $seed = shift;
my $key = shift;
my $rounds = shift;
return $result;
}
+BEGIN {
+ my $use_xs = load_xs;
+ *_transform_half = $use_xs ? \&File::KDBX::XS::kdf_aes_transform_half : \&_transform_half_pp;
+}
+
1;
__END__