1 package File
::KDBX
::Key
::Composite
;
2 # ABSTRACT: A composite key made up of component keys
7 use Crypt
::Digest
qw(digest_data);
9 use File
::KDBX
::Util
qw(:class :erase);
10 use Ref
::Util
qw(is_arrayref);
11 use Scalar
::Util
qw(blessed);
14 extends
'File::KDBX::Key';
16 our $VERSION = '999.999'; # VERSION
20 my $primitive = shift // throw
'Missing key primitive';
22 my @primitive = grep { defined } is_arrayref
($primitive) ? @$primitive : $primitive;
23 @primitive or throw
'Composite key must have at least one component key', count
=> scalar @primitive;
25 my @keys = map { blessed
$_ && $_->can('raw_key') ? $_ : File
::KDBX
::Key-
>new($_,
26 keep_primitive
=> $self->{keep_primitive
}) } @primitive;
27 $self->{keys} = \
@keys;
34 $raw_key = $key->raw_key;
35 $raw_key = $key->raw_key($challenge);
37 Get the raw key from
each component key
and return a generated composite raw key
.
43 my $challenge = shift;
45 my @keys = @{$self->keys} or throw
'Cannot generate a raw key from an empty composite key';
47 my @basic_keys = map { $_->raw_key } grep { !$_->can('challenge') } @keys;
49 $response = $self->challenge($challenge, @_) if defined $challenge;
50 my $cleanup = erase_scoped \
@basic_keys, $response;
52 return digest_data
('SHA256',
54 defined $response ? $response : (),
62 Get one
or more component L
<File
::KDBX
::Key
>.
68 $self->{keys} = shift if @_;
69 return $self->{keys} ||= [];
74 $response = $key->challenge(...);
76 Issues a challenge to any L
<File
::KDBX
::Key
::ChallengeResponse
> components
keys. Arguments are passed through
77 to
each component key
. The responses are hashed together
and the composite response
is returned
.
79 Returns empty string
if there are
no challenge-response components
keys.
86 my @chalresp_keys = grep { $_->can('challenge') } @{$self->keys} or return '';
88 my @responses = map { $_->challenge(@_) } @chalresp_keys;
89 my $cleanup = erase_scoped \
@responses;
91 return digest_data
('SHA256', @responses);
96 $_->hide for @{$self->keys};
102 $_->show for @{$self->keys};
111 use File::KDBX::Key::Composite;
113 my $key = File::KDBX::Key::Composite->(\@component_keys);
117 A composite key is a collection of other keys. A master key capable of unlocking a KDBX database is always
118 a composite key, even if it only has a single component.
120 Inherets methods and attributes from L<File::KDBX::Key>.