annotate src/md5.c @ 51242:661e2fe7e775

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