File Coverage

blib/lib/Digest/HMAC.pm
Criterion Covered Total %
statement 24 33 72.7
branch 4 4 100.0
condition 2 4 50.0
subroutine 6 11 54.5
pod 0 9 0.0
total 36 61 59.0


line stmt bran cond sub pod time code
1             package Digest::HMAC;
2             our $VERSION = '1.05'; # VERSION
3             our $AUTHORITY = 'cpan:ARODLAND'; # AUTHORITY
4              
5 1     1   8 use strict;
  1         12  
  1         769  
6              
7             # OO interface
8              
9             sub new
10             {
11 14     14 0 26 my($class, $key, $hasher, $block_size) = @_;
12 14   50     25 $block_size ||= 64;
13 14 100       31 $key = $hasher->new->add($key)->digest if length($key) > $block_size;
14              
15 14         71 my $self = bless {}, $class;
16 14         43 $self->{k_ipad} = $key ^ (chr(0x36) x $block_size);
17 14         24 $self->{k_opad} = $key ^ (chr(0x5c) x $block_size);
18 14         41 $self->{hasher} = $hasher->new->add($self->{k_ipad});
19 14         89 $self;
20             }
21              
22             sub reset
23             {
24 0     0 0 0 my $self = shift;
25 0         0 $self->{hasher}->reset->add($self->{k_ipad});
26 0         0 $self;
27             }
28              
29 14     14 0 41 sub add { my $self = shift; $self->{hasher}->add(@_); $self; }
  14         30  
  14         14  
30 0     0 0 0 sub addfile { my $self = shift; $self->{hasher}->addfile(@_); $self; }
  0         0  
  0         0  
31              
32             sub _digest
33             {
34 14     14   17 my $self = shift;
35 14         34 my $inner_digest = $self->{hasher}->digest;
36 14         38 $self->{hasher}->reset->add($self->{k_opad}, $inner_digest);
37             }
38              
39 14     14 0 44 sub digest { shift->_digest->digest; }
40 0     0 0 0 sub hexdigest { shift->_digest->hexdigest; }
41 0     0 0 0 sub b64digest { shift->_digest->b64digest; }
42              
43              
44             # Functional interface
45              
46             require Exporter;
47             *import = \&Exporter::import;
48             our @EXPORT_OK = qw(hmac hmac_hex);
49              
50             sub hmac
51             {
52 14     14 0 23 my($data, $key, $hash_func, $block_size) = @_;
53 14   50     23 $block_size ||= 64;
54 14 100       28 $key = &$hash_func($key) if length($key) > $block_size;
55              
56 14         23 my $k_ipad = $key ^ (chr(0x36) x $block_size);
57 14         24 my $k_opad = $key ^ (chr(0x5c) x $block_size);
58              
59 14         185 &$hash_func($k_opad, &$hash_func($k_ipad, $data));
60             }
61              
62 0     0 0   sub hmac_hex { unpack("H*", &hmac); }
63              
64             1;
65              
66             __END__