1
2
3
4
5
6
7
8
9 package md5
10
11
12 var table = []uint32{
13
14 0xd76aa478,
15 0xe8c7b756,
16 0x242070db,
17 0xc1bdceee,
18 0xf57c0faf,
19 0x4787c62a,
20 0xa8304613,
21 0xfd469501,
22 0x698098d8,
23 0x8b44f7af,
24 0xffff5bb1,
25 0x895cd7be,
26 0x6b901122,
27 0xfd987193,
28 0xa679438e,
29 0x49b40821,
30
31
32 0xf61e2562,
33 0xc040b340,
34 0x265e5a51,
35 0xe9b6c7aa,
36 0xd62f105d,
37 0x2441453,
38 0xd8a1e681,
39 0xe7d3fbc8,
40 0x21e1cde6,
41 0xc33707d6,
42 0xf4d50d87,
43 0x455a14ed,
44 0xa9e3e905,
45 0xfcefa3f8,
46 0x676f02d9,
47 0x8d2a4c8a,
48
49
50 0xfffa3942,
51 0x8771f681,
52 0x6d9d6122,
53 0xfde5380c,
54 0xa4beea44,
55 0x4bdecfa9,
56 0xf6bb4b60,
57 0xbebfbc70,
58 0x289b7ec6,
59 0xeaa127fa,
60 0xd4ef3085,
61 0x4881d05,
62 0xd9d4d039,
63 0xe6db99e5,
64 0x1fa27cf8,
65 0xc4ac5665,
66
67
68 0xf4292244,
69 0x432aff97,
70 0xab9423a7,
71 0xfc93a039,
72 0x655b59c3,
73 0x8f0ccc92,
74 0xffeff47d,
75 0x85845dd1,
76 0x6fa87e4f,
77 0xfe2ce6e0,
78 0xa3014314,
79 0x4e0811a1,
80 0xf7537e82,
81 0xbd3af235,
82 0x2ad7d2bb,
83 0xeb86d391,
84 }
85
86 var shift1 = []uint{7, 12, 17, 22}
87 var shift2 = []uint{5, 9, 14, 20}
88 var shift3 = []uint{4, 11, 16, 23}
89 var shift4 = []uint{6, 10, 15, 21}
90
91 func _Block(dig *digest, p []byte) int {
92 a := dig.s[0]
93 b := dig.s[1]
94 c := dig.s[2]
95 d := dig.s[3]
96 n := 0
97 var X [16]uint32
98 for len(p) >= _Chunk {
99 aa, bb, cc, dd := a, b, c, d
100
101 j := 0
102 for i := 0; i < 16; i++ {
103 X[i] = uint32(p[j]) | uint32(p[j+1])<<8 | uint32(p[j+2])<<16 | uint32(p[j+3])<<24
104 j += 4
105 }
106
107
108
109
110
111
112
113
114
115
116
117
118
119 for i := uint(0); i < 16; i++ {
120 x := i
121 s := shift1[i%4]
122 f := ((c ^ d) & b) ^ d
123 a += f + X[x] + table[i]
124 a = a<<s | a>>(32-s) + b
125 a, b, c, d = d, a, b, c
126 }
127
128
129 for i := uint(0); i < 16; i++ {
130 x := (1 + 5*i) % 16
131 s := shift2[i%4]
132 g := ((b ^ c) & d) ^ c
133 a += g + X[x] + table[i+16]
134 a = a<<s | a>>(32-s) + b
135 a, b, c, d = d, a, b, c
136 }
137
138
139 for i := uint(0); i < 16; i++ {
140 x := (5 + 3*i) % 16
141 s := shift3[i%4]
142 h := b ^ c ^ d
143 a += h + X[x] + table[i+32]
144 a = a<<s | a>>(32-s) + b
145 a, b, c, d = d, a, b, c
146 }
147
148
149 for i := uint(0); i < 16; i++ {
150 x := (7 * i) % 16
151 s := shift4[i%4]
152 j := c ^ (b | ^d)
153 a += j + X[x] + table[i+48]
154 a = a<<s | a>>(32-s) + b
155 a, b, c, d = d, a, b, c
156 }
157
158 a += aa
159 b += bb
160 c += cc
161 d += dd
162
163 p = p[_Chunk:]
164 n += _Chunk
165 }
166
167 dig.s[0] = a
168 dig.s[1] = b
169 dig.s[2] = c
170 dig.s[3] = d
171 return n
172 }