our
$VERSION
=
"1.20"
;
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
) {
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 ) {
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
;
my
$b64
=
$self
->base64_padded_digest;
$b64
=~ s/=+$//;
return
$b64
;
}
sub
base64_padded_digest {
my
$self
=
shift
;
return
MIME::Base64::encode(
$self
->digest(
@_
),
""
);
}
1;