MD5SUM.TXT -- Documentation for MD5SUM.EXE


WHAT IS THIS?

MD5SUM is a Public Domain program used for computing and checking
cryptographic message digests (or check values) of files.  It was written
with the Unix philosophy of reading from standard input and writing to
standard output, and options are delimited with "-" instead of "/".  To get a
rather terse help message, type

md5sum -h

at the DOS prompt.  Md5sum.exe will respond with:

usage: md5sum [-tv] [-c [file]] | [file...]
	Generates or checks MD5 Message Digests
	    -c  check message digests (default is generate)
	    -v  verbose, print file names when checking
	    -t  read files in text mode
	The input for -c should be the list of message digests and file names
	that is printed on stdout by this program when it generates digests.

Note that now, both '-' and '/' switches are accepted.
When checking files, MD5SUM generates no output if the files match their
fingerprints, unless you also specify the -v switch.  If there is a problem,
it will generate one or more of the following messages:

MD5SUM.EXE: can't open filename
MD5SUM.EXE: error reading filename
MD5SUM.EXE: MD5 check failed for filename
MD5SUM.EXE: _ of _ file(s) failed MD5 check
MD5SUM.EXE: no files checked


WHY WOULD I WANT TO DO THAT?

If the MD5 message digest "fingerprint" of a file has not changed, this is a
VERY good indication that the contents of the file has not changed.  Even if
you wanted to change a file in such a way that it still had the same MD5
"fingerprint," you probably couldn't do it without a lot of supercomputer
time (and neither could a bad guy).  This makes it useful for detection of
forgeries, viruses, and just plain transmission errors.  Note that this is
much more powerful than a normal CRC, which is good at detecting some kinds
of transmission errors, but can easily be forged.  This is also useful for
signing a collection of files with a digital signature (using PGP, a PEM
implementation, or some kind of DSA implementation, for example), without
having to individually sign each file.  Simply create a text file with the
"fingerprints" of each file you wish to sign, then sign that text file.


COMPUTING FILE MD5 FINGERPRINTS

To compute the MD5 fingerprint of a text file, simply type

MD5SUM filename(s)

Unfortunately, "wild cards" (like * and ?) are not supported by this program,
but you can put more than one file name on the command line.  Since the
program is assuming that this is a text file, line endings conventions may
differ and still result in the same check value.

MD5SUM filename(s)

To see the file names displayed while computing "fingerprints," include the
-v option, like:

MD5SUM -v filename(s)

To write the output to a file instead of just displaying it on the screen,
use redirection with the ">" character, like:

MD5SUM -v filename(s) > md5file

To append the output to an existing file, use two > characters, like:

MD5SUM -v filename(s) >> md5file


ADDING COMMENTS TO CHECK FILES

Sometimes it is nice to add comments to files containing MD5 fingerprints. To
do this, just edit the files made using the above instructions to add in what
you want to say.  Lines that do not start with valid hexadecimal digits are
ignored as comments.


CHECKING FILES AGAINST STORED FINGERPRINTS

To check all of the files listed in check files as generated above to see if
they have changed:

MD5SUM -c md5file

For a more verbose listing of results (listing file names followed by "OK" or
"FAILED"), type:

MD5SUM -cv md5file


DETECTING MODIFICATION OR FORGERY OF FINGERPRINT FILES

One way to prevent alteration of fingerprint files is to store several copies
in different secure places, then compare them from time to time.  Another way
is to use a digital signature produced by PGP, some PEM implementation, or a
DSS implementation.  PGP is the most widely used digital signature program in
the public sector right now.


SOURCE CODE

The source code I used to compile MD5SUM.EXE is available in the file
MD5SUM.ZIP (available on the Colorado Catacombs BBS at 303-772-1062).  I did
some minor edits to the source code as distributed with the Pretty Good
Privacy program (PGP) to make the compile completely free of warning messages
with my compiler, but made no functional changes to the code.  I checked to
make sure that the result was compatible with the "pure" code from the PGP
distribution.  I resisted temptation to make the command line and user
interface more like a DOS program, so this works exactly like the PGP
distribution compiled for other platforms.  Source code is supplied so that
you can see how this works and see for yourself that there is no "monkey
business" in the code.  You may also have an opportunity to make use of some
of it for other applications.

I, Blair Campbell, have modified the source code to remove getopt, add
support for wildcards, add support for on-the-fly translation, and several
other minor enhancements, such as adding support for both '-' and '/'
switches.

These are the commands used with Borland C++ 4.02 and PKLITE professional
1.13 that I used to compile MD5SUM.EXE:

bcc -mh -O2 md5sum.c md5.c getopt.c
pklite -r md5sum.exe

These are the commands used with OpenWatcom and UPX to compile MD5SUM.EXE:

wcl md5sum.c md5.c kitten.c
upx --best --8086 md5sum.exe


LEGAL NOTICES AND CREDITS

Nobody involved in this program makes any warranty of any kind regarding this
documentation or its associated source code and executable programs.  Because
this is in the Public Domain, we have no legal control over it anyway.  Even
though we might think this is useful and performs substantially as
documented, variations in computer hardware, operating systems, bugs, errors,
and other effects could happen.  It is up to you to determine if this is
useful, and if you use it, you do so entirely at your own risk. In case the
nearest star goes supernova, this program will likely cease to function for
lack of any hardware to run on.

This program and its documentation are in the Public Domain.  Copy it, use
it, sell it, modify it, or ignore it as you see fit.  Just don't attempt to
claim it as your own work and copyright it or patent it, or we will be very
angry.  The message digest algorithm used is MD5, invented by Ron Rivest. The
message digest code used was written by Colin Plumb in 1993 with no copyright
claimed.  It has been tested against the RSA Data Security, Inc., reference
implementation, but does not use that implementation.  The MD5SUM main
program was written by Branko Lankester in 1993, and modified slightly by
Colin Plumb.  The compiler used was OpenWatcom 1.3. Unix is a trademark of
AT&T and is used for identification purposes only. This program is not a
munition, but it can be modified to be a munition (for example, by adding
some high explosives and a detonator).

