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