summaryrefslogtreecommitdiff
path: root/Master/tlpkg/tlperl0/bin/shasum
diff options
context:
space:
mode:
Diffstat (limited to 'Master/tlpkg/tlperl0/bin/shasum')
-rwxr-xr-xMaster/tlpkg/tlperl0/bin/shasum268
1 files changed, 268 insertions, 0 deletions
diff --git a/Master/tlpkg/tlperl0/bin/shasum b/Master/tlpkg/tlperl0/bin/shasum
new file mode 100755
index 00000000000..3c0185892fa
--- /dev/null
+++ b/Master/tlpkg/tlperl0/bin/shasum
@@ -0,0 +1,268 @@
+#!perl -w
+
+ # shasum: filter for computing SHA digests (analogous to sha1sum)
+ #
+ # Copyright (C) 2003-2010 Mark Shelor, All Rights Reserved
+ #
+ # Version: 5.48
+ # Mon Jan 4 16:32:52 MST 2010
+
+=head1 NAME
+
+shasum - Print or Check SHA Checksums
+
+=head1 SYNOPSIS
+
+ Usage: shasum [OPTION] [FILE]...
+ or: shasum [OPTION] --check [FILE]
+ Print or check SHA checksums.
+ 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/Mac
+ -t, --text read files in text mode (default)
+
+ The following two options are useful only when verifying checksums:
+
+ -s, --status don't output anything, status code shows success
+ -w, --warn warn about improperly formatted SHA checksum lines
+
+ -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 portable, ` ' for text), and name for each FILE.
+
+=head1 DESCRIPTION
+
+The I<shasum> script provides the easiest and most convenient way to
+compute SHA message digests. Rather than writing a program, the user
+simply feeds data to the script via the command line, and waits for
+the results to be printed on standard output. Data can be fed to
+I<shasum> through files, standard input, or both.
+
+The following command shows how easy it is to compute digests for typical
+inputs such as the NIST test vector "abc":
+
+ perl -e "print qq(abc)" | shasum
+
+Or, if you want to use SHA-256 instead of the default SHA-1, simply say:
+
+ perl -e "print qq(abc)" | shasum -a 256
+
+Since I<shasum> uses the same interface employed by the familiar
+I<sha1sum> program (and its somewhat outmoded anscestor I<md5sum>),
+you can install this script as a convenient drop-in replacement.
+
+=head1 AUTHOR
+
+Copyright (c) 2003-2010 Mark Shelor <mshelor@cpan.org>.
+
+=head1 SEE ALSO
+
+shasum is implemented using the Perl module L<Digest::SHA> or
+L<Digest::SHA::PurePerl>.
+
+=cut
+
+use strict;
+use FileHandle;
+use Getopt::Long;
+
+my $VERSION = "5.48";
+
+
+ # Try to use Digest::SHA, since it's faster. If not installed,
+ # use Digest::SHA::PurePerl instead.
+
+my $MOD_PREFER = "Digest::SHA";
+my $MOD_SECOND = "Digest::SHA::PurePerl";
+
+my $module = $MOD_PREFER;
+eval "require $module";
+if ($@) {
+ $module = $MOD_SECOND;
+ eval "require $module";
+ die "Unable to find $MOD_PREFER or $MOD_SECOND\n" if $@;
+}
+
+
+ # Usage statement adapted from Ulrich Drepper's md5sum.
+ # Include an "-a" option for algorithm selection,
+ # and a "-p" option for portable digest computation.
+
+sub usage {
+ my($err, $msg) = @_;
+
+ $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.
+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/Mac
+ -t, --text read files in text mode (default)
+
+The following two options are useful only when verifying checksums:
+ -s, --status don't output anything, status code shows success
+ -w, --warn warn about improperly formatted SHA checksum lines
+
+ -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 portable, ` ' for text), and name for each FILE.
+
+Report bugs to <mshelor@cpan.org>.
+END_OF_USAGE
+ exit($err);
+}
+
+
+ # Collect options from command line
+
+my ($alg, $binary, $check, $text, $status, $warn, $help, $version);
+my ($portable);
+
+eval { Getopt::Long::Configure ("bundling") };
+GetOptions(
+ '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, "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 defined $alg;
+grep { $_ == $alg } (1, 224, 256, 384, 512)
+ or usage(1, "shasum: Unrecognized algorithm\n");
+
+
+ # Display version information if requested
+
+if ($version) {
+ print "$VERSION\n";
+ exit(0);
+}
+
+
+ # 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" or
+ # "--portable" options.
+
+my $isDOSish = ($^O =~ /^(MSWin\d\d|os2|dos|mint|cygwin)$/);
+if ($isDOSish) { $binary = 1 unless $text || $portable }
+
+my $modesym = $binary ? '*' : ($portable ? '?' : ' ');
+
+
+ # Read from STDIN (-) if no files listed on command line
+
+@ARGV = ("-") unless @ARGV;
+
+
+ # sumfile($file): computes SHA digest of $file
+
+sub sumfile {
+ my $file = shift;
+
+ my $mode = $portable ? 'p' : ($binary ? 'b' : '');
+ my $digest = eval { $module->new($alg)->addfile($file, $mode) };
+ if ($@) {
+ warn "shasum: $file: $!\n";
+ return;
+ }
+
+ $digest->hexdigest;
+}
+
+
+ # %len2alg: maps hex digest length to SHA algorithm
+
+my %len2alg = (40 => 1, 56 => 224, 64 => 256, 96 => 384, 128 => 512);
+
+
+ # Verify checksums if requested
+
+if ($check) {
+ my $checkfile = shift(@ARGV);
+ my ($err, $read_errs, $match_errs) = (0, 0, 0);
+ my ($num_files, $num_checksums) = (0, 0);
+ my ($fh, $sum, $fname, $rsp, $digest);
+
+ die "shasum: $checkfile: $!\n"
+ unless $fh = FileHandle->new($checkfile, "r");
+ while (<$fh>) {
+ s/\s+$//;
+ ($sum, $modesym, $fname) = /^(\S+) (.)(.*)$/;
+ ($binary, $portable, $text) =
+ map { $_ eq $modesym } ('*', '?', ' ');
+ unless ($alg = $len2alg{length($sum)}) {
+ warn("shasum: $checkfile: $.: improperly " .
+ "formatted SHA checksum line\n") if $warn;
+ next;
+ }
+ $rsp = "$fname: "; $num_files++;
+ unless ($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;
+ }
+ $fh->close;
+ 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
+
+my($file, $digest);
+
+for $file (@ARGV) {
+ if ($digest = sumfile($file)) {
+ print "$digest $modesym", "$file\n";
+ }
+}