Line | |
---|
1 | package Digest::base;
|
---|
2 |
|
---|
3 | use strict;
|
---|
4 | use vars qw($VERSION);
|
---|
5 | $VERSION = "1.00";
|
---|
6 |
|
---|
7 | # subclass is supposed to implement at least these
|
---|
8 | sub new;
|
---|
9 | sub clone;
|
---|
10 | sub add;
|
---|
11 | sub digest;
|
---|
12 |
|
---|
13 | sub reset {
|
---|
14 | my $self = shift;
|
---|
15 | $self->new(@_); # ugly
|
---|
16 | }
|
---|
17 |
|
---|
18 | sub 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 |
|
---|
35 | sub 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 |
|
---|
54 | sub hexdigest {
|
---|
55 | my $self = shift;
|
---|
56 | return unpack("H*", $self->digest(@_));
|
---|
57 | }
|
---|
58 |
|
---|
59 | sub 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 |
|
---|
67 | 1;
|
---|
68 |
|
---|
69 | __END__
|
---|
70 |
|
---|
71 | =head1 NAME
|
---|
72 |
|
---|
73 | Digest::base - Digest base class
|
---|
74 |
|
---|
75 | =head1 SYNOPSIS
|
---|
76 |
|
---|
77 | package Digest::Foo;
|
---|
78 | use base 'Digest::base';
|
---|
79 |
|
---|
80 | =head1 DESCRIPTION
|
---|
81 |
|
---|
82 | The C<Digest::base> class provide implementations of the methods
|
---|
83 | C<addfile> and C<add_bits> in terms of C<add>, and of the methods
|
---|
84 | C<hexdigest> and C<b64digest> in terms of C<digest>.
|
---|
85 |
|
---|
86 | Digest implementations might want to inherit from this class to get
|
---|
87 | this implementations of the alternative I<add> and I<digest> methods.
|
---|
88 | A minimal subclass needs to implement the following methods by itself:
|
---|
89 |
|
---|
90 | new
|
---|
91 | clone
|
---|
92 | add
|
---|
93 | digest
|
---|
94 |
|
---|
95 | The arguments and expected behaviour of these methods are described in
|
---|
96 | L<Digest>.
|
---|
97 |
|
---|
98 | =head1 SEE ALSO
|
---|
99 |
|
---|
100 | L<Digest>
|
---|
Note:
See
TracBrowser
for help on using the repository browser.