From: Martin Puppe
Sent: Monday, May 15, 2017 8:39 PM
To: win32-vanilla@perl.org
Subject: Wrong SHA1 is calculated
Hello,
I am debugging a problem with SHA1 checksums. I have found the following
handy one-liner on Stack Overflow [^1], which serves well as a minimal
example:
perl -MDigest::SHA1=sha1_hex -le "print sha1_hex <>" secure.txt
The problem is, that the result is simply not correct.Martin Puppe
The same web page presents a program which should provide the same "not
correct" result.
I've inserted "binmode $fh;" into it - which then allows it to return the
"correct" value:
#############################
use warnings;
use strict;
use Digest::SHA1;
die "Usage: $0 file ..\n" unless @ARGV;
foreach my $file (@ARGV) {
my $fh;
unless (open $fh, $file) {
warn "$0: open $file: $!";
next;
}
binmode $fh; # inserted by sisyphus
my $sha1 = Digest::SHA1->new;
$sha1->addfile($fh);
print $sha1->hexdigest, " $file\n";
close $fh;
}
###############################
If 'secure.txt' is a plain text file with Unix line endings, then that
binmode() should not be necessary - but if the text file has Windows line
endings then binmode() will prevent their translation to Unix endings (and
the program will return the result that you expect).
Unfortunately, I don't know how to get that binmode() into the one-liner's
angle brackets :-(
Maybe someone else here can chime in.
Cheers,
Rob