1
/* MD5 Message-Digest Algorithm - JavaScript
2
' MODIFICATION HISTORY:
3
' 1.0 16-Feb-2001 - Phil Fresle (sales@frez.co.uk) - Initial Version (VB/ASP code)
4
' 1.0 21-Feb-2001 - Enrico Mosanghini (erik504@yahoo.com) - JavaScript porting
5
*/
6
function MD5(sMessage) {
7
function RotateLeft(lValue,
iShiftBits) { return (lValue<<iShiftBits)
| (lValue>>>(32-iShiftBits));
}
8
function AddUnsigned(lX,lY)
{
9
var lX4,lY4,lX8,lY8,lResult;
10
lX8
= (lX
& 0x80000000);
11
lY8
= (lY
& 0x80000000);
12
lX4
= (lX
& 0x40000000);
13
lY4
= (lY
& 0x40000000);
14
lResult
= (lX
& 0x3FFFFFFF)+(lY
& 0x3FFFFFFF);
15
if (lX4
& lY4) return (lResult
^ 0x80000000
^ lX8
^ lY8);
16
if (lX4
| lY4) {
17
if (lResult
& 0x40000000)
return (lResult
^ 0xC0000000
^ lX8
^ lY8);
18
else return (lResult
^ 0x40000000
^ lX8
^ lY8);
19
}
else return (lResult
^ lX8
^ lY8);
20
}
21
function F(x,y,z) {
return (x
& y) | ((~x)
& z); }
22
function G(x,y,z) {
return (x
& z) | (y
& (~z)); }
23
function H(x,y,z) {
return (x
^ y ^ z); }
24
function I(x,y,z) {
return (y
^ (x | (~z))); }
25
function FF(a,b,c,d,x,s,ac) {
26
a
= AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
27
return AddUnsigned(RotateLeft(a, s), b);
28
}
29
function GG(a,b,c,d,x,s,ac) {
30
a
= AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
31
return AddUnsigned(RotateLeft(a, s), b);
32
}
33
function HH(a,b,c,d,x,s,ac) {
34
a
= AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
35
return AddUnsigned(RotateLeft(a, s), b);
36
}
37
function II(a,b,c,d,x,s,ac) {
38
a
= AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
39
return AddUnsigned(RotateLeft(a, s), b);
40
}
41
function ConvertToWordArray(sMessage)
{
42
var lWordCount;
43
var lMessageLength
= sMessage.length;
44
var lNumberOfWords_temp1=lMessageLength
+ 8;
45
var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1
% 64))/64;
46
var lNumberOfWords
= (lNumberOfWords_temp2+1)*16;
47
var lWordArray=Array(lNumberOfWords-1);
48
var lBytePosition
= 0;
49
var lByteCount
= 0;
50
while ( lByteCount
< lMessageLength ) {
51
lWordCount
= (lByteCount-(lByteCount
% 4))/4;
52
lBytePosition
= (lByteCount
% 4)*8;
53
lWordArray[lWordCount]
= (lWordArray[lWordCount]
| (sMessage.charCodeAt(lByteCount)<<lBytePosition));
54
lByteCount++;
55
}
56
lWordCount
= (lByteCount-(lByteCount
% 4))/4;
57
lBytePosition
= (lByteCount
% 4)*8;
58
lWordArray[lWordCount]
= lWordArray[lWordCount]
| (0x80<<lBytePosition);
59
lWordArray[lNumberOfWords-2]
= lMessageLength<<3;
60
lWordArray[lNumberOfWords-1]
= lMessageLength>>>29;
61
return lWordArray;
62
}
63
function WordToHex(lValue) {
64
var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
65
for (lCount
= 0;lCount<=3;lCount++)
{
66
lByte
= (lValue>>>(lCount*8))
& 255;
67
WordToHexValue_temp
= "0"
+ lByte.toString(16);
68
WordToHexValue
= WordToHexValue
+ WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
69
}
70
return WordToHexValue;
71
}
72
var x=Array();
73
var k,AA,BB,CC,DD,a,b,c,d
74
var S11=7, S12=12,
S13=17, S14=22;
75
var S21=5, S22=9
, S23=14, S24=20;
76
var S31=4, S32=11,
S33=16, S34=23;
77
var S41=6, S42=10,
S43=15, S44=21;
78
// Steps 1 and 2. Append padding bits and length and convert to words
79
x
= ConvertToWordArray(sMessage);
80
// Step 3. Initialise
81
a
= 0x67452301; b
= 0xEFCDAB89; c
= 0x98BADCFE; d
= 0x10325476;
82
// Step 4. Process the message in 16-word blocks
83
for (k=0;k<x.length;k+=16)
{
84
AA=a; BB=b;
CC=c; DD=d;
85
a=FF(a,b,c,d,x[k+0],
S11,0xD76AA478);
86
d=FF(d,a,b,c,x[k+1],
S12,0xE8C7B756);
87
c=FF(c,d,a,b,x[k+2],
S13,0x242070DB);
88
b=FF(b,c,d,a,x[k+3],
S14,0xC1BDCEEE);
89
a=FF(a,b,c,d,x[k+4],
S11,0xF57C0FAF);
90
d=FF(d,a,b,c,x[k+5],
S12,0x4787C62A);
91
c=FF(c,d,a,b,x[k+6],
S13,0xA8304613);
92
b=FF(b,c,d,a,x[k+7],
S14,0xFD469501);
93
a=FF(a,b,c,d,x[k+8],
S11,0x698098D8);
94
d=FF(d,a,b,c,x[k+9],
S12,0x8B44F7AF);
95
c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
96
b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
97
a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
98
d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
99
c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
100
b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
101
a=GG(a,b,c,d,x[k+1],
S21,0xF61E2562);
102
d=GG(d,a,b,c,x[k+6],
S22,0xC040B340);
103
c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
104
b=GG(b,c,d,a,x[k+0],
S24,0xE9B6C7AA);
105
a=GG(a,b,c,d,x[k+5],
S21,0xD62F105D);
106
d=GG(d,a,b,c,x[k+10],S22,0x2441453);
107
c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
108
b=GG(b,c,d,a,x[k+4],
S24,0xE7D3FBC8);
109
a=GG(a,b,c,d,x[k+9],
S21,0x21E1CDE6);
110
d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
111
c=GG(c,d,a,b,x[k+3],
S23,0xF4D50D87);
112
b=GG(b,c,d,a,x[k+8],
S24,0x455A14ED);
113
a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
114
d=GG(d,a,b,c,x[k+2],
S22,0xFCEFA3F8);
115
c=GG(c,d,a,b,x[k+7],
S23,0x676F02D9);
116
b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
117
a=HH(a,b,c,d,x[k+5],
S31,0xFFFA3942);
118
d=HH(d,a,b,c,x[k+8],
S32,0x8771F681);
119
c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
120
b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
121
a=HH(a,b,c,d,x[k+1],
S31,0xA4BEEA44);
122
d=HH(d,a,b,c,x[k+4],
S32,0x4BDECFA9);
123
c=HH(c,d,a,b,x[k+7],
S33,0xF6BB4B60);
124
b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
125
a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
126
d=HH(d,a,b,c,x[k+0],
S32,0xEAA127FA);
127
c=HH(c,d,a,b,x[k+3],
S33,0xD4EF3085);
128
b=HH(b,c,d,a,x[k+6],
S34,0x4881D05);
129
a=HH(a,b,c,d,x[k+9],
S31,0xD9D4D039);
130
d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
131
c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
132
b=HH(b,c,d,a,x[k+2],
S34,0xC4AC5665);
133
a=II(a,b,c,d,x[k+0],
S41,0xF4292244);
134
d=II(d,a,b,c,x[k+7],
S42,0x432AFF97);
135
c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
136
b=II(b,c,d,a,x[k+5],
S44,0xFC93A039);
137
a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
138
d=II(d,a,b,c,x[k+3],
S42,0x8F0CCC92);
139
c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
140
b=II(b,c,d,a,x[k+1],
S44,0x85845DD1);
141
a=II(a,b,c,d,x[k+8],
S41,0x6FA87E4F);
142
d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
143
c=II(c,d,a,b,x[k+6],
S43,0xA3014314);
144
b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
145
a=II(a,b,c,d,x[k+4],
S41,0xF7537E82);
146
d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
147
c=II(c,d,a,b,x[k+2],
S43,0x2AD7D2BB);
148
b=II(b,c,d,a,x[k+9],
S44,0xEB86D391);
149
a=AddUnsigned(a,AA);
b=AddUnsigned(b,BB); c=AddUnsigned(c,CC); d=AddUnsigned(d,DD);
150
}
151
// Step 5. Output the 128 bit digest
152
var temp= WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);
153
return temp.toLowerCase();
154
}

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154
