Function: rfc2104-hash
rfc2104-hash is an autoloaded and byte-compiled function defined in
rfc2104.el.gz.
Signature
(rfc2104-hash HASH BLOCK-LENGTH HASH-LENGTH KEY TEXT)
Source Code
;; Defined in /usr/src/emacs/lisp/net/rfc2104.el.gz
(defun rfc2104-hash (hash block-length hash-length key text)
(let* (;; if key is longer than B, reset it to HASH(key)
(key (if (> (length key) block-length)
(funcall hash key) key))
(len (length key))
(ipad (make-string block-length rfc2104-ipad))
(opad (make-string (+ block-length hash-length) rfc2104-opad))
c partial)
;; Prefix *pad with key, appropriately XORed.
(cl-do ((i 0 (1+ i)))
((= len i))
(setq c (aref key i))
(aset ipad i (logxor rfc2104-ipad c))
(aset opad i (logxor rfc2104-opad c)))
;; Perform inner hash.
(setq partial (funcall hash (concat ipad text)))
;; Pack latter part of opad.
(cl-do ((r 0 (+ 2 r))
(w block-length (1+ w)))
((= (* 2 hash-length) r))
(aset opad w
(+ (* 16 (aref rfc2104-nybbles (aref partial r)))
( aref rfc2104-nybbles (aref partial (1+ r))))))
;; Perform outer hash.
(funcall hash opad)))