
package MD5 is

  --====================================================================
  -- Authors   Rolf Ebert (no known address),
  --           Christoph Grein <Christ-Usch.Grein@T-Online.de>
  -- Version   1.1
  -- Date      16 January 1999
  --====================================================================
  -- The Message-Digest MD5 Algorithm of RSA Data Security, Inc.
  --
  -- The official description of this algorithm can be found on the
  -- site of the RSA Data Security, Inc. The following is a quote from
  -- this description.
  --
  --   The algorithm takes as input a message of arbitrary length and
  --   produces as output a 128-bit "fingerprint" or "message digest"
  --   of the input. 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. The MD5 algorithm is intended for digital
  --   signature applications, where a large file must be "compressed"
  --   in a secure manner before being encrypted with a private
  --   (secret) key under a public-key cryptosystem such as RSA.
  --
  -- The official description of the MD5 algorithm can be found at
  --   <ftp://ftp.rsa.com/pub/md5.txt>
  -- License is granted by RSA Data Security, Inc. <http://www.rsa.com>
  -- to make and use derivative works provided that such works are
  -- identified as "derived from the RSA Data Security, Inc. MD5
  -- Message-Digest Algorithm" in all material mentioning or referencing
  -- the derived work. (See the copyright notice in the official
  -- description.)
  --
  -- Usage:
  -- - First call Init.
  -- - Call Update (repeatedly) until all input has been digested.
  --   Long messages may be digested in chunks of any length (the
  --   reference implementation uses chunks of 1024 bits).
  -- - Call Final.
  -- For text output, the fingerprint may be converted to a hexadecimal
  -- string.
  --====================================================================
  -- History
  -- Author Version   Date    Reason for change
  --  R.E.    1.0  04.06.1997 Original as found in internet
  --  C.G.    1.1  16.01.1999 Minor code changes; commented to make
  --                          publication legal
  --====================================================================

  type Byte is mod 2**8;
  type Byte_Array is array (Long_Integer range <>) of Byte;
  pragma Pack (Byte_Array);

  subtype Fingerprint   is Byte_Array (1 .. 16);  -- 128 bits
  subtype Digest_String is String     (1 .. 32);  -- Fingerprint in hex

  -- Create a fingerprint

  type Context is private;

  procedure Init   (Ctx:    out Context);
  procedure Update (Ctx: in out Context; Data  : in     Byte_Array);
  procedure Update (Ctx: in out Context; Data  : in     String);
  procedure Final  (Ctx: in out Context; Digest:    out Fingerprint);

  -- Conversions

  Malformed: exception;  -- may be raised in Digest_From_Text

  function Digest_From_Text (S: Digest_String) return Fingerprint;
  function Digest_To_Text   (A: Fingerprint)   return Digest_String;

private

  type Word is mod 2**32;
  type Word_Array is array (Long_Integer range <>) of Word;
  pragma Pack (Word_Array);

  subtype ABCD_State is Word_Array (1 .. 4);
  subtype Count_T    is Word_Array (1 .. 2);

  subtype Buffer_T   is Byte_Array (1 .. 64);

  type Context is record
    State : ABCD_State;
    Count : Count_T;
    Buffer: Buffer_T;
  end record;

end MD5;
