summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changes42
-rw-r--r--META.yml4
-rw-r--r--Makefile.PL2
-rw-r--r--README2
-rw-r--r--SHA.pm90
-rw-r--r--SIGNATURE42
-rwxr-xr-xshasum144
-rw-r--r--src/hmac.c4
-rw-r--r--src/hmac.h4
-rw-r--r--src/sha.c8
-rw-r--r--src/sha.h6
-rw-r--r--t/2-nist-sha-oo.t35
-rw-r--r--t/nist/bit-hashes.sha128
-rw-r--r--t/nist/bit-messages.sha128
-rw-r--r--t/nist/byte-hashes.sha128
-rw-r--r--t/nist/byte-messages.sha128
16 files changed, 335 insertions, 160 deletions
diff --git a/Changes b/Changes
index 23bc914..82562c0 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,47 @@
Revision history for Perl extension Digest::SHA.
+5.39 Sun May 28 03:22:24 MST 2006
+ - modified shasum to warn rather than die for file errors
+ -- to follow conventions of GNU sha1sum/md5sum
+
+5.38 Thu May 25 02:02:02 MST 2006
+ - added new capabilities to the "addfile" method
+ -- now able to accept file names as well as handles
+ -- includes mode for portable digest calculation
+ -- thanks to Adam Kennedy for emails and ideas
+ ref. File::LocalizeNewlines
+ - used expanded addfile interface to simplify shasum (sumfile)
+ -- regex a tad less general than 5.37, but handles all
+ known newline variants in UNIX/Windows/MacOS
+ - enhanced WARNING messages from shasum checkfile processing
+ -- to mimic behavior of md5sum
+
+5.37 Mon May 8 04:30:09 MST 2006
+ - modified shasum to avoid file slurping (ref. sub sumfile)
+ - improved error handling of checksum files in shasum
+ -- to better mimic the behavior of md5sum
+ - refined line-break regex in shasum (ref. sub sumfile)
+ -- catches multiple CR's preceding LF
+ thanks to Gisle Aas for suggested patch
+ - changed loop vars to signed int's in shadump (ref. src/sha.c)
+ -- to prevent type mismatch warnings
+
+5.36 Mon May 8 01:38:36 MST 2006
+ - fixed the "portable" option in shasum
+ -- normalize line-breaks in text files only
+
+5.35 Thu May 4 16:54:42 MST 2006
+ - added "portable" option to shasum
+ -- to make digests match across Windows/Unix/MacOS
+ - enabled bundling of shasum command line options
+ -- to mimic behavior of md5sum
+ - removed \r's from text files in t/nist directory
+ -- resolves SIGNATURE clashes (rt.cpan.org #18983)
+ - changed suffix on SHA64_MAX (src/sha.h) to ULL
+ -- eliminates gcc warnings (rt.cpan.org #18988)
+ - specified minimum Perl version for module and Makefile.PL
+ -- closes rt.cpan.org #18984
+
5.34 Thu Feb 2 18:55:40 MST 2006
- removed Unix-style pathnames in test scripts
-- causing problems on OpenVMS
diff --git a/META.yml b/META.yml
index bee7f20..5ae3d81 100644
--- a/META.yml
+++ b/META.yml
@@ -1,6 +1,6 @@
--- #YAML:1.0
name: Digest-SHA
-version: 5.34
+version: 5.39
author:
- Mark Shelor, mshelor@cpan.org
abstract: Perl extension for SHA-1/224/256/384/512
@@ -12,5 +12,5 @@ conflicts: {}
provides:
Digest::SHA:
file: SHA.pm
- version: 5.34
+ version: 5.39
generated_by: Module::Build version 0.22
diff --git a/Makefile.PL b/Makefile.PL
index 82f31d2..a7455cd 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -1,3 +1,5 @@
+require 5.006000;
+
use ExtUtils::MakeMaker;
use Getopt::Std;
use Config;
diff --git a/README b/README
index d6faef8..4387a10 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-Digest::SHA version 5.34
+Digest::SHA version 5.39
========================
Digest::SHA is a complete implementation of the NIST Secure Hash
diff --git a/SHA.pm b/SHA.pm
index 31b6af5..f11fd78 100644
--- a/SHA.pm
+++ b/SHA.pm
@@ -1,10 +1,12 @@
package Digest::SHA;
+require 5.006000;
+
use strict;
use warnings;
use integer;
-our $VERSION = '5.34';
+our $VERSION = '5.39';
require Exporter;
our @ISA = qw(Exporter);
@@ -23,13 +25,14 @@ our @EXPORT_OK = qw(
# If possible, inherit from Digest::base (which depends on MIME::Base64)
+*addfile = \&Addfile;
+
eval {
require MIME::Base64;
require Digest::base;
push(@ISA, 'Digest::base');
};
if ($@) {
- *addfile = \&Addfile;
*hexdigest = \&Hexdigest;
*b64digest = \&B64digest;
}
@@ -85,25 +88,66 @@ sub add_bits {
return($self);
}
-# local copy of "addfile" in case Digest::base not installed
+sub _bail {
+ my $msg = shift;
+
+ require Carp;
+ Carp::croak("$msg: $!");
+}
-sub Addfile { # this is "addfile" from Digest::base 1.00
+sub _addfile { # this is "addfile" from Digest::base 1.00
my ($self, $handle) = @_;
my $n;
my $buf = "";
while (($n = read($handle, $buf, 4096))) {
- $self->add($buf);
- }
- unless (defined $n) {
- require Carp;
- Carp::croak("Read failed: $!");
+ $self->add($buf);
}
+ _bail("Read failed") unless defined $n;
$self;
}
+sub Addfile {
+ my ($self, $file, $mode) = @_;
+
+ if (ref(\$file) eq 'GLOB') { return(_addfile($self, $file)) }
+
+ $mode = defined($mode) ? $mode : "";
+ my ($binary, $portable) = map { $_ eq $mode } ("b", "p");
+ my $text = -T $file;
+
+ local *F;
+ _bail("Open failed") unless open(F, "<$file");
+ binmode(F) if $binary || $portable;
+
+ unless ($portable && $text) {
+ $self->_addfile(*F);
+ close(F);
+ return($self);
+ }
+
+ my ($n1, $n2);
+ my ($buf1, $buf2) = ("", "");
+
+ while (($n1 = read(F, $buf1, 4096))) {
+ while (substr($buf1, -1) eq "\015") {
+ $n2 = read(F, $buf2, 4096);
+ _bail("Read failed") unless defined $n2;
+ last unless $n2;
+ $buf1 .= $buf2;
+ }
+ $buf1 =~ s/\015?\015\012/\012/g; # DOS/Windows
+ $buf1 =~ s/\015/\012/g; # Apple/MacOS 9
+ $self->add($buf1);
+ }
+ _bail("Read failed") unless defined $n1;
+ close(F);
+
+ $self;
+}
+
sub dump {
my $self = shift;
my $file = shift || "";
@@ -156,7 +200,10 @@ In programs:
$sha = Digest::SHA->new($alg);
$sha->add($data); # feed data into stream
+
$sha->addfile(*F);
+ $sha->addfile($filename);
+
$sha->add_bits($bits);
$sha->add_bits($data, $nbits);
@@ -409,8 +456,28 @@ So, the following two statements do the same thing:
Reads from I<FILE> until EOF, and appends that data to the current
state. The return value is the updated object itself.
-This method is inherited if L<Digest::base> is installed on your
-system. Otherwise, a functionally equivalent substitute is used.
+=item B<addfile($filename [, $mode])>
+
+Reads the contents of I<$filename>, and appends that data to the current
+state. The return value is the updated object itself.
+
+By default, I<$filename> is simply opened and read; no special modes
+or I/O disciplines are used. To change this, set the optional I<$mode>
+argument to one of the following values:
+
+ "b" read file in binary mode
+
+ "p" use portable mode
+
+The "p" mode is handy since it ensures that the digest value of
+I<$filename> will be the same when computed on different operating
+systems. It accomplishes this by internally translating all newlines
+in text files to UNIX format before calculating the digest; on the other
+hand, binary files are read in raw mode with no translation whatsoever.
+
+For a fuller discussion of newline formats, refer to CPAN module
+L<File::LocalizeNewlines>. Its "universal line separator" regex forms
+the basis of I<addfile>'s portable mode processing.
=item B<dump($filename)>
@@ -539,6 +606,7 @@ The author is particularly grateful to
Jeffrey Friedl
Robert Gilmour
Brian Gladman
+ Adam Kennedy
Andy Lester
Alex Muntada
Steve Peters
diff --git a/SIGNATURE b/SIGNATURE
index b3be4f1..41be7e7 100644
--- a/SIGNATURE
+++ b/SIGNATURE
@@ -1,5 +1,5 @@
This file contains message digests of all files listed in MANIFEST,
-signed via the Module::Signature module, version 0.50.
+signed via the Module::Signature module, version 0.54.
To verify the content in this distribution, first make sure you have
Module::Signature installed, then type:
@@ -14,20 +14,20 @@ not run its Makefile.PL or Build.PL.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
-SHA1 4ec4dd0ac5a6e679b7ac77e0b5fb4be54e685e62 Changes
+SHA1 a73a1adca7a824df34190ceb459eb61046aa52e2 Changes
SHA1 952a17b73eeb605287d1aa08d2e8bf4837106b43 MANIFEST
-SHA1 44c45b209faa50d5cea2cd3aa154543473224068 META.yml
-SHA1 9903634fd8ce5d1ed2fbece7be5ed0cd5d98f158 Makefile.PL
-SHA1 8525f94799ac062aa636851ec618242b39b7c40f README
-SHA1 1b4d9e922933406df2c062878be9c5340dd40031 SHA.pm
+SHA1 40a4eefdf66e75517fffb829964a414cb370be4a META.yml
+SHA1 def31e4ea732857338ca9858b091a7b9b4c35fd7 Makefile.PL
+SHA1 3d858a1fb34300001599f240a4fdba54c81ea31f README
+SHA1 fa71c875541414bfe5307756c4cc435a760750a9 SHA.pm
SHA1 51d3d1db41241cdf960bb3d5c81efa9eac13b197 SHA.xs
SHA1 48517b1bf0ddf48ae4bc24910d3b9af625bc2325 ppport.h
-SHA1 3feeaa9113148ee3bff0073c7d0aa7977652581d shasum
-SHA1 8b7099c5959550c621ff6ba6e9ac0a856b5b25db src/hmac.c
-SHA1 5b081137aae691475eac941783b7842c81767485 src/hmac.h
+SHA1 7f01b2c6c83dc682b1704901d3001b40b83cc9c6 shasum
+SHA1 71366f8b4cb41657ad43d6a8f3c533ba5126f98e src/hmac.c
+SHA1 caa7528bf0d5a6e73abedb54ddd8fd0366c275d7 src/hmac.h
SHA1 7589c6ce33e74a58ded932d69756659e91723fdb src/hmacxtra.c
-SHA1 c31a02bd6128a416e85eb979258bf392e639d37e src/sha.c
-SHA1 fe5481cafe6d17424100d0c3119023d033acf783 src/sha.h
+SHA1 7211043454d63e444252bd03c1f3aef2f8754e63 src/sha.c
+SHA1 e92ff7c10662e1e9a2393cc49ced373c17c83d7f src/sha.h
SHA1 c1bba35de65c8d81362472b76075dba8cf1e542b src/sha64bit.c
SHA1 48d806b05a15dfd8211d5f7158b3294d86fa24d2 src/sha64bit.h
SHA1 329ac17325437c725331fbf84ae0c9484f50041a src/shaxtra.c
@@ -41,7 +41,7 @@ SHA1 008137e8d01cc1846346433f9ae4ed95acf67a17 t/2-nist-sha-256.t
SHA1 5ff47d34427af615dd5222486a3460e2a75535aa t/2-nist-sha-384.t
SHA1 4d5dfce16efb801b27dcd5cfcd904d91175e97f1 t/2-nist-sha-512.t
SHA1 902f263f29354655886cc5e5361bf8ff6fc6dc68 t/2-nist-sha-base64.t
-SHA1 a0c79db3485aac71beaa52f2e492445b19bdbf3f t/2-nist-sha-oo.t
+SHA1 cbfd1bd7c5f3b708b0a1b581dcf6af65490c446f t/2-nist-sha-oo.t
SHA1 62b21ae81d5e57c0b064f7ba0c6bc81952ea2808 t/2-nist-vectors-bit.t
SHA1 f8f550ff0161091803e163f56ecc043a9ae2387c t/2-nist-vectors-byte.t
SHA1 3e9a29e58dfc4a6c40b5f92982d7ba26f175cf9c t/3-gillogly-easy.t
@@ -58,20 +58,20 @@ SHA1 21c02922ef7908fd6d6ed3d1cc99df57b700274c t/7-ireland.t
SHA1 636d5e987243f6634fdc1dff1fe1d11d07778347 t/gillogly/state.011
SHA1 b1e86af6b46e066555bbcd749982ccba816cf744 t/gillogly/state.110
SHA1 427874bceb58bc3a36b5808a204023334614930b t/nist/COPYRIGHT
-SHA1 573d7d4bba50c5cecb4a86f1ffff14d764a31ecb t/nist/Readme.txt
-SHA1 7996bb1a434fb3f6fd38f64800ab3b2fe5d23c6b t/nist/bit-hashes.sha1
-SHA1 d21096373dfbf3330d89bcb2e704b543a27b6065 t/nist/bit-messages.sha1
-SHA1 dd66fe858830fb1b23d35affa402b52a77a15b1f t/nist/byte-hashes.sha1
-SHA1 936304c2db3a3ee49ecb1247f8466814cab080a0 t/nist/byte-messages.sha1
+SHA1 fb62fba7cf3abd4a3f102e3c5d1364885f3fca0c t/nist/Readme.txt
+SHA1 1c5e5609f4a68cbaac298d0bbcbc7f56866ac296 t/nist/bit-hashes.sha1
+SHA1 f5d19f0842895dc74ec3f9b1b2bc684088552d8e t/nist/bit-messages.sha1
+SHA1 81cc5e5a0c57de956de3f44977e486afa871068f t/nist/byte-hashes.sha1
+SHA1 505c66bd2326114b05fa96474ff1973e52761137 t/nist/byte-messages.sha1
SHA1 3b51b03c790b1cf112d4804573f5fd4814b384c2 t/state/state.1
SHA1 cc3d0feffc019e4651fb085e7bc51e190e58fa53 t/state/state.256
SHA1 2130ee8086bc7bf41fc329e9d87a81e2d98b68c8 t/state/state.384
SHA1 69cd49d84cb11c83ef8e6eb36f6a472edb37079d t/state/state.512
SHA1 e93dd71c67ba56e170516c16eeeb7659a41f91fd typemap
-----BEGIN PGP SIGNATURE-----
-Version: GnuPG v1.4.0 (Darwin)
+Version: GnuPG v1.4.1 (GNU/Linux)
-iD8DBQFD4rkjBwNg/wr1Y/4RAonyAJ4x4Z4AcLWE19ia1AaD2qc4uk+0BQCgitCp
-cRrFVjJh69RZtmw12owCn8U=
-=2SJ3
+iD8DBQFEeXyTBwNg/wr1Y/4RAk8iAJ0S8L/kq7tn3ucmsSOUQyP4dSV1yACgj8K6
++6ZCFz3GP+PHDsSyTb06TME=
+=XeHm
-----END PGP SIGNATURE-----
diff --git a/shasum b/shasum
index 652f25c..f98f2c4 100755
--- a/shasum
+++ b/shasum
@@ -4,8 +4,8 @@
#
# Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved
#
- # Version: 5.34
- # Thu Feb 2 18:55:40 MST 2006
+ # Version: 5.39
+ # Sun May 28 03:22:24 MST 2006
=head1 NAME
@@ -21,20 +21,22 @@ shasum - Print or Check SHA Checksums
-a, --algorithm 1 (default), 224, 256, 384, 512
-b, --binary read files in binary mode (default on DOS/Windows)
-c, --check check SHA sums against given list
+ -p, --portable read files in portable mode
+ produces same digest on Windows/Unix/MacOS 9
-t, --text read files in text mode (default)
The following two options are useful only when verifying checksums:
- --status don't output anything, status code shows success
+ -s, --status don't output anything, status code shows success
-w, --warn warn about improperly formatted SHA checksum lines
- --help display this help and exit
- --version output version information and exit
+ -h, --help display this help and exit
+ -v, --version output version information and exit
-The sums are computed as described in FIPS PUB 180-2. When checking,
-the input should be a former output of this program. The default
-mode is to print a line with checksum, a character indicating type
-(`*' for binary, ` ' for text), and name for each FILE.
+ The sums are computed as described in FIPS PUB 180-2. When checking,
+ the input should be a former output of this program. The default mode
+ is to print a line with checksum, a character indicating type (`*'
+ for binary, `?' for portable, ` ' for text), and name for each FILE.
=head1 AUTHOR
@@ -42,7 +44,7 @@ Copyright (c) 2003-2006 Mark Shelor <mshelor@cpan.org>.
=head1 SEE ALSO
-Shasum is implemented using the Perl module L<Digest::SHA> or
+shasum is implemented using the Perl module L<Digest::SHA> or
L<Digest::SHA::PurePerl>.
=cut
@@ -50,7 +52,7 @@ L<Digest::SHA::PurePerl>.
use strict;
use Getopt::Long;
-my $VERSION = "5.34";
+my $VERSION = "5.39";
# Try to use Digest::SHA, since it's faster. If not installed,
@@ -69,13 +71,18 @@ if ($@) {
# Usage statement adapted from Ulrich Drepper's md5sum.
- # Include an "-a" option for algorithm selection.
+ # Include an "-a" option for algorithm selection,
+ # and a "-p" option for portable digest computation.
sub usage {
- my($err) = @_;
+ my($err, $msg) = @_;
- my $stream = $err ? *STDERR : *STDOUT;
- print $stream <<'END_OF_USAGE';
+ $msg = "" unless defined $msg;
+ if ($err) {
+ warn($msg . "Type shasum -h for help\n");
+ exit($err);
+ }
+ print <<'END_OF_USAGE';
Usage: shasum [OPTION] [FILE]...
or: shasum [OPTION] --check [FILE]
Print or check SHA checksums.
@@ -84,19 +91,21 @@ With no FILE, or when FILE is -, read standard input.
-a, --algorithm 1 (default), 224, 256, 384, 512
-b, --binary read files in binary mode (default on DOS/Windows)
-c, --check check SHA sums against given list
+ -p, --portable read files in portable mode
+ produces same digest on Windows/Unix/MacOS 9
-t, --text read files in text mode (default)
The following two options are useful only when verifying checksums:
- --status don't output anything, status code shows success
+ -s, --status don't output anything, status code shows success
-w, --warn warn about improperly formatted SHA checksum lines
- --help display this help and exit
- --version output version information and exit
+ -h, --help display this help and exit
+ -v, --version output version information and exit
-The sums are computed as described in FIPS PUB 180-2. When checking,
-the input should be a former output of this program. The default
-mode is to print a line with checksum, a character indicating type
-(`*' for binary, ` ' for text), and name for each FILE.
+The sums are computed as described in FIPS PUB 180-2. When checking, the
+input should be a former output of this program. The default mode is to
+print a line with checksum, a character indicating type (`*' for binary,
+`?' for portable, ` ' for text), and name for each FILE.
Report bugs to <mshelor@cpan.org>.
END_OF_USAGE
@@ -107,27 +116,35 @@ END_OF_USAGE
# Collect options from command line
my ($alg, $binary, $check, $text, $status, $warn, $help, $version);
+my ($portable);
+Getopt::Long::Configure ("bundling");
GetOptions(
- 'binary' => \$binary, 'check' => \$check,
- 'text' => \$text, 'algorithm=i' => \$alg,
- 'status' => \$status, 'warn' => \$warn,
- 'help' => \$help, 'version' => \$version
-) or usage(1);
+ 'b|binary' => \$binary, 'c|check' => \$check,
+ 't|text' => \$text, 'a|algorithm=i' => \$alg,
+ 's|status' => \$status, 'w|warn' => \$warn,
+ 'h|help' => \$help, 'v|version' => \$version,
+ 'p|portable' => \$portable
+) or usage(1, "");
# Deal with help requests and incorrect uses
-usage(0) if $help;
-usage(1) if $binary and $text;
-usage(1) if $warn and not $check;
-usage(1) if $status and not $check;
+usage(0)
+ if $help;
+usage(1, "shasum: Ambiguous file mode\n")
+ if scalar(grep { defined $_ } ($binary, $portable, $text)) > 1;
+usage(1, "shasum: --warn option used only when verifying checksums\n")
+ if $warn && !$check;
+usage(1, "shasum: --status option used only when verifying checksums\n")
+ if $status && !$check;
# Default to SHA-1 unless overriden by command line option
$alg = 1 unless $alg;
-grep { $_ == $alg } (1, 224, 256, 384, 512) or usage(1);
+grep { $_ == $alg } (1, 224, 256, 384, 512)
+ or usage(1, "shasum: Unrecognized algorithm\n");
# Display version information if requested
@@ -140,10 +157,13 @@ if ($version) {
# Try to figure out if the OS is DOS-like. If it is,
# default to binary mode when reading files, unless
- # explicitly overriden by command line "text" option.
+ # explicitly overriden by command line "--text" or
+ # "--portable" options.
my $isDOSish = ($^O =~ /^(MSWin\d\d|os2|dos|mint|cygwin)$/);
-if ($isDOSish) { $binary = 1 unless $text }
+if ($isDOSish) { $binary = 1 unless $text || $portable }
+
+my $modesym = $binary ? '*' : ($portable ? '?' : ' ');
# Read from STDIN (-) if no files listed on command line
@@ -154,17 +174,16 @@ if ($isDOSish) { $binary = 1 unless $text }
# sumfile($file): computes SHA digest of $file
sub sumfile {
- my($file) = @_;
- my($fh, $digest);
+ my $file = shift;
- unless (open($fh, "<$file")) {
- print STDERR "shasum: $file: No such file or directory\n";
+ my $mode = $portable ? 'p' : ($binary ? 'b' : '');
+ my $digest = eval { $module->new($alg)->addfile($file, $mode) };
+ if ($@) {
+ warn "shasum: $file: $!\n";
return;
}
- binmode($fh) if $binary;
- $digest = $module->new($alg)->addfile($fh)->hexdigest;
- close($fh);
- return($digest);
+
+ $digest->hexdigest;
}
@@ -177,36 +196,49 @@ my %len2alg = (40 => 1, 56 => 224, 64 => 256, 96 => 384, 128 => 512);
if ($check) {
my $checkfile = shift(@ARGV);
- my $err = 0;
+ my ($err, $read_errs, $match_errs) = (0, 0, 0);
+ my ($num_files, $num_checksums) = (0, 0);
my ($fh, $sum, $fname, $rsp);
- die "shasum: $checkfile: No such file or directory\n"
+ die "shasum: $checkfile: $!\n"
unless open($fh, "<$checkfile");
while (<$fh>) {
s/\s+$//;
- ($sum, $binary, $fname) = /^(\S+)\s+(\*?)(.*)$/;
+ ($sum, $modesym, $fname) = /^(\S+) (.)(.*)$/;
+ ($binary, $portable, $text) =
+ map { $_ eq $modesym } ('*', '?', ' ');
unless ($alg = $len2alg{length($sum)}) {
- print STDERR "shasum: $checkfile: $.: improperly ",
- "formatted SHA checksum line\n" if $warn;
+ warn("shasum: $checkfile: $.: improperly " .
+ "formatted SHA checksum line\n") if $warn;
next;
}
- $rsp = "$fname: ";
- if (lc($sum) eq sumfile($fname)) { $rsp .= "OK\n" }
- else { $rsp .= "FAILED\n"; $err = 1 }
+ $rsp = "$fname: "; $num_files++;
+ unless (my $digest = sumfile($fname)) {
+ $rsp .= "FAILED open or read\n";
+ $err = 1; $read_errs++;
+ }
+ else {
+ $num_checksums++;
+ if (lc($sum) eq $digest) { $rsp .= "OK\n" }
+ else { $rsp .= "FAILED\n"; $err = 1; $match_errs++ }
+ }
print $rsp unless $status;
}
close($fh);
+ unless ($status) {
+ warn("shasum: WARNING: $read_errs of $num_files listed " .
+ "files could not be read\n") if $read_errs;
+ warn("shasum: WARNING: $match_errs of $num_checksums " .
+ "computed checksums did NOT match\n") if $match_errs;
+ }
exit($err);
}
# Compute and display SHA checksums of requested files
-for (@ARGV) {
- if (-d $_) {
- print STDERR "shasum: $_: Is a directory\n";
- next;
+for my $arg (@ARGV) {
+ if (my $digest = sumfile($arg)) {
+ print "$digest $modesym", "$arg\n";
}
- next unless my $digest = sumfile($_);
- print "$digest ", $binary ? "\*" : " ", "$_\n";
}
diff --git a/src/hmac.c b/src/hmac.c
index 60e1ba0..041d590 100644
--- a/src/hmac.c
+++ b/src/hmac.c
@@ -5,8 +5,8 @@
*
* Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved
*
- * Version: 5.34
- * Thu Feb 2 18:55:40 MST 2006
+ * Version: 5.39
+ * Sun May 28 03:22:24 MST 2006
*
*/
diff --git a/src/hmac.h b/src/hmac.h
index 903794d..df1ebcc 100644
--- a/src/hmac.h
+++ b/src/hmac.h
@@ -5,8 +5,8 @@
*
* Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved
*
- * Version: 5.34
- * Thu Feb 2 18:55:40 MST 2006
+ * Version: 5.39
+ * Sun May 28 03:22:24 MST 2006
*
*/
diff --git a/src/sha.c b/src/sha.c
index 6e024c4..a8c509f 100644
--- a/src/sha.c
+++ b/src/sha.c
@@ -5,8 +5,8 @@
*
* Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved
*
- * Version: 5.34
- * Thu Feb 2 18:55:40 MST 2006
+ * Version: 5.39
+ * Sun May 28 03:22:24 MST 2006
*
*/
@@ -517,7 +517,7 @@ int shadump(file, s)
char *file;
SHA *s;
{
- unsigned int i, j;
+ int i, j;
SHA_FILE *f;
UCHR *p = shadigest(s);
@@ -530,7 +530,7 @@ SHA *s;
for (j = 0; j < (s->alg <= 256 ? 4 : 8); j++)
SHA_fprintf(f, "%s%02x", j==0 ? ":" : "", *p++);
SHA_fprintf(f, "\nblock");
- for (i = 0; i < s->blocksize>>3; i++)
+ for (i = 0; i < (int) (s->blocksize >> 3); i++)
SHA_fprintf(f, ":%02x", s->block[i]);
SHA_fprintf(f, "\nblockcnt:%u\n", s->blockcnt);
SHA_fprintf(f, "lenhh:%lu\nlenhl:%lu\nlenlh:%lu\nlenll:%lu\n",
diff --git a/src/sha.h b/src/sha.h
index aff4ad3..23861ee 100644
--- a/src/sha.h
+++ b/src/sha.h
@@ -5,8 +5,8 @@
*
* Copyright (C) 2003-2006 Mark Shelor, All Rights Reserved
*
- * Version: 5.34
- * Thu Feb 2 18:55:40 MST 2006
+ * Version: 5.39
+ * Sun May 28 03:22:24 MST 2006
*
*/
@@ -16,7 +16,6 @@
#include <limits.h>
#define SHA32_MAX 4294967295U
-#define SHA64_MAX 18446744073709551615U
#define SHA32_SHR(x, n) ((x) >> (n))
#define SHA32_SHL(x, n) ((x) << (n))
@@ -61,6 +60,7 @@
#elif defined(SHA_ULL_EXISTS)
#undef SHA64_ALIGNED
#undef SHA64_SHR
+ #define SHA64_MAX 18446744073709551615ULL
#define SHA64_SHR(x, n) (((x) & SHA64_MAX) >> (n))
#define SHA64 unsigned long long
#define SHA64_CONST(c) c ## ULL
diff --git a/t/2-nist-sha-oo.t b/t/2-nist-sha-oo.t
index deefce9..c1a6b3e 100644
--- a/t/2-nist-sha-oo.t
+++ b/t/2-nist-sha-oo.t
@@ -20,7 +20,7 @@ BEGIN {
"248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1"
);
- plan tests => 1 + scalar(@vec);
+ plan tests => 5 + scalar(@vec);
}
# attempt to use an invalid algorithm, and check for failure
@@ -46,6 +46,37 @@ ok($ctx->clone->add("b", "c")->b64digest, $rsp);
$rsp = shift(@vec);
open(FILE, "<$file");
binmode(FILE);
-ok($ctx->addfile(*FILE)->hexdigest, $rsp);
+ok($ctx->clone->addfile(*FILE)->hexdigest, $rsp);
close(FILE);
+
+ # test addfile using file name instead of handle
+
+ok($ctx->addfile($file, "b")->hexdigest, $rsp);
+
+ # test addfile portable mode
+
+open(FILE, ">$file");
+binmode(FILE);
+print FILE "abc\012" x 2048; # using UNIX newline
+close(FILE);
+
+ok($ctx->new(1)->addfile($file, "p")->hexdigest,
+ "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51");
+
+open(FILE, ">$file");
+binmode(FILE);
+print FILE "abc\015\012" x 2048; # using DOS/Windows newline
+close(FILE);
+
+ok($ctx->new(1)->addfile($file, "p")->hexdigest,
+ "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51");
+
+open(FILE, ">$file");
+binmode(FILE);
+print FILE "abc\015" x 2048; # using Apple/Mac newline
+close(FILE);
+
+ok($ctx->new(1)->addfile($file, "p")->hexdigest,
+ "d449e19c1b0b0c191294c8dc9fa2e4a6ff77fc51");
+
unlink($file);
diff --git a/t/nist/bit-hashes.sha1 b/t/nist/bit-hashes.sha1
index cf95264..b405ce1 100644
--- a/t/nist/bit-hashes.sha1
+++ b/t/nist/bit-hashes.sha1
@@ -1,14 +1,14 @@
-# Configuration information for "SHA-1 Test"
-# SHA tests are configured for BIT oriented implementations
-H>SHS Type 1 Hashes<H
-D>
-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
-59C4526AA2CC59F9A5F56B5579BA7108E7CCB61A ^
-6E42FB84067CFF056C43A49E484997AF23190879 ^
-C63FBB9A87171A176E6E054890E29A8C5F125F6C ^
-3109E33C1C4B9A0169D1599169D0E5A520A1E71C ^
-9195E1E73CC68D7170F44BD1D83CB624BC87FA0B ^
-64F7C374527278C0436DBC8DE5AABEC2BBF634BC ^
-154B622EA426FB151B1FF1BE1CE871752B9EDEB4 ^
-12BDD00FD4038756CBCF8ECDAD1B0CD862603CD8 ^
-6700F93E1691E83735279E167F67AF61FEE9813B ^
+# Configuration information for "SHA-1 Test"
+# SHA tests are configured for BIT oriented implementations
+H>SHS Type 1 Hashes<H
+D>
+DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
+59C4526AA2CC59F9A5F56B5579BA7108E7CCB61A ^
+6E42FB84067CFF056C43A49E484997AF23190879 ^
+C63FBB9A87171A176E6E054890E29A8C5F125F6C ^
+3109E33C1C4B9A0169D1599169D0E5A520A1E71C ^
+9195E1E73CC68D7170F44BD1D83CB624BC87FA0B ^
+64F7C374527278C0436DBC8DE5AABEC2BBF634BC ^
+154B622EA426FB151B1FF1BE1CE871752B9EDEB4 ^
+12BDD00FD4038756CBCF8ECDAD1B0CD862603CD8 ^
+6700F93E1691E83735279E167F67AF61FEE9813B ^
diff --git a/t/nist/bit-messages.sha1 b/t/nist/bit-messages.sha1
index a4f9951..8e97b02 100644
--- a/t/nist/bit-messages.sha1
+++ b/t/nist/bit-messages.sha1
@@ -1,14 +1,14 @@
-# Configuration information for "SHA-1 Test"
-# SHA tests are configured for BIT oriented implementations
-H>SHS Type 1 Strings<H
-D>
-0 1 ^
-1 1 1 ^
-2 1 1 1 ^
-3 0 1 1 1 ^
-2 0 2 2 ^
-4 1 1 1 2 1 ^
-3 0 2 2 2 ^
-4 1 1 2 2 2 ^
-5 1 2 2 1 1 2 ^
-5 0 2 2 1 1 3 ^
+# Configuration information for "SHA-1 Test"
+# SHA tests are configured for BIT oriented implementations
+H>SHS Type 1 Strings<H
+D>
+0 1 ^
+1 1 1 ^
+2 1 1 1 ^
+3 0 1 1 1 ^
+2 0 2 2 ^
+4 1 1 1 2 1 ^
+3 0 2 2 2 ^
+4 1 1 2 2 2 ^
+5 1 2 2 1 1 2 ^
+5 0 2 2 1 1 3 ^
diff --git a/t/nist/byte-hashes.sha1 b/t/nist/byte-hashes.sha1
index d28980d..9aef69f 100644
--- a/t/nist/byte-hashes.sha1
+++ b/t/nist/byte-hashes.sha1
@@ -1,14 +1,14 @@
-# Configuration information for "SHA-1 Test"
-# SHA tests are configured for BYTE oriented implementations
-H>SHS Type 1 Hashes<H
-D>
-DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
-3CDF2936DA2FC556BFA533AB1EB59CE710AC80E5 ^
-19C1E2048FA7393CFBF2D310AD8209EC11D996E5 ^
-CA775D8C80FAA6F87FA62BECA6CA6089D63B56E5 ^
-71AC973D0E4B50AE9E5043FF4D615381120A25A0 ^
-A6B5B9F854CFB76701C3BDDBF374B3094EA49CBA ^
-D87A0EE74E4B9AD72E6847C87BDEEB3D07844380 ^
-1976B8DD509FE66BF09C9A8D33534D4EF4F63BFD ^
-5A78F439B6DB845BB8A558E4CEB106CD7B7FF783 ^
-F871BCE62436C1E280357416695EE2EF9B83695C ^
+# Configuration information for "SHA-1 Test"
+# SHA tests are configured for BYTE oriented implementations
+H>SHS Type 1 Hashes<H
+D>
+DA39A3EE5E6B4B0D3255BFEF95601890AFD80709 ^
+3CDF2936DA2FC556BFA533AB1EB59CE710AC80E5 ^
+19C1E2048FA7393CFBF2D310AD8209EC11D996E5 ^
+CA775D8C80FAA6F87FA62BECA6CA6089D63B56E5 ^
+71AC973D0E4B50AE9E5043FF4D615381120A25A0 ^
+A6B5B9F854CFB76701C3BDDBF374B3094EA49CBA ^
+D87A0EE74E4B9AD72E6847C87BDEEB3D07844380 ^
+1976B8DD509FE66BF09C9A8D33534D4EF4F63BFD ^
+5A78F439B6DB845BB8A558E4CEB106CD7B7FF783 ^
+F871BCE62436C1E280357416695EE2EF9B83695C ^
diff --git a/t/nist/byte-messages.sha1 b/t/nist/byte-messages.sha1
index b0682fe..6a3fc2f 100644
--- a/t/nist/byte-messages.sha1
+++ b/t/nist/byte-messages.sha1
@@ -1,14 +1,14 @@
-# Configuration information for "SHA-1 Test"
-# SHA tests are configured for BYTE oriented implementations
-H>SHS Type 1 Strings<H
-D>
-0 1 ^
-5 0 2 1 2 1 2 ^
-5 0 1 3 4 4 4 ^
-7 0 4 3 4 4 1 4 4 ^
-10 0 4 1 5 3 4 4 3 1 3 4 ^
-10 0 3 1 6 5 5 1 3 6 6 4 ^
-13 1 3 2 5 3 3 3 4 6 6 1 4 6 2 ^
-16 1 3 5 5 1 2 1 3 3 6 3 5 2 3 5 7 2 ^
-15 1 8 1 5 3 2 7 4 5 6 7 3 3 1 6 3 ^
-15 1 4 6 8 2 1 4 2 5 1 6 8 8 6 4 7 ^
+# Configuration information for "SHA-1 Test"
+# SHA tests are configured for BYTE oriented implementations
+H>SHS Type 1 Strings<H
+D>
+0 1 ^
+5 0 2 1 2 1 2 ^
+5 0 1 3 4 4 4 ^
+7 0 4 3 4 4 1 4 4 ^
+10 0 4 1 5 3 4 4 3 1 3 4 ^
+10 0 3 1 6 5 5 1 3 6 6 4 ^
+13 1 3 2 5 3 3 3 4 6 6 1 4 6 2 ^
+16 1 3 5 5 1 2 1 3 3 6 3 5 2 3 5 7 2 ^
+15 1 8 1 5 3 2 7 4 5 6 7 3 3 1 6 3 ^
+15 1 4 6 8 2 1 4 2 5 1 6 8 8 6 4 7 ^