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