annotate md5.c @ 6:e5663591d13c src

gettimeofday() doesn't exist in windows, but recent mingw32 runtime include a replacement that clashes with mingw32's one. This patch will check for it in configure.ac and define the private function only if gettimeofday() is not defined. Patch by Rafael Carr (funman videolan org)
author nicodvb
date Thu, 05 Jun 2008 08:52:00 +0000
parents fdbae45c30fc
children 4aa618ae094f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
1 /* md5.c - Functions to compute MD5 message digest of files or memory blocks
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
2 according to the definition of MD5 in RFC 1321 from April 1992.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
3 Copyright (C) 1995, 1996, 2001 Free Software Foundation, Inc.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
4 NOTE: The canonical source of this file is maintained with the GNU C
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
5 Library. Bugs can be reported to bug-glibc@prep.ai.mit.edu.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
6
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
7 This program is free software; you can redistribute it and/or modify it
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
8 under the terms of the GNU General Public License as published by the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
9 Free Software Foundation; either version 2, or (at your option) any
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
10 later version.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
11
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
12 This program is distributed in the hope that it will be useful,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
15 GNU General Public License for more details.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
16
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
18 along with this program; if not, write to the Free Software Foundation,
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
19 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
20
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
21 /* Written by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
22
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
23 #ifdef HAVE_CONFIG_H
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
24 # include <config.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
25 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
26
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
27 #include <sys/types.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
28
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
29 #include <stdlib.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
30 #include <string.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
31
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
32 #include "md5.h"
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
33 /* #include "unlocked-io.h" */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
34
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
35 #ifdef _LIBC
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
36 # include <endian.h>
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
37 # if __BYTE_ORDER == __BIG_ENDIAN
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
38 # define WORDS_BIGENDIAN 1
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
39 # endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
40 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
41
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
42 #ifdef WORDS_BIGENDIAN
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
43 # define SWAP(n) \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
44 (((n) << 24) | (((n) & 0xff00) << 8) | (((n) >> 8) & 0xff00) | ((n) >> 24))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
45 #else
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
46 # define SWAP(n) (n)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
47 #endif
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
48
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
49
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
50 /* This array contains the bytes used to pad the buffer to the next
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
51 64-byte boundary. (RFC 1321, 3.1: Step 1) */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
52 static const unsigned char fillbuf[64] = { 0x80, 0 /* , 0, 0, ... */ };
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
53
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
54
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
55 /* Initialize structure containing state of computation.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
56 (RFC 1321, 3.3: Step 3) */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
57 void
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
58 md5_init_ctx (ctx)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
59 struct md5_ctx *ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
60 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
61 ctx->A = 0x67452301;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
62 ctx->B = 0xefcdab89;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
63 ctx->C = 0x98badcfe;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
64 ctx->D = 0x10325476;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
65
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
66 ctx->total[0] = ctx->total[1] = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
67 ctx->buflen = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
68 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
69
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
70 /* Put result from CTX in first 16 bytes following RESBUF. The result
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
71 must be in little endian byte order.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
72
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
73 IMPORTANT: On some systems it is required that RESBUF is correctly
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
74 aligned for a 32 bits value. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
75 void *
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
76 md5_read_ctx (ctx, resbuf)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
77 const struct md5_ctx *ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
78 void *resbuf;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
79 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
80 ((md5_uint32 *) resbuf)[0] = SWAP (ctx->A);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
81 ((md5_uint32 *) resbuf)[1] = SWAP (ctx->B);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
82 ((md5_uint32 *) resbuf)[2] = SWAP (ctx->C);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
83 ((md5_uint32 *) resbuf)[3] = SWAP (ctx->D);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
84
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
85 return resbuf;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
86 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
87
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
88 /* Process the remaining bytes in the internal buffer and the usual
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
89 prolog according to the standard and write the result to RESBUF.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
90
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
91 IMPORTANT: On some systems it is required that RESBUF is correctly
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
92 aligned for a 32 bits value. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
93 void *
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
94 md5_finish_ctx (ctx, resbuf)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
95 struct md5_ctx *ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
96 void *resbuf;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
97 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
98 /* Take yet unprocessed bytes into account. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
99 md5_uint32 bytes = ctx->buflen;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
100 size_t pad;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
101
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
102 /* Now count remaining bytes. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
103 ctx->total[0] += bytes;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
104 if (ctx->total[0] < bytes)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
105 ++ctx->total[1];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
106
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
107 pad = bytes >= 56 ? 64 + 56 - bytes : 56 - bytes;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
108 memcpy (&ctx->buffer[bytes], fillbuf, pad);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
109
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
110 /* Put the 64-bit file length in *bits* at the end of the buffer. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
111 *(md5_uint32 *) &ctx->buffer[bytes + pad] = SWAP (ctx->total[0] << 3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
112 *(md5_uint32 *) &ctx->buffer[bytes + pad + 4] = SWAP ((ctx->total[1] << 3) |
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
113 (ctx->total[0] >> 29));
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
114
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
115 /* Process last bytes. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
116 md5_process_block (ctx->buffer, bytes + pad + 8, ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
117
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
118 return md5_read_ctx (ctx, resbuf);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
119 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
120
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
121 /* Compute MD5 message digest for bytes read from STREAM. The
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
122 resulting message digest number will be written into the 16 bytes
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
123 beginning at RESBLOCK. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
124 int
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
125 md5_stream (stream, resblock)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
126 FILE *stream;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
127 void *resblock;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
128 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
129 /* Important: BLOCKSIZE must be a multiple of 64. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
130 #define BLOCKSIZE 4096
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
131 struct md5_ctx ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
132 char buffer[BLOCKSIZE + 72];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
133 size_t sum;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
134
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
135 /* Initialize the computation context. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
136 md5_init_ctx (&ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
137
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
138 /* Iterate over full file contents. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
139 while (1)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
140 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
141 /* We read the file in blocks of BLOCKSIZE bytes. One call of the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
142 computation function processes the whole buffer so that with the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
143 next round of the loop another block can be read. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
144 size_t n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
145 sum = 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
146
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
147 /* Read block. Take care for partial reads. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
148 do
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
149 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
150 n = fread (buffer + sum, 1, BLOCKSIZE - sum, stream);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
151
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
152 sum += n;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
153 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
154 while (sum < BLOCKSIZE && n != 0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
155 if (n == 0 && ferror (stream))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
156 return 1;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
157
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
158 /* If end of file is reached, end the loop. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
159 if (n == 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
160 break;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
161
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
162 /* Process buffer with BLOCKSIZE bytes. Note that
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
163 BLOCKSIZE % 64 == 0
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
164 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
165 md5_process_block (buffer, BLOCKSIZE, &ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
166 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
167
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
168 /* Add the last bytes if necessary. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
169 if (sum > 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
170 md5_process_bytes (buffer, sum, &ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
171
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
172 /* Construct result in desired memory. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
173 md5_finish_ctx (&ctx, resblock);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
174 return 0;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
175 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
176
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
177 /* Compute MD5 message digest for LEN bytes beginning at BUFFER. The
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
178 result is always in little endian byte order, so that a byte-wise
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
179 output yields to the wanted ASCII representation of the message
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
180 digest. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
181 void *
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
182 md5_buffer (buffer, len, resblock)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
183 const char *buffer;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
184 size_t len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
185 void *resblock;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
186 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
187 struct md5_ctx ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
188
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
189 /* Initialize the computation context. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
190 md5_init_ctx (&ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
191
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
192 /* Process whole buffer but last len % 64 bytes. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
193 md5_process_bytes (buffer, len, &ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
194
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
195 /* Put result in desired memory area. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
196 return md5_finish_ctx (&ctx, resblock);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
197 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
198
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
199
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
200 void
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
201 md5_process_bytes (buffer, len, ctx)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
202 const void *buffer;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
203 size_t len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
204 struct md5_ctx *ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
205 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
206 /* When we already have some bits in our internal buffer concatenate
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
207 both inputs first. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
208 if (ctx->buflen != 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
209 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
210 size_t left_over = ctx->buflen;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
211 size_t add = 128 - left_over > len ? len : 128 - left_over;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
212
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
213 memcpy (&ctx->buffer[left_over], buffer, add);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
214 ctx->buflen += add;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
215
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
216 if (left_over + add > 64)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
217 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
218 md5_process_block (ctx->buffer, (left_over + add) & ~63, ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
219 /* The regions in the following copy operation cannot overlap. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
220 memcpy (ctx->buffer, &ctx->buffer[(left_over + add) & ~63],
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
221 (left_over + add) & 63);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
222 ctx->buflen = (left_over + add) & 63;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
223 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
224
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
225 buffer = (const char *) buffer + add;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
226 len -= add;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
227 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
228
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
229 /* Process available complete blocks. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
230 if (len > 64)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
231 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
232 md5_process_block (buffer, len & ~63, ctx);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
233 buffer = (const char *) buffer + (len & ~63);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
234 len &= 63;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
235 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
236
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
237 /* Move remaining bytes in internal buffer. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
238 if (len > 0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
239 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
240 memcpy (ctx->buffer, buffer, len);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
241 ctx->buflen = len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
242 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
243 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
244
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
245
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
246 /* These are the four functions used in the four steps of the MD5 algorithm
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
247 and defined in the RFC 1321. The first function is a little bit optimized
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
248 (as found in Colin Plumbs public domain implementation). */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
249 /* #define FF(b, c, d) ((b & c) | (~b & d)) */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
250 #define FF(b, c, d) (d ^ (b & (c ^ d)))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
251 #define FG(b, c, d) FF (d, b, c)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
252 #define FH(b, c, d) (b ^ c ^ d)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
253 #define FI(b, c, d) (c ^ (b | ~d))
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
254
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
255 /* Process LEN bytes of BUFFER, accumulating context into CTX.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
256 It is assumed that LEN % 64 == 0. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
257
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
258 void
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
259 md5_process_block (buffer, len, ctx)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
260 const void *buffer;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
261 size_t len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
262 struct md5_ctx *ctx;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
263 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
264 md5_uint32 correct_words[16];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
265 const md5_uint32 *words = buffer;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
266 size_t nwords = len / sizeof (md5_uint32);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
267 const md5_uint32 *endp = words + nwords;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
268 md5_uint32 A = ctx->A;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
269 md5_uint32 B = ctx->B;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
270 md5_uint32 C = ctx->C;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
271 md5_uint32 D = ctx->D;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
272
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
273 /* First increment the byte count. RFC 1321 specifies the possible
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
274 length of the file up to 2^64 bits. Here we only compute the
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
275 number of bytes. Do a double word increment. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
276 ctx->total[0] += len;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
277 if (ctx->total[0] < len)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
278 ++ctx->total[1];
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
279
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
280 /* Process all bytes in the buffer with 64 bytes in each round of
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
281 the loop. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
282 while (words < endp)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
283 {
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
284 md5_uint32 *cwp = correct_words;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
285 md5_uint32 A_save = A;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
286 md5_uint32 B_save = B;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
287 md5_uint32 C_save = C;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
288 md5_uint32 D_save = D;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
289
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
290 /* First round: using the given function, the context and a constant
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
291 the next context is computed. Because the algorithms processing
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
292 unit is a 32-bit word and it is determined to work on words in
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
293 little endian byte order we perhaps have to change the byte order
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
294 before the computation. To reduce the work for the next steps
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
295 we store the swapped words in the array CORRECT_WORDS. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
296
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
297 #define OP(a, b, c, d, s, T) \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
298 do \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
299 { \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
300 a += FF (b, c, d) + (*cwp++ = SWAP (*words)) + T; \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
301 ++words; \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
302 a = rol (a, s); \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
303 a += b; \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
304 } \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
305 while (0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
306
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
307 /* Before we start, one word to the strange constants.
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
308 They are defined in RFC 1321 as
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
309
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
310 T[i] = (int) (4294967296.0 * fabs (sin (i))), i=1..64, or
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
311 perl -e 'foreach(1..64){printf "0x%08x\n", int (4294967296 * abs (sin $_))}'
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
312 */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
313
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
314 /* Round 1. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
315 OP (A, B, C, D, 7, 0xd76aa478);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
316 OP (D, A, B, C, 12, 0xe8c7b756);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
317 OP (C, D, A, B, 17, 0x242070db);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
318 OP (B, C, D, A, 22, 0xc1bdceee);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
319 OP (A, B, C, D, 7, 0xf57c0faf);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
320 OP (D, A, B, C, 12, 0x4787c62a);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
321 OP (C, D, A, B, 17, 0xa8304613);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
322 OP (B, C, D, A, 22, 0xfd469501);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
323 OP (A, B, C, D, 7, 0x698098d8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
324 OP (D, A, B, C, 12, 0x8b44f7af);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
325 OP (C, D, A, B, 17, 0xffff5bb1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
326 OP (B, C, D, A, 22, 0x895cd7be);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
327 OP (A, B, C, D, 7, 0x6b901122);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
328 OP (D, A, B, C, 12, 0xfd987193);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
329 OP (C, D, A, B, 17, 0xa679438e);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
330 OP (B, C, D, A, 22, 0x49b40821);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
331
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
332 /* For the second to fourth round we have the possibly swapped words
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
333 in CORRECT_WORDS. Redefine the macro to take an additional first
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
334 argument specifying the function to use. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
335 #undef OP
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
336 #define OP(f, a, b, c, d, k, s, T) \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
337 do \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
338 { \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
339 a += f (b, c, d) + correct_words[k] + T; \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
340 a = rol (a, s); \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
341 a += b; \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
342 } \
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
343 while (0)
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
344
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
345 /* Round 2. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
346 OP (FG, A, B, C, D, 1, 5, 0xf61e2562);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
347 OP (FG, D, A, B, C, 6, 9, 0xc040b340);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
348 OP (FG, C, D, A, B, 11, 14, 0x265e5a51);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
349 OP (FG, B, C, D, A, 0, 20, 0xe9b6c7aa);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
350 OP (FG, A, B, C, D, 5, 5, 0xd62f105d);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
351 OP (FG, D, A, B, C, 10, 9, 0x02441453);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
352 OP (FG, C, D, A, B, 15, 14, 0xd8a1e681);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
353 OP (FG, B, C, D, A, 4, 20, 0xe7d3fbc8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
354 OP (FG, A, B, C, D, 9, 5, 0x21e1cde6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
355 OP (FG, D, A, B, C, 14, 9, 0xc33707d6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
356 OP (FG, C, D, A, B, 3, 14, 0xf4d50d87);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
357 OP (FG, B, C, D, A, 8, 20, 0x455a14ed);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
358 OP (FG, A, B, C, D, 13, 5, 0xa9e3e905);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
359 OP (FG, D, A, B, C, 2, 9, 0xfcefa3f8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
360 OP (FG, C, D, A, B, 7, 14, 0x676f02d9);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
361 OP (FG, B, C, D, A, 12, 20, 0x8d2a4c8a);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
362
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
363 /* Round 3. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
364 OP (FH, A, B, C, D, 5, 4, 0xfffa3942);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
365 OP (FH, D, A, B, C, 8, 11, 0x8771f681);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
366 OP (FH, C, D, A, B, 11, 16, 0x6d9d6122);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
367 OP (FH, B, C, D, A, 14, 23, 0xfde5380c);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
368 OP (FH, A, B, C, D, 1, 4, 0xa4beea44);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
369 OP (FH, D, A, B, C, 4, 11, 0x4bdecfa9);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
370 OP (FH, C, D, A, B, 7, 16, 0xf6bb4b60);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
371 OP (FH, B, C, D, A, 10, 23, 0xbebfbc70);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
372 OP (FH, A, B, C, D, 13, 4, 0x289b7ec6);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
373 OP (FH, D, A, B, C, 0, 11, 0xeaa127fa);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
374 OP (FH, C, D, A, B, 3, 16, 0xd4ef3085);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
375 OP (FH, B, C, D, A, 6, 23, 0x04881d05);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
376 OP (FH, A, B, C, D, 9, 4, 0xd9d4d039);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
377 OP (FH, D, A, B, C, 12, 11, 0xe6db99e5);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
378 OP (FH, C, D, A, B, 15, 16, 0x1fa27cf8);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
379 OP (FH, B, C, D, A, 2, 23, 0xc4ac5665);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
380
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
381 /* Round 4. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
382 OP (FI, A, B, C, D, 0, 6, 0xf4292244);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
383 OP (FI, D, A, B, C, 7, 10, 0x432aff97);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
384 OP (FI, C, D, A, B, 14, 15, 0xab9423a7);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
385 OP (FI, B, C, D, A, 5, 21, 0xfc93a039);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
386 OP (FI, A, B, C, D, 12, 6, 0x655b59c3);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
387 OP (FI, D, A, B, C, 3, 10, 0x8f0ccc92);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
388 OP (FI, C, D, A, B, 10, 15, 0xffeff47d);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
389 OP (FI, B, C, D, A, 1, 21, 0x85845dd1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
390 OP (FI, A, B, C, D, 8, 6, 0x6fa87e4f);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
391 OP (FI, D, A, B, C, 15, 10, 0xfe2ce6e0);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
392 OP (FI, C, D, A, B, 6, 15, 0xa3014314);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
393 OP (FI, B, C, D, A, 13, 21, 0x4e0811a1);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
394 OP (FI, A, B, C, D, 4, 6, 0xf7537e82);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
395 OP (FI, D, A, B, C, 11, 10, 0xbd3af235);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
396 OP (FI, C, D, A, B, 2, 15, 0x2ad7d2bb);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
397 OP (FI, B, C, D, A, 9, 21, 0xeb86d391);
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
398
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
399 /* Add the starting values of the context. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
400 A += A_save;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
401 B += B_save;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
402 C += C_save;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
403 D += D_save;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
404 }
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
405
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
406 /* Put checksum in context given as argument. */
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
407 ctx->A = A;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
408 ctx->B = B;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
409 ctx->C = C;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
410 ctx->D = D;
fdbae45c30fc moved to src/ the sources files
nicodvb
parents:
diff changeset
411 }