Blame Digest/base.pm

Packit eb1bc2
package Digest::base;
Packit eb1bc2
Packit eb1bc2
use strict;
Packit eb1bc2
use vars qw($VERSION);
Packit eb1bc2
$VERSION = "1.16";
Packit eb1bc2
Packit eb1bc2
# subclass is supposed to implement at least these
Packit eb1bc2
sub new;
Packit eb1bc2
sub clone;
Packit eb1bc2
sub add;
Packit eb1bc2
sub digest;
Packit eb1bc2
Packit eb1bc2
sub reset {
Packit eb1bc2
    my $self = shift;
Packit eb1bc2
    $self->new(@_);  # ugly
Packit eb1bc2
}
Packit eb1bc2
Packit eb1bc2
sub addfile {
Packit eb1bc2
    my ($self, $handle) = @_;
Packit eb1bc2
Packit eb1bc2
    my $n;
Packit eb1bc2
    my $buf = "";
Packit eb1bc2
Packit eb1bc2
    while (($n = read($handle, $buf, 4*1024))) {
Packit eb1bc2
        $self->add($buf);
Packit eb1bc2
    }
Packit eb1bc2
    unless (defined $n) {
Packit eb1bc2
	require Carp;
Packit eb1bc2
	Carp::croak("Read failed: $!");
Packit eb1bc2
    }
Packit eb1bc2
Packit eb1bc2
    $self;
Packit eb1bc2
}
Packit eb1bc2
Packit eb1bc2
sub add_bits {
Packit eb1bc2
    my $self = shift;
Packit eb1bc2
    my $bits;
Packit eb1bc2
    my $nbits;
Packit eb1bc2
    if (@_ == 1) {
Packit eb1bc2
	my $arg = shift;
Packit eb1bc2
	$bits = pack("B*", $arg);
Packit eb1bc2
	$nbits = length($arg);
Packit eb1bc2
    }
Packit eb1bc2
    else {
Packit eb1bc2
	($bits, $nbits) = @_;
Packit eb1bc2
    }
Packit eb1bc2
    if (($nbits % 8) != 0) {
Packit eb1bc2
	require Carp;
Packit eb1bc2
	Carp::croak("Number of bits must be multiple of 8 for this algorithm");
Packit eb1bc2
    }
Packit eb1bc2
    return $self->add(substr($bits, 0, $nbits/8));
Packit eb1bc2
}
Packit eb1bc2
Packit eb1bc2
sub hexdigest {
Packit eb1bc2
    my $self = shift;
Packit eb1bc2
    return unpack("H*", $self->digest(@_));
Packit eb1bc2
}
Packit eb1bc2
Packit eb1bc2
sub b64digest {
Packit eb1bc2
    my $self = shift;
Packit eb1bc2
    require MIME::Base64;
Packit eb1bc2
    my $b64 = MIME::Base64::encode($self->digest(@_), "");
Packit eb1bc2
    $b64 =~ s/=+$//;
Packit eb1bc2
    return $b64;
Packit eb1bc2
}
Packit eb1bc2
Packit eb1bc2
1;
Packit eb1bc2
Packit eb1bc2
__END__
Packit eb1bc2
Packit eb1bc2
=head1 NAME
Packit eb1bc2
Packit eb1bc2
Digest::base - Digest base class
Packit eb1bc2
Packit eb1bc2
=head1 SYNOPSIS
Packit eb1bc2
Packit eb1bc2
  package Digest::Foo;
Packit eb1bc2
  use base 'Digest::base';
Packit eb1bc2
Packit eb1bc2
=head1 DESCRIPTION
Packit eb1bc2
Packit eb1bc2
The C<Digest::base> class provide implementations of the methods
Packit eb1bc2
C<addfile> and C<add_bits> in terms of C<add>, and of the methods
Packit eb1bc2
C<hexdigest> and C<b64digest> in terms of C<digest>.
Packit eb1bc2
Packit eb1bc2
Digest implementations might want to inherit from this class to get
Packit eb1bc2
this implementations of the alternative I<add> and I<digest> methods.
Packit eb1bc2
A minimal subclass needs to implement the following methods by itself:
Packit eb1bc2
Packit eb1bc2
    new
Packit eb1bc2
    clone
Packit eb1bc2
    add
Packit eb1bc2
    digest
Packit eb1bc2
Packit eb1bc2
The arguments and expected behaviour of these methods are described in
Packit eb1bc2
L<Digest>.
Packit eb1bc2
Packit eb1bc2
=head1 SEE ALSO
Packit eb1bc2
Packit eb1bc2
L<Digest>