<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package Digest::base;

use strict;
use warnings;

our $VERSION = "1.20";

# subclass is supposed to implement at least these
sub new;
sub clone;
sub add;
sub digest;

sub reset {
    my $self = shift;
    $self-&gt;new(@_);    # ugly
}

sub addfile {
    my ( $self, $handle ) = @_;

    my $n;
    my $buf = "";

    while ( ( $n = read( $handle, $buf, 4 * 1024 ) ) ) {
        $self-&gt;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-&gt;add( substr( $bits, 0, $nbits / 8 ) );
}

sub hexdigest {
    my $self = shift;
    return unpack( "H*", $self-&gt;digest(@_) );
}

sub b64digest {
    my $self = shift;
    my $b64  = $self-&gt;base64_padded_digest;
    $b64 =~ s/=+$//;
    return $b64;
}

sub base64_padded_digest {
    my $self = shift;
    require MIME::Base64;
    return MIME::Base64::encode( $self-&gt;digest(@_), "" );
}

1;

__END__

=head1 NAME

Digest::base - Digest base class

=head1 SYNOPSIS

  package Digest::Foo;
  use base 'Digest::base';

=head1 DESCRIPTION

The C&lt;Digest::base&gt; class provide implementations of the methods
C&lt;addfile&gt; and C&lt;add_bits&gt; in terms of C&lt;add&gt;, and of the methods
C&lt;hexdigest&gt; and C&lt;b64digest&gt; in terms of C&lt;digest&gt;.

Digest implementations might want to inherit from this class to get
this implementations of the alternative I&lt;add&gt; and I&lt;digest&gt; 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&lt;Digest&gt;.

=head1 SEE ALSO

L&lt;Digest&gt;
</pre></body></html>