%%
%%

\chapter{Bacula MD5 Algorithm}
\label{MD5Chapter}
\addcontentsline{toc}{section}{}

\section{Command Line Message Digest Utility }
\index{Utility!Command Line Message Digest }
\index{Command Line Message Digest Utility }
\addcontentsline{toc}{subsection}{Command Line Message Digest Utility}


This page describes {\bf md5}, a command line utility usable on either Unix or
MS-DOS/Windows, which generates and verifies message digests (digital
signatures) using the MD5 algorithm. This program can be useful when
developing shell scripts or Perl programs for software installation, file
comparison, and detection of file corruption and tampering. 

\subsection{Name}
\index{Name}
\addcontentsline{toc}{subsubsection}{Name}

{\bf md5} - generate / check MD5 message digest 

\subsection{Synopsis}
\index{Synopsis }
\addcontentsline{toc}{subsubsection}{Synopsis}

{\bf md5} [ {\bf -c}{\it signature} ] [ {\bf -u} ] [ {\bf -d}{\it input\_text}
| {\it infile} ] [ {\it outfile} ] 

\subsection{Description}
\index{Description }
\addcontentsline{toc}{subsubsection}{Description}

A {\it message digest} is a compact digital signature for an arbitrarily long
stream of binary data. An ideal message digest algorithm would never generate
the same signature for two different sets of input, but achieving such
theoretical perfection would require a message digest as long as the input
file. Practical message digest algorithms compromise in favour of a digital
signature of modest size created with an algorithm designed to make
preparation of input text with a given signature computationally infeasible.
Message digest algorithms have much in common with techniques used in
encryption, but to a different end; verification that data have not been
altered since the signature was published. 

Many older programs requiring digital signatures employed 16 or 32 bit {\it
cyclical redundancy codes} (CRC) originally developed to verify correct
transmission in data communication protocols, but these short codes, while
adequate to detect the kind of transmission errors for which they were
intended, are insufficiently secure for applications such as electronic
commerce and verification of security related software distributions. 

The most commonly used present-day message digest algorithm is the 128 bit MD5
algorithm, developed by Ron Rivest of the 
\elink{MIT}{http://web.mit.edu/} 
\elink{Laboratory for Computer Science}{http://www.lcs.mit.edu/} and 
\elink{RSA Data Security, Inc.}{http://www.rsa.com/} The algorithm, with a
reference implementation, was published as Internet 
\elink{RFC 1321}{http://www.fourmilab.ch/md5/rfc1321.html} in April 1992, and
was placed into the public domain at that time. Message digest algorithms such
as MD5 are not deemed ``encryption technology'' and are not subject to the
export controls some governments impose on other data security products.
(Obviously, the responsibility for obeying the laws in the jurisdiction in
which you reside is entirely your own, but many common Web and Mail utilities
use MD5, and I am unaware of any restrictions on their distribution and use.) 

The MD5 algorithm has been implemented in numerous computer languages
including C, 
\elink{Perl}{http://www.perl.org/}, and 
\elink{Java}{http://www.javasoft.com/}; if you're writing a program in such a
language, track down a suitable subroutine and incorporate it into your
program. The program described on this page is a {\it command line}
implementation of MD5, intended for use in shell scripts and Perl programs (it
is much faster than computing an MD5 signature directly in Perl). This {\bf
md5} program was originally developed as part of a suite of tools intended to
monitor large collections of files (for example, the contents of a Web site)
to detect corruption of files and inadvertent (or perhaps malicious) changes.
That task is now best accomplished with more comprehensive packages such as 
\elink{Tripwire}{ftp://coast.cs.purdue.edu/pub/COAST/Tripwire/}, but the
command line {\bf md5} component continues to prove useful for verifying
correct delivery and installation of software packages, comparing the contents
of two different systems, and checking for changes in specific files. 

\subsection{Options}
\index{Options }
\addcontentsline{toc}{subsubsection}{Options}

\begin{description}

\item [{\bf -c}{\it signature}  ]
   \index{-csignature }
   Computes the signature of the specified {\it infile} or the string  supplied
by the {\bf -d} option and compares it against the specified  {\it signature}.
If the two signatures match, the exit status will be zero,  otherwise the exit
status will be 1. No signature is written to  {\it outfile} or standard
output; only the exit status is set. The  signature to be checked must be
specified as 32 hexadecimal digits.  

\item [{\bf -d}{\it input\_text}  ]
   \index{-dinput\_text }
   A signature is computed for the given {\it input\_text} (which must be  quoted
if it contains white space characters) instead of input from  {\it infile} or
standard input. If input is specified with the {\bf -d}  option, no {\it
infile} should be specified.  

\item [{\bf -u}  ]
   Print how-to-call information. 
   \end{description}

\subsection{Files}
\index{Files }
\addcontentsline{toc}{subsubsection}{Files}

If no {\it infile} or {\bf -d} option is specified or {\it infile} is a single
``-'', {\bf md5} reads from standard input; if no {\it outfile} is given, or
{\it outfile} is a single ``-'', output is sent to standard output. Input and
output are processed strictly serially; consequently {\bf md5} may be used in
pipelines. 

\subsection{Bugs}
\index{Bugs }
\addcontentsline{toc}{subsubsection}{Bugs}

The mechanism used to set standard input to binary mode may be specific to
Microsoft C; if you rebuild the DOS/Windows version of the program from source
using another compiler, be sure to verify binary files work properly when read
via redirection or a pipe. 

This program has not been tested on a machine on which {\tt int} and/or {\tt
long} are longer than 32 bits. 

\section{
\elink{Download md5.zip}{http://www.fourmilab.ch/md5/md5.zip} (Zipped archive)}
\index{Archive!Download md5.zip Zipped }
\index{Download md5.zip (Zipped archive) }
\addcontentsline{toc}{subsection}{Download md5.zip (Zipped archive)}

The program is provided as 
\elink{md5.zip}{http://www.fourmilab.ch/md5/md5.zip}, a 
\elink{Zipped}{http://www.pkware.com/} archive containing an ready-to-run
Win32 command-line executable program, {\tt md5.exe} (compiled using Microsoft
Visual C++ 5.0), and in source code form along with a {\tt Makefile} to build
the program under Unix. 

\subsection{See Also}
\index{ALSO!SEE }
\index{See Also }
\addcontentsline{toc}{subsubsection}{SEE ALSO}

{\bf sum}(1) 

\subsection{Exit Status}
\index{Status!Exit }
\index{Exit Status }
\addcontentsline{toc}{subsubsection}{Exit Status}

{\bf md5} returns status 0 if processing was completed without errors, 1 if
the {\bf -c} option was specified and the given signature does not match that
of the input, and 2 if processing could not be performed at all due, for
example, to a nonexistent input file. 

\subsection{Copying}
\index{Copying }
\addcontentsline{toc}{subsubsection}{Copying}

\begin{quote}
This software is in the public domain. Permission to use, copy,  modify, and
distribute this software and its documentation for any purpose and  without
fee is hereby granted, without any conditions or restrictions. This  software
is provided ``as is'' without express or implied warranty. 
\end{quote}

\subsection{Acknowledgements}
\index{Acknowledgements }
\addcontentsline{toc}{subsubsection}{Acknowledgements}

The MD5 algorithm was developed by Ron Rivest. The public domain C language
implementation used in this program was written by Colin Plumb in 1993. 
{\it \elink{by John Walker}{http://www.fourmilab.ch/} January 6th, MIM } 
