]> Dogcows Code - chaz/p5-File-KDBX/blob - lib/File/KDBX/KDF/Argon2.pm
Add function for creating class attributes
[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 File::KDBX::Util qw(:class);
11 use namespace::clean;
12
13 extends 'File::KDBX::KDF';
14
15 our $VERSION = '999.999'; # VERSION
16
17 =attr salt
18
19 =attr parallelism
20
21 =attr memory
22
23 =attr iterations
24
25 =attr version
26
27 =attr secret
28
29 =attr assocdata
30
31 Get various KDF parameters.
32
33 C<version>, C<secret> and C<assocdata> are currently unused.
34
35 =cut
36
37 sub salt { $_[0]->{+KDF_PARAM_ARGON2_SALT} or throw 'Salt is not set' }
38 sub seed { $_[0]->salt }
39 sub parallelism { $_[0]->{+KDF_PARAM_ARGON2_PARALLELISM} //= KDF_DEFAULT_ARGON2_PARALLELISM }
40 sub memory { $_[0]->{+KDF_PARAM_ARGON2_MEMORY} //= KDF_DEFAULT_ARGON2_MEMORY }
41 sub iterations { $_[0]->{+KDF_PARAM_ARGON2_ITERATIONS} //= KDF_DEFAULT_ARGON2_ITERATIONS }
42 sub version { $_[0]->{+KDF_PARAM_ARGON2_VERSION} //= KDF_DEFAULT_ARGON2_VERSION }
43 sub secret { $_[0]->{+KDF_PARAM_ARGON2_SECRET} }
44 sub assocdata { $_[0]->{+KDF_PARAM_ARGON2_ASSOCDATA} }
45
46 sub init {
47 my $self = shift;
48 my %args = @_;
49 return $self->SUPER::init(
50 KDF_PARAM_ARGON2_SALT() => $args{+KDF_PARAM_ARGON2_SALT} // $args{salt},
51 KDF_PARAM_ARGON2_PARALLELISM() => $args{+KDF_PARAM_ARGON2_PARALLELISM} // $args{parallelism},
52 KDF_PARAM_ARGON2_MEMORY() => $args{+KDF_PARAM_ARGON2_MEMORY} // $args{memory},
53 KDF_PARAM_ARGON2_ITERATIONS() => $args{+KDF_PARAM_ARGON2_ITERATIONS} // $args{iterations},
54 KDF_PARAM_ARGON2_VERSION() => $args{+KDF_PARAM_ARGON2_VERSION} // $args{version},
55 KDF_PARAM_ARGON2_SECRET() => $args{+KDF_PARAM_ARGON2_SECRET} // $args{secret},
56 KDF_PARAM_ARGON2_ASSOCDATA() => $args{+KDF_PARAM_ARGON2_ASSOCDATA} // $args{assocdata},
57 );
58 }
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.039602 seconds and 4 git commands to generate.