This module implements the RFC1321 "MD5" Message Digest Algorithm

The implementation for CMUCL was largely done by Pierre Mai, with help
from denizens of the cmucl-help mailing list.  Since CMUCL and SBCL
are similar in many respects, it was not too difficult to extend the
low-level implementation optimizations for CMUCL to SBCL;
consequently, performance is within spitting distance of
implementations of the algorithm in more static languages.

Notes:
  * the algorithm includes a bitwise rotation of a 32-bit field.
    Here, this is implemented by using the SB-ROTATE-BYTE module,
    providing functionality for rotation of arbitrary bitfields.
    However, this will perform extremely badly unless a low-level
    implementation is available on the target for rotation, either
    natively, as on the x86, or synthetically (through two shifts and
    a logical or) on the sparc.  At present, only the x86 has a fast
    implementation; therefore, do not be surprised if computing
    message digests takes a long time on other hardware.
    Contributions or even requests for implementation of 32-bit
    ROTATE-BYTE on other platforms are welcome.

  * the algorithm includes an addition modulo 2^32.  This is
    implemented here for SBCL by compiler transforms on the high-level
    description of this modular arithmetic, so although the code looks
    like a naive implementation it actually compiles to the obvious
    machine code.  The abuse of EXT:TRULY-THE was not robust and
    turned out not to work on platforms where the underlying hardware
    was 64-bit.

  * the "high-level" entry points to the md5 algorithm are
    MD5SUM-FILE, MD5SUM-STREAM and MD5SUM-SEQUENCE (despite its name,
    the last only acts on vectors).

  * there are some more notes in the md5.lisp source file.

Christophe Rhodes, 2003-05-16
