aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWarner Losh <imp@FreeBSD.org>2021-05-19 17:26:20 +0000
committerWarner Losh <imp@FreeBSD.org>2021-05-19 17:41:53 +0000
commit086feed850c31c278f25c958b97992d024139896 (patch)
tree2b1e66de9022e5c313c7b0ffa1aa3e0825fe0fc3
parent4a6830761c6552bfe2c118a73a5a461694cb84c7 (diff)
downloadsrc-086feed850c3.tar.gz
src-086feed850c3.zip
md5: Create md5sum, etc compatible programs
On Linux, there's a similar set of programs to ours, but that end in the letters 'sum'. These act basically like FreeBSD versions run with the -r option. Add code so that when the program ends in 'sum' you get the linux -r behavior. This is enough to make most things that use sha*sum work correctly (the -c / --check options, as well as the long args are not implemented). When running with the -sum programs, ignore -t instead of running internal speed tests and make -c an error. Reviewed by: sef, and kp and allanjude (earlier version) Relnotes: yes Sponsored by: Netflix Differential Revision: https://reviews.freebsd.org/D30309
-rw-r--r--sbin/md5/Makefile30
-rw-r--r--sbin/md5/md5.134
-rw-r--r--sbin/md5/md5.c35
3 files changed, 88 insertions, 11 deletions
diff --git a/sbin/md5/Makefile b/sbin/md5/Makefile
index dcbd94dcd381..b1e40713c219 100644
--- a/sbin/md5/Makefile
+++ b/sbin/md5/Makefile
@@ -4,27 +4,49 @@
PACKAGE=runtime
PROG= md5
-LINKS= ${BINDIR}/md5 ${BINDIR}/rmd160 \
+LINKS= ${BINDIR}/md5 ${BINDIR}/md5sum \
+ ${BINDIR}/md5 ${BINDIR}/rmd160 \
+ ${BINDIR}/md5 ${BINDIR}/rmd160sum \
${BINDIR}/md5 ${BINDIR}/sha1 \
+ ${BINDIR}/md5 ${BINDIR}/sha1sum \
${BINDIR}/md5 ${BINDIR}/sha224 \
+ ${BINDIR}/md5 ${BINDIR}/sha224sum \
${BINDIR}/md5 ${BINDIR}/sha256 \
+ ${BINDIR}/md5 ${BINDIR}/sha256sum \
${BINDIR}/md5 ${BINDIR}/sha384 \
+ ${BINDIR}/md5 ${BINDIR}/sha384sum \
${BINDIR}/md5 ${BINDIR}/sha512 \
+ ${BINDIR}/md5 ${BINDIR}/sha512sum \
${BINDIR}/md5 ${BINDIR}/sha512t256 \
+ ${BINDIR}/md5 ${BINDIR}/sha512t256sum \
${BINDIR}/md5 ${BINDIR}/skein256 \
+ ${BINDIR}/md5 ${BINDIR}/skein256sum \
${BINDIR}/md5 ${BINDIR}/skein512 \
- ${BINDIR}/md5 ${BINDIR}/skein1024
+ ${BINDIR}/md5 ${BINDIR}/skein512sum \
+ ${BINDIR}/md5 ${BINDIR}/skein1024 \
+ ${BINDIR}/md5 ${BINDIR}/skein1024sum
-MLINKS= md5.1 rmd160.1 \
+MLINKS= md5.1 md5sum.1 \
+ md5.1 rmd160.1 \
+ md5.1 rmd160sum.1 \
md5.1 sha1.1 \
+ md5.1 sha1sum.1 \
md5.1 sha224.1 \
+ md5.1 sha224sum.1 \
md5.1 sha256.1 \
+ md5.1 sha256sum.1 \
md5.1 sha384.1 \
+ md5.1 sha384sum.1 \
md5.1 sha512.1 \
+ md5.1 sha512sum.1 \
md5.1 sha512t256.1 \
+ md5.1 sha512t256sum.1 \
md5.1 skein256.1 \
+ md5.1 skein256sum.1 \
md5.1 skein512.1 \
- md5.1 skein1024.1
+ md5.1 skein512sum.1 \
+ md5.1 skein1024.1 \
+ md5.1 skein1024sum.1
LIBADD= md
diff --git a/sbin/md5/md5.1 b/sbin/md5/md5.1
index e6b29233c399..c154c4788f8d 100644
--- a/sbin/md5/md5.1
+++ b/sbin/md5/md5.1
@@ -1,10 +1,12 @@
.\" $FreeBSD$
-.Dd June 19, 2020
+.Dd May 19, 2021
.Dt MD5 1
.Os
.Sh NAME
.Nm md5 , sha1 , sha224 , sha256 , sha384 , sha512 , sha512t256 , rmd160 ,
-.Nm skein256 , skein512 , skein1024
+.Nm skein256 , skein512 , skein1024 ,
+.Nm md5sum , sha1sum , sha224sum , sha256sum , sha384sum , sha512sum ,
+.Nm sha512t256sum , rmd160sum , skein256sum , skein512sum , skein1024sum
.Nd calculate a message-digest fingerprint (checksum) for a file
.Sh SYNOPSIS
.Nm
@@ -26,6 +28,15 @@ output a
or
.Dq message digest
of the input.
+The
+.Nm md5sum , sha1sum , sha224sum , sha256sum , sha384sum , sha512sum ,
+.Nm sha512t256sum , rmd160sum , skein256sum , skein512sum ,
+and
+.Nm skein1024sum
+utilities do the same, but default to the reversed format of
+the
+.Fl r
+flag.
It is conjectured that it is computationally infeasible to
produce two messages having the same message digest, or to produce any
message having a given prespecified target message digest.
@@ -59,9 +70,18 @@ precede any files named on the command line.
The hexadecimal checksum of each file listed on the command line is printed
after the options are processed.
.Bl -tag -width indent
+.It Fl b
+Ignored for compatibility with the coreutils
+.Nm -sum
+programs.
.It Fl c Ar string
Compare the digest of the file against this string.
.Pq Note that this option is not yet useful if multiple files are specified.
+This option causes an error in for the
+.Nm -sum
+programs because it check the checksums listed in a file for the coreutils
+.Nm -sum
+programs that is not yet implemented.
.It Fl s Ar string
Print a checksum of the given
.Ar string .
@@ -81,6 +101,9 @@ when combined with the
options.
.It Fl t
Run a built-in time trial.
+For the
+.Nm -sum
+versions, this is a nop for compatibility with coreutils.
.It Fl x
Run a built-in test script.
.El
@@ -171,6 +194,13 @@ Secure Hash Standard (SHS):
.Pp
The RIPEMD-160 page:
.Pa http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html .
+.Sh BUGS
+All of the utilities that end in
+.Sq sum
+are intended to be compatible with the GNU coreutils programs.
+However, the long arguments and the
+.Fl -check
+functionality are not provided.
.Sh ACKNOWLEDGMENTS
This program is placed in the public domain for free general use by
RSA Data Security.
diff --git a/sbin/md5/md5.c b/sbin/md5/md5.c
index 96dfcede9711..4381ef124c7b 100644
--- a/sbin/md5/md5.c
+++ b/sbin/md5/md5.c
@@ -177,13 +177,32 @@ main(int argc, char *argv[])
char buf[HEX_DIGEST_LENGTH];
size_t len;
unsigned digest;
- const char* progname;
+ char *progname;
+ bool gnu_emu = false;
if ((progname = strrchr(argv[0], '/')) == NULL)
progname = argv[0];
else
progname++;
+ /*
+ * GNU coreutils has a number of programs named *sum. These produce
+ * similar results to the BSD version, but in a different format,
+ * similar to BSD's -r flag. We install links to this program with
+ * ending 'sum' to provide this compatibility. Check here to see if the
+ * name of the program ends in 'sum', set the flag and drop the 'sum' so
+ * the digest lookup works. Also, make -t a nop when running in this mode
+ * since that means 'text file' there (though it's a nop in coreutils
+ * on unix-like systems). The -c flag conflicts, so it's just disabled
+ * in this mode (though in the future it might be implemented).
+ */
+ len = strlen(progname);
+ if (len > 3 && strcmp(progname + len - 3, "sum") == 0) {
+ progname[len - 3] = '\0';
+ rflag = 1;
+ gnu_emu = true;
+ }
+
for (digest = 0; digest < sizeof(Algorithm)/sizeof(*Algorithm); digest++)
if (strcasecmp(Algorithm[digest].progname, progname) == 0)
break;
@@ -195,9 +214,13 @@ main(int argc, char *argv[])
checkAgainst = NULL;
checksFailed = 0;
skip = 0;
- while ((ch = getopt(argc, argv, "c:pqrs:tx")) != -1)
+ while ((ch = getopt(argc, argv, "bc:pqrs:tx")) != -1)
switch (ch) {
+ case 'b':
+ break;
case 'c':
+ if (gnu_emu)
+ errx(1, "-c check option not supported");
checkAgainst = optarg;
break;
case 'p':
@@ -214,8 +237,10 @@ main(int argc, char *argv[])
string = optarg;
break;
case 't':
- MDTimeTrial(&Algorithm[digest]);
- skip = 1;
+ if (!gnu_emu) {
+ MDTimeTrial(&Algorithm[digest]);
+ skip = 1;
+ } /* else: text mode is a nop */
break;
case 'x':
MDTestSuite(&Algorithm[digest]);
@@ -348,7 +373,7 @@ MDTimeTrial(const Algorithm_t *alg)
printf(" done\n");
printf("Digest = %s", p);
printf("\nTime = %f seconds\n", seconds);
- printf("Speed = %f MiB/second\n", (float) TEST_BLOCK_LEN *
+ printf("Speed = %f MiB/second\n", (float) TEST_BLOCK_LEN *
(float) TEST_BLOCK_COUNT / seconds / (1 << 20));
}
/*