/[MITgcm]/MITgcm/tools/mpack-1.6/md5c.c
ViewVC logotype

Annotation of /MITgcm/tools/mpack-1.6/md5c.c

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.1 - (hide annotations) (download)
Tue Aug 26 20:45:25 2003 UTC (20 years, 8 months ago) by edhill
Branch: MAIN
CVS Tags: checkpoint64y, checkpoint64x, checkpoint58l_post, checkpoint64z, checkpoint51k_post, checkpoint57t_post, checkpoint64q, checkpoint64p, checkpoint64s, checkpoint64r, checkpoint64u, checkpoint64t, checkpoint64w, checkpoint64v, checkpoint64i, checkpoint64h, checkpoint64k, checkpoint64j, checkpoint64m, checkpoint64l, checkpoint64o, checkpoint64n, checkpoint64a, checkpoint57o_post, checkpoint64c, checkpoint64b, checkpoint64e, checkpoint64d, checkpoint64g, checkpoint64f, checkpoint52l_pre, checkpoint52e_pre, hrcube4, checkpoint58e_post, mitgcm_mapl_00, checkpoint52n_post, checkpoint52j_post, checkpoint53d_post, checkpoint58u_post, checkpoint58w_post, checkpoint54a_pre, checkpoint51o_pre, checkpoint57m_post, checkpoint55c_post, checkpoint54e_post, checkpoint52e_post, checkpoint57s_post, checkpoint51n_pre, checkpoint54a_post, checkpoint63p, checkpoint63q, checkpoint63r, checkpoint63s, checkpoint63l, checkpoint63m, checkpoint63n, checkpoint63o, checkpoint63h, checkpoint63i, checkpoint63j, checkpoint63k, checkpoint63d, checkpoint63e, checkpoint63f, checkpoint63g, checkpoint53c_post, checkpoint63a, checkpoint63b, checkpoint63c, checkpoint57k_post, checkpoint55d_pre, checkpoint57d_post, checkpoint51l_post, checkpoint57g_post, checkpoint51q_post, checkpoint64, checkpoint65, checkpoint60, checkpoint61, checkpoint62, checkpoint63, checkpoint57b_post, checkpoint57c_pre, checkpoint51j_post, checkpoint58r_post, checkpoint55j_post, checkpoint56b_post, checkpoint57i_post, checkpoint57y_post, hrcube_1, checkpoint57e_post, checkpoint66g, checkpoint66f, checkpoint66e, checkpoint66d, checkpoint66c, checkpoint66b, checkpoint66a, checkpoint66o, checkpoint66n, checkpoint66m, checkpoint66l, checkpoint66k, checkpoint66j, checkpoint66i, checkpoint66h, branch-netcdf, checkpoint52d_pre, checkpoint52l_post, checkpoint55h_post, checkpoint58n_post, checkpoint53b_post, checkpoint58x_post, checkpoint52k_post, checkpoint52b_pre, checkpoint57g_pre, checkpoint54b_post, checkpoint53b_pre, checkpoint55b_post, checkpoint58t_post, checkpoint58h_post, checkpoint65z, checkpoint65x, checkpoint65y, checkpoint54d_post, checkpoint65r, checkpoint65s, checkpoint65p, checkpoint65q, checkpoint65v, checkpoint65w, checkpoint65t, checkpoint65u, checkpoint65j, checkpoint65k, checkpoint65h, checkpoint65i, checkpoint65n, checkpoint65o, checkpoint65l, checkpoint65m, checkpoint65b, checkpoint65c, checkpoint65a, checkpoint65f, checkpoint65g, checkpoint65d, checkpoint65e, checkpoint56c_post, checkpoint52m_post, checkpoint57y_pre, checkpoint55, checkpoint53a_post, checkpoint57f_pre, checkpoint57a_post, checkpoint54, checkpoint58q_post, checkpoint54f_post, checkpoint57v_post, checkpoint59q, checkpoint59p, checkpoint55g_post, checkpoint59r, checkpoint51o_post, checkpoint51p_post, checkpoint58j_post, checkpoint52a_pre, checkpoint59e, checkpoint59d, checkpoint59g, checkpoint59f, checkpoint59a, checkpoint55f_post, checkpoint59c, checkpoint59b, checkpoint59m, checkpoint59l, checkpoint59o, checkpoint59n, checkpoint59i, checkpoint59h, checkpoint59k, checkpoint59j, checkpoint57r_post, checkpoint59, checkpoint58, checkpoint57a_pre, checkpoint55i_post, checkpoint57, checkpoint56, checkpoint51i_post, checkpoint53, checkpoint52, checkpoint51f_post, checkpoint52d_post, eckpoint57e_pre, checkpoint51r_post, checkpoint52a_post, checkpoint57h_done, checkpoint58f_post, checkpoint52b_post, checkpoint53g_post, checkpoint52f_post, branchpoint-genmake2, checkpoint57x_post, checkpoint57n_post, checkpoint52c_post, checkpoint58d_post, checkpoint58c_post, checkpoint57w_post, checkpoint57p_post, checkpint57u_post, checkpoint57f_post, checkpoint58a_post, checkpoint51h_pre, checkpoint51l_pre, checkpoint58i_post, checkpoint57q_post, checkpoint51g_post, checkpoint58g_post, ecco_c52_e35, hrcube5, checkpoint58o_post, checkpoint57z_post, checkpoint62c, checkpoint62b, checkpoint62a, checkpoint62g, checkpoint62f, checkpoint62e, checkpoint62d, checkpoint62k, checkpoint62j, checkpoint62i, checkpoint62h, checkpoint62o, checkpoint62n, checkpoint62m, checkpoint62l, checkpoint62s, checkpoint62r, checkpoint62q, checkpoint62p, checkpoint62w, checkpoint62v, checkpoint62u, checkpoint62t, checkpoint57c_post, checkpoint62z, checkpoint62y, checkpoint62x, checkpoint58y_post, checkpoint55e_post, checkpoint58k_post, checkpoint52i_post, checkpoint52j_pre, checkpoint58v_post, checkpoint53f_post, checkpoint55a_post, checkpoint51t_post, checkpoint53d_pre, checkpoint54c_post, checkpoint58s_post, checkpoint61f, checkpoint61g, checkpoint61d, checkpoint61e, checkpoint61b, checkpoint61c, checkpoint58p_post, checkpoint61a, checkpoint61n, checkpoint61o, checkpoint61l, checkpoint61m, checkpoint61j, checkpoint61k, checkpoint61h, checkpoint61i, checkpoint61v, checkpoint61w, checkpoint61t, checkpoint61u, checkpoint61r, checkpoint61s, checkpoint61p, checkpoint61q, checkpoint51n_post, checkpoint57j_post, checkpoint61z, checkpoint61x, checkpoint61y, checkpoint58b_post, checkpoint57h_pre, checkpoint51i_pre, checkpoint58m_post, checkpoint57l_post, checkpoint52i_pre, checkpoint51u_post, checkpoint52h_pre, checkpoint52f_pre, checkpoint57h_post, hrcube_2, hrcube_3, checkpoint56a_post, checkpoint51m_post, checkpoint51s_post, checkpoint55d_post, HEAD
Branch point for: branch-nonh, branch-genmake2, tg2-branch, checkpoint51n_branch, netcdf-sm0
File MIME type: text/plain
Initial check-in of the CMU "mpack" utility.  This allows us to (portably)
send MITgcm output as MIME-encoded email messages and will be used by the
"testreport" script.  The CMU license is basically an "AS-IS" statement.

1 edhill 1.1 /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
2     */
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    
26     #include "md5.h"
27    
28     /* Constants for MD5Transform routine.
29     */
30    
31     #define S11 7
32     #define S12 12
33     #define S13 17
34     #define S14 22
35     #define S21 5
36     #define S22 9
37     #define S23 14
38     #define S24 20
39     #define S31 4
40     #define S32 11
41     #define S33 16
42     #define S34 23
43     #define S41 6
44     #define S42 10
45     #define S43 15
46     #define S44 21
47    
48     static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
49     static void Encode PROTO_LIST
50     ((unsigned char *, UINT4 *, unsigned int));
51     static void Decode PROTO_LIST
52     ((UINT4 *, unsigned char *, unsigned int));
53     static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
54     static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
55    
56     static unsigned char PADDING[64] = {
57     0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
60     };
61    
62     /* F, G, H and I are basic MD5 functions.
63     */
64     #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
65     #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
66     #define H(x, y, z) ((x) ^ (y) ^ (z))
67     #define I(x, y, z) ((y) ^ ((x) | (~z)))
68    
69     /* ROTATE_LEFT rotates x left n bits.
70     */
71     #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
72    
73     /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
74     Rotation is separate from addition to prevent recomputation.
75     */
76     #define FF(a, b, c, d, x, s, ac) { \
77     (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
78     (a) = ROTATE_LEFT ((a), (s)); \
79     (a) += (b); \
80     }
81     #define GG(a, b, c, d, x, s, ac) { \
82     (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
83     (a) = ROTATE_LEFT ((a), (s)); \
84     (a) += (b); \
85     }
86     #define HH(a, b, c, d, x, s, ac) { \
87     (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
88     (a) = ROTATE_LEFT ((a), (s)); \
89     (a) += (b); \
90     }
91     #define II(a, b, c, d, x, s, ac) { \
92     (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
93     (a) = ROTATE_LEFT ((a), (s)); \
94     (a) += (b); \
95     }
96    
97     /* MD5 initialization. Begins an MD5 operation, writing a new context.
98     */
99     void MD5Init (MD5_CTX *context)
100     /* context */
101     {
102     context->count[0] = context->count[1] = 0;
103     /* Load magic initialization constants.
104     */
105     context->state[0] = 0x67452301;
106     context->state[1] = 0xefcdab89;
107     context->state[2] = 0x98badcfe;
108     context->state[3] = 0x10325476;
109     }
110    
111     /* MD5 block update operation. Continues an MD5 message-digest
112     operation, processing another message block, and updating the
113     context.
114     */
115     void MD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen)
116     /* context */
117     /* input block */
118     /* length of input block */
119     {
120     unsigned int i, index, partLen;
121    
122     /* Compute number of bytes mod 64 */
123     index = (unsigned int)((context->count[0] >> 3) & 0x3F);
124    
125     /* Update number of bits */
126     if ((context->count[0] += ((UINT4)inputLen << 3))
127     < ((UINT4)inputLen << 3))
128     context->count[1]++;
129     context->count[1] += ((UINT4)inputLen >> 29);
130    
131     partLen = 64 - index;
132    
133     /* Transform as many times as possible.
134     */
135     if (inputLen >= partLen) {
136     MD5_memcpy
137     ((POINTER)&context->buffer[index], (POINTER)input, partLen);
138     MD5Transform (context->state, context->buffer);
139    
140     for (i = partLen; i + 63 < inputLen; i += 64)
141     MD5Transform (context->state, &input[i]);
142    
143     index = 0;
144     }
145     else
146     i = 0;
147    
148     /* Buffer remaining input */
149     MD5_memcpy
150     ((POINTER)&context->buffer[index], (POINTER)&input[i],
151     inputLen-i);
152     }
153    
154     /* MD5 finalization. Ends an MD5 message-digest operation, writing the
155     the message digest and zeroizing the context.
156     */
157     void MD5Final (unsigned char *digest, MD5_CTX *context)
158     /* message digest */
159     /* context */
160     {
161     unsigned char bits[8];
162     unsigned int index, padLen;
163    
164     /* Save number of bits */
165     Encode (bits, context->count, 8);
166    
167     /* Pad out to 56 mod 64.
168     */
169     index = (unsigned int)((context->count[0] >> 3) & 0x3f);
170     padLen = (index < 56) ? (56 - index) : (120 - index);
171     MD5Update (context, PADDING, padLen);
172    
173     /* Append length (before padding) */
174     MD5Update (context, bits, 8);
175    
176     /* Store state in digest */
177     Encode (digest, context->state, 16);
178    
179     /* Zeroize sensitive information.
180     */
181     MD5_memset ((POINTER)context, 0, sizeof (*context));
182     }
183    
184     /* MD5 basic transformation. Transforms state based on block.
185     */
186     static void MD5Transform (UINT4 *state, unsigned char *block)
187     {
188     UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
189    
190     Decode (x, block, 64);
191    
192     /* Round 1 */
193     FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
194     FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
195     FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
196     FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
197     FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
198     FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
199     FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
200     FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
201     FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
202     FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
203     FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
204     FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
205     FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
206     FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
207     FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
208     FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
209    
210     /* Round 2 */
211     GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
212     GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
213     GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
214     GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
215     GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
216     GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
217     GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
218     GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
219     GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
220     GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
221     GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
222     GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
223     GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
224     GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
225     GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
226     GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
227    
228     /* Round 3 */
229     HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
230     HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
231     HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
232     HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
233     HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
234     HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
235     HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
236     HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
237     HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
238     HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
239     HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
240     HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
241     HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
242     HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
243     HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
244     HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
245    
246     /* Round 4 */
247     II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
248     II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
249     II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
250     II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
251     II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
252     II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
253     II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
254     II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
255     II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
256     II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
257     II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
258     II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
259     II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
260     II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
261     II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
262     II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
263    
264     state[0] += a;
265     state[1] += b;
266     state[2] += c;
267     state[3] += d;
268    
269     /* Zeroize sensitive information.
270     */
271     MD5_memset ((POINTER)x, 0, sizeof (x));
272     }
273    
274     /* Encodes input (UINT4) into output (unsigned char). Assumes len is
275     a multiple of 4.
276     */
277     static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
278     {
279     unsigned int i, j;
280    
281     for (i = 0, j = 0; j < len; i++, j += 4) {
282     output[j] = (unsigned char)(input[i] & 0xff);
283     output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
284     output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
285     output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
286     }
287     }
288    
289     /* Decodes input (unsigned char) into output (UINT4). Assumes len is
290     a multiple of 4.
291     */
292     static void Decode (UINT4 *output, unsigned char *input, unsigned int len)
293     {
294     unsigned int i, j;
295    
296     for (i = 0, j = 0; j < len; i++, j += 4)
297     output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
298     (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
299     }
300    
301     /* Note: Replace "for loop" with standard memcpy if possible.
302     */
303    
304     static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
305     {
306     unsigned int i;
307    
308     for (i = 0; i < len; i++)
309     output[i] = input[i];
310     }
311    
312     /* Note: Replace "for loop" with standard memset if possible.
313     */
314     static void MD5_memset (POINTER output, int value, unsigned int len)
315     {
316     unsigned int i;
317    
318     for (i = 0; i < len; i++)
319     ((char *)output)[i] = (char)value;
320     }

  ViewVC Help
Powered by ViewVC 1.1.22