/[cvs]/joko/TestArea/vb/DigestMD5/resources/md5bas/Rivest-MD5.txt
ViewVC logotype

Contents of /joko/TestArea/vb/DigestMD5/resources/md5bas/Rivest-MD5.txt

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations)
Mon Jan 20 17:24:07 2003 UTC (21 years, 8 months ago) by joko
Branch: MAIN
CVS Tags: HEAD
File MIME type: text/plain
+ initial check-in

1
2
3
4
5
6 Network Working Group R. Rivest
7 Request for Comments: 1321 MIT Laboratory for Computer Science
8 and RSA Data Security, Inc.
9 April 1992
10
11
12 The MD5 Message-Digest Algorithm
13
14 Status of this Memo
15
16 This memo provides information for the Internet community. It does
17 not specify an Internet standard. Distribution of this memo is
18 unlimited.
19
20 Acknowlegements
21
22 We would like to thank Don Coppersmith, Burt Kaliski, Ralph Merkle,
23 David Chaum, and Noam Nisan for numerous helpful comments and
24 suggestions.
25
26 Table of Contents
27
28 1. Executive Summary 1
29 2. Terminology and Notation 2
30 3. MD5 Algorithm Description 3
31 4. Summary 6
32 5. Differences Between MD4 and MD5 6
33 References 7
34 APPENDIX A - Reference Implementation 7
35 Security Considerations 21
36 Author's Address 21
37
38 1. Executive Summary
39
40 This document describes the MD5 message-digest algorithm. The
41 algorithm takes as input a message of arbitrary length and produces
42 as output a 128-bit "fingerprint" or "message digest" of the input.
43 It is conjectured that it is computationally infeasible to produce
44 two messages having the same message digest, or to produce any
45 message having a given prespecified target message digest. The MD5
46 algorithm is intended for digital signature applications, where a
47 large file must be "compressed" in a secure manner before being
48 encrypted with a private (secret) key under a public-key cryptosystem
49 such as RSA.
50
51
52
53
54
55
56
57 Rivest [Page 1]
58
59 RFC 1321 MD5 Message-Digest Algorithm April 1992
60
61
62 The MD5 algorithm is designed to be quite fast on 32-bit machines. In
63 addition, the MD5 algorithm does not require any large substitution
64 tables; the algorithm can be coded quite compactly.
65
66 The MD5 algorithm is an extension of the MD4 message-digest algorithm
67 1,2]. MD5 is slightly slower than MD4, but is more "conservative" in
68 design. MD5 was designed because it was felt that MD4 was perhaps
69 being adopted for use more quickly than justified by the existing
70 critical review; because MD4 was designed to be exceptionally fast,
71 it is "at the edge" in terms of risking successful cryptanalytic
72 attack. MD5 backs off a bit, giving up a little in speed for a much
73 greater likelihood of ultimate security. It incorporates some
74 suggestions made by various reviewers, and contains additional
75 optimizations. The MD5 algorithm is being placed in the public domain
76 for review and possible adoption as a standard.
77
78 For OSI-based applications, MD5's object identifier is
79
80 md5 OBJECT IDENTIFIER ::=
81 iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) 5}
82
83 In the X.509 type AlgorithmIdentifier [3], the parameters for MD5
84 should have type NULL.
85
86 2. Terminology and Notation
87
88 In this document a "word" is a 32-bit quantity and a "byte" is an
89 eight-bit quantity. A sequence of bits can be interpreted in a
90 natural manner as a sequence of bytes, where each consecutive group
91 of eight bits is interpreted as a byte with the high-order (most
92 significant) bit of each byte listed first. Similarly, a sequence of
93 bytes can be interpreted as a sequence of 32-bit words, where each
94 consecutive group of four bytes is interpreted as a word with the
95 low-order (least significant) byte given first.
96
97 Let x_i denote "x sub i". If the subscript is an expression, we
98 surround it in braces, as in x_{i+1}. Similarly, we use ^ for
99 superscripts (exponentiation), so that x^i denotes x to the i-th
100 power.
101
102 Let the symbol "+" denote addition of words (i.e., modulo-2^32
103 addition). Let X <<< s denote the 32-bit value obtained by circularly
104 shifting (rotating) X left by s bit positions. Let not(X) denote the
105 bit-wise complement of X, and let X v Y denote the bit-wise OR of X
106 and Y. Let X xor Y denote the bit-wise XOR of X and Y, and let XY
107 denote the bit-wise AND of X and Y.
108
109
110
111
112
113 Rivest [Page 2]
114
115 RFC 1321 MD5 Message-Digest Algorithm April 1992
116
117
118 3. MD5 Algorithm Description
119
120 We begin by supposing that we have a b-bit message as input, and that
121 we wish to find its message digest. Here b is an arbitrary
122 nonnegative integer; b may be zero, it need not be a multiple of
123 eight, and it may be arbitrarily large. We imagine the bits of the
124 message written down as follows:
125
126 m_0 m_1 ... m_{b-1}
127
128 The following five steps are performed to compute the message digest
129 of the message.
130
131 3.1 Step 1. Append Padding Bits
132
133 The message is "padded" (extended) so that its length (in bits) is
134 congruent to 448, modulo 512. That is, the message is extended so
135 that it is just 64 bits shy of being a multiple of 512 bits long.
136 Padding is always performed, even if the length of the message is
137 already congruent to 448, modulo 512.
138
139 Padding is performed as follows: a single "1" bit is appended to the
140 message, and then "0" bits are appended so that the length in bits of
141 the padded message becomes congruent to 448, modulo 512. In all, at
142 least one bit and at most 512 bits are appended.
143
144 3.2 Step 2. Append Length
145
146 A 64-bit representation of b (the length of the message before the
147 padding bits were added) is appended to the result of the previous
148 step. In the unlikely event that b is greater than 2^64, then only
149 the low-order 64 bits of b are used. (These bits are appended as two
150 32-bit words and appended low-order word first in accordance with the
151 previous conventions.)
152
153 At this point the resulting message (after padding with bits and with
154 b) has a length that is an exact multiple of 512 bits. Equivalently,
155 this message has a length that is an exact multiple of 16 (32-bit)
156 words. Let M[0 ... N-1] denote the words of the resulting message,
157 where N is a multiple of 16.
158
159 3.3 Step 3. Initialize MD Buffer
160
161 A four-word buffer (A,B,C,D) is used to compute the message digest.
162 Here each of A, B, C, D is a 32-bit register. These registers are
163 initialized to the following values in hexadecimal, low-order bytes
164 first):
165
166
167
168
169 Rivest [Page 3]
170
171 RFC 1321 MD5 Message-Digest Algorithm April 1992
172
173
174 word A: 01 23 45 67
175 word B: 89 ab cd ef
176 word C: fe dc ba 98
177 word D: 76 54 32 10
178
179 3.4 Step 4. Process Message in 16-Word Blocks
180
181 We first define four auxiliary functions that each take as input
182 three 32-bit words and produce as output one 32-bit word.
183
184 F(X,Y,Z) = XY v not(X) Z
185 G(X,Y,Z) = XZ v Y not(Z)
186 H(X,Y,Z) = X xor Y xor Z
187 I(X,Y,Z) = Y xor (X v not(Z))
188
189 In each bit position F acts as a conditional: if X then Y else Z.
190 The function F could have been defined using + instead of v since XY
191 and not(X)Z will never have 1's in the same bit position.) It is
192 interesting to note that if the bits of X, Y, and Z are independent
193 and unbiased, the each bit of F(X,Y,Z) will be independent and
194 unbiased.
195
196 The functions G, H, and I are similar to the function F, in that they
197 act in "bitwise parallel" to produce their output from the bits of X,
198 Y, and Z, in such a manner that if the corresponding bits of X, Y,
199 and Z are independent and unbiased, then each bit of G(X,Y,Z),
200 H(X,Y,Z), and I(X,Y,Z) will be independent and unbiased. Note that
201 the function H is the bit-wise "xor" or "parity" function of its
202 inputs.
203
204 This step uses a 64-element table T[1 ... 64] constructed from the
205 sine function. Let T[i] denote the i-th element of the table, which
206 is equal to the integer part of 4294967296 times abs(sin(i)), where i
207 is in radians. The elements of the table are given in the appendix.
208
209 Do the following:
210
211 /* Process each 16-word block. */
212 For i = 0 to N/16-1 do
213
214 /* Copy block i into X. */
215 For j = 0 to 15 do
216 Set X[j] to M[i*16+j].
217 end /* of loop on j */
218
219 /* Save A as AA, B as BB, C as CC, and D as DD. */
220 AA = A
221 BB = B
222
223
224
225 Rivest [Page 4]
226
227 RFC 1321 MD5 Message-Digest Algorithm April 1992
228
229
230 CC = C
231 DD = D
232
233 /* Round 1. */
234 /* Let [abcd k s i] denote the operation
235 a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
236 /* Do the following 16 operations. */
237 [ABCD 0 7 1] [DABC 1 12 2] [CDAB 2 17 3] [BCDA 3 22 4]
238 [ABCD 4 7 5] [DABC 5 12 6] [CDAB 6 17 7] [BCDA 7 22 8]
239 [ABCD 8 7 9] [DABC 9 12 10] [CDAB 10 17 11] [BCDA 11 22 12]
240 [ABCD 12 7 13] [DABC 13 12 14] [CDAB 14 17 15] [BCDA 15 22 16]
241
242 /* Round 2. */
243 /* Let [abcd k s i] denote the operation
244 a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
245 /* Do the following 16 operations. */
246 [ABCD 1 5 17] [DABC 6 9 18] [CDAB 11 14 19] [BCDA 0 20 20]
247 [ABCD 5 5 21] [DABC 10 9 22] [CDAB 15 14 23] [BCDA 4 20 24]
248 [ABCD 9 5 25] [DABC 14 9 26] [CDAB 3 14 27] [BCDA 8 20 28]
249 [ABCD 13 5 29] [DABC 2 9 30] [CDAB 7 14 31] [BCDA 12 20 32]
250
251 /* Round 3. */
252 /* Let [abcd k s t] denote the operation
253 a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
254 /* Do the following 16 operations. */
255 [ABCD 5 4 33] [DABC 8 11 34] [CDAB 11 16 35] [BCDA 14 23 36]
256 [ABCD 1 4 37] [DABC 4 11 38] [CDAB 7 16 39] [BCDA 10 23 40]
257 [ABCD 13 4 41] [DABC 0 11 42] [CDAB 3 16 43] [BCDA 6 23 44]
258 [ABCD 9 4 45] [DABC 12 11 46] [CDAB 15 16 47] [BCDA 2 23 48]
259
260 /* Round 4. */
261 /* Let [abcd k s t] denote the operation
262 a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
263 /* Do the following 16 operations. */
264 [ABCD 0 6 49] [DABC 7 10 50] [CDAB 14 15 51] [BCDA 5 21 52]
265 [ABCD 12 6 53] [DABC 3 10 54] [CDAB 10 15 55] [BCDA 1 21 56]
266 [ABCD 8 6 57] [DABC 15 10 58] [CDAB 6 15 59] [BCDA 13 21 60]
267 [ABCD 4 6 61] [DABC 11 10 62] [CDAB 2 15 63] [BCDA 9 21 64]
268
269 /* Then perform the following additions. (That is increment each
270 of the four registers by the value it had before this block
271 was started.) */
272 A = A + AA
273 B = B + BB
274 C = C + CC
275 D = D + DD
276
277 end /* of loop on i */
278
279
280
281 Rivest [Page 5]
282
283 RFC 1321 MD5 Message-Digest Algorithm April 1992
284
285
286 3.5 Step 5. Output
287
288 The message digest produced as output is A, B, C, D. That is, we
289 begin with the low-order byte of A, and end with the high-order byte
290 of D.
291
292 This completes the description of MD5. A reference implementation in
293 C is given in the appendix.
294
295 4. Summary
296
297 The MD5 message-digest algorithm is simple to implement, and provides
298 a "fingerprint" or message digest of a message of arbitrary length.
299 It is conjectured that the difficulty of coming up with two messages
300 having the same message digest is on the order of 2^64 operations,
301 and that the difficulty of coming up with any message having a given
302 message digest is on the order of 2^128 operations. The MD5 algorithm
303 has been carefully scrutinized for weaknesses. It is, however, a
304 relatively new algorithm and further security analysis is of course
305 justified, as is the case with any new proposal of this sort.
306
307 5. Differences Between MD4 and MD5
308
309 The following are the differences between MD4 and MD5:
310
311 1. A fourth round has been added.
312
313 2. Each step now has a unique additive constant.
314
315 3. The function g in round 2 was changed from (XY v XZ v YZ) to
316 (XZ v Y not(Z)) to make g less symmetric.
317
318 4. Each step now adds in the result of the previous step. This
319 promotes a faster "avalanche effect".
320
321 5. The order in which input words are accessed in rounds 2 and
322 3 is changed, to make these patterns less like each other.
323
324 6. The shift amounts in each round have been approximately
325 optimized, to yield a faster "avalanche effect." The shifts in
326 different rounds are distinct.
327
328
329
330
331
332
333
334
335
336
337 Rivest [Page 6]
338
339 RFC 1321 MD5 Message-Digest Algorithm April 1992
340
341
342 References
343
344 [1] Rivest, R., "The MD4 Message Digest Algorithm", RFC 1320, MIT and
345 RSA Data Security, Inc., April 1992.
346
347 [2] Rivest, R., "The MD4 message digest algorithm", in A.J. Menezes
348 and S.A. Vanstone, editors, Advances in Cryptology - CRYPTO '90
349 Proceedings, pages 303-311, Springer-Verlag, 1991.
350
351 [3] CCITT Recommendation X.509 (1988), "The Directory -
352 Authentication Framework."
353
354 APPENDIX A - Reference Implementation
355
356 This appendix contains the following files taken from RSAREF: A
357 Cryptographic Toolkit for Privacy-Enhanced Mail:
358
359 global.h -- global header file
360
361 md5.h -- header file for MD5
362
363 md5c.c -- source code for MD5
364
365 For more information on RSAREF, send email to <rsaref@rsa.com>.
366
367 The appendix also includes the following file:
368
369 mddriver.c -- test driver for MD2, MD4 and MD5
370
371 The driver compiles for MD5 by default but can compile for MD2 or MD4
372 if the symbol MD is defined on the C compiler command line as 2 or 4.
373
374 The implementation is portable and should work on many different
375 plaforms. However, it is not difficult to optimize the implementation
376 on particular platforms, an exercise left to the reader. For example,
377 on "little-endian" platforms where the lowest-addressed byte in a 32-
378 bit word is the least significant and there are no alignment
379 restrictions, the call to Decode in MD5Transform can be replaced with
380 a typecast.
381
382 A.1 global.h
383
384 /* GLOBAL.H - RSAREF types and constants
385 */
386
387 /* PROTOTYPES should be set to one if and only if the compiler supports
388 function argument prototyping.
389 The following makes PROTOTYPES default to 0 if it has not already
390
391
392
393 Rivest [Page 7]
394
395 RFC 1321 MD5 Message-Digest Algorithm April 1992
396
397
398 been defined with C compiler flags.
399 */
400 #ifndef PROTOTYPES
401 #define PROTOTYPES 0
402 #endif
403
404 /* POINTER defines a generic pointer type */
405 typedef unsigned char *POINTER;
406
407 /* UINT2 defines a two byte word */
408 typedef unsigned short int UINT2;
409
410 /* UINT4 defines a four byte word */
411 typedef unsigned long int UINT4;
412
413 /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
414 If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
415 returns an empty list.
416 */
417 #if PROTOTYPES
418 #define PROTO_LIST(list) list
419 #else
420 #define PROTO_LIST(list) ()
421 #endif
422
423 A.2 md5.h
424
425 /* MD5.H - header file for MD5C.C
426 */
427
428 /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
429 rights reserved.
430
431 License to copy and use this software is granted provided that it
432 is identified as the "RSA Data Security, Inc. MD5 Message-Digest
433 Algorithm" in all material mentioning or referencing this software
434 or this function.
435
436 License is also granted to make and use derivative works provided
437 that such works are identified as "derived from the RSA Data
438 Security, Inc. MD5 Message-Digest Algorithm" in all material
439 mentioning or referencing the derived work.
440
441 RSA Data Security, Inc. makes no representations concerning either
442 the merchantability of this software or the suitability of this
443 software for any particular purpose. It is provided "as is"
444 without express or implied warranty of any kind.
445
446
447
448
449 Rivest [Page 8]
450
451 RFC 1321 MD5 Message-Digest Algorithm April 1992
452
453
454 These notices must be retained in any copies of any part of this
455 documentation and/or software.
456 */
457
458 /* MD5 context. */
459 typedef struct {
460 UINT4 state[4]; /* state (ABCD) */
461 UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
462 unsigned char buffer[64]; /* input buffer */
463 } MD5_CTX;
464
465 void MD5Init PROTO_LIST ((MD5_CTX *));
466 void MD5Update PROTO_LIST
467 ((MD5_CTX *, unsigned char *, unsigned int));
468 void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
469
470 A.3 md5c.c
471
472 /* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
473 */
474
475 /* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
476 rights reserved.
477
478 License to copy and use this software is granted provided that it
479 is identified as the "RSA Data Security, Inc. MD5 Message-Digest
480 Algorithm" in all material mentioning or referencing this software
481 or this function.
482
483 License is also granted to make and use derivative works provided
484 that such works are identified as "derived from the RSA Data
485 Security, Inc. MD5 Message-Digest Algorithm" in all material
486 mentioning or referencing the derived work.
487
488 RSA Data Security, Inc. makes no representations concerning either
489 the merchantability of this software or the suitability of this
490 software for any particular purpose. It is provided "as is"
491 without express or implied warranty of any kind.
492
493 These notices must be retained in any copies of any part of this
494 documentation and/or software.
495 */
496
497 #include "global.h"
498 #include "md5.h"
499
500 /* Constants for MD5Transform routine.
501 */
502
503
504
505 Rivest [Page 9]
506
507 RFC 1321 MD5 Message-Digest Algorithm April 1992
508
509
510 #define S11 7
511 #define S12 12
512 #define S13 17
513 #define S14 22
514 #define S21 5
515 #define S22 9
516 #define S23 14
517 #define S24 20
518 #define S31 4
519 #define S32 11
520 #define S33 16
521 #define S34 23
522 #define S41 6
523 #define S42 10
524 #define S43 15
525 #define S44 21
526
527 static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
528 static void Encode PROTO_LIST
529 ((unsigned char *, UINT4 *, unsigned int));
530 static void Decode PROTO_LIST
531 ((UINT4 *, unsigned char *, unsigned int));
532 static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
533 static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
534
535 static unsigned char PADDING[64] = {
536 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
537 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
538 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
539 };
540
541 /* F, G, H and I are basic MD5 functions.
542 */
543 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
544 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
545 #define H(x, y, z) ((x) ^ (y) ^ (z))
546 #define I(x, y, z) ((y) ^ ((x) | (~z)))
547
548 /* ROTATE_LEFT rotates x left n bits.
549 */
550 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
551
552 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
553 Rotation is separate from addition to prevent recomputation.
554 */
555 #define FF(a, b, c, d, x, s, ac) { \
556 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
557 (a) = ROTATE_LEFT ((a), (s)); \
558
559
560
561 Rivest [Page 10]
562
563 RFC 1321 MD5 Message-Digest Algorithm April 1992
564
565
566 (a) += (b); \
567 }
568 #define GG(a, b, c, d, x, s, ac) { \
569 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
570 (a) = ROTATE_LEFT ((a), (s)); \
571 (a) += (b); \
572 }
573 #define HH(a, b, c, d, x, s, ac) { \
574 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
575 (a) = ROTATE_LEFT ((a), (s)); \
576 (a) += (b); \
577 }
578 #define II(a, b, c, d, x, s, ac) { \
579 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
580 (a) = ROTATE_LEFT ((a), (s)); \
581 (a) += (b); \
582 }
583
584 /* MD5 initialization. Begins an MD5 operation, writing a new context.
585 */
586 void MD5Init (context)
587 MD5_CTX *context; /* context */
588 {
589 context->count[0] = context->count[1] = 0;
590 /* Load magic initialization constants.
591 */
592 context->state[0] = 0x67452301;
593 context->state[1] = 0xefcdab89;
594 context->state[2] = 0x98badcfe;
595 context->state[3] = 0x10325476;
596 }
597
598 /* MD5 block update operation. Continues an MD5 message-digest
599 operation, processing another message block, and updating the
600 context.
601 */
602 void MD5Update (context, input, inputLen)
603 MD5_CTX *context; /* context */
604 unsigned char *input; /* input block */
605 unsigned int inputLen; /* length of input block */
606 {
607 unsigned int i, index, partLen;
608
609 /* Compute number of bytes mod 64 */
610 index = (unsigned int)((context->count[0] >> 3) & 0x3F);
611
612 /* Update number of bits */
613 if ((context->count[0] += ((UINT4)inputLen << 3))
614
615
616
617 Rivest [Page 11]
618
619 RFC 1321 MD5 Message-Digest Algorithm April 1992
620
621
622 < ((UINT4)inputLen << 3))
623 context->count[1]++;
624 context->count[1] += ((UINT4)inputLen >> 29);
625
626 partLen = 64 - index;
627
628 /* Transform as many times as possible.
629 */
630 if (inputLen >= partLen) {
631 MD5_memcpy
632 ((POINTER)&context->buffer[index], (POINTER)input, partLen);
633 MD5Transform (context->state, context->buffer);
634
635 for (i = partLen; i + 63 < inputLen; i += 64)
636 MD5Transform (context->state, &input[i]);
637
638 index = 0;
639 }
640 else
641 i = 0;
642
643 /* Buffer remaining input */
644 MD5_memcpy
645 ((POINTER)&context->buffer[index], (POINTER)&input[i],
646 inputLen-i);
647 }
648
649 /* MD5 finalization. Ends an MD5 message-digest operation, writing the
650 the message digest and zeroizing the context.
651 */
652 void MD5Final (digest, context)
653 unsigned char digest[16]; /* message digest */
654 MD5_CTX *context; /* context */
655 {
656 unsigned char bits[8];
657 unsigned int index, padLen;
658
659 /* Save number of bits */
660 Encode (bits, context->count, 8);
661
662 /* Pad out to 56 mod 64.
663 */
664 index = (unsigned int)((context->count[0] >> 3) & 0x3f);
665 padLen = (index < 56) ? (56 - index) : (120 - index);
666 MD5Update (context, PADDING, padLen);
667
668 /* Append length (before padding) */
669 MD5Update (context, bits, 8);
670
671
672
673 Rivest [Page 12]
674
675 RFC 1321 MD5 Message-Digest Algorithm April 1992
676
677
678 /* Store state in digest */
679 Encode (digest, context->state, 16);
680
681 /* Zeroize sensitive information.
682 */
683 MD5_memset ((POINTER)context, 0, sizeof (*context));
684 }
685
686 /* MD5 basic transformation. Transforms state based on block.
687 */
688 static void MD5Transform (state, block)
689 UINT4 state[4];
690 unsigned char block[64];
691 {
692 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
693
694 Decode (x, block, 64);
695
696 /* Round 1 */
697 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
698 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
699 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
700 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
701 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
702 FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
703 FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
704 FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
705 FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
706 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
707 FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
708 FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
709 FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
710 FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
711 FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
712 FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
713
714 /* Round 2 */
715 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
716 GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
717 GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
718 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
719 GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
720 GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
721 GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
722 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
723 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
724 GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
725 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
726
727
728
729 Rivest [Page 13]
730
731 RFC 1321 MD5 Message-Digest Algorithm April 1992
732
733
734 GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
735 GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
736 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
737 GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
738 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
739
740 /* Round 3 */
741 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
742 HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
743 HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
744 HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
745 HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
746 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
747 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
748 HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
749 HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
750 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
751 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
752 HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
753 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
754 HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
755 HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
756 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
757
758 /* Round 4 */
759 II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
760 II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
761 II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
762 II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
763 II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
764 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
765 II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
766 II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
767 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
768 II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
769 II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
770 II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
771 II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
772 II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
773 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
774 II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
775
776 state[0] += a;
777 state[1] += b;
778 state[2] += c;
779 state[3] += d;
780
781 /* Zeroize sensitive information.
782
783
784
785 Rivest [Page 14]
786
787 RFC 1321 MD5 Message-Digest Algorithm April 1992
788
789
790 */
791 MD5_memset ((POINTER)x, 0, sizeof (x));
792 }
793
794 /* Encodes input (UINT4) into output (unsigned char). Assumes len is
795 a multiple of 4.
796 */
797 static void Encode (output, input, len)
798 unsigned char *output;
799 UINT4 *input;
800 unsigned int len;
801 {
802 unsigned int i, j;
803
804 for (i = 0, j = 0; j < len; i++, j += 4) {
805 output[j] = (unsigned char)(input[i] & 0xff);
806 output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
807 output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
808 output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
809 }
810 }
811
812 /* Decodes input (unsigned char) into output (UINT4). Assumes len is
813 a multiple of 4.
814 */
815 static void Decode (output, input, len)
816 UINT4 *output;
817 unsigned char *input;
818 unsigned int len;
819 {
820 unsigned int i, j;
821
822 for (i = 0, j = 0; j < len; i++, j += 4)
823 output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
824 (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
825 }
826
827 /* Note: Replace "for loop" with standard memcpy if possible.
828 */
829
830 static void MD5_memcpy (output, input, len)
831 POINTER output;
832 POINTER input;
833 unsigned int len;
834 {
835 unsigned int i;
836
837 for (i = 0; i < len; i++)
838
839
840
841 Rivest [Page 15]
842
843 RFC 1321 MD5 Message-Digest Algorithm April 1992
844
845
846 output[i] = input[i];
847 }
848
849 /* Note: Replace "for loop" with standard memset if possible.
850 */
851 static void MD5_memset (output, value, len)
852 POINTER output;
853 int value;
854 unsigned int len;
855 {
856 unsigned int i;
857
858 for (i = 0; i < len; i++)
859 ((char *)output)[i] = (char)value;
860 }
861
862 A.4 mddriver.c
863
864 /* MDDRIVER.C - test driver for MD2, MD4 and MD5
865 */
866
867 /* Copyright (C) 1990-2, RSA Data Security, Inc. Created 1990. All
868 rights reserved.
869
870 RSA Data Security, Inc. makes no representations concerning either
871 the merchantability of this software or the suitability of this
872 software for any particular purpose. It is provided "as is"
873 without express or implied warranty of any kind.
874
875 These notices must be retained in any copies of any part of this
876 documentation and/or software.
877 */
878
879 /* The following makes MD default to MD5 if it has not already been
880 defined with C compiler flags.
881 */
882 #ifndef MD
883 #define MD MD5
884 #endif
885
886 #include <stdio.h>
887 #include <time.h>
888 #include <string.h>
889 #include "global.h"
890 #if MD == 2
891 #include "md2.h"
892 #endif
893 #if MD == 4
894
895
896
897 Rivest [Page 16]
898
899 RFC 1321 MD5 Message-Digest Algorithm April 1992
900
901
902 #include "md4.h"
903 #endif
904 #if MD == 5
905 #include "md5.h"
906 #endif
907
908 /* Length of test block, number of test blocks.
909 */
910 #define TEST_BLOCK_LEN 1000
911 #define TEST_BLOCK_COUNT 1000
912
913 static void MDString PROTO_LIST ((char *));
914 static void MDTimeTrial PROTO_LIST ((void));
915 static void MDTestSuite PROTO_LIST ((void));
916 static void MDFile PROTO_LIST ((char *));
917 static void MDFilter PROTO_LIST ((void));
918 static void MDPrint PROTO_LIST ((unsigned char [16]));
919
920 #if MD == 2
921 #define MD_CTX MD2_CTX
922 #define MDInit MD2Init
923 #define MDUpdate MD2Update
924 #define MDFinal MD2Final
925 #endif
926 #if MD == 4
927 #define MD_CTX MD4_CTX
928 #define MDInit MD4Init
929 #define MDUpdate MD4Update
930 #define MDFinal MD4Final
931 #endif
932 #if MD == 5
933 #define MD_CTX MD5_CTX
934 #define MDInit MD5Init
935 #define MDUpdate MD5Update
936 #define MDFinal MD5Final
937 #endif
938
939 /* Main driver.
940
941 Arguments (may be any combination):
942 -sstring - digests string
943 -t - runs time trial
944 -x - runs test script
945 filename - digests file
946 (none) - digests standard input
947 */
948 int main (argc, argv)
949 int argc;
950
951
952
953 Rivest [Page 17]
954
955 RFC 1321 MD5 Message-Digest Algorithm April 1992
956
957
958 char *argv[];
959 {
960 int i;
961
962 if (argc > 1)
963 for (i = 1; i < argc; i++)
964 if (argv[i][0] == '-' && argv[i][1] == 's')
965 MDString (argv[i] + 2);
966 else if (strcmp (argv[i], "-t") == 0)
967 MDTimeTrial ();
968 else if (strcmp (argv[i], "-x") == 0)
969 MDTestSuite ();
970 else
971 MDFile (argv[i]);
972 else
973 MDFilter ();
974
975 return (0);
976 }
977
978 /* Digests a string and prints the result.
979 */
980 static void MDString (string)
981 char *string;
982 {
983 MD_CTX context;
984 unsigned char digest[16];
985 unsigned int len = strlen (string);
986
987 MDInit (&context);
988 MDUpdate (&context, string, len);
989 MDFinal (digest, &context);
990
991 printf ("MD%d (\"%s\") = ", MD, string);
992 MDPrint (digest);
993 printf ("\n");
994 }
995
996 /* Measures the time to digest TEST_BLOCK_COUNT TEST_BLOCK_LEN-byte
997 blocks.
998 */
999 static void MDTimeTrial ()
1000 {
1001 MD_CTX context;
1002 time_t endTime, startTime;
1003 unsigned char block[TEST_BLOCK_LEN], digest[16];
1004 unsigned int i;
1005
1006
1007
1008
1009 Rivest [Page 18]
1010
1011 RFC 1321 MD5 Message-Digest Algorithm April 1992
1012
1013
1014 printf
1015 ("MD%d time trial. Digesting %d %d-byte blocks ...", MD,
1016 TEST_BLOCK_LEN, TEST_BLOCK_COUNT);
1017
1018 /* Initialize block */
1019 for (i = 0; i < TEST_BLOCK_LEN; i++)
1020 block[i] = (unsigned char)(i & 0xff);
1021
1022 /* Start timer */
1023 time (&startTime);
1024
1025 /* Digest blocks */
1026 MDInit (&context);
1027 for (i = 0; i < TEST_BLOCK_COUNT; i++)
1028 MDUpdate (&context, block, TEST_BLOCK_LEN);
1029 MDFinal (digest, &context);
1030
1031 /* Stop timer */
1032 time (&endTime);
1033
1034 printf (" done\n");
1035 printf ("Digest = ");
1036 MDPrint (digest);
1037 printf ("\nTime = %ld seconds\n", (long)(endTime-startTime));
1038 printf
1039 ("Speed = %ld bytes/second\n",
1040 (long)TEST_BLOCK_LEN * (long)TEST_BLOCK_COUNT/(endTime-startTime));
1041 }
1042
1043 /* Digests a reference suite of strings and prints the results.
1044 */
1045 static void MDTestSuite ()
1046 {
1047 printf ("MD%d test suite:\n", MD);
1048
1049 MDString ("");
1050 MDString ("a");
1051 MDString ("abc");
1052 MDString ("message digest");
1053 MDString ("abcdefghijklmnopqrstuvwxyz");
1054 MDString
1055 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789");
1056 MDString
1057 ("1234567890123456789012345678901234567890\
1058 1234567890123456789012345678901234567890");
1059 }
1060
1061 /* Digests a file and prints the result.
1062
1063
1064
1065 Rivest [Page 19]
1066
1067 RFC 1321 MD5 Message-Digest Algorithm April 1992
1068
1069
1070 */
1071 static void MDFile (filename)
1072 char *filename;
1073 {
1074 FILE *file;
1075 MD_CTX context;
1076 int len;
1077 unsigned char buffer[1024], digest[16];
1078
1079 if ((file = fopen (filename, "rb")) == NULL)
1080 printf ("%s can't be opened\n", filename);
1081
1082 else {
1083 MDInit (&context);
1084 while (len = fread (buffer, 1, 1024, file))
1085 MDUpdate (&context, buffer, len);
1086 MDFinal (digest, &context);
1087
1088 fclose (file);
1089
1090 printf ("MD%d (%s) = ", MD, filename);
1091 MDPrint (digest);
1092 printf ("\n");
1093 }
1094 }
1095
1096 /* Digests the standard input and prints the result.
1097 */
1098 static void MDFilter ()
1099 {
1100 MD_CTX context;
1101 int len;
1102 unsigned char buffer[16], digest[16];
1103
1104 MDInit (&context);
1105 while (len = fread (buffer, 1, 16, stdin))
1106 MDUpdate (&context, buffer, len);
1107 MDFinal (digest, &context);
1108
1109 MDPrint (digest);
1110 printf ("\n");
1111 }
1112
1113 /* Prints a message digest in hexadecimal.
1114 */
1115 static void MDPrint (digest)
1116 unsigned char digest[16];
1117 {
1118
1119
1120
1121 Rivest [Page 20]
1122
1123 RFC 1321 MD5 Message-Digest Algorithm April 1992
1124
1125
1126 unsigned int i;
1127
1128 for (i = 0; i < 16; i++)
1129 printf ("%02x", digest[i]);
1130 }
1131
1132 A.5 Test suite
1133
1134 The MD5 test suite (driver option "-x") should print the following
1135 results:
1136
1137 MD5 test suite:
1138 MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
1139 MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
1140 MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
1141 MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
1142 MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
1143 MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
1144 d174ab98d277d9f5a5611c2c9f419d9f
1145 MD5 ("123456789012345678901234567890123456789012345678901234567890123456
1146 78901234567890") = 57edf4a22be3c955ac49da2e2107b67a
1147
1148 Security Considerations
1149
1150 The level of security discussed in this memo is considered to be
1151 sufficient for implementing very high security hybrid digital-
1152 signature schemes based on MD5 and a public-key cryptosystem.
1153
1154 Author's Address
1155
1156 Ronald L. Rivest
1157 Massachusetts Institute of Technology
1158 Laboratory for Computer Science
1159 NE43-324
1160 545 Technology Square
1161 Cambridge, MA 02139-1986
1162
1163 Phone: (617) 253-5880
1164 EMail: rivest@theory.lcs.mit.edu
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177 Rivest [Page 21]
1178
1179

MailToCvsAdmin">MailToCvsAdmin
ViewVC Help
Powered by ViewVC 1.1.26 RSS 2.0 feed