(eval-when-compile
(defmacro hex-char-to-num (chr)
- `(let ((chr ,chr))
- (cond
- ((and (<= ?a chr)(<= chr ?f)) (+ (- chr ?a) 10))
- ((and (<= ?A chr)(<= chr ?F)) (+ (- chr ?A) 10))
- ((and (<= ?0 chr)(<= chr ?9)) (- chr ?0))
- (t (error "Invalid hexadecimal digit `%c'" chr)))))
+ (` (let ((chr (, chr)))
+ (cond
+ ((and (<= ?a chr)(<= chr ?f)) (+ (- chr ?a) 10))
+ ((and (<= ?A chr)(<= chr ?F)) (+ (- chr ?A) 10))
+ ((and (<= ?0 chr)(<= chr ?9)) (- chr ?0))
+ (t (error "Invalid hexadecimal digit `%c'" chr))))))
(defmacro num-to-hex-char (num)
- `(aref "0123456789abcdef" ,num)))
+ (` (aref "0123456789abcdef" (, num)))))
(defun decode-hex-string (string)
"Decode hexadecimal STRING to octet string."
(dst (make-string (/ len 2) 0))
(idx 0)(pos 0))
(while (< pos len)
- ;; logior and lsh are not byte-coded.
- ;; (aset dst idx (logior (lsh (hex-char-to-num (aref string pos)) 4)
- ;; (hex-char-to-num (aref string (1+ pos)))))
+;;; logior and lsh are not byte-coded.
+;;; (aset dst idx (logior (lsh (hex-char-to-num (aref string pos)) 4)
+;;; (hex-char-to-num (aref string (1+ pos)))))
(aset dst idx (+ (* (hex-char-to-num (aref string pos)) 16)
(hex-char-to-num (aref string (1+ pos)))))
(setq idx (1+ idx)
(dst (make-string (* len 2) 0))
(idx 0)(pos 0))
(while (< pos len)
- ;; logand and lsh are not byte-coded.
- ;; (aset dst idx (num-to-hex-char (logand (lsh (aref string pos) -4) 15)))
+;;; logand and lsh are not byte-coded.
+;;; (aset dst idx (num-to-hex-char (logand (lsh (aref string pos) -4) 15)))
(aset dst idx (num-to-hex-char (/ (aref string pos) 16)))
(setq idx (1+ idx))
- ;; (aset dst idx (num-to-hex-char (logand (aref string pos) 15)))
+;;; (aset dst idx (num-to-hex-char (logand (aref string pos) 15)))
(aset dst idx (num-to-hex-char (% (aref string pos) 16)))
(setq idx (1+ idx)
pos (1+ pos)))
B is a byte-length of a block size of H. (B=64 for both SHA1 and MD5.)
L is a byte-length of hash outputs. (L=16 for MD5, L=20 for SHA1.)
If BIT is non-nil, truncate output to specified bits."
- `(defun ,name (text key)
- ,(concat "Compute "
- (upcase (symbol-name name))
- " over TEXT with KEY.")
- (let ((key-xor-ipad (make-string ,B ?\x36))
- (key-xor-opad (make-string ,B ?\x5C))
- (len (length key))
- (pos 0))
- (unwind-protect
- (progn
- ;; if `key' is longer than the block size, apply hash function
- ;; to `key' and use the result as a real `key'.
- (if (> len ,B)
- (setq key (,H key)
- len ,L))
- (while (< pos len)
- (aset key-xor-ipad pos (logxor (aref key pos) ?\x36))
- (aset key-xor-opad pos (logxor (aref key pos) ?\x5C))
- (setq pos (1+ pos)))
- (setq key-xor-ipad (unwind-protect
- (concat key-xor-ipad text)
- (fillarray key-xor-ipad 0))
- key-xor-ipad (unwind-protect
- (,H key-xor-ipad)
- (fillarray key-xor-ipad 0))
- key-xor-opad (unwind-protect
- (concat key-xor-opad key-xor-ipad)
- (fillarray key-xor-opad 0))
- key-xor-opad (unwind-protect
- (,H key-xor-opad)
- (fillarray key-xor-opad 0)))
- ;; now `key-xor-opad' contains
- ;; H(KEY XOR opad, H(KEY XOR ipad, TEXT)).
- ,(if (and bit (< (/ bit 8) L))
- `(substring key-xor-opad 0 ,(/ bit 8))
- ;; return a copy of `key-xor-opad'.
- `(concat key-xor-opad)))
- ;; cleanup.
- (fillarray key-xor-ipad 0)
- (fillarray key-xor-opad 0)))))
+ (` (defun (, name) (text key)
+ (, (concat "Compute "
+ (upcase (symbol-name name))
+ " over TEXT with KEY."))
+ (let ((key-xor-ipad (make-string (, B) ?\x36))
+ (key-xor-opad (make-string (, B) ?\x5C))
+ (len (length key))
+ (pos 0))
+ (unwind-protect
+ (progn
+ ;; if `key' is longer than the block size, apply hash function
+ ;; to `key' and use the result as a real `key'.
+ (if (> len (, B))
+ (setq key ((, H) key)
+ len (, L)))
+ (while (< pos len)
+ (aset key-xor-ipad pos (logxor (aref key pos) ?\x36))
+ (aset key-xor-opad pos (logxor (aref key pos) ?\x5C))
+ (setq pos (1+ pos)))
+ (setq key-xor-ipad (unwind-protect
+ (concat key-xor-ipad text)
+ (fillarray key-xor-ipad 0))
+ key-xor-ipad (unwind-protect
+ ((, H) key-xor-ipad)
+ (fillarray key-xor-ipad 0))
+ key-xor-opad (unwind-protect
+ (concat key-xor-opad key-xor-ipad)
+ (fillarray key-xor-opad 0))
+ key-xor-opad (unwind-protect
+ ((, H) key-xor-opad)
+ (fillarray key-xor-opad 0)))
+ ;; now `key-xor-opad' contains
+ ;; H(KEY XOR opad, H(KEY XOR ipad, TEXT)).
+ (, (if (and bit (< (/ bit 8) L))
+ (` (substring key-xor-opad 0 (, (/ bit 8))))
+ ;; return a copy of `key-xor-opad'.
+ (` (concat key-xor-opad)))))
+ ;; cleanup.
+ (fillarray key-xor-ipad 0)
+ (fillarray key-xor-opad 0))))))
(provide 'hmac-def)
(defconst sha1-K3-high 51810) ; (string-to-number "CA62" 16)
(defconst sha1-K3-low 49622) ; (string-to-number "C1D6" 16)
- ;; original definition of sha1-F0.
- ;; (defmacro sha1-F0 (B C D)
- ;; `(logior (logand ,B ,C)
- ;; (logand (lognot ,B) ,D)))
- ;; a little optimization from GnuPG/cipher/sha1.c.
+;;; original definition of sha1-F0.
+;;; (defmacro sha1-F0 (B C D)
+;;; (` (logior (logand (, B) (, C))
+;;; (logand (lognot (, B)) (, D)))))
+;;; a little optimization from GnuPG/cipher/sha1.c.
(defmacro sha1-F0 (B C D)
- `(logxor ,D (logand ,B (logxor ,C ,D))))
+ (` (logxor (, D) (logand (, B) (logxor (, C) (, D))))))
(defmacro sha1-F1 (B C D)
- `(logxor ,B ,C ,D))
- ;; original definition of sha1-F2.
- ;; (defmacro sha1-F2 (B C D)
- ;; `(logior (logand ,B ,C)
- ;; (logand ,B ,D)
- ;; (logand ,C ,D)))
- ;; a little optimization from GnuPG/cipher/sha1.c.
+ (` (logxor (, B) (, C) (, D))))
+;;; original definition of sha1-F2.
+;;; (defmacro sha1-F2 (B C D)
+;;; (` (logior (logand (, B) (, C))
+;;; (logand (, B) (, D))
+;;; (logand (, C) (, D)))))
+;;; a little optimization from GnuPG/cipher/sha1.c.
(defmacro sha1-F2 (B C D)
- `(logior (logand ,B ,C)
- (logand ,D (logior ,B ,C))))
+ (` (logior (logand (, B) (, C))
+ (logand (, D) (logior (, B) (, C))))))
(defmacro sha1-F3 (B C D)
- `(logxor ,B ,C ,D))
+ (` (logxor (, B) (, C) (, D))))
(defmacro sha1-S1 (W-high W-low)
- `(let ((W-high ,W-high)
- (W-low ,W-low))
- (setq S1W-high (+ (% (* W-high 2) 65536)
- (/ W-low ,(/ 65536 2))))
- (setq S1W-low (+ (/ W-high ,(/ 65536 2))
- (% (* W-low 2) 65536)))))
+ (` (let ((W-high (, W-high))
+ (W-low (, W-low)))
+ (setq S1W-high (+ (% (* W-high 2) 65536)
+ (/ W-low (, (/ 65536 2)))))
+ (setq S1W-low (+ (/ W-high (, (/ 65536 2)))
+ (% (* W-low 2) 65536))))))
(defmacro sha1-S5 (A-high A-low)
- `(progn
- (setq S5A-high (+ (% (* ,A-high 32) 65536)
- (/ ,A-low ,(/ 65536 32))))
- (setq S5A-low (+ (/ ,A-high ,(/ 65536 32))
- (% (* ,A-low 32) 65536)))))
+ (` (progn
+ (setq S5A-high (+ (% (* (, A-high) 32) 65536)
+ (/ (, A-low) (, (/ 65536 32)))))
+ (setq S5A-low (+ (/ (, A-high) (, (/ 65536 32)))
+ (% (* (, A-low) 32) 65536))))))
(defmacro sha1-S30 (B-high B-low)
- `(progn
- (setq S30B-high (+ (/ ,B-high 4)
- (* (% ,B-low 4) ,(/ 65536 4))))
- (setq S30B-low (+ (/ ,B-low 4)
- (* (% ,B-high 4) ,(/ 65536 4))))))
+ (` (progn
+ (setq S30B-high (+ (/ (, B-high) 4)
+ (* (% (, B-low) 4) (, (/ 65536 4)))))
+ (setq S30B-low (+ (/ (, B-low) 4)
+ (* (% (, B-high) 4) (, (/ 65536 4))))))))
(defmacro sha1-OP (round)
- `(progn
- (sha1-S5 sha1-A-high sha1-A-low)
- (sha1-S30 sha1-B-high sha1-B-low)
- (setq sha1-A-low (+ (,(intern (format "sha1-F%d" round))
- sha1-B-low sha1-C-low sha1-D-low)
- sha1-E-low
- ,(symbol-value
- (intern (format "sha1-K%d-low" round)))
- (aref block-low idx)
- (progn
- (setq sha1-E-low sha1-D-low)
- (setq sha1-D-low sha1-C-low)
- (setq sha1-C-low S30B-low)
- (setq sha1-B-low sha1-A-low)
- S5A-low)))
- (setq carry (/ sha1-A-low 65536))
- (setq sha1-A-low (% sha1-A-low 65536))
- (setq sha1-A-high (% (+ (,(intern (format "sha1-F%d" round))
- sha1-B-high sha1-C-high sha1-D-high)
- sha1-E-high
- ,(symbol-value
- (intern (format "sha1-K%d-high" round)))
- (aref block-high idx)
- (progn
- (setq sha1-E-high sha1-D-high)
- (setq sha1-D-high sha1-C-high)
- (setq sha1-C-high S30B-high)
- (setq sha1-B-high sha1-A-high)
- S5A-high)
- carry)
- 65536))))
+ (` (progn
+ (sha1-S5 sha1-A-high sha1-A-low)
+ (sha1-S30 sha1-B-high sha1-B-low)
+ (setq sha1-A-low (+ ((, (intern (format "sha1-F%d" round)))
+ sha1-B-low sha1-C-low sha1-D-low)
+ sha1-E-low
+ (, (symbol-value
+ (intern (format "sha1-K%d-low" round))))
+ (aref block-low idx)
+ (progn
+ (setq sha1-E-low sha1-D-low)
+ (setq sha1-D-low sha1-C-low)
+ (setq sha1-C-low S30B-low)
+ (setq sha1-B-low sha1-A-low)
+ S5A-low)))
+ (setq carry (/ sha1-A-low 65536))
+ (setq sha1-A-low (% sha1-A-low 65536))
+ (setq sha1-A-high (% (+ ((, (intern (format "sha1-F%d" round)))
+ sha1-B-high sha1-C-high sha1-D-high)
+ sha1-E-high
+ (, (symbol-value
+ (intern (format "sha1-K%d-high" round))))
+ (aref block-high idx)
+ (progn
+ (setq sha1-E-high sha1-D-high)
+ (setq sha1-D-high sha1-C-high)
+ (setq sha1-C-high S30B-high)
+ (setq sha1-B-high sha1-A-high)
+ S5A-high)
+ carry)
+ 65536)))))
(defmacro sha1-add-to-H (H X)
- `(progn
- (setq ,(intern (format "sha1-%s-low" H))
- (+ ,(intern (format "sha1-%s-low" H))
- ,(intern (format "sha1-%s-low" X))))
- (setq carry (/ ,(intern (format "sha1-%s-low" H)) 65536))
- (setq ,(intern (format "sha1-%s-low" H))
- (% ,(intern (format "sha1-%s-low" H)) 65536))
- (setq ,(intern (format "sha1-%s-high" H))
- (% (+ ,(intern (format "sha1-%s-high" H))
- ,(intern (format "sha1-%s-high" X))
- carry)
- 65536))))
+ (` (progn
+ (setq (, (intern (format "sha1-%s-low" H)))
+ (+ (, (intern (format "sha1-%s-low" H)))
+ (, (intern (format "sha1-%s-low" X)))))
+ (setq carry (/ (, (intern (format "sha1-%s-low" H))) 65536))
+ (setq (, (intern (format "sha1-%s-low" H)))
+ (% (, (intern (format "sha1-%s-low" H))) 65536))
+ (setq (, (intern (format "sha1-%s-high" H)))
+ (% (+ (, (intern (format "sha1-%s-high" H)))
+ (, (intern (format "sha1-%s-high" X)))
+ carry)
+ 65536)))))
)
;;; buffers (H0 H1 H2 H3 H4).
If BINARY is non-nil, return a string in binary form."
(if (stringp object)
(sha1-string object binary)
- (with-current-buffer object
+ (save-excursion
+ (set-buffer object)
(sha1-region (or beg (point-min)) (or end (point-max)) binary))))
(provide 'sha1-el)