Skip to content

Commit

Permalink
md5: Create md5sum, etc compatible programs
Browse files Browse the repository at this point in the history
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
  • Loading branch information
bsdimp committed May 19, 2021
1 parent 4a68307 commit 086feed
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 11 deletions.
30 changes: 26 additions & 4 deletions sbin/md5/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
34 changes: 32 additions & 2 deletions sbin/md5/md5.1
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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.
Expand Down Expand Up @@ -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 .
Expand All @@ -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
Expand Down Expand Up @@ -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.
Expand Down
35 changes: 30 additions & 5 deletions sbin/md5/md5.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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':
Expand All @@ -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]);
Expand Down Expand Up @@ -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));
}
/*
Expand Down

0 comments on commit 086feed

Please sign in to comment.