package Digest::base;

use strict;
use vars qw($VERSION);
$VERSION = "1.00";

sub new;
sub clone;
sub add;
sub digest;

sub reset{
my $self=shift;
$self->new(@_);
}

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;

