Bug Summary

File:rootdir/src/libs/ec/cpp/../../../../src/utils/mkFileSum.c
Warning:line 216, column 35
Access of 'PADDING' at an overflowing index, while it holds only 64 'unsigned char' elements

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name mkFileSum.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -pic-is-pie -mframe-pointer=all -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/rootdir/src/libs/ec/cpp -fcoverage-compilation-dir=/rootdir/src/libs/ec/cpp -resource-dir /usr/lib/llvm-19/lib/clang/19 -internal-isystem /usr/lib/llvm-19/lib/clang/19/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/14/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -ferror-limit 19 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2025-01-14-142857-17216-1 -x c ../../../../src/utils/mkFileSum.c
1/*
2 * This file is part of the aMule project.
3 *
4 * Copyright (c) 2003-2011 aMule Team ( admin@amule.org / http://www.amule.org )
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 */
20
21/*
22 * This program generates an md5sum from a C/C++ source file.
23 * Basic preprocessing is applied to the source (comment removal,
24 * whitespace normalization), so only real code change will result
25 * in md5sum change.
26 *
27 * Preprocessor code is written by Dévai Tamás (gonosztopi@amule.org)
28 * md5 code is taken from src/MD5Sum.cpp
29 *
30 * Usage: the program takes input from stdin and places output to stdout.
31 * This behaviour cannot be altered.
32 */
33
34#include <inttypes.h>
35#include <stdio.h>
36
37typedef unsigned char *POINTER;
38typedef uint16_t UINT2;
39typedef uint32_t UINT4;
40
41typedef struct {
42 UINT4 state[4];
43 UINT4 count[2];
44 unsigned char buffer[64];
45} MD5_CTX;
46
47void MD5Init(MD5_CTX *);
48void MD5Update(MD5_CTX *, const unsigned char *, unsigned int);
49void MD5Final(unsigned char [16], MD5_CTX *);
50
51
52const int table[][9] = {
53 { 0x0206, 0x0206, 0x0008, 0x0100, 0x0101, 0x0102, 0x000e, 0x0100, 0x00ff },
54 { 0x0101, 0x0101, 0x0101, 0x0101, 0x0100, 0x0101, 0x010b, 0x0101, 0x00ff },
55 { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0100, 0x010c, 0x0102, 0x00ff },
56 { 0x0003, 0x0003, 0x0003, 0x0009, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff },
57 { 0x0006, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x00ff },
58 { 0x0206, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x0005, 0x00ff },
59 { 0x0006, 0x0006, 0x0007, 0x0100, 0x0101, 0x0102, 0x000d, 0x0100, 0x00ff },
60 { 0x0606, 0x0606, 0x0004, 0x000f, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff },
61 { 0x0606, 0x0606, 0x0005, 0x0003, 0x0401, 0x0402, 0x050a, 0x0400, 0x04ff },
62 { 0x0003, 0x0003, 0x0000, 0x0003, 0x0003, 0x0003, 0x0003, 0x0003, 0x00ff },
63 { 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x0100, 0x00ff },
64 { 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x0101, 0x00ff },
65 { 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x0102, 0x00ff },
66 { 0x0006, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff },
67 { 0x0206, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x0800, 0x00ff },
68 { 0x000f, 0x000f, 0x000f, 0x0010, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff },
69 { 0x000f, 0x000f, 0x0006, 0x000f, 0x000f, 0x000f, 0x000f, 0x000f, 0x00ff }
70};
71
72int GetCharCode(int c)
73{
74 if (c == '\r' || c == '\n') return 0;
75 if (c == ' ' || c == '\t') return 1;
76 if (c == '/') return 2;
77 if (c == '*') return 3;
78 if (c == '\"') return 4;
79 if (c == '\'') return 5;
80 if (c == '\\') return 6;
81 if (c == EOF(-1)) return 8;
82 return 7;
83}
84
85int main()
86{
87 int state = 0;
88 MD5_CTX context;
89 unsigned char digest[16];
90 unsigned char buffer[1024];
91 int count = 0;
92
93 MD5Init(&context);
94
95 while (state != 0x00ff) {
1
Loop condition is true. Entering loop body
7
Loop condition is true. Entering loop body
13
Loop condition is false. Execution continues on line 116
96 int c = getchar();
97 state = table[state][GetCharCode(c)];
98 if (state & 0x0800) {
2
Taking false branch
8
Taking false branch
99 buffer[count++] = '\\';
100 }
101 if (state & 0x0400) {
3
Taking false branch
9
Taking false branch
102 buffer[count++] = '/';
103 }
104 if (state & 0x0200) {
4
Taking true branch
10
Taking false branch
105 buffer[count++] = ' ';
106 }
107 if (state & 0x0100) {
5
Taking false branch
11
Taking false branch
108 buffer[count++] = c;
109 }
110 state &= 0x00ff;
111 if (count
5.1
'count' is <= 1020
11.1
'count' is <= 1020
> 1020) {
6
Taking false branch
12
Taking false branch
112 MD5Update(&context, buffer, count);
113 count = 0;
114 }
115 }
116 MD5Update(&context, buffer, count);
117 MD5Final(digest, &context);
14
Calling 'MD5Final'
118 for (count = 0; count < 16; count++) printf("%02x", digest[count]);
119 putchar('\n');
120 return 0;
121}
122
123
124#define S117 7
125#define S1212 12
126#define S1317 17
127#define S1422 22
128#define S215 5
129#define S229 9
130#define S2314 14
131#define S2420 20
132#define S314 4
133#define S3211 11
134#define S3316 16
135#define S3423 23
136#define S416 6
137#define S4210 10
138#define S4315 15
139#define S4421 21
140
141static void MD5Transform (UINT4 [4], const unsigned char [64]);
142static void Encode (unsigned char *, UINT4 *, unsigned int);
143static void Decode (UINT4 *, const unsigned char *, unsigned int);
144static void MD5_memcpy (POINTER, POINTER, unsigned int);
145static void MD5_memset (POINTER, int, unsigned int);
146
147static unsigned char PADDING[64] = {
148 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
149 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
150 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
151};
152
153/* F, G, H and I are basic MD5 functions.
154 */
155#define F(x, y, z)(((x) & (y)) | ((~x) & (z))) (((x) & (y)) | ((~x) & (z)))
156#define G(x, y, z)(((x) & (z)) | ((y) & (~z))) (((x) & (z)) | ((y) & (~z)))
157#define H(x, y, z)((x) ^ (y) ^ (z)) ((x) ^ (y) ^ (z))
158#define I(x, y, z)((y) ^ ((x) | (~z))) ((y) ^ ((x) | (~z)))
159
160/* ROTATE_LEFT rotates x left n bits.
161 15-April-2003 Sony: use MSVC intrinsic to save some cycles
162 */
163#ifdef _MSC_VER
164#pragma intrinsic(_rotl)
165#define ROTATE_LEFT(x, n)(((x) << (n)) | ((x) >> (32-(n)))) _rotl((x), (n))
166#else
167#define ROTATE_LEFT(x, n)(((x) << (n)) | ((x) >> (32-(n)))) (((x) << (n)) | ((x) >> (32-(n))))
168#endif
169
170/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
171Rotation is separate from addition to prevent recomputation.
172*/
173/* Defines must be on one line to work with GCC-2.95.3 */
174#define FF(a, b, c, d, x, s, ac){ (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x) +
(UINT4)(ac); (a) = ((((a)) << ((s))) | (((a)) >>
(32-((s))))); (a) += (b); }
{ (a) += F ((b), (c), (d))((((b)) & ((c))) | ((~(b)) & ((d)))) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s))((((a)) << ((s))) | (((a)) >> (32-((s))))); (a) += (b); }
175#define GG(a, b, c, d, x, s, ac){ (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x) +
(UINT4)(ac); (a) = ((((a)) << ((s))) | (((a)) >>
(32-((s))))); (a) += (b); }
{ (a) += G ((b), (c), (d))((((b)) & ((d))) | (((c)) & (~(d)))) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s))((((a)) << ((s))) | (((a)) >> (32-((s))))); (a) += (b); }
176#define HH(a, b, c, d, x, s, ac){ (a) += (((b)) ^ ((c)) ^ ((d))) + (x) + (UINT4)(ac); (a) = (
(((a)) << ((s))) | (((a)) >> (32-((s))))); (a) +=
(b); }
{ (a) += H ((b), (c), (d))(((b)) ^ ((c)) ^ ((d))) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s))((((a)) << ((s))) | (((a)) >> (32-((s))))); (a) += (b); }
177#define II(a, b, c, d, x, s, ac){ (a) += (((c)) ^ (((b)) | (~(d)))) + (x) + (UINT4)(ac); (a) =
((((a)) << ((s))) | (((a)) >> (32-((s))))); (a) +=
(b); }
{ (a) += I ((b), (c), (d))(((c)) ^ (((b)) | (~(d)))) + (x) + (UINT4)(ac); (a) = ROTATE_LEFT ((a), (s))((((a)) << ((s))) | (((a)) >> (32-((s))))); (a) += (b); }
178
179/* MD5 initialization. Begins an MD5 operation, writing a new context.
180 */
181void MD5Init (MD5_CTX *context)
182{
183 context->count[0] = context->count[1] = 0;
184 /* Load magic initialization constants.
185*/
186 context->state[0] = 0x67452301;
187 context->state[1] = 0xefcdab89;
188 context->state[2] = 0x98badcfe;
189 context->state[3] = 0x10325476;
190}
191
192/* MD5 block update operation. Continues an MD5 message-digest
193 operation, processing another message block, and updating the
194 context.
195 */
196void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen)
197{
198 unsigned int i, index, partLen;
199
200 /* Compute number of bytes mod 64 */
201 index = (unsigned int)((context->count[0] >> 3) & 0x3F);
202
203 /* Update number of bits */
204 if ((context->count[0] += ((UINT4)inputLen << 3)) < ((UINT4)inputLen << 3)) {
18
Assuming the condition is false
19
Taking false branch
205 context->count[1]++;
206 }
207 context->count[1] += ((UINT4)inputLen >> 29);
208 partLen = 64 - index;
209
210 /* Transform as many times as possible. */
211 if (inputLen >= partLen) {
20
Assuming 'inputLen' is >= 'partLen'
21
Taking true branch
212 MD5_memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
213 MD5Transform (context->state, context->buffer);
214
215 for (i = partLen; i + 63 < inputLen; i += 64) {
22
Assuming the condition is true
23
Loop condition is true. Entering loop body
25
Assuming the condition is true
26
Loop condition is true. Entering loop body
216 MD5Transform (context->state, &input[i]);
24
Assuming index is less than 64, the number of 'const unsigned char' elements in 'PADDING'
27
Access of 'PADDING' at an overflowing index, while it holds only 64 'unsigned char' elements
217 }
218 index = 0;
219 } else {
220 i = 0;
221 }
222 /* Buffer remaining input */
223 MD5_memcpy((POINTER)&context->buffer[index], (POINTER)&input[i], inputLen-i);
224}
225
226/* MD5 finalization. Ends an MD5 message-digest operation, writing the
227 * the message digest and zeroizing the context.
228 */
229void MD5Final (unsigned char digest[16], MD5_CTX *context)
230{
231 unsigned char bits[8];
232 unsigned int index, padLen;
233
234 /* Save number of bits */
235 Encode (bits, context->count, 8);
236
237 /* Pad out to 56 mod 64. */
238 index = (unsigned int)((context->count[0] >> 3) & 0x3f);
239 padLen = (index < 56) ? (56 - index) : (120 - index);
15
Assuming 'index' is >= 56
16
'?' condition is false
240 MD5Update (context, PADDING, padLen);
17
Calling 'MD5Update'
241
242 /* Append length (before padding) */
243 MD5Update (context, bits, 8);
244 /* Store state in digest */
245 Encode (digest, context->state, 16);
246
247 /* Zeroize sensitive information.*/
248 MD5_memset ((POINTER)context, 0, sizeof (*context));
249}
250
251/* MD5 basic transformation. Transforms state based on block.
252 */
253static void MD5Transform (UINT4 state[4], const unsigned char block[64])
254{
255 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
256
257 Decode (x, block, 64);
258
259 /* Round 1 */
260 FF (a, b, c, d, x[ 0], S11, 0xd76aa478){ (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[ 0
]) + (UINT4)(0xd76aa478); (a) = ((((a)) << ((7))) | (((
a)) >> (32-((7))))); (a) += (b); }
; /* 1 */
261 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756){ (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[ 1
]) + (UINT4)(0xe8c7b756); (d) = ((((d)) << ((12))) | ((
(d)) >> (32-((12))))); (d) += (a); }
; /* 2 */
262 FF (c, d, a, b, x[ 2], S13, 0x242070db){ (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[ 2
]) + (UINT4)(0x242070db); (c) = ((((c)) << ((17))) | ((
(c)) >> (32-((17))))); (c) += (d); }
; /* 3 */
263 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee){ (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[ 3
]) + (UINT4)(0xc1bdceee); (b) = ((((b)) << ((22))) | ((
(b)) >> (32-((22))))); (b) += (c); }
; /* 4 */
264 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf){ (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[ 4
]) + (UINT4)(0xf57c0faf); (a) = ((((a)) << ((7))) | (((
a)) >> (32-((7))))); (a) += (b); }
; /* 5 */
265 FF (d, a, b, c, x[ 5], S12, 0x4787c62a){ (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[ 5
]) + (UINT4)(0x4787c62a); (d) = ((((d)) << ((12))) | ((
(d)) >> (32-((12))))); (d) += (a); }
; /* 6 */
266 FF (c, d, a, b, x[ 6], S13, 0xa8304613){ (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[ 6
]) + (UINT4)(0xa8304613); (c) = ((((c)) << ((17))) | ((
(c)) >> (32-((17))))); (c) += (d); }
; /* 7 */
267 FF (b, c, d, a, x[ 7], S14, 0xfd469501){ (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[ 7
]) + (UINT4)(0xfd469501); (b) = ((((b)) << ((22))) | ((
(b)) >> (32-((22))))); (b) += (c); }
; /* 8 */
268 FF (a, b, c, d, x[ 8], S11, 0x698098d8){ (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[ 8
]) + (UINT4)(0x698098d8); (a) = ((((a)) << ((7))) | (((
a)) >> (32-((7))))); (a) += (b); }
; /* 9 */
269 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af){ (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[ 9
]) + (UINT4)(0x8b44f7af); (d) = ((((d)) << ((12))) | ((
(d)) >> (32-((12))))); (d) += (a); }
; /* 10 */
270 FF (c, d, a, b, x[10], S13, 0xffff5bb1){ (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[10
]) + (UINT4)(0xffff5bb1); (c) = ((((c)) << ((17))) | ((
(c)) >> (32-((17))))); (c) += (d); }
; /* 11 */
271 FF (b, c, d, a, x[11], S14, 0x895cd7be){ (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[11
]) + (UINT4)(0x895cd7be); (b) = ((((b)) << ((22))) | ((
(b)) >> (32-((22))))); (b) += (c); }
; /* 12 */
272 FF (a, b, c, d, x[12], S11, 0x6b901122){ (a) += ((((b)) & ((c))) | ((~(b)) & ((d)))) + (x[12
]) + (UINT4)(0x6b901122); (a) = ((((a)) << ((7))) | (((
a)) >> (32-((7))))); (a) += (b); }
; /* 13 */
273 FF (d, a, b, c, x[13], S12, 0xfd987193){ (d) += ((((a)) & ((b))) | ((~(a)) & ((c)))) + (x[13
]) + (UINT4)(0xfd987193); (d) = ((((d)) << ((12))) | ((
(d)) >> (32-((12))))); (d) += (a); }
; /* 14 */
274 FF (c, d, a, b, x[14], S13, 0xa679438e){ (c) += ((((d)) & ((a))) | ((~(d)) & ((b)))) + (x[14
]) + (UINT4)(0xa679438e); (c) = ((((c)) << ((17))) | ((
(c)) >> (32-((17))))); (c) += (d); }
; /* 15 */
275 FF (b, c, d, a, x[15], S14, 0x49b40821){ (b) += ((((c)) & ((d))) | ((~(c)) & ((a)))) + (x[15
]) + (UINT4)(0x49b40821); (b) = ((((b)) << ((22))) | ((
(b)) >> (32-((22))))); (b) += (c); }
; /* 16 */
276
277 /* Round 2 */
278 GG (a, b, c, d, x[ 1], S21, 0xf61e2562){ (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[ 1
]) + (UINT4)(0xf61e2562); (a) = ((((a)) << ((5))) | (((
a)) >> (32-((5))))); (a) += (b); }
; /* 17 */
279 GG (d, a, b, c, x[ 6], S22, 0xc040b340){ (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[ 6
]) + (UINT4)(0xc040b340); (d) = ((((d)) << ((9))) | (((
d)) >> (32-((9))))); (d) += (a); }
; /* 18 */
280 GG (c, d, a, b, x[11], S23, 0x265e5a51){ (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[11
]) + (UINT4)(0x265e5a51); (c) = ((((c)) << ((14))) | ((
(c)) >> (32-((14))))); (c) += (d); }
; /* 19 */
281 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa){ (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[ 0
]) + (UINT4)(0xe9b6c7aa); (b) = ((((b)) << ((20))) | ((
(b)) >> (32-((20))))); (b) += (c); }
; /* 20 */
282 GG (a, b, c, d, x[ 5], S21, 0xd62f105d){ (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[ 5
]) + (UINT4)(0xd62f105d); (a) = ((((a)) << ((5))) | (((
a)) >> (32-((5))))); (a) += (b); }
; /* 21 */
283 GG (d, a, b, c, x[10], S22, 0x2441453){ (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[10
]) + (UINT4)(0x2441453); (d) = ((((d)) << ((9))) | (((d
)) >> (32-((9))))); (d) += (a); }
; /* 22 */
284 GG (c, d, a, b, x[15], S23, 0xd8a1e681){ (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[15
]) + (UINT4)(0xd8a1e681); (c) = ((((c)) << ((14))) | ((
(c)) >> (32-((14))))); (c) += (d); }
; /* 23 */
285 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8){ (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[ 4
]) + (UINT4)(0xe7d3fbc8); (b) = ((((b)) << ((20))) | ((
(b)) >> (32-((20))))); (b) += (c); }
; /* 24 */
286 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6){ (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[ 9
]) + (UINT4)(0x21e1cde6); (a) = ((((a)) << ((5))) | (((
a)) >> (32-((5))))); (a) += (b); }
; /* 25 */
287 GG (d, a, b, c, x[14], S22, 0xc33707d6){ (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[14
]) + (UINT4)(0xc33707d6); (d) = ((((d)) << ((9))) | (((
d)) >> (32-((9))))); (d) += (a); }
; /* 26 */
288 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87){ (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[ 3
]) + (UINT4)(0xf4d50d87); (c) = ((((c)) << ((14))) | ((
(c)) >> (32-((14))))); (c) += (d); }
; /* 27 */
289 GG (b, c, d, a, x[ 8], S24, 0x455a14ed){ (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[ 8
]) + (UINT4)(0x455a14ed); (b) = ((((b)) << ((20))) | ((
(b)) >> (32-((20))))); (b) += (c); }
; /* 28 */
290 GG (a, b, c, d, x[13], S21, 0xa9e3e905){ (a) += ((((b)) & ((d))) | (((c)) & (~(d)))) + (x[13
]) + (UINT4)(0xa9e3e905); (a) = ((((a)) << ((5))) | (((
a)) >> (32-((5))))); (a) += (b); }
; /* 29 */
291 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8){ (d) += ((((a)) & ((c))) | (((b)) & (~(c)))) + (x[ 2
]) + (UINT4)(0xfcefa3f8); (d) = ((((d)) << ((9))) | (((
d)) >> (32-((9))))); (d) += (a); }
; /* 30 */
292 GG (c, d, a, b, x[ 7], S23, 0x676f02d9){ (c) += ((((d)) & ((b))) | (((a)) & (~(b)))) + (x[ 7
]) + (UINT4)(0x676f02d9); (c) = ((((c)) << ((14))) | ((
(c)) >> (32-((14))))); (c) += (d); }
; /* 31 */
293 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a){ (b) += ((((c)) & ((a))) | (((d)) & (~(a)))) + (x[12
]) + (UINT4)(0x8d2a4c8a); (b) = ((((b)) << ((20))) | ((
(b)) >> (32-((20))))); (b) += (c); }
; /* 32 */
294
295 /* Round 3 */
296 HH (a, b, c, d, x[ 5], S31, 0xfffa3942){ (a) += (((b)) ^ ((c)) ^ ((d))) + (x[ 5]) + (UINT4)(0xfffa3942
); (a) = ((((a)) << ((4))) | (((a)) >> (32-((4)))
)); (a) += (b); }
; /* 33 */
297 HH (d, a, b, c, x[ 8], S32, 0x8771f681){ (d) += (((a)) ^ ((b)) ^ ((c))) + (x[ 8]) + (UINT4)(0x8771f681
); (d) = ((((d)) << ((11))) | (((d)) >> (32-((11)
)))); (d) += (a); }
; /* 34 */
298 HH (c, d, a, b, x[11], S33, 0x6d9d6122){ (c) += (((d)) ^ ((a)) ^ ((b))) + (x[11]) + (UINT4)(0x6d9d6122
); (c) = ((((c)) << ((16))) | (((c)) >> (32-((16)
)))); (c) += (d); }
; /* 35 */
299 HH (b, c, d, a, x[14], S34, 0xfde5380c){ (b) += (((c)) ^ ((d)) ^ ((a))) + (x[14]) + (UINT4)(0xfde5380c
); (b) = ((((b)) << ((23))) | (((b)) >> (32-((23)
)))); (b) += (c); }
; /* 36 */
300 HH (a, b, c, d, x[ 1], S31, 0xa4beea44){ (a) += (((b)) ^ ((c)) ^ ((d))) + (x[ 1]) + (UINT4)(0xa4beea44
); (a) = ((((a)) << ((4))) | (((a)) >> (32-((4)))
)); (a) += (b); }
; /* 37 */
301 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9){ (d) += (((a)) ^ ((b)) ^ ((c))) + (x[ 4]) + (UINT4)(0x4bdecfa9
); (d) = ((((d)) << ((11))) | (((d)) >> (32-((11)
)))); (d) += (a); }
; /* 38 */
302 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60){ (c) += (((d)) ^ ((a)) ^ ((b))) + (x[ 7]) + (UINT4)(0xf6bb4b60
); (c) = ((((c)) << ((16))) | (((c)) >> (32-((16)
)))); (c) += (d); }
; /* 39 */
303 HH (b, c, d, a, x[10], S34, 0xbebfbc70){ (b) += (((c)) ^ ((d)) ^ ((a))) + (x[10]) + (UINT4)(0xbebfbc70
); (b) = ((((b)) << ((23))) | (((b)) >> (32-((23)
)))); (b) += (c); }
; /* 40 */
304 HH (a, b, c, d, x[13], S31, 0x289b7ec6){ (a) += (((b)) ^ ((c)) ^ ((d))) + (x[13]) + (UINT4)(0x289b7ec6
); (a) = ((((a)) << ((4))) | (((a)) >> (32-((4)))
)); (a) += (b); }
; /* 41 */
305 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa){ (d) += (((a)) ^ ((b)) ^ ((c))) + (x[ 0]) + (UINT4)(0xeaa127fa
); (d) = ((((d)) << ((11))) | (((d)) >> (32-((11)
)))); (d) += (a); }
; /* 42 */
306 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085){ (c) += (((d)) ^ ((a)) ^ ((b))) + (x[ 3]) + (UINT4)(0xd4ef3085
); (c) = ((((c)) << ((16))) | (((c)) >> (32-((16)
)))); (c) += (d); }
; /* 43 */
307 HH (b, c, d, a, x[ 6], S34, 0x4881d05){ (b) += (((c)) ^ ((d)) ^ ((a))) + (x[ 6]) + (UINT4)(0x4881d05
); (b) = ((((b)) << ((23))) | (((b)) >> (32-((23)
)))); (b) += (c); }
; /* 44 */
308 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039){ (a) += (((b)) ^ ((c)) ^ ((d))) + (x[ 9]) + (UINT4)(0xd9d4d039
); (a) = ((((a)) << ((4))) | (((a)) >> (32-((4)))
)); (a) += (b); }
; /* 45 */
309 HH (d, a, b, c, x[12], S32, 0xe6db99e5){ (d) += (((a)) ^ ((b)) ^ ((c))) + (x[12]) + (UINT4)(0xe6db99e5
); (d) = ((((d)) << ((11))) | (((d)) >> (32-((11)
)))); (d) += (a); }
; /* 46 */
310 HH (c, d, a, b, x[15], S33, 0x1fa27cf8){ (c) += (((d)) ^ ((a)) ^ ((b))) + (x[15]) + (UINT4)(0x1fa27cf8
); (c) = ((((c)) << ((16))) | (((c)) >> (32-((16)
)))); (c) += (d); }
; /* 47 */
311 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665){ (b) += (((c)) ^ ((d)) ^ ((a))) + (x[ 2]) + (UINT4)(0xc4ac5665
); (b) = ((((b)) << ((23))) | (((b)) >> (32-((23)
)))); (b) += (c); }
; /* 48 */
312
313 /* Round 4 */
314 II (a, b, c, d, x[ 0], S41, 0xf4292244){ (a) += (((c)) ^ (((b)) | (~(d)))) + (x[ 0]) + (UINT4)(0xf4292244
); (a) = ((((a)) << ((6))) | (((a)) >> (32-((6)))
)); (a) += (b); }
; /* 49 */
315 II (d, a, b, c, x[ 7], S42, 0x432aff97){ (d) += (((b)) ^ (((a)) | (~(c)))) + (x[ 7]) + (UINT4)(0x432aff97
); (d) = ((((d)) << ((10))) | (((d)) >> (32-((10)
)))); (d) += (a); }
; /* 50 */
316 II (c, d, a, b, x[14], S43, 0xab9423a7){ (c) += (((a)) ^ (((d)) | (~(b)))) + (x[14]) + (UINT4)(0xab9423a7
); (c) = ((((c)) << ((15))) | (((c)) >> (32-((15)
)))); (c) += (d); }
; /* 51 */
317 II (b, c, d, a, x[ 5], S44, 0xfc93a039){ (b) += (((d)) ^ (((c)) | (~(a)))) + (x[ 5]) + (UINT4)(0xfc93a039
); (b) = ((((b)) << ((21))) | (((b)) >> (32-((21)
)))); (b) += (c); }
; /* 52 */
318 II (a, b, c, d, x[12], S41, 0x655b59c3){ (a) += (((c)) ^ (((b)) | (~(d)))) + (x[12]) + (UINT4)(0x655b59c3
); (a) = ((((a)) << ((6))) | (((a)) >> (32-((6)))
)); (a) += (b); }
; /* 53 */
319 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92){ (d) += (((b)) ^ (((a)) | (~(c)))) + (x[ 3]) + (UINT4)(0x8f0ccc92
); (d) = ((((d)) << ((10))) | (((d)) >> (32-((10)
)))); (d) += (a); }
; /* 54 */
320 II (c, d, a, b, x[10], S43, 0xffeff47d){ (c) += (((a)) ^ (((d)) | (~(b)))) + (x[10]) + (UINT4)(0xffeff47d
); (c) = ((((c)) << ((15))) | (((c)) >> (32-((15)
)))); (c) += (d); }
; /* 55 */
321 II (b, c, d, a, x[ 1], S44, 0x85845dd1){ (b) += (((d)) ^ (((c)) | (~(a)))) + (x[ 1]) + (UINT4)(0x85845dd1
); (b) = ((((b)) << ((21))) | (((b)) >> (32-((21)
)))); (b) += (c); }
; /* 56 */
322 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f){ (a) += (((c)) ^ (((b)) | (~(d)))) + (x[ 8]) + (UINT4)(0x6fa87e4f
); (a) = ((((a)) << ((6))) | (((a)) >> (32-((6)))
)); (a) += (b); }
; /* 57 */
323 II (d, a, b, c, x[15], S42, 0xfe2ce6e0){ (d) += (((b)) ^ (((a)) | (~(c)))) + (x[15]) + (UINT4)(0xfe2ce6e0
); (d) = ((((d)) << ((10))) | (((d)) >> (32-((10)
)))); (d) += (a); }
; /* 58 */
324 II (c, d, a, b, x[ 6], S43, 0xa3014314){ (c) += (((a)) ^ (((d)) | (~(b)))) + (x[ 6]) + (UINT4)(0xa3014314
); (c) = ((((c)) << ((15))) | (((c)) >> (32-((15)
)))); (c) += (d); }
; /* 59 */
325 II (b, c, d, a, x[13], S44, 0x4e0811a1){ (b) += (((d)) ^ (((c)) | (~(a)))) + (x[13]) + (UINT4)(0x4e0811a1
); (b) = ((((b)) << ((21))) | (((b)) >> (32-((21)
)))); (b) += (c); }
; /* 60 */
326 II (a, b, c, d, x[ 4], S41, 0xf7537e82){ (a) += (((c)) ^ (((b)) | (~(d)))) + (x[ 4]) + (UINT4)(0xf7537e82
); (a) = ((((a)) << ((6))) | (((a)) >> (32-((6)))
)); (a) += (b); }
; /* 61 */
327 II (d, a, b, c, x[11], S42, 0xbd3af235){ (d) += (((b)) ^ (((a)) | (~(c)))) + (x[11]) + (UINT4)(0xbd3af235
); (d) = ((((d)) << ((10))) | (((d)) >> (32-((10)
)))); (d) += (a); }
; /* 62 */
328 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb){ (c) += (((a)) ^ (((d)) | (~(b)))) + (x[ 2]) + (UINT4)(0x2ad7d2bb
); (c) = ((((c)) << ((15))) | (((c)) >> (32-((15)
)))); (c) += (d); }
; /* 63 */
329 II (b, c, d, a, x[ 9], S44, 0xeb86d391){ (b) += (((d)) ^ (((c)) | (~(a)))) + (x[ 9]) + (UINT4)(0xeb86d391
); (b) = ((((b)) << ((21))) | (((b)) >> (32-((21)
)))); (b) += (c); }
; /* 64 */
330
331 state[0] += a;
332 state[1] += b;
333 state[2] += c;
334 state[3] += d;
335
336 /* Zeroize sensitive information.
337 */
338 MD5_memset ((POINTER)x, 0, sizeof (x));
339}
340
341/* Encodes input (UINT4) into output (unsigned char). Assumes len is
342 a multiple of 4.
343 */
344static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
345{
346 unsigned int i, j;
347
348 for (i = 0, j = 0; j < len; i++, j += 4) {
349 output[j] = (unsigned char)(input[i] & 0xff);
350 output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
351 output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
352 output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
353 }
354}
355
356/* Decodes input (unsigned char) into output (UINT4). Assumes len is
357 a multiple of 4.
358 */
359static void Decode (UINT4 *output, const unsigned char *input, unsigned int len)
360{
361 unsigned int i, j;
362
363 for (i = 0, j = 0; j < len; i++, j += 4)
364 output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
365 (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
366}
367
368/* Note: Replace "for loop" with standard memcpy if possible.
369 */
370
371static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
372{
373 unsigned int i;
374
375 for (i = 0; i < len; i++)
376 output[i] = input[i];
377}
378
379/* Note: Replace "for loop" with standard memset if possible.
380 */
381static void MD5_memset (POINTER output, int value, unsigned int len)
382{
383 unsigned int i;
384
385 for (i = 0; i < len; i++)
386 ((char *)output)[i] = (char)value;
387}