annotate src/md5.c @ 69478:e8bb5df2ba7a

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