File Coverage

blib/lib/Amazon/S3Curl/PurePerl/Digest/HMAC.pm
Criterion Covered Total %
statement 21 36 58.3
branch 1 4 25.0
condition 1 4 25.0
subroutine 6 12 50.0
pod 0 9 0.0
total 29 65 44.6


line stmt bran cond sub pod time code
1             package #hide from cpan index
2             Amazon::S3Curl::PurePerl::Digest::HMAC;
3              
4             =head2 DESCRIPTION
5             From L
6             Digest::HMAC is pure perl, however the distribution Digest::HMAC requires Digest::MD5, which is not.
7             So I copied it here.
8             Preferably the importer should check if the user has Digest::HMAC available first before using this module.
9              
10             =cut
11              
12 1     1   540 use strict;
  1         1  
  1         415  
13              
14             # OO interface
15              
16             sub new
17             {
18 1     1 0 3 my($class, $key, $hasher, $block_size) = @_;
19 1   50     4 $block_size ||= 64;
20 1 50       7 $key = $hasher->new->add($key)->digest if length($key) > $block_size;
21              
22 1         4 my $self = bless {}, $class;
23 1         11 $self->{k_ipad} = $key ^ (chr(0x36) x $block_size);
24 1         5 $self->{k_opad} = $key ^ (chr(0x5c) x $block_size);
25 1         11 $self->{hasher} = $hasher->new->add($self->{k_ipad});
26 1         758 $self;
27             }
28              
29             sub reset
30             {
31 0     0 0 0 my $self = shift;
32 0         0 $self->{hasher}->reset->add($self->{k_ipad});
33 0         0 $self;
34             }
35              
36 1     1 0 2 sub add { my $self = shift; $self->{hasher}->add(@_); $self; }
  1         6  
  1         280  
37 0     0 0 0 sub addfile { my $self = shift; $self->{hasher}->addfile(@_); $self; }
  0         0  
  0         0  
38              
39             sub _digest
40             {
41 1     1   3 my $self = shift;
42 1         6 my $inner_digest = $self->{hasher}->digest;
43 1         5404 $self->{hasher}->reset->add($self->{k_opad}, $inner_digest);
44             }
45              
46 1     1 0 6 sub digest { shift->_digest->digest; }
47 0     0 0   sub hexdigest { shift->_digest->hexdigest; }
48 0     0 0   sub b64digest { shift->_digest->b64digest; }
49              
50              
51             # Functional interface
52              
53             require Exporter;
54             *import = \&Exporter::import;
55 1     1   7 use vars qw(@EXPORT_OK);
  1         1  
  1         199  
56             @EXPORT_OK = qw(hmac hmac_hex);
57              
58             sub hmac
59             {
60 0     0 0   my($data, $key, $hash_func, $block_size) = @_;
61 0   0       $block_size ||= 64;
62 0 0         $key = &$hash_func($key) if length($key) > $block_size;
63              
64 0           my $k_ipad = $key ^ (chr(0x36) x $block_size);
65 0           my $k_opad = $key ^ (chr(0x5c) x $block_size);
66              
67 0           &$hash_func($k_opad, &$hash_func($k_ipad, $data));
68             }
69              
70 0     0 0   sub hmac_hex { unpack("H*", &hmac); }
71              
72             1;