2N/A * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 2N/A * Use is subject to license terms. 2N/A#
pragma ident "%Z%%M% %I% %E% SMI" 2N/A************************************************************************** 2N/A** md5.c -- the source code for MD5 routines ** 2N/A** RSA Data Security, Inc. MD5 Message-Digest Algorithm ** 2N/A** Created: 2/17/90 RLR ** 2N/A** Revised: 1/91 SRD, AJ, BSK, JT Reference C ver., 7/10 constant corr. ** 2N/A************************************************************************** 2N/A************************************************************************** 2N/A** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. ** 2N/A** License to copy and use this software is granted provided that ** 2N/A** it is identified as the "RSA Data Security, Inc. MD5 Message- ** 2N/A** Digest Algorithm" in all material mentioning or referencing this ** 2N/A** software or this function. ** 2N/A** License is also granted to make and use derivative works ** 2N/A** provided that such works are identified as "derived from the RSA ** 2N/A** Data Security, Inc. MD5 Message-Digest Algorithm" in all ** 2N/A** material mentioning or referencing the derived work. ** 2N/A** RSA Data Security, Inc. makes no representations concerning ** 2N/A** either the merchantability of this software or the suitability ** 2N/A** of this software for any particular purpose. It is provided "as ** 2N/A** is" without express or implied warranty of any kind. ** 2N/A** These notices must be retained in any copies of any part of this ** 2N/A************************************************************************** 2N/A************************************************************************** 2N/A** Message-digest routines: ** 2N/A** To form the message digest for a message M ** 2N/A** (1) Initialize a context buffer mdContext using MD5Init ** 2N/A** (2) Call MD5Update on mdContext and M ** 2N/A** (3) Call MD5Final on mdContext ** 2N/A** The message digest is now in mdContext->digest[0...15] ** 2N/A************************************************************************** 2N/A/* forward declaration */ 2N/A 0x80,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
2N/A 0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00,
0x00 2N/A/* F, G, H and I are basic MD5 functions */ 2N/A#
define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
2N/A#
define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
2N/A#
define H(x, y, z) ((x) ^ (y) ^ (z))
2N/A#
define I(x, y, z) ((y) ^ ((x) | (~z)))
2N/A/* ROTATE_LEFT rotates x left n bits */ 2N/A/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */ 2N/A/* Rotation is separate from addition to prevent recomputation */ 2N/A* The routine MD5Init initializes the message-digest context 2N/A* mdContext. All fields are set to zero. 2N/A * Load magic initialization constants. 2N/A* The routine MD5Update updates the message-digest context to 2N/A* account for the presence of each of the characters inBuf[0..inLen-1] 2N/A* in the message whose digest is being computed. 2N/A /* compute number of bytes mod 64 */ 2N/A /* update number of bits */ 2N/A /* add new character to buffer, increment mdi */ 2N/A /* transform if necessary */ 2N/A for (i = 0,
ii = 0; i <
16; i++,
ii +=
4)
2N/A* The routine MD5Final terminates the message-digest computation and 2N/A* ends with the desired message digest in mdContext->digest[0...15]. 2N/A /* save number of bits */ 2N/A /* compute number of bytes mod 64 */ 2N/A /* pad out to 56 mod 64 */ 2N/A /* append length in bits and transform */ 2N/A for (i = 0,
ii = 0; i <
14; i++,
ii +=
4)
2N/A /* store buffer in digest */ 2N/A for (i = 0,
ii = 0; i <
4; i++,
ii +=
4) {
2N/A* Basic MD5 step. Transforms buf based on in. 2N/A FF (a, b, c, d,
in[ 0],
S11,
3614090360U);
/* 1 */ 2N/A FF (d, a, b, c,
in[
1],
S12,
3905402710U);
/* 2 */ 2N/A FF (b, c, d, a,
in[
3],
S14,
3250441966U);
/* 4 */ 2N/A FF (a, b, c, d,
in[
4],
S11,
4118548399U);
/* 5 */ 2N/A FF (d, a, b, c,
in[
5],
S12,
1200080426U);
/* 6 */ 2N/A FF (c, d, a, b,
in[
6],
S13,
2821735955U);
/* 7 */ 2N/A FF (b, c, d, a,
in[
7],
S14,
4249261313U);
/* 8 */ 2N/A FF (a, b, c, d,
in[
8],
S11,
1770035416U);
/* 9 */ 2N/A FF (d, a, b, c,
in[
9],
S12,
2336552879U);
/* 10 */ 2N/A FF (c, d, a, b,
in[
10],
S13,
4294925233U);
/* 11 */ 2N/A FF (b, c, d, a,
in[
11],
S14,
2304563134U);
/* 12 */ 2N/A FF (a, b, c, d,
in[
12],
S11,
1804603682U);
/* 13 */ 2N/A FF (d, a, b, c,
in[
13],
S12,
4254626195U);
/* 14 */ 2N/A FF (c, d, a, b,
in[
14],
S13,
2792965006U);
/* 15 */ 2N/A FF (b, c, d, a,
in[
15],
S14,
1236535329U);
/* 16 */ 2N/A GG (a, b, c, d,
in[
1],
S21,
4129170786U);
/* 17 */ 2N/A GG (d, a, b, c,
in[
6],
S22,
3225465664U);
/* 18 */ 2N/A GG (c, d, a, b,
in[
11],
S23,
643717713U);
/* 19 */ 2N/A GG (b, c, d, a,
in[ 0],
S24,
3921069994U);
/* 20 */ 2N/A GG (a, b, c, d,
in[
5],
S21,
3593408605U);
/* 21 */ 2N/A GG (c, d, a, b,
in[
15],
S23,
3634488961U);
/* 23 */ 2N/A GG (b, c, d, a,
in[
4],
S24,
3889429448U);
/* 24 */ 2N/A GG (a, b, c, d,
in[
9],
S21,
568446438U);
/* 25 */ 2N/A GG (d, a, b, c,
in[
14],
S22,
3275163606U);
/* 26 */ 2N/A GG (c, d, a, b,
in[
3],
S23,
4107603335U);
/* 27 */ 2N/A GG (b, c, d, a,
in[
8],
S24,
1163531501U);
/* 28 */ 2N/A GG (a, b, c, d,
in[
13],
S21,
2850285829U);
/* 29 */ 2N/A GG (d, a, b, c,
in[
2],
S22,
4243563512U);
/* 30 */ 2N/A GG (c, d, a, b,
in[
7],
S23,
1735328473U);
/* 31 */ 2N/A GG (b, c, d, a,
in[
12],
S24,
2368359562U);
/* 32 */ 2N/A HH (a, b, c, d,
in[
5],
S31,
4294588738U);
/* 33 */ 2N/A HH (d, a, b, c,
in[
8],
S32,
2272392833U);
/* 34 */ 2N/A HH (c, d, a, b,
in[
11],
S33,
1839030562U);
/* 35 */ 2N/A HH (b, c, d, a,
in[
14],
S34,
4259657740U);
/* 36 */ 2N/A HH (a, b, c, d,
in[
1],
S31,
2763975236U);
/* 37 */ 2N/A HH (d, a, b, c,
in[
4],
S32,
1272893353U);
/* 38 */ 2N/A HH (c, d, a, b,
in[
7],
S33,
4139469664U);
/* 39 */ 2N/A HH (b, c, d, a,
in[
10],
S34,
3200236656U);
/* 40 */ 2N/A HH (a, b, c, d,
in[
13],
S31,
681279174U);
/* 41 */ 2N/A HH (d, a, b, c,
in[ 0],
S32,
3936430074U);
/* 42 */ 2N/A HH (c, d, a, b,
in[
3],
S33,
3572445317U);
/* 43 */ 2N/A HH (a, b, c, d,
in[
9],
S31,
3654602809U);
/* 45 */ 2N/A HH (d, a, b, c,
in[
12],
S32,
3873151461U);
/* 46 */ 2N/A HH (c, d, a, b,
in[
15],
S33,
530742520U);
/* 47 */ 2N/A HH (b, c, d, a,
in[
2],
S34,
3299628645U);
/* 48 */ 2N/A II (a, b, c, d,
in[ 0],
S41,
4096336452U);
/* 49 */ 2N/A II (d, a, b, c,
in[
7],
S42,
1126891415U);
/* 50 */ 2N/A II (c, d, a, b,
in[
14],
S43,
2878612391U);
/* 51 */ 2N/A II (b, c, d, a,
in[
5],
S44,
4237533241U);
/* 52 */ 2N/A II (a, b, c, d,
in[
12],
S41,
1700485571U);
/* 53 */ 2N/A II (d, a, b, c,
in[
3],
S42,
2399980690U);
/* 54 */ 2N/A II (c, d, a, b,
in[
10],
S43,
4293915773U);
/* 55 */ 2N/A II (b, c, d, a,
in[
1],
S44,
2240044497U);
/* 56 */ 2N/A II (a, b, c, d,
in[
8],
S41,
1873313359U);
/* 57 */ 2N/A II (d, a, b, c,
in[
15],
S42,
4264355552U);
/* 58 */ 2N/A II (c, d, a, b,
in[
6],
S43,
2734768916U);
/* 59 */ 2N/A II (b, c, d, a,
in[
13],
S44,
1309151649U);
/* 60 */ 2N/A II (a, b, c, d,
in[
4],
S41,
4149444226U);
/* 61 */ 2N/A II (d, a, b, c,
in[
11],
S42,
3174756917U);
/* 62 */ 2N/A II (c, d, a, b,
in[
2],
S43,
718787259U);
/* 63 */ 2N/A II (b, c, d, a,
in[
9],
S44,
3951481745U);
/* 64 */