=pod

=head1 NAME

MDC2, MDC2_Init, MDC2_Update, MDC2_Final - MDC2 hash function

=head1 SYNOPSIS

 #include <openssl/mdc2.h>

 unsigned char *MDC2(const unsigned char *d, unsigned long n,
                  unsigned char *md);

 void MDC2_Init(MDC2_CTX *c);
 void MDC2_Update(MDC2_CTX *c, const unsigned char *data,
                  unsigned long len);
 void MDC2_Final(unsigned char *md, MDC2_CTX *c);

=head1 DESCRIPTION

MDC2 is a method to construct hash functions with 128 bit output from
block ciphers.  These functions are an implementation of MDC2 with
DES.

MDC2() computes the MDC2 message digest of the B<n>
bytes at B<d> and places it in B<md> (which must have space for
MDC2_DIGEST_LENGTH == 16 bytes of output). If B<md> is NULL, the digest
is placed in a static array.

The following functions may be used if the message is not completely
stored in memory:

MDC2_Init() initializes a B<MDC2_CTX> structure.

MDC2_Update() can be called repeatedly with chunks of the message to
be hashed (B<len> bytes at B<data>).

MDC2_Final() places the message digest in B<md>, which must have space
for MDC2_DIGEST_LENGTH == 16 bytes of output, and erases the B<MDC2_CTX>.

Applications should use the higher level functions
L<EVP_DigestInit(3)|EVP_DigestInit(3)> etc. instead of calling the
hash functions directly.

=head1 RETURN VALUES

MDC2() returns a pointer to the hash value. 

MDC2_Init(), MDC2_Update() and MDC2_Final() do not return values.

=head1 CONFORMING TO

ISO/IEC 10118-2, with DES

=head1 SEE ALSO

L<sha(3)|sha(3)>, L<EVP_DigestInit(3)|EVP_DigestInit(3)>

=head1 HISTORY

MDC2(), MDC2_Init(), MDC2_Update() and MDC2_Final() are available since
SSLeay 0.8.

=cut
