---
name: "MD5End"
section: "3"
platform: "linux"
package: "libmd"
version: "1.3.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/md5/3"
---

# MD5End(3)

calculate the RSA Data Security, Inc., “MD5” message digest

Part of [md5(3)](/md5/3.md).

## NAME

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

## LIBRARY

library “libmd”

## 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

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**(), **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)](/malloc/3.md) and subsequently must be explicitly deallocated using [free(3)](/free/3.md) 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

[md2(3)](/md2/3.md), [md4(3)](/md4/3.md), [md5(3)](/md5/3.md), [rmd160(3)](/rmd160/3.md), [sha1(3)](/sha1/3.md), [sha2(3)](/sha2/3.md) 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*, \<http://www.rsa.com/rsalabs/faq/\>. 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

These functions appeared in OpenBSD 2.0 and NetBSD 1.3.

## 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 versions of both MD4 and MD5. The use of [sha2(3)](/sha2/3.md) is recommended instead.
