annotate src/md5.c @ 99492:ee792794d888

(isearch-search-fun): Compare the length of the current search string with the length of the string from the previous search state to detect the situation when the user adds or removes characters in the search string. Use word-search-forward-lax and word-search-backward-lax in this case, and otherwise word-search-forward and word-search-backward.
author Juri Linkov <juri@jurta.org>
date Tue, 11 Nov 2008 19:43:09 +0000
parents fd635b03dbe5
children aec1143e8d85
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1 /* Functions to compute MD5 message digest of files or memory blocks.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
2 according to the definition of MD5 in RFC 1321 from April 1992.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 72951
diff changeset
3 Copyright (C) 1995, 1996, 1997, 1999, 2000, 2001, 2002, 2003, 2004,
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 72951
diff changeset
4 2005, 2006, 2007 Free Software Foundation, Inc.
94960
fd635b03dbe5 Mark as part of the GNU C Library rather than of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
5
fd635b03dbe5 Mark as part of the GNU C Library rather than of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
6 This file is part of the GNU C Library.
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
7
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8 The GNU C Library is free software; you can redistribute it and/or
72951
751c24f0ec88 Replace "GNU Library General Public License" by "GNU General Public
Jay Belanger <jay.p.belanger@gmail.com>
parents: 68651
diff changeset
9 modify it under the terms of the GNU General Public License as
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
10 published by the Free Software Foundation; either version 2 of the
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
11 License, or (at your option) any later version.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
12
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
13 The GNU C Library is distributed in the hope that it will be useful,
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
72951
751c24f0ec88 Replace "GNU Library General Public License" by "GNU General Public
Jay Belanger <jay.p.belanger@gmail.com>
parents: 68651
diff changeset
16 General Public License for more details.
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17
94960
fd635b03dbe5 Mark as part of the GNU C Library rather than of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
18 You should have received a copy of the GNU General Public License
fd635b03dbe5 Mark as part of the GNU C Library rather than of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
19 along with the GNU C Library; see the file COPYING. If not, write to the
fd635b03dbe5 Mark as part of the GNU C Library rather than of Emacs.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
20 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
21 Boston, MA 02110-1301, USA. */
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
22
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25 #ifdef HAVE_CONFIG_H
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 # include <config.h>
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 #endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 #include <sys/types.h>
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 #if STDC_HEADERS || defined _LIBC
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 # include <stdlib.h>
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 # include <string.h>
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 #else
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 # ifndef HAVE_MEMCPY
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 # define memcpy(d, s, n) bcopy ((s), (d), (n))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 # endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 #endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 #ifdef _LIBC
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41 # include <endian.h>
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42 # if __BYTE_ORDER == __BIG_ENDIAN
35292
a0b80b4a7fa1 (WORDS_BIG_ENDIAN) [__BYTE_ORDER == __BIG_ENDIAN]: Define
Kenichi Handa <handa@m17n.org>
parents: 34249
diff changeset
43 # define WORDS_BIG_ENDIAN 1
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 # endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 /* We need to keep the namespace clean so define the MD5 function
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 protected using leading __ . */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 # define md5_init_ctx __md5_init_ctx
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 # define md5_process_block __md5_process_block
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 # define md5_process_bytes __md5_process_bytes
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 # define md5_finish_ctx __md5_finish_ctx
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 # define md5_read_ctx __md5_read_ctx
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 # define md5_stream __md5_stream
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 # define md5_buffer __md5_buffer
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 #endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55
34230
1aff490f2518 Delay include of md5.h until after namespace cleaning.
Jason Rumney <jasonr@gnu.org>
parents: 34054
diff changeset
56 #include "md5.h"
1aff490f2518 Delay include of md5.h until after namespace cleaning.
Jason Rumney <jasonr@gnu.org>
parents: 34054
diff changeset
57
35292
a0b80b4a7fa1 (WORDS_BIG_ENDIAN) [__BYTE_ORDER == __BIG_ENDIAN]: Define
Kenichi Handa <handa@m17n.org>
parents: 34249
diff changeset
58 #ifdef WORDS_BIG_ENDIAN
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 # define SWAP(n) \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 #else
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
62 # define SWAP(n) (n)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
63 #endif
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
64
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
65
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 /* This array contains the bytes used to pad the buffer to the next
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 64-byte boundary. (RFC 1321, 3.1: Step 1) */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71 /* Initialize structure containing state of computation.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 (RFC 1321, 3.3: Step 3) */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 void
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 md5_init_ctx (ctx)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 struct md5_ctx *ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 ctx->A = 0x67452301;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 ctx->B = 0xefcdab89;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 ctx->C = 0x98badcfe;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 ctx->D = 0x10325476;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 ctx->total[0] = ctx->total[1] = 0;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 ctx->buflen = 0;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 /* Put result from CTX in first 16 bytes following RESBUF. The result
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 must be in little endian byte order.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 IMPORTANT: On some systems it is required that RESBUF is correctly
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 aligned for a 32 bits value. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 void *
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 md5_read_ctx (ctx, resbuf)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 const struct md5_ctx *ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 void *resbuf;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 return resbuf;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 /* Process the remaining bytes in the internal buffer and the usual
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 prolog according to the standard and write the result to RESBUF.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 IMPORTANT: On some systems it is required that RESBUF is correctly
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 aligned for a 32 bits value. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 void *
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 md5_finish_ctx (ctx, resbuf)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 struct md5_ctx *ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 void *resbuf;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 /* Take yet unprocessed bytes into account. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 md5_uint32 bytes = ctx->buflen;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 size_t pad;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 /* Now count remaining bytes. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119 ctx->total[0] += bytes;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 if (ctx->total[0] < bytes)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
121 ++ctx->total[1];
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
122
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 memcpy (&ctx->buffer[bytes], fillbuf, pad);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
126 /* Put the 64-bit file length in *bits* at the end of the buffer. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128 *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 (ctx->total[0] >> 29));
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 /* Process last bytes. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
132 md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
133
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 return md5_read_ctx (ctx, resbuf);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
137 /* Compute MD5 message digest for bytes read from STREAM. The
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
138 resulting message digest number will be written into the 16 bytes
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 beginning at RESBLOCK. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
140 int
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
141 md5_stream (stream, resblock)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
142 FILE *stream;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
143 void *resblock;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
144 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 /* Important: BLOCKSIZE must be a multiple of 64. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 #define BLOCKSIZE 4096
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147 struct md5_ctx ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 char buffer[BLOCKSIZE + 72];
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
149 size_t sum;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 /* Initialize the computation context. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 md5_init_ctx (&ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
153
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
154 /* Iterate over full file contents. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
155 while (1)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158 computation function processes the whole buffer so that with the
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 next round of the loop another block can be read. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
160 size_t n;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 sum = 0;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 /* Read block. Take care for partial reads. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 do
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166 n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
168 sum += n;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 while (sum < BLOCKSIZE && n != 0);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 if (n == 0 && ferror (stream))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172 return 1;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
174 /* If end of file is reached, end the loop. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 if (n == 0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 break;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 /* Process buffer with BLOCKSIZE bytes. Note that
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 BLOCKSIZE % 64 == 0
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 md5_process_block (buffer, BLOCKSIZE, &ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 /* Add the last bytes if necessary. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
185 if (sum > 0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 md5_process_bytes (buffer, sum, &ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 /* Construct result in desired memory. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189 md5_finish_ctx (&ctx, resblock);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 return 0;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
191 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 result is always in little endian byte order, so that a byte-wise
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 output yields to the wanted ASCII representation of the message
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 digest. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197 void *
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 md5_buffer (buffer, len, resblock)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
199 const char *buffer;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 size_t len;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 void *resblock;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 struct md5_ctx ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 /* Initialize the computation context. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 md5_init_ctx (&ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208 /* Process whole buffer but last len % 64 bytes. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
209 md5_process_bytes (buffer, len, &ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 /* Put result in desired memory area. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 return md5_finish_ctx (&ctx, resblock);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 void
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 md5_process_bytes (buffer, len, ctx)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218 const void *buffer;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 size_t len;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220 struct md5_ctx *ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
221 {
34249
e1f215aaf449 Fix C++-style comment.
Dave Love <fx@gnu.org>
parents: 34230
diff changeset
222 /* const void aligned_buffer = buffer; */
34054
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224 /* When we already have some bits in our internal buffer concatenate
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 both inputs first. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226 if (ctx->buflen != 0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228 size_t left_over = ctx->buflen;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 size_t add = 128 - left_over > len ? len : 128 - left_over;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 /* Only put full words in the buffer. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 add -= add % __alignof__ (md5_uint32);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 memcpy (&ctx->buffer[left_over], buffer, add);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 ctx->buflen += add;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237 if (ctx->buflen > 64)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
239 md5_process_block (ctx->buffer, ctx->buflen & ~63, ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 ctx->buflen &= 63;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 /* The regions in the following copy operation cannot overlap. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244 ctx->buflen);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 buffer = (const char *) buffer + add;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 len -= add;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
251 /* Process available complete blocks. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
252 if (len > 64)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254 md5_process_block (buffer, len & ~63, ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255 buffer = (const char *) buffer + (len & ~63);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 len &= 63;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 /* Move remaining bytes in internal buffer. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 if (len > 0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 size_t left_over = ctx->buflen;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 memcpy (&ctx->buffer[left_over], buffer, len);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265 left_over += len;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266 if (left_over >= 64)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
267 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 md5_process_block (ctx->buffer, 64, ctx);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 left_over -= 64;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 memcpy (ctx->buffer, &ctx->buffer[64], left_over);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 ctx->buflen = left_over;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277 /* These are the four functions used in the four steps of the MD5 algorithm
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 and defined in the RFC 1321. The first function is a little bit optimized
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
279 (as found in Colin Plumbs public domain implementation). */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 /* #define FF(b, c, d) ((b & c) | (~b & d)) */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 #define FF(b, c, d) (d ^ (b & (c ^ d)))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282 #define FG(b, c, d) FF (d, b, c)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 #define FH(b, c, d) (b ^ c ^ d)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
284 #define FI(b, c, d) (c ^ (b | ~d))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
285
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
286 /* Process LEN bytes of BUFFER, accumulating context into CTX.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
287 It is assumed that LEN % 64 == 0. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
288
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289 void
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 md5_process_block (buffer, len, ctx)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 const void *buffer;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 size_t len;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
293 struct md5_ctx *ctx;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 md5_uint32 correct_words[16];
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296 const md5_uint32 *words = buffer;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 size_t nwords = len / sizeof (md5_uint32);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
298 const md5_uint32 *endp = words + nwords;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 md5_uint32 A = ctx->A;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 md5_uint32 B = ctx->B;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301 md5_uint32 C = ctx->C;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 md5_uint32 D = ctx->D;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 /* First increment the byte count. RFC 1321 specifies the possible
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 length of the file up to 2^64 bits. Here we only compute the
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
306 number of bytes. Do a double word increment. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 ctx->total[0] += len;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 if (ctx->total[0] < len)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 ++ctx->total[1];
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
311 /* Process all bytes in the buffer with 64 bytes in each round of
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
312 the loop. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
313 while (words < endp)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
314 {
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
315 md5_uint32 *cwp = correct_words;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
316 md5_uint32 A_save = A;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
317 md5_uint32 B_save = B;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
318 md5_uint32 C_save = C;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
319 md5_uint32 D_save = D;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
320
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
321 /* First round: using the given function, the context and a constant
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
322 the next context is computed. Because the algorithms processing
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
323 unit is a 32-bit word and it is determined to work on words in
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
324 little endian byte order we perhaps have to change the byte order
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
325 before the computation. To reduce the work for the next steps
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
326 we store the swapped words in the array CORRECT_WORDS. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
327
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
328 #define OP(a, b, c, d, s, T) \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 do \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330 { \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332 ++words; \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 CYCLIC (a, s); \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 a += b; \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 } \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336 while (0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338 /* It is unfortunate that C does not provide an operator for
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 cyclic rotation. Hope the C compiler is smart enough. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 #define CYCLIC(w, s) (w = (w << s) | (w >> (32 - s)))
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 /* Before we start, one word to the strange constants.
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 They are defined in RFC 1321 as
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 /* Round 1. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 OP (A, B, C, D, 7, 0xd76aa478);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 OP (D, A, B, C, 12, 0xe8c7b756);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351 OP (C, D, A, B, 17, 0x242070db);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 OP (B, C, D, A, 22, 0xc1bdceee);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
353 OP (A, B, C, D, 7, 0xf57c0faf);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
354 OP (D, A, B, C, 12, 0x4787c62a);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
355 OP (C, D, A, B, 17, 0xa8304613);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
356 OP (B, C, D, A, 22, 0xfd469501);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
357 OP (A, B, C, D, 7, 0x698098d8);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
358 OP (D, A, B, C, 12, 0x8b44f7af);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
359 OP (C, D, A, B, 17, 0xffff5bb1);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
360 OP (B, C, D, A, 22, 0x895cd7be);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
361 OP (A, B, C, D, 7, 0x6b901122);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
362 OP (D, A, B, C, 12, 0xfd987193);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
363 OP (C, D, A, B, 17, 0xa679438e);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
364 OP (B, C, D, A, 22, 0x49b40821);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
365
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
366 /* For the second to fourth round we have the possibly swapped words
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
367 in CORRECT_WORDS. Redefine the macro to take an additional first
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
368 argument specifying the function to use. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
369 #undef OP
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
370 #define OP(f, a, b, c, d, k, s, T) \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
371 do \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
372 { \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
373 a += f (b, c, d) + correct_words[k] + T; \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
374 CYCLIC (a, s); \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
375 a += b; \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
376 } \
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
377 while (0)
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
378
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
379 /* Round 2. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
380 OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
381 OP (FG, D, A, B, C, 6, 9, 0xc040b340);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
382 OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
383 OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
384 OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
385 OP (FG, D, A, B, C, 10, 9, 0x02441453);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
386 OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
387 OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
388 OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
389 OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
390 OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
391 OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
392 OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
393 OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
394 OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
395 OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
396
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
397 /* Round 3. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
398 OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
399 OP (FH, D, A, B, C, 8, 11, 0x8771f681);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
400 OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
401 OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
402 OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
403 OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
404 OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
405 OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
406 OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
407 OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
408 OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
409 OP (FH, B, C, D, A, 6, 23, 0x04881d05);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
410 OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
411 OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
412 OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
413 OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
414
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
415 /* Round 4. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
416 OP (FI, A, B, C, D, 0, 6, 0xf4292244);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
417 OP (FI, D, A, B, C, 7, 10, 0x432aff97);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
418 OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
419 OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
420 OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
421 OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
422 OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
423 OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
424 OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
425 OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
426 OP (FI, C, D, A, B, 6, 15, 0xa3014314);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
427 OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
428 OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
429 OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
430 OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
431 OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
432
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
433 /* Add the starting values of the context. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
434 A += A_save;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
435 B += B_save;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
436 C += C_save;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
437 D += D_save;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
438 }
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
439
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
440 /* Put checksum in context given as argument. */
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
441 ctx->A = A;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
442 ctx->B = B;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
443 ctx->C = C;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
444 ctx->D = D;
da7a782777bc *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
445 }
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 35292
diff changeset
446
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 35292
diff changeset
447 /* arch-tag: 60084f04-b434-42cb-9d2b-e91df01f4325
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 35292
diff changeset
448 (do not change this comment) */