view lisp/net/hmac-def.el @ 96486:7369ded3b436

Typo and docstring fixes. * url.el (url-do-setup): * url-dired.el (url-dired-minor-mode): * url-file.el (url-file-find-possibly-compressed-file): * url-gw.el (url-gateway-broken-resolution): * url-handlers.el (url-handler-regexp): * url-imap.el (url-imap-default-port): * url-methods.el (url-scheme-get-property): Fix typos in docstrings. * url-auth.el (url-basic-auth-storage, url-digest-auth): Fix typos in docstrings. (url-digest-auth-storage, url-register-auth-scheme): Reflow docstrings. * url-cache.el (url-cache-prepare): Doc fix. (url-cache-create-filename-human-readable, url-cache-extract): Fix typos in docstrings. * url-dav.el (url-intersection, url-dav-iso8601-regexp) (url-dav-delete-something): Fix typos in docstrings. (url-dav-http-success-p, url-dav-file-name-all-completions) (url-dav-directory-files, url-dav-file-name-completion): Doc fixes. * url-http.el (url-http-idle-sentinel): Doc fix. * url-irc.el (url-irc-default-port): Fix typo in docstring. (url-irc-function): Doc fix. * url-util.el (url-get-url-filename-chars, url-unhex-string): Fix typos in docstrings. (url-file-extension): Doc fix. * url-vars.el (url-current-object, url-current-mime-headers) (url-privacy-level, url-mail-command, url-mime-language-string): Fix typos in docstrings. (url-honor-refresh-requests): Reflow docstring. (url-using-proxy): Doc fix.
author Juanma Barranquero <lekktu@gmail.com>
date Wed, 02 Jul 2008 11:14:38 +0000
parents 91e5880a36c1
children a9dc0e7c3f2b
line wrap: on
line source

;;; hmac-def.el --- A macro for defining HMAC functions.

;; Copyright (C) 1999, 2001, 2007, 2008  Free Software Foundation, Inc.

;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
;; Keywords: HMAC, RFC 2104

;; This file is part of GNU Emacs.

;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs.  If not, see <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This program is implemented from RFC 2104,
;; "HMAC: Keyed-Hashing for Message Authentication".

;;; Code:

(defmacro define-hmac-function (name H B L &optional bit)
  "Define a function NAME(TEXT KEY) which computes HMAC with function H.

HMAC function is H(KEY XOR opad, H(KEY XOR ipad, TEXT)):

H is a cryptographic hash function, such as SHA1 and MD5, which takes
a string and return a digest of it (in binary form).
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)))))

(provide 'hmac-def)

;; arch-tag: 645adcef-b835-4900-a10a-11f636c982b9
;;; hmac-def.el ends here