MD5(3) Library Functions Manual MD5(3)

# [NAME](#NAME)

`MD5Init`, `MD5Update`, `MD5Pad`, `MD5Final`, `MD5Transform`, `MD5End`, `MD5File`, `MD5FileChunk`, `MD5Data` — calculate the RSA Data Security, Inc., “MD5” message digest

# [LIBRARY](#LIBRARY)

Message Digest (MD4, MD5, etc.) Support Library (libmd, -lmd)

# [SYNOPSIS](#SYNOPSIS)

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

`void`  
`MD5Init`(`MD5_CTX *context`);

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

`void`  
`MD5Pad`(`MD5_CTX *context`);

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

`void`  
`MD5Transform`(`uint32_t state[4]`, `uint8_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 uint8_t *data`, `size_t len`, `char *buf`);

# [DESCRIPTION](#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.

MD2 is the slowest, MD4 is the fastest and MD5 is somewhere in the middle. MD2 can only be used for Privacy-Enhanced Mail. MD4 has been criticized for being too weak, so MD5 was developed in response as \`\`MD4 with safety-belts''. MD4 and MD5 have been broken; they should only be used where necessary for backward compatibility. The attacks on both MD4 and MD5 are both 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`](#MD5Init)(), [`MD5Update`](#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`](#MD5Pad)() function can be used to apply padding to the message digest as in [`MD5Final`](#MD5Final)(), but the current context can still be used with `MD5Update`().

The [`MD5Transform`](#MD5Transform)() function is used by [`MD5Update`](#MD5Update~2)() 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`](#MD5End)() is a wrapper for [`MD5Final`](#MD5Final~2)() 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`](#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`](#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`](#MD5Data)() calculates the digest of a chunk of data in memory, and uses `MD5End`() to return the result.

When using [`MD5End`](#MD5End~2)(), `MD5File`(), `MD5FileChunk`(), or `MD5Data`(), the `buf` argument can be a null pointer, in which case the returned string is allocated with [malloc(3)](/man/os/libmd/malloc.3) and subsequently must be explicitly deallocated using [free(3)](/man/os/libmd/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](#SEE_ALSO)

[md2(3)](/man/os/libmd/md2.3), [md4(3)](/man/os/libmd/md4.3), [md5(3)](/man/os/libmd/md5.3), [rmd160(3)](/man/os/libmd/rmd160.3), [sha1(3)](/man/os/libmd/sha1.3), [sha2(3)](/man/os/libmd/sha2.3)

B. Kaliski, The MD2 Message-Digest Algorithm, RFC 1319.

R. Rivest, The MD4 Message-Digest Algorithm, RFC 1186.

R. Rivest, The MD5 Message-Digest Algorithm, RFC 1321.

RSA Laboratories, Frequently Asked Questions About today's Cryptography, &lt;http://www.rsa.com/rsalabs/faq/&gt;.

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.

# [HISTORY](#HISTORY)

These functions appeared in OpenBSD 2.0 and NetBSD 1.3.

# [AUTHORS](#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](#BUGS)

Collisions have been found for the full versions of both MD4 and MD5. The use of [sha2(3)](/man/os/libmd/sha2.3) is recommended instead.

July 13, 2010 Linux 4.19.0-gvisor

---

Document: MD5FileChunk(3) from libmd 1.2.0-r3 (Chainguard OS)
Source: https://gitlab.freedesktop.org/libbsd/libmd.git
