]> Dogcows Code - chaz/p5-File-KDBX/blob - lib/File/KDBX/KDF/Argon2.pm
6019380fe016ea218fd2bfd5fdbeb66feb321957
[chaz/p5-File-KDBX] / lib / File / KDBX / KDF / Argon2.pm
1 package File::KDBX::KDF::Argon2;
2 # ABSTRACT: The Argon2 family of key derivation functions
3
4 use warnings;
5 use strict;
6
7 use Crypt::Argon2 qw(argon2d_raw argon2id_raw);
8 use File::KDBX::Constants qw(:kdf);
9 use File::KDBX::Error;
10 use namespace::clean;
11
12 use parent 'File::KDBX::KDF';
13
14 our $VERSION = '999.999'; # VERSION
15
16 sub init {
17 my $self = shift;
18 my %args = @_;
19 return $self->SUPER::init(
20 KDF_PARAM_ARGON2_SALT() => $args{+KDF_PARAM_ARGON2_SALT} // $args{salt},
21 KDF_PARAM_ARGON2_PARALLELISM() => $args{+KDF_PARAM_ARGON2_PARALLELISM} // $args{parallelism},
22 KDF_PARAM_ARGON2_MEMORY() => $args{+KDF_PARAM_ARGON2_MEMORY} // $args{memory},
23 KDF_PARAM_ARGON2_ITERATIONS() => $args{+KDF_PARAM_ARGON2_ITERATIONS} // $args{iterations},
24 KDF_PARAM_ARGON2_VERSION() => $args{+KDF_PARAM_ARGON2_VERSION} // $args{version},
25 KDF_PARAM_ARGON2_SECRET() => $args{+KDF_PARAM_ARGON2_SECRET} // $args{secret},
26 KDF_PARAM_ARGON2_ASSOCDATA() => $args{+KDF_PARAM_ARGON2_ASSOCDATA} // $args{assocdata},
27 );
28 }
29
30 =attr salt
31
32 =attr parallelism
33
34 =attr memory
35
36 =attr iterations
37
38 =attr version
39
40 =attr secret
41
42 =attr assocdata
43
44 Get various KDF parameters.
45
46 C<version>, C<secret> and C<assocdata> are currently unused.
47
48 =cut
49
50 sub salt { $_[0]->{+KDF_PARAM_ARGON2_SALT} or throw 'Salt is not set' }
51 sub parallelism { $_[0]->{+KDF_PARAM_ARGON2_PARALLELISM} //= KDF_DEFAULT_ARGON2_PARALLELISM }
52 sub memory { $_[0]->{+KDF_PARAM_ARGON2_MEMORY} //= KDF_DEFAULT_ARGON2_MEMORY }
53 sub iterations { $_[0]->{+KDF_PARAM_ARGON2_ITERATIONS} //= KDF_DEFAULT_ARGON2_ITERATIONS }
54 sub version { $_[0]->{+KDF_PARAM_ARGON2_VERSION} //= KDF_DEFAULT_ARGON2_VERSION }
55 sub secret { $_[0]->{+KDF_PARAM_ARGON2_SECRET} }
56 sub assocdata { $_[0]->{+KDF_PARAM_ARGON2_ASSOCDATA} }
57
58 sub seed { $_[0]->salt }
59
60 sub _transform {
61 my $self = shift;
62 my $key = shift;
63
64 my ($uuid, $salt, $iterations, $memory, $parallelism)
65 = ($self->uuid, $self->salt, $self->iterations, $self->memory, $self->parallelism);
66
67 if ($uuid eq KDF_UUID_ARGON2D) {
68 return argon2d_raw($key, $salt, $iterations, $memory, $parallelism, length($salt));
69 }
70 elsif ($uuid eq KDF_UUID_ARGON2ID) {
71 return argon2id_raw($key, $salt, $iterations, $memory, $parallelism, length($salt));
72 }
73
74 throw 'Unknown Argon2 type', uuid => $uuid;
75 }
76
77 1;
78 __END__
79
80 =head1 DESCRIPTION
81
82 An Argon2 key derivation function. This is a L<File::KDBX::KDF> subclass.
83
84 This KDF allows for excellent resistance to ASIC password cracking. It's a solid choice but doesn't have the
85 track record of L<File::KDBX::KDF::AES> and requires using the KDBX4+ file format.
86
87 =cut
This page took 0.034468 seconds and 3 git commands to generate.