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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [net/] [bsd_tcpip/] [current/] [src/] [sys/] [kern/] [md5c.c] - Blame information for rev 786

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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