2362N/A * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. 0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 0N/A * This code is free software; you can redistribute it and/or modify it 0N/A * under the terms of the GNU General Public License version 2 only, as 2362N/A * published by the Free Software Foundation. Oracle designates this 0N/A * particular file as subject to the "Classpath" exception as provided 2362N/A * by Oracle in the LICENSE file that accompanied this code. 0N/A * This code is distributed in the hope that it will be useful, but WITHOUT 0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 0N/A * version 2 for more details (a copy is included in the LICENSE file that 0N/A * accompanied this code). 0N/A * You should have received a copy of the GNU General Public License version 0N/A * 2 along with this work; if not, write to the Free Software Foundation, 0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2362N/A * or visit www.oracle.com if you need additional information or have any 0N/A * Implementation for the MD2 algorithm, see RFC1319. It is very slow and 0N/A * not particular secure. It is only supported to be able to verify 0N/A * RSA/Verisign root certificates signed using MD2withRSA. It should not 0N/A * be used for anything else. 0N/A * @author Andreas Sterbenz 0N/A private final int[] X;
0N/A // checksum, 16 ints. they are really bytes, but byte arithmetic in 0N/A // the JVM is much slower that int arithmetic. 0N/A private final int[] C;
0N/A // temporary store for checksum C during final digest 0N/A * Create a new MD2 digest. Called by the JCA framework 0N/A super(
"MD2",
16,
16);
0N/A // reset state and checksum 0N/A // finish the digest 0N/A for (
int i =
0; i <
16; i++) {
0N/A for (
int i =
0; i <
16; i++) {
0N/A // one iteration of the compression function 0N/A for (
int i =
0; i <
16; i++) {
0N/A X[
32 + i] = k ^ X[i];
0N/A // update the checksum 0N/A for (
int i =
0; i <
16; i++) {
0N/A t = (C[i] ^= S[X[
16 + i] ^ t]);
0N/A for (
int i =
0; i <
18; i++) {
0N/A for (
int j =
0; j <
48; j++) {
0N/A // substitution table derived from Pi. Copied from the RFC. 0N/A private final static int[] S =
new int[] {
0N/A 41,
46,
67,
201,
162,
216,
124,
1,
61,
54,
84,
161,
236,
240,
6,
0N/A 19,
98,
167,
5,
243,
192,
199,
115,
140,
152,
147,
43,
217,
188,
0N/A 76,
130,
202,
30,
155,
87,
60,
253,
212,
224,
22,
103,
66,
111,
24,
0N/A 138,
23,
229,
18,
190,
78,
196,
214,
218,
158,
222,
73,
160,
251,
0N/A 245,
142,
187,
47,
238,
122,
169,
104,
121,
145,
21,
178,
7,
63,
0N/A 148,
194,
16,
137,
11,
34,
95,
33,
128,
127,
93,
154,
90,
144,
50,
0N/A 39,
53,
62,
204,
231,
191,
247,
151,
3,
255,
25,
48,
179,
72,
165,
0N/A 181,
209,
215,
94,
146,
42,
172,
86,
170,
198,
79,
184,
56,
210,
0N/A 150,
164,
125,
182,
118,
252,
107,
226,
156,
116,
4,
241,
69,
157,
0N/A 112,
89,
100,
113,
135,
32,
134,
91,
207,
101,
230,
45,
168,
2,
27,
0N/A 96,
37,
173,
174,
176,
185,
246,
28,
70,
97,
105,
52,
64,
126,
15,
0N/A 85,
71,
163,
35,
221,
81,
175,
58,
195,
92,
249,
206,
186,
197,
0N/A 234,
38,
44,
83,
13,
110,
133,
40,
132,
9,
211,
223,
205,
244,
65,
0N/A 129,
77,
82,
106,
220,
55,
200,
108,
193,
171,
250,
36,
225,
123,
0N/A 8,
12,
189,
177,
74,
120,
136,
149,
139,
227,
99,
232,
109,
233,
0N/A 203,
213,
254,
59,
0,
29,
57,
242,
239,
183,
14,
102,
88,
208,
228,
0N/A 166,
119,
114,
248,
235,
117,
75,
10,
49,
68,
80,
180,
143,
237,
0N/A 31,
26,
219,
153,
141,
51,
159,
17,
131,
20,
0N/A // digest padding. 17 element array. 0N/A // padding[0] is null 0N/A // padding[i] is an array of i time the byte value i (i = 1..16) 0N/A for (
int i =
1; i <
17; i++) {
0N/A byte[] b =
new byte[i];