diff options
author | Nicholas Clark <nick@ccl4.org> | 2003-11-29 17:09:25 +0000 |
---|---|---|
committer | Nicholas Clark <nick@ccl4.org> | 2003-11-29 17:09:25 +0000 |
commit | 4158a951785f90e7eefe039d837a9048e68bac32 (patch) | |
tree | 9d5a25e5eb4f5cfb730af24dc76dcd36545d0438 /lib/Digest | |
parent | 49953a3f383b8241104c85e979c4a29a2f362e74 (diff) | |
download | perl-4158a951785f90e7eefe039d837a9048e68bac32.tar.gz |
D'oh! Forgot to lib/Digest/base.pm
p4raw-id: //depot/perl@21809
Diffstat (limited to 'lib/Digest')
-rw-r--r-- | lib/Digest/base.pm | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/lib/Digest/base.pm b/lib/Digest/base.pm new file mode 100644 index 0000000000..df9408fbc6 --- /dev/null +++ b/lib/Digest/base.pm @@ -0,0 +1,100 @@ +package Digest::base; + +use strict; +use vars qw($VERSION); +$VERSION = "1.00"; + +# subclass is supposed to implement at least these +sub new; +sub clone; +sub add; +sub digest; + +sub reset { + my $self = shift; + $self->new(@_); # ugly +} + +sub addfile { + my ($self, $handle) = @_; + + my $n; + my $buf = ""; + + while (($n = read($handle, $buf, 4*1024))) { + $self->add($buf); + } + unless (defined $n) { + require Carp; + Carp::croak("Read failed: $!"); + } + + $self; +} + +sub add_bits { + my $self = shift; + my $bits; + my $nbits; + if (@_ == 1) { + my $arg = shift; + $bits = pack("B*", $arg); + $nbits = length($arg); + } + else { + ($bits, $nbits) = @_; + } + if (($nbits % 8) != 0) { + require Carp; + Carp::croak("Number of bits must be multiple of 8 for this algorithm"); + } + return $self->add(substr($bits, 0, $nbits/8)); +} + +sub hexdigest { + my $self = shift; + return unpack("H*", $self->digest(@_)); +} + +sub b64digest { + my $self = shift; + require MIME::Base64; + my $b64 = MIME::Base64::encode($self->digest(@_), ""); + $b64 =~ s/=+$//; + return $b64; +} + +1; + +__END__ + +=head1 NAME + +Digest::base - Digest base class + +=head1 SYNPOSIS + + package Digest::Foo; + use base 'Digest::base'; + +=head1 DESCRIPTION + +The C<Digest::base> class provide implementations of the methods +C<addfile> and C<add_bits> in terms of C<add>, and of the methods +C<hexdigest> and C<b64digest> in terms of C<digest>. + +Digest implementations might want to inherit from this class to get +this implementations of the alternative I<add> and I<digest> methods. +A minimal subclass needs to implement the following methods by itself: + + new + clone + add + digest + +The arguments and expected behaviour of these methods are described in +L<Digest>. + +=head1 SEE ALSO + +L<Digest> |