1
1
/*
2
- * Copyright (c) 1996, 2020 , Oracle and/or its affiliates. All rights reserved.
2
+ * Copyright (c) 1996, 2021 , Oracle and/or its affiliates. All rights reserved.
3
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
4
*
5
5
* This code is free software; you can redistribute it and/or modify it
25
25
26
26
package sun .security .provider ;
27
27
28
+ import java .lang .invoke .MethodHandles ;
29
+ import java .lang .invoke .VarHandle ;
30
+ import java .nio .ByteOrder ;
28
31
import java .util .Arrays ;
29
32
import java .util .Objects ;
30
33
@@ -44,8 +47,6 @@ public final class MD5 extends DigestBase {
44
47
45
48
// state of this object
46
49
private int [] state ;
47
- // temporary buffer, used by implCompress()
48
- private int [] x ;
49
50
50
51
// rotation constants
51
52
private static final int S11 = 7 ;
@@ -69,15 +70,13 @@ public final class MD5 extends DigestBase {
69
70
public MD5 () {
70
71
super ("MD5" , 16 , 64 );
71
72
state = new int [4 ];
72
- x = new int [16 ];
73
- resetHashes ();
73
+ implReset ();
74
74
}
75
75
76
76
// clone this object
77
77
public Object clone () throws CloneNotSupportedException {
78
78
MD5 copy = (MD5 ) super .clone ();
79
79
copy .state = copy .state .clone ();
80
- copy .x = new int [16 ];
81
80
return copy ;
82
81
}
83
82
@@ -86,12 +85,6 @@ public Object clone() throws CloneNotSupportedException {
86
85
*/
87
86
void implReset () {
88
87
// Load magic initialization constants.
89
- resetHashes ();
90
- // clear out old data
91
- Arrays .fill (x , 0 );
92
- }
93
-
94
- private void resetHashes () {
95
88
state [0 ] = 0x67452301 ;
96
89
state [1 ] = 0xefcdab89 ;
97
90
state [2 ] = 0x98badcfe ;
@@ -156,11 +149,12 @@ void implCompress(byte[] buf, int ofs) {
156
149
private void implCompressCheck (byte [] buf , int ofs ) {
157
150
Objects .requireNonNull (buf );
158
151
159
- // The checks performed by the method 'b2iBig64'
160
- // are sufficient for the case when the method
152
+ // These checks are sufficient for the case when the method
161
153
// 'implCompressImpl' is replaced with a compiler
162
154
// intrinsic.
163
- b2iLittle64 (buf , ofs , x );
155
+ if ((ofs < 0 ) || ((buf .length - ofs ) < 64 )) {
156
+ throw new ArrayIndexOutOfBoundsException ();
157
+ }
164
158
}
165
159
166
160
// The method 'implCompress0 seems not to use its parameters.
@@ -175,77 +169,94 @@ void implCompress0(byte[] buf, int ofs) {
175
169
int c = state [2 ];
176
170
int d = state [3 ];
177
171
172
+ int x0 = (int ) LE .INT_ARRAY .get (buf , ofs );
173
+ int x1 = (int ) LE .INT_ARRAY .get (buf , ofs + 4 );
174
+ int x2 = (int ) LE .INT_ARRAY .get (buf , ofs + 8 );
175
+ int x3 = (int ) LE .INT_ARRAY .get (buf , ofs + 12 );
176
+ int x4 = (int ) LE .INT_ARRAY .get (buf , ofs + 16 );
177
+ int x5 = (int ) LE .INT_ARRAY .get (buf , ofs + 20 );
178
+ int x6 = (int ) LE .INT_ARRAY .get (buf , ofs + 24 );
179
+ int x7 = (int ) LE .INT_ARRAY .get (buf , ofs + 28 );
180
+ int x8 = (int ) LE .INT_ARRAY .get (buf , ofs + 32 );
181
+ int x9 = (int ) LE .INT_ARRAY .get (buf , ofs + 36 );
182
+ int x10 = (int ) LE .INT_ARRAY .get (buf , ofs + 40 );
183
+ int x11 = (int ) LE .INT_ARRAY .get (buf , ofs + 44 );
184
+ int x12 = (int ) LE .INT_ARRAY .get (buf , ofs + 48 );
185
+ int x13 = (int ) LE .INT_ARRAY .get (buf , ofs + 52 );
186
+ int x14 = (int ) LE .INT_ARRAY .get (buf , ofs + 56 );
187
+ int x15 = (int ) LE .INT_ARRAY .get (buf , ofs + 60 );
188
+
178
189
/* Round 1 */
179
- a = FF ( a , b , c , d , x [ 0 ], S11 , 0xd76aa478 ); /* 1 */
180
- d = FF ( d , a , b , c , x [ 1 ], S12 , 0xe8c7b756 ); /* 2 */
181
- c = FF ( c , d , a , b , x [ 2 ], S13 , 0x242070db ); /* 3 */
182
- b = FF ( b , c , d , a , x [ 3 ], S14 , 0xc1bdceee ); /* 4 */
183
- a = FF ( a , b , c , d , x [ 4 ], S11 , 0xf57c0faf ); /* 5 */
184
- d = FF ( d , a , b , c , x [ 5 ], S12 , 0x4787c62a ); /* 6 */
185
- c = FF ( c , d , a , b , x [ 6 ], S13 , 0xa8304613 ); /* 7 */
186
- b = FF ( b , c , d , a , x [ 7 ], S14 , 0xfd469501 ); /* 8 */
187
- a = FF ( a , b , c , d , x [ 8 ], S11 , 0x698098d8 ); /* 9 */
188
- d = FF ( d , a , b , c , x [ 9 ], S12 , 0x8b44f7af ); /* 10 */
189
- c = FF ( c , d , a , b , x [ 10 ] , S13 , 0xffff5bb1 ); /* 11 */
190
- b = FF ( b , c , d , a , x [ 11 ] , S14 , 0x895cd7be ); /* 12 */
191
- a = FF ( a , b , c , d , x [ 12 ] , S11 , 0x6b901122 ); /* 13 */
192
- d = FF ( d , a , b , c , x [ 13 ] , S12 , 0xfd987193 ); /* 14 */
193
- c = FF ( c , d , a , b , x [ 14 ] , S13 , 0xa679438e ); /* 15 */
194
- b = FF ( b , c , d , a , x [ 15 ] , S14 , 0x49b40821 ); /* 16 */
190
+ a = FF ( a , b , c , d , x0 , S11 , 0xd76aa478 ); /* 1 */
191
+ d = FF ( d , a , b , c , x1 , S12 , 0xe8c7b756 ); /* 2 */
192
+ c = FF ( c , d , a , b , x2 , S13 , 0x242070db ); /* 3 */
193
+ b = FF ( b , c , d , a , x3 , S14 , 0xc1bdceee ); /* 4 */
194
+ a = FF ( a , b , c , d , x4 , S11 , 0xf57c0faf ); /* 5 */
195
+ d = FF ( d , a , b , c , x5 , S12 , 0x4787c62a ); /* 6 */
196
+ c = FF ( c , d , a , b , x6 , S13 , 0xa8304613 ); /* 7 */
197
+ b = FF ( b , c , d , a , x7 , S14 , 0xfd469501 ); /* 8 */
198
+ a = FF ( a , b , c , d , x8 , S11 , 0x698098d8 ); /* 9 */
199
+ d = FF ( d , a , b , c , x9 , S12 , 0x8b44f7af ); /* 10 */
200
+ c = FF ( c , d , a , b , x10 , S13 , 0xffff5bb1 ); /* 11 */
201
+ b = FF ( b , c , d , a , x11 , S14 , 0x895cd7be ); /* 12 */
202
+ a = FF ( a , b , c , d , x12 , S11 , 0x6b901122 ); /* 13 */
203
+ d = FF ( d , a , b , c , x13 , S12 , 0xfd987193 ); /* 14 */
204
+ c = FF ( c , d , a , b , x14 , S13 , 0xa679438e ); /* 15 */
205
+ b = FF ( b , c , d , a , x15 , S14 , 0x49b40821 ); /* 16 */
195
206
196
207
/* Round 2 */
197
- a = GG ( a , b , c , d , x [ 1 ], S21 , 0xf61e2562 ); /* 17 */
198
- d = GG ( d , a , b , c , x [ 6 ], S22 , 0xc040b340 ); /* 18 */
199
- c = GG ( c , d , a , b , x [ 11 ] , S23 , 0x265e5a51 ); /* 19 */
200
- b = GG ( b , c , d , a , x [ 0 ], S24 , 0xe9b6c7aa ); /* 20 */
201
- a = GG ( a , b , c , d , x [ 5 ], S21 , 0xd62f105d ); /* 21 */
202
- d = GG ( d , a , b , c , x [ 10 ] , S22 , 0x2441453 ); /* 22 */
203
- c = GG ( c , d , a , b , x [ 15 ] , S23 , 0xd8a1e681 ); /* 23 */
204
- b = GG ( b , c , d , a , x [ 4 ], S24 , 0xe7d3fbc8 ); /* 24 */
205
- a = GG ( a , b , c , d , x [ 9 ], S21 , 0x21e1cde6 ); /* 25 */
206
- d = GG ( d , a , b , c , x [ 14 ] , S22 , 0xc33707d6 ); /* 26 */
207
- c = GG ( c , d , a , b , x [ 3 ], S23 , 0xf4d50d87 ); /* 27 */
208
- b = GG ( b , c , d , a , x [ 8 ], S24 , 0x455a14ed ); /* 28 */
209
- a = GG ( a , b , c , d , x [ 13 ] , S21 , 0xa9e3e905 ); /* 29 */
210
- d = GG ( d , a , b , c , x [ 2 ], S22 , 0xfcefa3f8 ); /* 30 */
211
- c = GG ( c , d , a , b , x [ 7 ], S23 , 0x676f02d9 ); /* 31 */
212
- b = GG ( b , c , d , a , x [ 12 ] , S24 , 0x8d2a4c8a ); /* 32 */
208
+ a = GG ( a , b , c , d , x1 , S21 , 0xf61e2562 ); /* 17 */
209
+ d = GG ( d , a , b , c , x6 , S22 , 0xc040b340 ); /* 18 */
210
+ c = GG ( c , d , a , b , x11 , S23 , 0x265e5a51 ); /* 19 */
211
+ b = GG ( b , c , d , a , x0 , S24 , 0xe9b6c7aa ); /* 20 */
212
+ a = GG ( a , b , c , d , x5 , S21 , 0xd62f105d ); /* 21 */
213
+ d = GG ( d , a , b , c , x10 , S22 , 0x2441453 ); /* 22 */
214
+ c = GG ( c , d , a , b , x15 , S23 , 0xd8a1e681 ); /* 23 */
215
+ b = GG ( b , c , d , a , x4 , S24 , 0xe7d3fbc8 ); /* 24 */
216
+ a = GG ( a , b , c , d , x9 , S21 , 0x21e1cde6 ); /* 25 */
217
+ d = GG ( d , a , b , c , x14 , S22 , 0xc33707d6 ); /* 26 */
218
+ c = GG ( c , d , a , b , x3 , S23 , 0xf4d50d87 ); /* 27 */
219
+ b = GG ( b , c , d , a , x8 , S24 , 0x455a14ed ); /* 28 */
220
+ a = GG ( a , b , c , d , x13 , S21 , 0xa9e3e905 ); /* 29 */
221
+ d = GG ( d , a , b , c , x2 , S22 , 0xfcefa3f8 ); /* 30 */
222
+ c = GG ( c , d , a , b , x7 , S23 , 0x676f02d9 ); /* 31 */
223
+ b = GG ( b , c , d , a , x12 , S24 , 0x8d2a4c8a ); /* 32 */
213
224
214
225
/* Round 3 */
215
- a = HH ( a , b , c , d , x [ 5 ], S31 , 0xfffa3942 ); /* 33 */
216
- d = HH ( d , a , b , c , x [ 8 ], S32 , 0x8771f681 ); /* 34 */
217
- c = HH ( c , d , a , b , x [ 11 ] , S33 , 0x6d9d6122 ); /* 35 */
218
- b = HH ( b , c , d , a , x [ 14 ] , S34 , 0xfde5380c ); /* 36 */
219
- a = HH ( a , b , c , d , x [ 1 ], S31 , 0xa4beea44 ); /* 37 */
220
- d = HH ( d , a , b , c , x [ 4 ], S32 , 0x4bdecfa9 ); /* 38 */
221
- c = HH ( c , d , a , b , x [ 7 ], S33 , 0xf6bb4b60 ); /* 39 */
222
- b = HH ( b , c , d , a , x [ 10 ] , S34 , 0xbebfbc70 ); /* 40 */
223
- a = HH ( a , b , c , d , x [ 13 ] , S31 , 0x289b7ec6 ); /* 41 */
224
- d = HH ( d , a , b , c , x [ 0 ], S32 , 0xeaa127fa ); /* 42 */
225
- c = HH ( c , d , a , b , x [ 3 ], S33 , 0xd4ef3085 ); /* 43 */
226
- b = HH ( b , c , d , a , x [ 6 ], S34 , 0x4881d05 ); /* 44 */
227
- a = HH ( a , b , c , d , x [ 9 ], S31 , 0xd9d4d039 ); /* 45 */
228
- d = HH ( d , a , b , c , x [ 12 ] , S32 , 0xe6db99e5 ); /* 46 */
229
- c = HH ( c , d , a , b , x [ 15 ] , S33 , 0x1fa27cf8 ); /* 47 */
230
- b = HH ( b , c , d , a , x [ 2 ], S34 , 0xc4ac5665 ); /* 48 */
226
+ a = HH ( a , b , c , d , x5 , S31 , 0xfffa3942 ); /* 33 */
227
+ d = HH ( d , a , b , c , x8 , S32 , 0x8771f681 ); /* 34 */
228
+ c = HH ( c , d , a , b , x11 , S33 , 0x6d9d6122 ); /* 35 */
229
+ b = HH ( b , c , d , a , x14 , S34 , 0xfde5380c ); /* 36 */
230
+ a = HH ( a , b , c , d , x1 , S31 , 0xa4beea44 ); /* 37 */
231
+ d = HH ( d , a , b , c , x4 , S32 , 0x4bdecfa9 ); /* 38 */
232
+ c = HH ( c , d , a , b , x7 , S33 , 0xf6bb4b60 ); /* 39 */
233
+ b = HH ( b , c , d , a , x10 , S34 , 0xbebfbc70 ); /* 40 */
234
+ a = HH ( a , b , c , d , x13 , S31 , 0x289b7ec6 ); /* 41 */
235
+ d = HH ( d , a , b , c , x0 , S32 , 0xeaa127fa ); /* 42 */
236
+ c = HH ( c , d , a , b , x3 , S33 , 0xd4ef3085 ); /* 43 */
237
+ b = HH ( b , c , d , a , x6 , S34 , 0x4881d05 ); /* 44 */
238
+ a = HH ( a , b , c , d , x9 , S31 , 0xd9d4d039 ); /* 45 */
239
+ d = HH ( d , a , b , c , x12 , S32 , 0xe6db99e5 ); /* 46 */
240
+ c = HH ( c , d , a , b , x15 , S33 , 0x1fa27cf8 ); /* 47 */
241
+ b = HH ( b , c , d , a , x2 , S34 , 0xc4ac5665 ); /* 48 */
231
242
232
243
/* Round 4 */
233
- a = II ( a , b , c , d , x [ 0 ], S41 , 0xf4292244 ); /* 49 */
234
- d = II ( d , a , b , c , x [ 7 ], S42 , 0x432aff97 ); /* 50 */
235
- c = II ( c , d , a , b , x [ 14 ] , S43 , 0xab9423a7 ); /* 51 */
236
- b = II ( b , c , d , a , x [ 5 ], S44 , 0xfc93a039 ); /* 52 */
237
- a = II ( a , b , c , d , x [ 12 ] , S41 , 0x655b59c3 ); /* 53 */
238
- d = II ( d , a , b , c , x [ 3 ], S42 , 0x8f0ccc92 ); /* 54 */
239
- c = II ( c , d , a , b , x [ 10 ] , S43 , 0xffeff47d ); /* 55 */
240
- b = II ( b , c , d , a , x [ 1 ], S44 , 0x85845dd1 ); /* 56 */
241
- a = II ( a , b , c , d , x [ 8 ], S41 , 0x6fa87e4f ); /* 57 */
242
- d = II ( d , a , b , c , x [ 15 ] , S42 , 0xfe2ce6e0 ); /* 58 */
243
- c = II ( c , d , a , b , x [ 6 ], S43 , 0xa3014314 ); /* 59 */
244
- b = II ( b , c , d , a , x [ 13 ] , S44 , 0x4e0811a1 ); /* 60 */
245
- a = II ( a , b , c , d , x [ 4 ], S41 , 0xf7537e82 ); /* 61 */
246
- d = II ( d , a , b , c , x [ 11 ] , S42 , 0xbd3af235 ); /* 62 */
247
- c = II ( c , d , a , b , x [ 2 ], S43 , 0x2ad7d2bb ); /* 63 */
248
- b = II ( b , c , d , a , x [ 9 ], S44 , 0xeb86d391 ); /* 64 */
244
+ a = II ( a , b , c , d , x0 , S41 , 0xf4292244 ); /* 49 */
245
+ d = II ( d , a , b , c , x7 , S42 , 0x432aff97 ); /* 50 */
246
+ c = II ( c , d , a , b , x14 , S43 , 0xab9423a7 ); /* 51 */
247
+ b = II ( b , c , d , a , x5 , S44 , 0xfc93a039 ); /* 52 */
248
+ a = II ( a , b , c , d , x12 , S41 , 0x655b59c3 ); /* 53 */
249
+ d = II ( d , a , b , c , x3 , S42 , 0x8f0ccc92 ); /* 54 */
250
+ c = II ( c , d , a , b , x10 , S43 , 0xffeff47d ); /* 55 */
251
+ b = II ( b , c , d , a , x1 , S44 , 0x85845dd1 ); /* 56 */
252
+ a = II ( a , b , c , d , x8 , S41 , 0x6fa87e4f ); /* 57 */
253
+ d = II ( d , a , b , c , x15 , S42 , 0xfe2ce6e0 ); /* 58 */
254
+ c = II ( c , d , a , b , x6 , S43 , 0xa3014314 ); /* 59 */
255
+ b = II ( b , c , d , a , x13 , S44 , 0x4e0811a1 ); /* 60 */
256
+ a = II ( a , b , c , d , x4 , S41 , 0xf7537e82 ); /* 61 */
257
+ d = II ( d , a , b , c , x11 , S42 , 0xbd3af235 ); /* 62 */
258
+ c = II ( c , d , a , b , x2 , S43 , 0x2ad7d2bb ); /* 63 */
259
+ b = II ( b , c , d , a , x9 , S44 , 0xeb86d391 ); /* 64 */
249
260
250
261
state [0 ] += a ;
251
262
state [1 ] += b ;
0 commit comments