File Coverage

blib/lib/Crypt/RIPEMD160/MAC.pm
Criterion Covered Total %
statement 45 45 100.0
branch 3 4 75.0
condition n/a
subroutine 11 11 100.0
pod 6 6 100.0
total 65 66 98.4


line stmt bran cond sub pod time code
1             package Crypt::RIPEMD160::MAC;
2              
3 5     5   2119 use Crypt::RIPEMD160 0.03;
  5         79  
  5         144  
4              
5 5     5   17 use strict;
  5         11  
  5         70  
6 5     5   12 use warnings;
  5         6  
  5         165  
7 5     5   15 use Carp;
  5         6  
  5         2400  
8              
9             our $VERSION = '0.14';
10              
11             sub new {
12 74     74 1 709891 my($pkg, $key) = @_;
13              
14             # Hash long keys per RFC 2104
15 74 100       187 if (length($key) > 64) {
16 11         54 $key = Crypt::RIPEMD160->hash($key);
17             }
18              
19 74         109 my $k_ipad = chr(0x36) x 64;
20 74         87 my $k_opad = chr(0x5c) x 64;
21 74         144 $k_ipad ^= $key;
22 74         96 $k_opad ^= $key;
23              
24 74         389 my $self = {
25             'key' => $key,
26             'hash' => Crypt::RIPEMD160->new,
27             'k_ipad' => $k_ipad,
28             'k_opad' => $k_opad,
29             };
30              
31 74         144 bless $self, $pkg;
32              
33 74         386 $self->{'hash'}->add($self->{'k_ipad'});
34              
35 74         143 return $self;
36             }
37              
38             sub reset {
39 9     9 1 1161 my($self) = @_;
40              
41 9         24 $self->{'hash'}->reset();
42 9         37 $self->{'hash'}->add($self->{'k_ipad'});
43              
44 9         13 return $self;
45             }
46              
47             sub add {
48 259     259 1 670 my($self, @data) = @_;
49              
50 259         1064 $self->{'hash'}->add(@data);
51              
52 259         353 return $self;
53             }
54              
55             sub addfile
56             {
57 6     6 1 27 my ($self, $handle) = @_;
58              
59 6         13 binmode($handle);
60 6         26 $self->{'hash'}->addfile($handle);
61              
62 5         10 return $self;
63             }
64              
65             sub DESTROY {
66 75     75   48735 my($self) = @_;
67              
68             # Best-effort zeroing of key material in Perl scalars.
69             # Not as reliable as C-level secure_memzero (Perl may keep
70             # copies via COW or realloc), but better than leaving keys
71             # in memory until GC reclaims the storage.
72 75         142 for my $field (qw(key k_ipad k_opad)) {
73 225 50       432 if (defined $self->{$field}) {
74 225         426 $self->{$field} = "\x00" x length($self->{$field});
75 225         556 $self->{$field} = '';
76             }
77             }
78             }
79              
80             sub mac {
81 41     41 1 130 my($self) = @_;
82              
83 41         174 my($inner) = $self->{'hash'}->digest();
84              
85 41         144 return Crypt::RIPEMD160->hash($self->{'k_opad'}.$inner);
86             }
87              
88             sub hexmac {
89 33     33 1 108 my($self) = @_;
90              
91 33         146 my($inner) = $self->{'hash'}->digest();
92              
93 33         137 return Crypt::RIPEMD160->hexhash($self->{'k_opad'}.$inner);
94             }
95              
96             1;
97             __END__