File Coverage

blib/lib/Digest/HMAC.pm
Criterion Covered Total %
statement 27 36 75.0
branch 4 4 100.0
condition 2 4 50.0
subroutine 7 12 58.3
pod 0 9 0.0
total 40 65 61.5


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