File Coverage

blib/lib/Crypt/RIPEMD160/MAC.pm
Criterion Covered Total %
statement 43 54 79.6
branch 3 8 37.5
condition n/a
subroutine 9 10 90.0
pod 0 6 0.0
total 55 78 70.5


line stmt bran cond sub pod time code
1             package Crypt::RIPEMD160::MAC;
2              
3 2     2   2005 use Crypt::RIPEMD160 0.03;
  2         67  
  2         103  
4              
5 2     2   16 use strict;
  2         4  
  2         66  
6 2     2   28 use warnings;
  2         8  
  2         1000  
7              
8             our $VERSION = '0.09';
9              
10             sub new {
11 20     20 0 74513 my($pkg, $key) = @_;
12              
13 20         143 my $self = {
14             'key' => $key,
15             'hash' => Crypt::RIPEMD160->new,
16             'k_ipad' => chr(0x36) x 64,
17             'k_opad' => chr(0x5c) x 64,
18             };
19              
20 20         44 bless $self, $pkg;
21              
22 20 100       100 if (length($self->{'key'}) > 64) {
23 6         24 $self->{'key'} = Crypt::RIPEMD160->hash($self->{'key'});
24             }
25              
26 20         55 $self->{'k_ipad'} ^= $self->{'key'};
27 20         37 $self->{'k_opad'} ^= $self->{'key'};
28              
29 20         119 $self->{'hash'}->add($self->{'k_ipad'});
30              
31 20         51 return $self;
32             }
33              
34             sub reset {
35 0     0 0 0 my($self) = @_;
36              
37 0         0 $self->{'hash'}->reset();
38 0         0 $self->{'k_ipad'} = chr(0x36) x 64;
39 0         0 $self->{'k_opad'} = chr(0x5c) x 64;
40              
41 0 0       0 if (length($self->{'key'}) > 64) {
42 0         0 $self->{'key'} = Crypt::RIPEMD160->hash($self->{'key'});
43             }
44              
45 0         0 $self->{'k_ipad'} ^= $self->{'key'};
46 0         0 $self->{'k_opad'} ^= $self->{'key'};
47              
48 0         0 $self->{'hash'}->add($self->{'k_ipad'});
49              
50 0         0 return $self;
51             }
52              
53             sub add {
54 18     18 0 96 my($self, @data) = @_;
55              
56 18         66 $self->{'hash'}->add(@data);
57             }
58              
59             sub addfile
60             {
61 2     2   16 no strict 'refs';
  2         4  
  2         1037  
62 1     1 0 7 my ($self, $handle) = @_;
63 1         6 my ($package, $file, $line) = caller;
64 1         2 my ($data);
65              
66 1 50       6 if (!ref($handle)) {
67 0 0       0 $handle = $package . "::" . $handle unless ($handle =~ /(\:\:|\')/);
68             }
69 1         32 while (read($handle, $data, 8192)) {
70 1         10 $self->{'hash'}->add($data);
71             }
72             }
73              
74             sub mac {
75 1     1 0 7 my($self) = @_;
76              
77 1         8 my($inner) = $self->{'hash'}->digest();
78              
79 1         9 my($outer) = Crypt::RIPEMD160->hash($self->{'k_opad'}.$inner);
80              
81 1         4 $self->{'key'} = "";
82 1         3 $self->{'k_ipad'} = "";
83 1         2 $self->{'k_opad'} = "";
84              
85 1         3 return($outer);
86             }
87              
88             sub hexmac {
89 18     18 0 74 my($self) = @_;
90              
91 18         92 my($inner) = $self->{'hash'}->digest();
92              
93 18         91 my($outer) = Crypt::RIPEMD160->hexhash($self->{'k_opad'}.$inner);
94              
95 18         38 $self->{'key'} = "";
96 18         27 $self->{'k_ipad'} = "";
97 18         28 $self->{'k_opad'} = "";
98              
99 18         50 return($outer);
100             }
101              
102             1;
103             __END__