---
name: "mdX"
section: "3"
platform: "macos"
package: "libmd"
version: "7"
release: "macOS 26.5"
platforms: ["macos"]
url: "https://new.carta.tech/mdX"
---

# mdX(3)

calculate the RSA Data Security, Inc., \`\`MDX'' message digest

## NAME

**MDXInit**, **MDXUpdate**, **MDXPad**, **MDXFinal**, **MDXEnd**, **MDXFile**, **MDXFileChunk**, **MDXData** – calculate the RSA Data Security, Inc., \`\`MDX'' message digest

## LIBRARY

library “libmd”

## SYNOPSIS

**#include \<sys/types.h\>**

**#include \<mdX.h\>**

*void*\

**MDXInit**(*MDX\_CTX \*context*);

*void*\

**MDXUpdate**(*MDX\_CTX \*context*, *const void \*data*, *unsigned int len*);

*void*\

**MDXPad**(*MDX\_CTX \*context*);

*void*\

**MDXFinal**(*unsigned char digest\[16\]*, *MDX\_CTX \*context*);

*char \**\

**MDXEnd**(*MDX\_CTX \*context*, *char \*buf*);

*char \**\

**MDXFile**(*const char \*filename*, *char \*buf*);

*char \**\

**MDXFileChunk**(*const char \*filename*, *char \*buf*, *off\_t offset*, *off\_t length*);

*char \**\

**MDXData**(*const void \*data*, *unsigned int len*, *char \*buf*);

## DESCRIPTION

The MDX 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 does not disclose the actual input.

MD4 is the fastest and MD5 is somewhat slower. MD4 has now been broken; it should only be used where necessary for backward compatibility. MD5 has not yet (1999-02-11) been broken, but sufficient attacks have been made that its security is in some doubt. 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 **MDXInit**(), **MDXUpdate**(), and **MDXFinal**() functions are the core functions. Allocate an *MDX\_CTX*, initialize it with **MDXInit**(), run over the data with **MDXUpdate**(), and finally extract the result using **MDXFinal**(), which will also erase the *MDX\_CTX*.

The **MDXPad**() function can be used to pad message data in same way as done by **MDXFinal**() without terminating calculation.

The **MDXEnd**() function is a wrapper for **MDXFinal**() which converts the return value to a 33-character (including the terminating '\\0') ASCII string which represents the 128 bits in hexadecimal.

The **MDXFile**() function calculates the digest of a file, and uses **MDXEnd**() to return the result. If the file cannot be opened, a null pointer is returned. The **MDXFileChunk**() function is similar to **MDXFile**(), but it only calculates the digest over a byte-range of the file specified, starting at *offset* and spanning *length* bytes. If the *length* parameter is specified as 0, or more than the length of the remaining part of the file, **MDXFileChunk**() calculates the digest from *offset* to the end of file. The **MDXData**() function calculates the digest of a chunk of data in memory, and uses **MDXEnd**() to return the result.

When using **MDXEnd**(), **MDXFile**(), or **MDXData**(), 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 33 characters of buffer space.

## ERRORS

The **MDXEnd**() function called with a null buf argument may fail and return NULL if:

- \[ENOMEM\]

  Insufficient storage space is available.

The **MDXFile**() and **MDXFileChunk**() may return NULL when underlying [open(2)](/open/2.md), [fstat(2)](/fstat/2.md), [lseek(2)](/lseek/2.md), or MDXEnd(2) fail.

## SEE ALSO

[md4(3)](/md4/3.md), [md5(3)](/md5/3.md), [ripemd(3)](/ripemd/3.md), [sha(3)](/sha/3.md), [sha256(3)](/sha256/3.md), [sha512(3)](/sha512/3.md), [skein(3)](/skein/3.md) R. Rivest, *The MD4 Message-Digest Algorithm*, RFC 1186. R. Rivest, *The MD5 Message-Digest Algorithm*, RFC 1321. H. Dobbertin, “Alf Swindles Ann”, *CryptoBytes*, 1(3):5, 1995. MJ. B. Robshaw, “On Recent Results for MD2, MD4 and MD5”, *RSA Laboratories Bulletin*, 4, November 12, 1996.

## HISTORY

These functions appeared in FreeBSD 2.0.

## AUTHORS

The original MDX routines were developed by RSA Data Security, Inc., and published in the above references. This code is derived directly from these implementations by Poul-Henning Kamp ⟨*phk@FreeBSD.org*⟩.

Phk ristede runen.

## BUGS

The MD5 algorithm has been proven to be vulnerable to practical collision attacks and should not be relied upon to produce unique outputs, *nor* *should* *they* *be* *used* *as* *part* *of* *a* *cryptographic* *signature* *scheme.*
