1package Digest::base; 2 3use strict; 4use vars qw($VERSION); 5$VERSION = "1.00"; 6 7# subclass is supposed to implement at least these 8sub new; 9sub clone; 10sub add; 11sub digest; 12 13sub reset { 14 my $self = shift; 15 $self->new(@_); # ugly 16} 17 18sub addfile { 19 my ($self, $handle) = @_; 20 21 my $n; 22 my $buf = ""; 23 24 while (($n = read($handle, $buf, 4*1024))) { 25 $self->add($buf); 26 } 27 unless (defined $n) { 28 require Carp; 29 Carp::croak("Read failed: $!"); 30 } 31 32 $self; 33} 34 35sub add_bits { 36 my $self = shift; 37 my $bits; 38 my $nbits; 39 if (@_ == 1) { 40 my $arg = shift; 41 $bits = pack("B*", $arg); 42 $nbits = length($arg); 43 } 44 else { 45 ($bits, $nbits) = @_; 46 } 47 if (($nbits % 8) != 0) { 48 require Carp; 49 Carp::croak("Number of bits must be multiple of 8 for this algorithm"); 50 } 51 return $self->add(substr($bits, 0, $nbits/8)); 52} 53 54sub hexdigest { 55 my $self = shift; 56 return unpack("H*", $self->digest(@_)); 57} 58 59sub b64digest { 60 my $self = shift; 61 require MIME::Base64; 62 my $b64 = MIME::Base64::encode($self->digest(@_), ""); 63 $b64 =~ s/=+$//; 64 return $b64; 65} 66 671; 68 69__END__ 70 71=head1 NAME 72 73Digest::base - Digest base class 74 75=head1 SYNPOSIS 76 77 package Digest::Foo; 78 use base 'Digest::base'; 79 80=head1 DESCRIPTION 81 82The C<Digest::base> class provide implementations of the methods 83C<addfile> and C<add_bits> in terms of C<add>, and of the methods 84C<hexdigest> and C<b64digest> in terms of C<digest>. 85 86Digest implementations might want to inherit from this class to get 87this implementations of the alternative I<add> and I<digest> methods. 88A minimal subclass needs to implement the following methods by itself: 89 90 new 91 clone 92 add 93 digest 94 95The arguments and expected behaviour of these methods are described in 96L<Digest>. 97 98=head1 SEE ALSO 99 100L<Digest> 101