Function: md4

md4 is a byte-compiled function defined in md4.el.gz.

Signature

(md4 IN N)

Documentation

Return the MD4 hash for a string IN of length N bytes.

The returned hash is 16 bytes long. N is required to handle strings containing the character 0.

The security of the MD4 hashing algorithm is very poor to non-existent. It was declared obsolete by RFC 6150 in 2011.

You probably want to use secure-hash instead.

Source Code

;; Defined in /usr/src/emacs/lisp/md4.el.gz
(defun md4 (in n)
  "Return the MD4 hash for a string IN of length N bytes.
The returned hash is 16 bytes long.  N is required to handle
strings containing the character 0.

The security of the MD4 hashing algorithm is very poor to
non-existent.  It was declared obsolete by RFC 6150 in 2011.

You probably want to use `secure-hash' instead."
  (let (m
	(b (cons 0 (* n 8)))
	(i 0)
	(buf (make-string 128 0)) c4)
    ;; initial values
    (aset md4-buffer 0 '(26437 . 8961))		;0x67452301
    (aset md4-buffer 1 '(61389 . 43913))	;0xefcdab89
    (aset md4-buffer 2 '(39098 . 56574))	;0x98badcfe
    (aset md4-buffer 3 '(4146 . 21622))		;0x10325476

    ;; process the string in 64 bits chunks
    (while (> n 64)
      (setq m (md4-copy64 (substring in 0 64)))
      (md4-64 m)
      (setq in (substring in 64))
      (setq n (- n 64)))

    ;; process the rest of the string (length is now n <= 64)
    (setq i 0)
    (while (< i n)
      (aset buf i (aref in i))
      (setq i (1+ i)))
    (aset buf n 128)			;0x80
    (if (<= n 55)
	(progn
	  (setq c4 (md4-pack-int32 b))
	  (aset buf 56 (aref c4 0))
	  (aset buf 57 (aref c4 1))
	  (aset buf 58 (aref c4 2))
	  (aset buf 59 (aref c4 3))
	  (setq m (md4-copy64 buf))
	  (md4-64 m))
      ;; else
      (setq c4 (md4-pack-int32 b))
      (aset buf 120 (aref c4 0))
      (aset buf 121 (aref c4 1))
      (aset buf 122 (aref c4 2))
      (aset buf 123 (aref c4 3))
      (setq m (md4-copy64 buf))
      (md4-64 m)
      (setq m (md4-copy64 (substring buf 64)))
      (md4-64 m)))

    (concat (md4-pack-int32 (aref md4-buffer 0))
	    (md4-pack-int32 (aref md4-buffer 1))
	    (md4-pack-int32 (aref md4-buffer 2))
	    (md4-pack-int32 (aref md4-buffer 3))))