annotate lisp/sha1.el @ 96627:ae085a544367

Use more correct IPA characters for English pronunciation. Add the combining acute accent after the accented vowel in the Russian example like it is used in dictionaries.
author Juri Linkov <juri@jurta.org>
date Sat, 12 Jul 2008 20:41:45 +0000
parents ee5932bf781d
children d42aff5ca541
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
1 ;;; sha1.el --- SHA1 Secure Hash Algorithm in Emacs-Lisp
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
2
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
3 ;; Copyright (C) 1999, 2001, 2002, 2003, 2004,
87649
107ccd98fa12 Merge from emacs--rel--22
Miles Bader <miles@gnu.org>
parents: 86919
diff changeset
4 ;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
5
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
6 ;; Author: Shuhei KOBAYASHI <shuhei@aqua.ocn.ne.jp>
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
7 ;; Keywords: SHA1, FIPS 180-1
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
8
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
10
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92779
diff changeset
11 ;; GNU Emacs is free software: you can redistribute it and/or modify
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
12 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92779
diff changeset
13 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92779
diff changeset
14 ;; (at your option) any later version.
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
15
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
20
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
21 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92779
diff changeset
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
23
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
25
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
26 ;; This program is implemented from the definition of SHA-1 in FIPS PUB
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
27 ;; 180-1 (Federal Information Processing Standards Publication 180-1),
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
28 ;; "Announcing the Standard for SECURE HASH STANDARD".
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
29 ;; <URL:http://www.itl.nist.gov/div897/pubs/fip180-1.htm>
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
30 ;; (EXCEPTION; two optimizations taken from GnuPG/cipher/sha1.c)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
31 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
32 ;; Test cases from FIPS PUB 180-1.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
33 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
34 ;; (sha1 "abc")
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
35 ;; => a9993e364706816aba3e25717850c26c9cd0d89d
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
36 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
37 ;; (sha1 "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq")
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
38 ;; => 84983e441c3bd26ebaae4aa1f95129e5e54670f1
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
39 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
40 ;; (sha1 (make-string 1000000 ?a))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
41 ;; => 34aa973cd4c4daa4f61eeb2bdbad27316534016f
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
42 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
43 ;; BUGS:
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
44 ;; * It is assumed that length of input string is less than 2^29 bytes.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
45 ;; * It is caller's responsibility to make string (or region) unibyte.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
46 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
47 ;; TODO:
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
48 ;; * Rewrite from scratch!
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
49 ;; This version is much faster than Keiichi Suzuki's another sha1.el,
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
50 ;; but it is too dirty.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
51
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
52 ;;; Code:
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
53
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
54 (require 'hex-util)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
55
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
56 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
57 ;;; external SHA1 function.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
58 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
59
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
60 (defgroup sha1 nil
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
61 "Elisp interface for SHA1 hash computation."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
62 :version "22.1"
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
63 :group 'extensions)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
64
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
65 (defcustom sha1-maximum-internal-length 500
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
66 "*Maximum length of message to use Lisp version of SHA1 function.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
67 If message is longer than this, `sha1-program' is used instead.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
68
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
69 If this variable is set to 0, use external program only.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
70 If this variable is set to nil, use internal function only."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
71 :type 'integer
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
72 :group 'sha1)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
73
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
74 (defcustom sha1-program '("sha1sum")
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
75 "*Name of program to compute SHA1.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
76 It must be a string \(program name\) or list of strings \(name and its args\)."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
77 :type '(repeat string)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
78 :group 'sha1)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
79
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
80 (defcustom sha1-use-external (condition-case ()
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
81 (executable-find (car sha1-program))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
82 (error))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
83 "*Use external SHA1 program.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
84 If this variable is set to nil, use internal function only."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
85 :type 'boolean
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
86 :group 'sha1)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
87
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
88 (defun sha1-string-external (string &optional binary)
92779
e9bef8bf2940 (sha1-string-external): Use set-buffer-multibyte rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
89 (let (prog args digest)
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
90 (if (consp sha1-program)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
91 (setq prog (car sha1-program)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
92 args (cdr sha1-program))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
93 (setq prog sha1-program
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
94 args nil))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
95 (with-temp-buffer
92779
e9bef8bf2940 (sha1-string-external): Use set-buffer-multibyte rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
96 (set-buffer-multibyte nil)
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
97 (insert string)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
98 (apply (function call-process-region)
92779
e9bef8bf2940 (sha1-string-external): Use set-buffer-multibyte rather than
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 87649
diff changeset
99 (point-min) (point-max)
86919
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
100 prog t t nil args)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
101 ;; SHA1 is 40 bytes long in hexadecimal form.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
102 (setq digest (buffer-substring (point-min)(+ (point-min) 40))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
103 (if binary
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
104 (decode-hex-string digest)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
105 digest)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
106
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
107 (defun sha1-region-external (beg end &optional binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
108 (sha1-string-external (buffer-substring-no-properties beg end) binary))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
109
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
110 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
111 ;;; internal SHA1 function.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
112 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
113
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
114 (eval-when-compile
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
115 ;; optional second arg of string-to-number is new in v20.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
116 (defconst sha1-K0-high 23170) ; (string-to-number "5A82" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
117 (defconst sha1-K0-low 31129) ; (string-to-number "7999" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
118 (defconst sha1-K1-high 28377) ; (string-to-number "6ED9" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
119 (defconst sha1-K1-low 60321) ; (string-to-number "EBA1" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
120 (defconst sha1-K2-high 36635) ; (string-to-number "8F1B" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
121 (defconst sha1-K2-low 48348) ; (string-to-number "BCDC" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
122 (defconst sha1-K3-high 51810) ; (string-to-number "CA62" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
123 (defconst sha1-K3-low 49622) ; (string-to-number "C1D6" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
124
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
125 ;; original definition of sha1-F0.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
126 ;; (defmacro sha1-F0 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
127 ;; (` (logior (logand (, B) (, C))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
128 ;; (logand (lognot (, B)) (, D)))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
129 ;; a little optimization from GnuPG/cipher/sha1.c.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
130 (defmacro sha1-F0 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
131 `(logxor ,D (logand ,B (logxor ,C ,D))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
132 (defmacro sha1-F1 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
133 `(logxor ,B ,C ,D))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
134 ;; original definition of sha1-F2.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
135 ;; (defmacro sha1-F2 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
136 ;; (` (logior (logand (, B) (, C))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
137 ;; (logand (, B) (, D))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
138 ;; (logand (, C) (, D)))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
139 ;; a little optimization from GnuPG/cipher/sha1.c.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
140 (defmacro sha1-F2 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
141 `(logior (logand ,B ,C)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
142 (logand ,D (logior ,B ,C))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
143 (defmacro sha1-F3 (B C D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
144 `(logxor ,B ,C ,D))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
145
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
146 (defmacro sha1-S1 (W-high W-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
147 `(let ((W-high ,W-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
148 (W-low ,W-low))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
149 (setq S1W-high (+ (% (* W-high 2) 65536)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
150 (/ W-low ,(/ 65536 2))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
151 (setq S1W-low (+ (/ W-high ,(/ 65536 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
152 (% (* W-low 2) 65536)))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
153 (defmacro sha1-S5 (A-high A-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
154 `(progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
155 (setq S5A-high (+ (% (* ,A-high 32) 65536)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
156 (/ ,A-low ,(/ 65536 32))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
157 (setq S5A-low (+ (/ ,A-high ,(/ 65536 32))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
158 (% (* ,A-low 32) 65536)))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
159 (defmacro sha1-S30 (B-high B-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
160 `(progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
161 (setq S30B-high (+ (/ ,B-high 4)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
162 (* (% ,B-low 4) ,(/ 65536 4))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
163 (setq S30B-low (+ (/ ,B-low 4)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
164 (* (% ,B-high 4) ,(/ 65536 4))))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
165
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
166 (defmacro sha1-OP (round)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
167 `(progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
168 (sha1-S5 sha1-A-high sha1-A-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
169 (sha1-S30 sha1-B-high sha1-B-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
170 (setq sha1-A-low (+ (,(intern (format "sha1-F%d" round))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
171 sha1-B-low sha1-C-low sha1-D-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
172 sha1-E-low
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
173 ,(symbol-value
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
174 (intern (format "sha1-K%d-low" round)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
175 (aref block-low idx)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
176 (progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
177 (setq sha1-E-low sha1-D-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
178 (setq sha1-D-low sha1-C-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
179 (setq sha1-C-low S30B-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
180 (setq sha1-B-low sha1-A-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
181 S5A-low)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
182 (setq carry (/ sha1-A-low 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
183 (setq sha1-A-low (% sha1-A-low 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
184 (setq sha1-A-high (% (+ (,(intern (format "sha1-F%d" round))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
185 sha1-B-high sha1-C-high sha1-D-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
186 sha1-E-high
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
187 ,(symbol-value
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
188 (intern (format "sha1-K%d-high" round)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
189 (aref block-high idx)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
190 (progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
191 (setq sha1-E-high sha1-D-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
192 (setq sha1-D-high sha1-C-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
193 (setq sha1-C-high S30B-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
194 (setq sha1-B-high sha1-A-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
195 S5A-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
196 carry)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
197 65536))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
198
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
199 (defmacro sha1-add-to-H (H X)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
200 `(progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
201 (setq ,(intern (format "sha1-%s-low" H))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
202 (+ ,(intern (format "sha1-%s-low" H))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
203 ,(intern (format "sha1-%s-low" X))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
204 (setq carry (/ ,(intern (format "sha1-%s-low" H)) 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
205 (setq ,(intern (format "sha1-%s-low" H))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
206 (% ,(intern (format "sha1-%s-low" H)) 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
207 (setq ,(intern (format "sha1-%s-high" H))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
208 (% (+ ,(intern (format "sha1-%s-high" H))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
209 ,(intern (format "sha1-%s-high" X))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
210 carry)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
211 65536))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
212 )
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
213
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
214 ;;; buffers (H0 H1 H2 H3 H4).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
215 (defvar sha1-H0-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
216 (defvar sha1-H0-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
217 (defvar sha1-H1-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
218 (defvar sha1-H1-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
219 (defvar sha1-H2-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
220 (defvar sha1-H2-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
221 (defvar sha1-H3-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
222 (defvar sha1-H3-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
223 (defvar sha1-H4-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
224 (defvar sha1-H4-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
225
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
226 (defun sha1-block (block-high block-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
227 (let (;; step (c) --- initialize buffers (A B C D E).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
228 (sha1-A-high sha1-H0-high) (sha1-A-low sha1-H0-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
229 (sha1-B-high sha1-H1-high) (sha1-B-low sha1-H1-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
230 (sha1-C-high sha1-H2-high) (sha1-C-low sha1-H2-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
231 (sha1-D-high sha1-H3-high) (sha1-D-low sha1-H3-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
232 (sha1-E-high sha1-H4-high) (sha1-E-low sha1-H4-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
233 (idx 16))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
234 ;; step (b).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
235 (let (;; temporary variables used in sha1-S1 macro.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
236 S1W-high S1W-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
237 (while (< idx 80)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
238 (sha1-S1 (logxor (aref block-high (- idx 3))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
239 (aref block-high (- idx 8))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
240 (aref block-high (- idx 14))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
241 (aref block-high (- idx 16)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
242 (logxor (aref block-low (- idx 3))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
243 (aref block-low (- idx 8))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
244 (aref block-low (- idx 14))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
245 (aref block-low (- idx 16))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
246 (aset block-high idx S1W-high)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
247 (aset block-low idx S1W-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
248 (setq idx (1+ idx))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
249 ;; step (d).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
250 (setq idx 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
251 (let (;; temporary variables used in sha1-OP macro.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
252 S5A-high S5A-low S30B-high S30B-low carry)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
253 (while (< idx 20) (sha1-OP 0) (setq idx (1+ idx)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
254 (while (< idx 40) (sha1-OP 1) (setq idx (1+ idx)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
255 (while (< idx 60) (sha1-OP 2) (setq idx (1+ idx)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
256 (while (< idx 80) (sha1-OP 3) (setq idx (1+ idx))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
257 ;; step (e).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
258 (let (;; temporary variables used in sha1-add-to-H macro.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
259 carry)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
260 (sha1-add-to-H H0 A)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
261 (sha1-add-to-H H1 B)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
262 (sha1-add-to-H H2 C)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
263 (sha1-add-to-H H3 D)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
264 (sha1-add-to-H H4 E))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
265
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
266 (defun sha1-binary (string)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
267 "Return the SHA1 of STRING in binary form."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
268 (let (;; prepare buffers for a block. byte-length of block is 64.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
269 ;; input block is split into two vectors.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
270 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
271 ;; input block: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ...
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
272 ;; block-high: +-0-+ +-1-+ +-2-+ +-3-+
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
273 ;; block-low: +-0-+ +-1-+ +-2-+ +-3-+
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
274 ;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
275 ;; length of each vector is 80, and elements of each vector are
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
276 ;; 16bit integers. elements 0x10-0x4F of each vector are
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
277 ;; assigned later in `sha1-block'.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
278 (block-high (eval-when-compile (make-vector 80 nil)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
279 (block-low (eval-when-compile (make-vector 80 nil))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
280 (unwind-protect
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
281 (let* (;; byte-length of input string.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
282 (len (length string))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
283 (lim (* (/ len 64) 64))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
284 (rem (% len 4))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
285 (idx 0)(pos 0))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
286 ;; initialize buffers (H0 H1 H2 H3 H4).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
287 (setq sha1-H0-high 26437 ; (string-to-number "6745" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
288 sha1-H0-low 8961 ; (string-to-number "2301" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
289 sha1-H1-high 61389 ; (string-to-number "EFCD" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
290 sha1-H1-low 43913 ; (string-to-number "AB89" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
291 sha1-H2-high 39098 ; (string-to-number "98BA" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
292 sha1-H2-low 56574 ; (string-to-number "DCFE" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
293 sha1-H3-high 4146 ; (string-to-number "1032" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
294 sha1-H3-low 21622 ; (string-to-number "5476" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
295 sha1-H4-high 50130 ; (string-to-number "C3D2" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
296 sha1-H4-low 57840) ; (string-to-number "E1F0" 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
297 ;; loop for each 64 bytes block.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
298 (while (< pos lim)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
299 ;; step (a).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
300 (setq idx 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
301 (while (< idx 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
302 (aset block-high idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
303 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
304 (setq pos (+ pos 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
305 (aset block-low idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
306 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
307 (setq pos (+ pos 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
308 (setq idx (1+ idx)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
309 (sha1-block block-high block-low))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
310 ;; last block.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
311 (if (prog1
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
312 (< (- len lim) 56)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
313 (setq lim (- len rem))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
314 (setq idx 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
315 (while (< pos lim)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
316 (aset block-high idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
317 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
318 (setq pos (+ pos 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
319 (aset block-low idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
320 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
321 (setq pos (+ pos 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
322 (setq idx (1+ idx)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
323 ;; this is the last (at most) 32bit word.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
324 (cond
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
325 ((= rem 3)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
326 (aset block-high idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
327 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
328 (setq pos (+ pos 2))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
329 (aset block-low idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
330 128)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
331 ((= rem 2)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
332 (aset block-high idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
333 (aref string (1+ pos))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
334 (aset block-low idx 32768))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
335 ((= rem 1)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
336 (aset block-high idx (+ (* (aref string pos) 256)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
337 128))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
338 (aset block-low idx 0))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
339 (t ;; (= rem 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
340 (aset block-high idx 32768)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
341 (aset block-low idx 0)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
342 (setq idx (1+ idx))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
343 (while (< idx 16)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
344 (aset block-high idx 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
345 (aset block-low idx 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
346 (setq idx (1+ idx))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
347 ;; last block has enough room to write the length of string.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
348 (progn
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
349 ;; write bit length of string to last 4 bytes of the block.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
350 (aset block-low 15 (* (% len 8192) 8))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
351 (setq len (/ len 8192))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
352 (aset block-high 15 (% len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
353 ;; XXX: It is not practical to compute SHA1 of
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
354 ;; such a huge message on emacs.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
355 ;; (setq len (/ len 65536)) ; for 64bit emacs.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
356 ;; (aset block-low 14 (% len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
357 ;; (aset block-high 14 (/ len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
358 (sha1-block block-high block-low))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
359 ;; need one more block.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
360 (sha1-block block-high block-low)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
361 (fillarray block-high 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
362 (fillarray block-low 0)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
363 ;; write bit length of string to last 4 bytes of the block.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
364 (aset block-low 15 (* (% len 8192) 8))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
365 (setq len (/ len 8192))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
366 (aset block-high 15 (% len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
367 ;; XXX: It is not practical to compute SHA1 of
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
368 ;; such a huge message on emacs.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
369 ;; (setq len (/ len 65536)) ; for 64bit emacs.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
370 ;; (aset block-low 14 (% len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
371 ;; (aset block-high 14 (/ len 65536))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
372 (sha1-block block-high block-low))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
373 ;; make output string (in binary form).
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
374 (let ((result (make-string 20 0)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
375 (aset result 0 (/ sha1-H0-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
376 (aset result 1 (% sha1-H0-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
377 (aset result 2 (/ sha1-H0-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
378 (aset result 3 (% sha1-H0-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
379 (aset result 4 (/ sha1-H1-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
380 (aset result 5 (% sha1-H1-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
381 (aset result 6 (/ sha1-H1-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
382 (aset result 7 (% sha1-H1-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
383 (aset result 8 (/ sha1-H2-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
384 (aset result 9 (% sha1-H2-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
385 (aset result 10 (/ sha1-H2-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
386 (aset result 11 (% sha1-H2-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
387 (aset result 12 (/ sha1-H3-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
388 (aset result 13 (% sha1-H3-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
389 (aset result 14 (/ sha1-H3-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
390 (aset result 15 (% sha1-H3-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
391 (aset result 16 (/ sha1-H4-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
392 (aset result 17 (% sha1-H4-high 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
393 (aset result 18 (/ sha1-H4-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
394 (aset result 19 (% sha1-H4-low 256))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
395 result))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
396 ;; do not leave a copy of input string.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
397 (fillarray block-high nil)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
398 (fillarray block-low nil))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
399
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
400 (defun sha1-string-internal (string &optional binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
401 (if binary
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
402 (sha1-binary string)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
403 (encode-hex-string (sha1-binary string))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
404
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
405 (defun sha1-region-internal (beg end &optional binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
406 (sha1-string-internal (buffer-substring-no-properties beg end) binary))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
407
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
408 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
409 ;;; application interface.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
410 ;;;
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
411
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
412 (defun sha1-region (beg end &optional binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
413 (if (and sha1-use-external
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
414 sha1-maximum-internal-length
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
415 (> (abs (- end beg)) sha1-maximum-internal-length))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
416 (sha1-region-external beg end binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
417 (sha1-region-internal beg end binary)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
418
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
419 (defun sha1-string (string &optional binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
420 (if (and sha1-use-external
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
421 sha1-maximum-internal-length
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
422 (> (length string) sha1-maximum-internal-length))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
423 (sha1-string-external string binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
424 (sha1-string-internal string binary)))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
425
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
426 ;;;###autoload
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
427 (defun sha1 (object &optional beg end binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
428 "Return the SHA1 (Secure Hash Algorithm) of an object.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
429 OBJECT is either a string or a buffer.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
430 Optional arguments BEG and END denote buffer positions for computing the
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
431 hash of a portion of OBJECT.
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
432 If BINARY is non-nil, return a string in binary form."
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
433 (if (stringp object)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
434 (sha1-string object binary)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
435 (with-current-buffer object
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
436 (sha1-region (or beg (point-min)) (or end (point-max)) binary))))
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
437
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
438 (provide 'sha1)
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
439
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
440 ;; arch-tag: c0f9abd0-ffc1-4557-aac6-ece7f2d4c901
f7d29ef23ff8 Move here from gnus/.
Glenn Morris <rgm@gnu.org>
parents:
diff changeset
441 ;;; sha1.el ends here