Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/i386/libsaio/md5c.c

Source at commit 214 created 13 years 5 months ago.
By ifabio, update to chameleon trunk 630, and now the pakage folder is the same as blackosx branch, also add Icon "building" into buildpkg script, and add mint theme info into the English localizable.strings.
1/*
2 * MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
3 *
4 * Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
5 * rights reserved.
6 *
7 * License to copy and use this software is granted provided that it
8 * is identified as the "RSA Data Security, Inc. MD5 Message-Digest
9 * Algorithm" in all material mentioning or referencing this software
10 * or this function.
11 *
12 * License is also granted to make and use derivative works provided
13 * that such works are identified as "derived from the RSA Data
14 * Security, Inc. MD5 Message-Digest Algorithm" in all material
15 * mentioning or referencing the derived work.
16 *
17 * RSA Data Security, Inc. makes no representations concerning either
18 * the merchantability of this software or the suitability of this
19 * software for any particular purpose. It is provided "as is"
20 * without express or implied warranty of any kind.
21 *
22 * These notices must be retained in any copies of any part of this
23 * documentation and/or software.
24 *
25 * $Id: md5c.c,v 1.1 2005/06/24 22:47:12 curtisg Exp $
26 *
27 * This code is the same as the code published by RSA Inc. It has been
28 * edited for clarity and style only.
29 */
30
31#include <sys/types.h>
32
33#ifdef KERNEL
34#include <sys/systm.h>
35#else
36#include <string.h>
37#endif
38
39#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
40# include <Kernel/libkern/crypto/md5.h>
41#else
42# include <sys/md5.h>
43#endif
44
45
46#ifdef KERNEL
47#define memset(x,y,z)bzero(x,z);
48#define memcpy(x,y,z)bcopy(y, x, z)
49#endif
50
51#if defined(__i386__) || defined(__alpha__)
52#define Encode memcpy
53#define Decode memcpy
54#else /* __i386__ */
55
56/*
57 * Encodes input (u_int32_t) into output (unsigned char). Assumes len is
58 * a multiple of 4.
59 */
60
61/* XXX not prototyped, and not compatible with memcpy(). */
62static void
63Encode (output, input, len)
64unsigned char *output;
65u_int32_t *input;
66unsigned int len;
67{
68unsigned int i, j;
69
70for (i = 0, j = 0; j < len; i++, j += 4) {
71output[j] = (unsigned char)(input[i] & 0xff);
72output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
73output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
74output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
75}
76}
77
78/*
79 * Decodes input (unsigned char) into output (u_int32_t). Assumes len is
80 * a multiple of 4.
81 */
82
83static void
84Decode (output, input, len)
85u_int32_t *output;
86const unsigned char *input;
87unsigned int len;
88{
89unsigned int i, j;
90
91for (i = 0, j = 0; j < len; i++, j += 4)
92output[i] = ((u_int32_t)input[j]) | (((u_int32_t)input[j+1]) << 8) |
93 (((u_int32_t)input[j+2]) << 16) | (((u_int32_t)input[j+3]) << 24);
94}
95#endif /* i386 */
96
97static unsigned char PADDING[64] = {
98 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
100 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
101};
102
103/* F, G, H and I are basic MD5 functions. */
104#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
105#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
106#define H(x, y, z) ((x) ^ (y) ^ (z))
107#define I(x, y, z) ((y) ^ ((x) | (~z)))
108
109/* ROTATE_LEFT rotates x left n bits. */
110#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
111
112/*
113 * FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
114 * Rotation is separate from addition to prevent recomputation.
115 */
116#define FF(a, b, c, d, x, s, ac) { \
117(a) += F ((b), (c), (d)) + (x) + (u_int32_t)(ac); \
118(a) = ROTATE_LEFT ((a), (s)); \
119(a) += (b); \
120}
121#define GG(a, b, c, d, x, s, ac) { \
122(a) += G ((b), (c), (d)) + (x) + (u_int32_t)(ac); \
123(a) = ROTATE_LEFT ((a), (s)); \
124(a) += (b); \
125}
126#define HH(a, b, c, d, x, s, ac) { \
127(a) += H ((b), (c), (d)) + (x) + (u_int32_t)(ac); \
128(a) = ROTATE_LEFT ((a), (s)); \
129(a) += (b); \
130}
131#define II(a, b, c, d, x, s, ac) { \
132(a) += I ((b), (c), (d)) + (x) + (u_int32_t)(ac); \
133(a) = ROTATE_LEFT ((a), (s)); \
134(a) += (b); \
135}
136
137static void MD5Transform (u_int32_t state[4], const unsigned char block[64]);
138
139/* MD5 initialization. Begins an MD5 operation, writing a new context. */
140
141void
142MD5Init (context)
143MD5_CTX *context;
144{
145
146context->count[0] = context->count[1] = 0;
147
148/* Load magic initialization constants. */
149context->state[0] = 0x67452301;
150context->state[1] = 0xefcdab89;
151context->state[2] = 0x98badcfe;
152context->state[3] = 0x10325476;
153}
154
155/*
156 * MD5 block update operation. Continues an MD5 message-digest
157 * operation, processing another message block, and updating the
158 * context.
159 */
160
161void
162MD5Update (context, input, inputLen)
163MD5_CTX *context;
164#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_5
165const void *input;
166#else
167const unsigned char *input;
168#endif
169unsigned int inputLen;
170{
171unsigned int i, index, partLen;
172
173/* Compute number of bytes mod 64 */
174index = (unsigned int)((context->count[0] >> 3) & 0x3F);
175
176/* Update number of bits */
177if ((context->count[0] += ((u_int32_t)inputLen << 3))
178 < ((u_int32_t)inputLen << 3))
179context->count[1]++;
180context->count[1] += ((u_int32_t)inputLen >> 29);
181
182partLen = 64 - index;
183
184/* Transform as many times as possible. */
185if (inputLen >= partLen) {
186memcpy((void *)&context->buffer[index], (const void *)input,
187 partLen);
188MD5Transform (context->state, context->buffer);
189
190for (i = partLen; i + 63 < inputLen; i += 64)
191MD5Transform (context->state, &((const unsigned char *)input)[i]);
192
193index = 0;
194}
195else
196i = 0;
197
198/* Buffer remaining input */
199memcpy ((void *)&context->buffer[index], (const void *)&((const unsigned char*)input)[i],
200 inputLen-i);
201}
202
203/*
204 * MD5 padding. Adds padding followed by original length.
205 */
206
207void
208MD5Pad (context)
209MD5_CTX *context;
210{
211unsigned char bits[8];
212unsigned int index, padLen;
213
214/* Save number of bits */
215Encode (bits, context->count, 8);
216
217/* Pad out to 56 mod 64. */
218index = (unsigned int)((context->count[0] >> 3) & 0x3f);
219padLen = (index < 56) ? (56 - index) : (120 - index);
220MD5Update (context, PADDING, padLen);
221
222/* Append length (before padding) */
223MD5Update (context, bits, 8);
224}
225
226/*
227 * MD5 finalization. Ends an MD5 message-digest operation, writing the
228 * the message digest and zeroizing the context.
229 */
230
231void
232MD5Final (digest, context)
233unsigned char digest[16];
234MD5_CTX *context;
235{
236/* Do padding. */
237MD5Pad (context);
238
239/* Store state in digest */
240Encode (digest, context->state, 16);
241
242/* Zeroize sensitive information. */
243memset ((void *)context, 0, sizeof (*context));
244}
245
246/* MD5 basic transformation. Transforms state based on block. */
247
248static void
249MD5Transform (state, block)
250u_int32_t state[4];
251const unsigned char block[64];
252{
253u_int32_t a = state[0], b = state[1], c = state[2], d = state[3], x[16];
254
255Decode (x, block, 64);
256
257/* Round 1 */
258#define S11 7
259#define S12 12
260#define S13 17
261#define S14 22
262FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
263FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
264FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
265FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
266FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
267FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
268FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
269FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
270FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
271FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
272FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
273FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
274FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
275FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
276FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
277FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
278
279/* Round 2 */
280#define S21 5
281#define S22 9
282#define S23 14
283#define S24 20
284GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
285GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
286GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
287GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
288GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
289GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
290GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
291GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
292GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
293GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
294GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
295GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
296GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
297GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
298GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
299GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
300
301/* Round 3 */
302#define S31 4
303#define S32 11
304#define S33 16
305#define S34 23
306HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
307HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
308HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
309HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
310HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
311HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
312HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
313HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
314HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
315HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
316HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
317HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
318HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
319HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
320HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
321HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
322
323/* Round 4 */
324#define S41 6
325#define S42 10
326#define S43 15
327#define S44 21
328II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
329II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
330II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
331II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
332II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
333II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
334II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
335II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
336II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
337II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
338II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
339II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
340II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
341II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
342II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
343II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
344
345state[0] += a;
346state[1] += b;
347state[2] += c;
348state[3] += d;
349
350/* Zeroize sensitive information. */
351memset ((void *)x, 0, sizeof (x));
352}
353

Archive Download this file

Revision: 214