--- /dev/null
+#ifndef CCAN_MD4_H
+#define CCAN_MD4_H
+#include <stdint.h>
+#include <stdlib.h>
+
+/**
+ * md4_ctx - context structure for md4 hashing
+ * @hash: the 128-bit hash value (only valid after md4_finish)
+ * @block: internal working state.
+ * @byte_count: the total number of bytes processed.
+ */
+struct md4_ctx {
+ union {
+ unsigned char bytes[16];
+ uint32_t words[4];
+ } hash;
+ uint32_t block[16];
+ uint64_t byte_count;
+};
+
+/**
+ * md4_init - (re-)initialize the struct md4_ctx before md4_hash.
+ * @mctx: the struct md4_ctx which will be handed to md4_hash.
+ *
+ * Contexts can be safely re-used by calling md4_init() on them again.
+ *
+ * Example:
+ * struct md4_ctx ctx;
+ *
+ * md4_init(&ctx);
+ * ...
+ */
+void md4_init(struct md4_ctx *mctx);
+
+/**
+ * md4_hash - add these bytes into the hash
+ * @mctx: the struct md4_ctx.
+ * @p: pointer to the bytes to hash.
+ * @len: the number of bytes pointed to by @p.
+ *
+ * Example:
+ * struct md4_ctx ctx;
+ *
+ * md4_init(&ctx);
+ * md4_hash(&ctx, "hello", 5);
+ * md4_hash(&ctx, " ", 1);
+ * md4_hash(&ctx, "world", 5);
+ */
+void md4_hash(struct md4_ctx *mctx, const void *p, size_t len);
+
+/**
+ * md4_finish - complete the MD4 hash
+ * @mctx: the struct md4_ctx.
+ *
+ * Example:
+ * struct md4_ctx ctx;
+ *
+ * md4_init(&ctx);
+ * md4_hash(&ctx, "hello world", strlen("hello world"));
+ * md4_finish(&ctx);
+ */
+void md4_finish(struct md4_ctx *mctx);
+
+#endif /* CCAN_MD4_H */