|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
print "1..3\n";
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
use strict;
|
|
Packit |
f354a3 |
use Digest::MD5 qw(md5 md5_hex md5_base64);
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
# To update the EBCDIC section even on a Latin 1 platform,
|
|
Packit |
f354a3 |
# run this script with $ENV{EBCDIC_MD5SUM} set to a true value.
|
|
Packit |
f354a3 |
# (You'll need to have Perl 5.7.3 or later, to have the Encode installed.)
|
|
Packit |
f354a3 |
# (And remember that under the Perl core distribution you should
|
|
Packit |
f354a3 |
# also have the $ENV{PERL_CORE} set to a true value.)
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $EXPECT;
|
|
Packit |
f354a3 |
if (ord "A" == 193) { # EBCDIC
|
|
Packit |
f354a3 |
$EXPECT = <
|
|
Packit |
f354a3 |
0956ffb4f6416082b27d6680b4cf73fc README
|
|
Packit |
f354a3 |
60a80f534f0017745eb755f36a946fe7 MD5.xs
|
|
Packit |
f354a3 |
276da0aa4e9a08b7fe09430c9c5690aa rfc1321.txt
|
|
Packit |
f354a3 |
EOT
|
|
Packit |
f354a3 |
} else {
|
|
Packit |
f354a3 |
# This is the output of: 'md5sum README MD5.xs rfc1321.txt'
|
|
Packit |
f354a3 |
$EXPECT = <
|
|
Packit |
f354a3 |
2f93400875dbb56f36691d5f69f3eba5 README
|
|
Packit |
f354a3 |
9572832f3628e3bebcdd54f47c43dc5a MD5.xs
|
|
Packit |
f354a3 |
754b9db19f79dbc4992f7166eb0f37ce rfc1321.txt
|
|
Packit |
f354a3 |
EOT
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if (!(-f "README") && -f "../README") {
|
|
Packit |
f354a3 |
chdir("..") or die "Can't chdir: $!";
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $testno = 0;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $B64 = 1;
|
|
Packit |
f354a3 |
eval { require MIME::Base64; };
|
|
Packit |
f354a3 |
if ($@) {
|
|
Packit |
f354a3 |
print "# $@: Will not test base64 methods\n";
|
|
Packit |
f354a3 |
$B64 = 0;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
for (split /^/, $EXPECT) {
|
|
Packit |
f354a3 |
my($md5hex, $file) = split ' ';
|
|
Packit |
f354a3 |
my $base = $file;
|
|
Packit |
f354a3 |
# print "# $base\n";
|
|
Packit |
f354a3 |
if ($ENV{PERL_CORE}) {
|
|
Packit |
f354a3 |
# Don't have these in core.
|
|
Packit |
f354a3 |
if ($file eq 'rfc1321.txt' or $file eq 'README') {
|
|
Packit |
f354a3 |
print "ok ", ++$testno, " # Skip: PERL_CORE\n";
|
|
Packit |
f354a3 |
next;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
# print "# file = $file\n";
|
|
Packit |
f354a3 |
unless (-f $file) {
|
|
Packit |
f354a3 |
warn "No such file: $file\n";
|
|
Packit |
f354a3 |
next;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if ($ENV{EBCDIC_MD5SUM}) {
|
|
Packit |
f354a3 |
require Encode;
|
|
Packit |
f354a3 |
my $data = cat_file($file);
|
|
Packit |
f354a3 |
Encode::from_to($data, 'latin1', 'cp1047');
|
|
Packit |
f354a3 |
print md5_hex($data), " $base\n";
|
|
Packit |
f354a3 |
next;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
my $md5bin = pack("H*", $md5hex);
|
|
Packit |
f354a3 |
my $md5b64;
|
|
Packit |
f354a3 |
if ($B64) {
|
|
Packit |
f354a3 |
$md5b64 = MIME::Base64::encode($md5bin, "");
|
|
Packit |
f354a3 |
chop($md5b64); chop($md5b64); # remove padding
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
my $failed;
|
|
Packit |
f354a3 |
my $got;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if (digest_file($file, 'digest') ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: Bad digest\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if (($got = digest_file($file, 'hexdigest')) ne $md5hex) {
|
|
Packit |
f354a3 |
print "$file: Bad hexdigest: got $got expected $md5hex\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if ($B64 && digest_file($file, 'b64digest') ne $md5b64) {
|
|
Packit |
f354a3 |
print "$file: Bad b64digest\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $data = cat_file($file);
|
|
Packit |
f354a3 |
if (md5($data) ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: md5() failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if (md5_hex($data) ne $md5hex) {
|
|
Packit |
f354a3 |
print "$file: md5_hex() failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if ($B64 && md5_base64($data) ne $md5b64) {
|
|
Packit |
f354a3 |
print "$file: md5_base64() failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
if (Digest::MD5->new->add($data)->digest ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: MD5->new->add(...)->digest failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if (Digest::MD5->new->add($data)->hexdigest ne $md5hex) {
|
|
Packit |
f354a3 |
print "$file: MD5->new->add(...)->hexdigest failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if ($B64 && Digest::MD5->new->add($data)->b64digest ne $md5b64) {
|
|
Packit |
f354a3 |
print "$file: MD5->new->add(...)->b64digest failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my @data = split //, $data;
|
|
Packit |
f354a3 |
if (md5(@data) ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: md5(\@data) failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if (Digest::MD5->new->add(@data)->digest ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: MD5->new->add(\@data)->digest failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
my $md5 = Digest::MD5->new;
|
|
Packit |
f354a3 |
for (@data) {
|
|
Packit |
f354a3 |
$md5->add($_);
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
if ($md5->digest ne $md5bin) {
|
|
Packit |
f354a3 |
print "$file: $md5->add()-loop failed\n";
|
|
Packit |
f354a3 |
$failed++;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
print "not " if $failed;
|
|
Packit |
f354a3 |
print "ok ", ++$testno, "\n";
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
sub digest_file
|
|
Packit |
f354a3 |
{
|
|
Packit |
f354a3 |
my($file, $method) = @_;
|
|
Packit |
f354a3 |
$method ||= "digest";
|
|
Packit |
f354a3 |
#print "$file $method\n";
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
open(FILE, $file) or die "Can't open $file: $!";
|
|
Packit |
f354a3 |
my $digest = Digest::MD5->new->addfile(*FILE)->$method();
|
|
Packit |
f354a3 |
close(FILE);
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
$digest;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
sub cat_file
|
|
Packit |
f354a3 |
{
|
|
Packit |
f354a3 |
my($file) = @_;
|
|
Packit |
f354a3 |
local $/; # slurp
|
|
Packit |
f354a3 |
open(FILE, $file) or die "Can't open $file: $!";
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
# For PerlIO in case of UTF-8 locales.
|
|
Packit |
f354a3 |
eval 'binmode(FILE, ":bytes")' if $] >= 5.008;
|
|
Packit |
f354a3 |
|
|
Packit |
f354a3 |
my $tmp = <FILE>;
|
|
Packit |
f354a3 |
close(FILE);
|
|
Packit |
f354a3 |
$tmp;
|
|
Packit |
f354a3 |
}
|
|
Packit |
f354a3 |
|