MD5INIT(3) | Library Functions Manual | MD5INIT(3)

# NAME

`MD5Init`, `MD5Update`, `MD5Pad`, `MD5Final`, `MD5Transform`, `MD5End`, `MD5File`, `MD5FileChunk`, `MD5Data` — calculate MD5 message digest

# SYNOPSIS

`#include <sys/types.h>`
`#include <md5.h>`

void
`MD5Init`(MD5_CTX *context);

void
`MD5Update`(MD5_CTX *context, const u_int8_t *data, size_t len);

void
`MD5Pad`(MD5_CTX *context);

void
`MD5Final`(u_int8_t digest[MD5_DIGEST_LENGTH], MD5_CTX *context);

void
`MD5Transform`(u_int32_t state[4], u_int8_t block[MD5_BLOCK_LENGTH]);

char *
`MD5End`(MD5_CTX *context, char *buf);

char *
`MD5File`(const char *filename, char *buf);

char *
`MD5FileChunk`(const char *filename, char *buf, off_t offset, off_t length);

char *
`MD5Data`(const u_int8_t *data, size_t len, char *buf);

# DESCRIPTION

The MD5 functions calculate a 128-bit cryptographic checksum (digest) for any number of input bytes. A cryptographic checksum is a one-way hash-function, that is, you cannot find (except by exhaustive search) the input corresponding to a particular output. This net result is a “fingerprint” of the input-data, which doesn't disclose the actual input.

MD5 has been broken; it should only be used where necessary for backward compatibility. The attack on MD5 is in the nature of finding “collisions” — that is, multiple inputs which hash to the same value. It is still unlikely for an attacker to be able to determine the exact original input given a hash value.

The `MD5Init`(), `MD5Update`(), and `MD5Final`() functions are the core functions. Allocate an MD5_CTX, initialize it with `MD5Init`(), run over the data with `MD5Update`(), and finally extract the result using `MD5Final`().

The `MD5Pad`() function can be used to apply padding to the message digest as in `MD5Final`(), but the current context can still be used with `MD5Update`().

The `MD5Transform`() function is used by `MD5Update`() to hash 512-bit blocks and forms the core of the algorithm. Most programs should use the interface provided by `MD5Init`(), `MD5Update`() and `MD5Final`() instead of calling `MD5Transform`() directly.

`MD5End`() is a wrapper for `MD5Final`() which converts the return value to an MD5_DIGEST_STRING_LENGTH-character (including the terminating '\0') ASCII string which represents the 128 bits in hexadecimal.

`MD5File`() calculates the digest of a file, and uses `MD5End`() to return the result. If the file cannot be opened, a null pointer is returned.

`MD5FileChunk`() behaves like `MD5File`() but calculates the digest only for that portion of the file starting at offset and continuing for length bytes or until end of file is reached, whichever comes first. A zero length can be specified to read until end of file. A negative length or offset will be ignored. `MD5Data`() calculates the digest of a chunk of data in memory, and uses `MD5End`() to return the result.

When using `MD5End`(), `MD5File`(), `MD5FileChunk`(), or `MD5Data`(), the buf argument can be a null pointer, in which case the returned string is allocated with malloc(3) and subsequently must be explicitly deallocated using free(3) after use. If the buf argument is non-null, it must point to at least MD5_DIGEST_STRING_LENGTH characters of buffer space.

# SEE ALSO

cksum(1), md5(1), RMD160Init(3), SHA1Init(3), SHA256Init(3)

H. Dobbertin, Alf Swindles Ann, CryptoBytes, 1(3):5, 1995.

MJ. B. Robshaw, On Recent Results for MD4 and MD5, RSA Laboratories Bulletin, 4, November 12, 1996.

Hans Dobbertin, Cryptanalysis of MD5 Compress.

# STANDARDS

R. Rivest, The MD5 Message Digest Algorithm, RFC 1321, April 1992.

# HISTORY

These functions appeared in OpenBSD 2.0.

# AUTHORS

The original MD5 routines were developed by RSA Data Security, Inc., and published in the above references. This code is derived from a public domain implementation written by Colin Plumb.

The `MD5End`(), `MD5File`(), `MD5FileChunk`(), and `MD5Data`() helper functions are derived from code written by Poul-Henning Kamp.

# BUGS

Collisions have been found for the full version of MD5. The use of the SHA2 functions is recommended instead.

June 13, 2025 | Debian