File Coverage

blib/lib/Crypt/Passphrase/Argon2.pm
Criterion Covered Total %
statement 32 33 96.9
branch 2 4 50.0
condition 12 16 75.0
subroutine 10 11 90.9
pod 5 5 100.0
total 61 69 88.4


line stmt bran cond sub pod time code
1             package Crypt::Passphrase::Argon2;
2             $Crypt::Passphrase::Argon2::VERSION = '0.007';
3 1     1   70382 use strict;
  1         12  
  1         27  
4 1     1   6 use warnings;
  1         3  
  1         35  
5              
6 1     1   585 use Crypt::Passphrase 0.010 -encoder;
  1         15334  
  1         6  
7              
8 1     1   8137 use Carp 'croak';
  1         2  
  1         86  
9 1     1   7 use Crypt::Argon2 0.017 qw/argon2_pass argon2_needs_rehash argon2_verify argon2_types/;
  1         16  
  1         513  
10              
11             my %settings_for = (
12             interactive => {
13             time_cost => 2,
14             memory_cost => '64M',
15             },
16             moderate => {
17             time_cost => 3,
18             memory_cost => '256M',
19             },
20             sensitive => {
21             time_cost => 4,
22             memory_cost => '1G',
23             }
24             );
25              
26             my %valid_types = map { ($_ => 1) } argon2_types;
27              
28             sub _settings_for {
29 3     3   8 my %args = @_;
30 3   50     20 my $subtype = $args{subtype} // 'argon2id';
31 3 50       10 croak "Unknown subtype $subtype" unless $valid_types{$subtype};
32 3   100     11 my $profile = $args{profile} // 'moderate';
33 3 50       11 croak "Unknown profile $profile" unless $settings_for{$profile};
34             return {
35             memory_cost => $args{memory_cost} // $settings_for{$profile}{memory_cost},
36             time_cost => $args{time_cost} // $settings_for{$profile}{time_cost},
37             parallelism => $args{parallelism} // 1,
38             output_size => $args{output_size} // 16,
39 3   66     52 salt_size => $args{salt_size} // 16,
      66        
      50        
      100        
      100        
40             subtype => $subtype,
41             };
42             }
43              
44             sub new {
45 3     3 1 423 my ($class, %args) = @_;
46 3         13 return bless _settings_for(%args), $class;
47             }
48              
49             sub hash_password {
50 2     2 1 15 my ($self, $password) = @_;
51 2         19 my $salt = $self->random_bytes($self->{salt_size});
52 2         10635 return argon2_pass($self->{subtype}, $password, $salt, @{$self}{qw/time_cost memory_cost parallelism output_size/});
  2         332780  
53             }
54              
55             sub needs_rehash {
56 5     5 1 35 my ($self, $hash) = @_;
57 5         15 return argon2_needs_rehash($hash, @{$self}{qw/subtype time_cost memory_cost parallelism output_size salt_size/});
  5         35  
58             }
59              
60             sub crypt_subtypes {
61 0     0 1 0 return argon2_types;
62             }
63              
64             sub verify_password {
65 5     5 1 110908 my ($class, $password, $hash) = @_;
66 5         436464 return argon2_verify($hash, $password);
67             }
68              
69             #ABSTRACT: An Argon2 encoder for Crypt::Passphrase
70              
71             __END__