OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [net/] [athttpd/] [current/] [src/] [md5c.c] - Blame information for rev 867

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
/* 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 <cyg/athttpd/md5.h>
27
 
28
/* Constants for MD5Transform routine.
29
 */
30
#define S11 7
31
#define S12 12
32
#define S13 17
33
#define S14 22
34
#define S21 5
35
#define S22 9
36
#define S23 14
37
#define S24 20
38
#define S31 4
39
#define S32 11
40
#define S33 16
41
#define S34 23
42
#define S41 6
43
#define S42 10
44
#define S43 15
45
#define S44 21
46
 
47
static void MD5Transform (UINT4 [4], unsigned char [64]);
48
static void Encode(unsigned char *, UINT4 *, unsigned int);
49
static void Decode(UINT4 *, unsigned char *, unsigned int);
50
static void MD5_memcpy(POINTER, POINTER, unsigned int);
51
static void MD5_memset(POINTER, int, unsigned int);
52
 
53
static unsigned char PADDING[64] = {
54
  0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
55
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
56
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
57
};
58
 
59
/* F, G, H and I are basic MD5 functions.
60
 */
61
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
62
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
63
#define H(x, y, z) ((x) ^ (y) ^ (z))
64
#define I(x, y, z) ((y) ^ ((x) | (~z)))
65
 
66
/* ROTATE_LEFT rotates x left n bits.
67
 */
68
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
69
 
70
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
71
   Rotation is separate from addition to prevent recomputation.
72
 */
73
#define FF(a, b, c, d, x, s, ac) { \
74
    (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
75
    (a) = ROTATE_LEFT ((a), (s)); \
76
    (a) += (b); \
77
  }
78
#define GG(a, b, c, d, x, s, ac) { \
79
    (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
80
    (a) = ROTATE_LEFT ((a), (s)); \
81
    (a) += (b); \
82
  }
83
#define HH(a, b, c, d, x, s, ac) { \
84
    (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
85
    (a) = ROTATE_LEFT ((a), (s)); \
86
    (a) += (b); \
87
  }
88
#define II(a, b, c, d, x, s, ac) { \
89
    (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
90
    (a) = ROTATE_LEFT ((a), (s)); \
91
    (a) += (b); \
92
  }
93
 
94
/* MD5 initialization. Begins an MD5 operation, writing a new context.
95
 */
96
void MD5Init (context)
97
MD5_CTX *context;                                        /* context */
98
{
99
  context->count[0] = context->count[1] = 0;
100
 
101
  /* Load magic initialization constants.
102
   */
103
  context->state[0] = 0x67452301;
104
  context->state[1] = 0xefcdab89;
105
  context->state[2] = 0x98badcfe;
106
  context->state[3] = 0x10325476;
107
}
108
 
109
/* MD5 block update operation. Continues an MD5 message-digest
110
     operation, processing another message block, and updating the
111
     context.
112
 */
113
void MD5Update (context, input, inputLen)
114
MD5_CTX *context;                                        /* context */
115
unsigned char *input;                                /* input block */
116
unsigned int inputLen;                     /* length of input block */
117
{
118
  unsigned int i, index, partLen;
119
 
120
  /* Compute number of bytes mod 64 */
121
  index = (unsigned int)((context->count[0] >> 3) & 0x3F);
122
 
123
  /* Update number of bits */
124
  if ((context->count[0] += ((UINT4)inputLen << 3))
125
      < ((UINT4)inputLen << 3))
126
    context->count[1]++;
127
  context->count[1] += ((UINT4)inputLen >> 29);
128
 
129
  partLen = 64 - index;
130
 
131
  /* Transform as many times as possible.
132
   */
133
  if (inputLen >= partLen) {
134
    MD5_memcpy
135
      ((POINTER)&context->buffer[index], (POINTER)input, partLen);
136
    MD5Transform (context->state, context->buffer);
137
 
138
    for (i = partLen; i + 63 < inputLen; i += 64)
139
      MD5Transform (context->state, &input[i]);
140
 
141
    index = 0;
142
  }
143
  else
144
    i = 0;
145
 
146
  /* Buffer remaining input */
147
  MD5_memcpy
148
    ((POINTER)&context->buffer[index], (POINTER)&input[i],
149
     inputLen-i);
150
}
151
 
152
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
153
     the message digest and zeroizing the context.
154
 */
155
void MD5Final (digest, context)
156
unsigned char digest[16];                         /* message digest */
157
MD5_CTX *context;                                       /* context */
158
{
159
  unsigned char bits[8];
160
  unsigned int index, padLen;
161
 
162
  /* Save number of bits */
163
  Encode (bits, context->count, 8);
164
 
165
  /* Pad out to 56 mod 64.
166
   */
167
  index = (unsigned int)((context->count[0] >> 3) & 0x3f);
168
  padLen = (index < 56) ? (56 - index) : (120 - index);
169
  MD5Update (context, PADDING, padLen);
170
 
171
  /* Append length (before padding) */
172
  MD5Update (context, bits, 8);
173
 
174
  /* Store state in digest */
175
  Encode (digest, context->state, 16);
176
 
177
  /* Zeroize sensitive information.
178
   */
179
  MD5_memset ((POINTER)context, 0, sizeof (*context));
180
}
181
 
182
/* MD5 basic transformation. Transforms state based on block.
183
 */
184
static void MD5Transform (state, block)
185
UINT4 state[4];
186
unsigned char block[64];
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 (output, input, len)
278
unsigned char *output;
279
UINT4 *input;
280
unsigned int len;
281
{
282
  unsigned int i, j;
283
 
284
  for (i = 0, j = 0; j < len; i++, j += 4) {
285
    output[j] = (unsigned char)(input[i] & 0xff);
286
    output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
287
    output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
288
    output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
289
  }
290
}
291
 
292
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
293
     a multiple of 4.
294
 */
295
static void Decode (output, input, len)
296
UINT4 *output;
297
unsigned char *input;
298
unsigned int len;
299
{
300
  unsigned int i, j;
301
 
302
  for (i = 0, j = 0; j < len; i++, j += 4)
303
    output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
304
      (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
305
}
306
 
307
/* Note: Replace "for loop" with standard memcpy if possible.
308
 */
309
static void MD5_memcpy (output, input, len)
310
POINTER output;
311
POINTER input;
312
unsigned int len;
313
{
314
  unsigned int i;
315
 
316
  for (i = 0; i < len; i++)
317
    output[i] = input[i];
318
}
319
 
320
/* Note: Replace "for loop" with standard memset if possible.
321
 */
322
static void MD5_memset (output, value, len)
323
POINTER output;
324
int value;
325
unsigned int len;
326
{
327
  unsigned int i;
328
 
329
  for (i = 0; i < len; i++)
330
    ((char *)output)[i] = (char)value;
331
}

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.