File Coverage

blib/lib/Crypt/Passphrase/Argon2/AES.pm
Criterion Covered Total %
statement 41 41 100.0
branch 7 14 50.0
condition 2 5 40.0
subroutine 11 11 100.0
pod 1 4 25.0
total 62 75 82.6


line stmt bran cond sub pod time code
1             package Crypt::Passphrase::Argon2::AES;
2              
3 1     1   947 use strict;
  1         4  
  1         47  
4 1     1   8 use warnings;
  1         3  
  1         64  
5              
6             our $VERSION = '0.005';
7              
8 1     1   841 use parent 'Crypt::Passphrase::Argon2::Encrypted';
  1         475  
  1         9  
9 1     1   19391 use Crypt::Passphrase 0.010 -encoder;
  1         18  
  1         7  
10              
11 1     1   60 use Carp 'croak';
  1         3  
  1         57  
12 1     1   482 use Crypt::Rijndael 1.16;
  1         447  
  1         109  
13              
14             my %mode = (
15             'aes-cbc' => Crypt::Rijndael::MODE_CBC,
16             'aes-ecb' => Crypt::Rijndael::MODE_ECB,
17             'aes-cfb' => Crypt::Rijndael::MODE_CFB,
18             'aes-ofb' => Crypt::Rijndael::MODE_OFB,
19             'aes-ctr' => Crypt::Rijndael::MODE_CTR,
20             );
21              
22             sub new {
23 1     1 1 22 my ($class, %args) = @_;
24 1 50       9 my $peppers = $args{peppers} or croak('No peppers given');
25 1 50 33 1   9 $args{active} //= (sort {; no warnings 'numeric'; $b <=> $a || $b cmp $a } keys %{ $peppers })[0];
  1         4  
  1         447  
  1         7  
  1         12  
  1         9  
26 1   50     6 my $mode = delete $args{mode} // 'cbc';
27 1         3 my $cipher = "aes-$mode";
28 1 50       3 croak("No such mode $mode") if not exists $mode{$cipher};
29 1         8 my $self = $class->SUPER::new(%args, cipher => $cipher);
30 1         61 $self->{peppers} = $peppers;
31 1         6 return $self;
32             }
33              
34             sub encrypt_hash {
35 1     1 0 76875 my ($self, $cipher, $id, $iv, $raw) = @_;
36 1 50       24 my $mode = $mode{$cipher} or croak "No such cipher $cipher";
37 1 50       21 my $secret = $self->{peppers}{$id} or croak "No such pepper $id";
38 1         90 return Crypt::Rijndael->new($secret, $mode)->encrypt($raw, $iv);
39             }
40              
41             sub decrypt_hash {
42 2     2 0 161924 my ($self, $cipher, $id, $iv, $raw) = @_;
43 2 50       23 my $mode = $mode{$cipher} or croak "No such cipher $cipher";
44 2 50       18 my $secret = $self->{peppers}{$id} or croak "No such pepper $id";
45 2         91 return Crypt::Rijndael->new($secret, $mode)->decrypt($raw, $iv);
46             }
47              
48             sub supported_ciphers {
49 1     1 0 281 return keys %mode;
50             }
51              
52             1;
53              
54             __END__