Coverage Summary for Class: KeccakCore (org.ethereum.crypto.cryptohash)
Class |
Class, %
|
Method, %
|
Line, %
|
KeccakCore |
100%
(1/1)
|
83.3%
(10/12)
|
99.1%
(428/432)
|
1 /*
2 * This file is part of RskJ
3 * Copyright (C) 2017 RSK Labs Ltd.
4 * (derived from ethereumJ library, Copyright (c) 2016 <ether.camp>)
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 // $Id: KeccakCore.java 258 2011-07-15 22:16:50Z tp $
21
22 package org.ethereum.crypto.cryptohash;
23
24 /**
25 * This class implements the core operations for the Keccak digest
26 * algorithm.
27 *
28 * <pre>
29 * ==========================(LICENSE BEGIN)============================
30 *
31 * Copyright (c) 2007-2010 Projet RNRT SAPHIR
32 *
33 * Permission is hereby granted, free of charge, to any person obtaining
34 * a copy of this software and associated documentation files (the
35 * "Software"), to deal in the Software without restriction, including
36 * without limitation the rights to use, copy, modify, merge, publish,
37 * distribute, sublicense, and/or sell copies of the Software, and to
38 * permit persons to whom the Software is furnished to do so, subject to
39 * the following conditions:
40 *
41 * The above copyright notice and this permission notice shall be
42 * included in all copies or substantial portions of the Software.
43 *
44 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
45 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
46 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
47 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
48 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
49 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
50 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
51 *
52 * ===========================(LICENSE END)=============================
53 * </pre>
54 *
55 * @version $Revision: 258 $
56 * @author Thomas Pornin <thomas.pornin@cryptolog.com>
57 */
58
59 abstract class KeccakCore extends DigestEngine {
60
61 KeccakCore()
62 {
63 }
64
65 private long[] a;
66 private byte[] tmpOut;
67
68 private static final long[] RC = {
69 0x0000000000000001L, 0x0000000000008082L,
70 0x800000000000808AL, 0x8000000080008000L,
71 0x000000000000808BL, 0x0000000080000001L,
72 0x8000000080008081L, 0x8000000000008009L,
73 0x000000000000008AL, 0x0000000000000088L,
74 0x0000000080008009L, 0x000000008000000AL,
75 0x000000008000808BL, 0x800000000000008BL,
76 0x8000000000008089L, 0x8000000000008003L,
77 0x8000000000008002L, 0x8000000000000080L,
78 0x000000000000800AL, 0x800000008000000AL,
79 0x8000000080008081L, 0x8000000000008080L,
80 0x0000000080000001L, 0x8000000080008008L
81 };
82
83 /**
84 * Encode the 64-bit word {@code val} into the array
85 * {@code buf} at offset {@code off}, in little-endian
86 * convention (least significant byte first).
87 *
88 * @param val the value to encode
89 * @param buf the destination buffer
90 * @param off the destination offset
91 */
92 private static final void encodeLELong(long val, byte[] buf, int off)
93 {
94 buf[off + 0] = (byte)val;
95 buf[off + 1] = (byte)(val >>> 8);
96 buf[off + 2] = (byte)(val >>> 16);
97 buf[off + 3] = (byte)(val >>> 24);
98 buf[off + 4] = (byte)(val >>> 32);
99 buf[off + 5] = (byte)(val >>> 40);
100 buf[off + 6] = (byte)(val >>> 48);
101 buf[off + 7] = (byte)(val >>> 56);
102 }
103
104 /**
105 * Decode a 64-bit little-endian word from the array {@code buf}
106 * at offset {@code off}.
107 *
108 * @param buf the source buffer
109 * @param off the source offset
110 * @return the decoded value
111 */
112 private static final long decodeLELong(byte[] buf, int off)
113 {
114 return (buf[off + 0] & 0xFFL)
115 | ((buf[off + 1] & 0xFFL) << 8)
116 | ((buf[off + 2] & 0xFFL) << 16)
117 | ((buf[off + 3] & 0xFFL) << 24)
118 | ((buf[off + 4] & 0xFFL) << 32)
119 | ((buf[off + 5] & 0xFFL) << 40)
120 | ((buf[off + 6] & 0xFFL) << 48)
121 | ((buf[off + 7] & 0xFFL) << 56);
122 }
123
124 /** @see org.ethereum.crypto.cryptohash.DigestEngine */
125 protected void engineReset()
126 {
127 doReset();
128 }
129
130 /** @see org.ethereum.crypto.cryptohash.DigestEngine */
131 protected void processBlock(byte[] data)
132 {
133 /* Input block */
134 for (int i = 0; i < data.length; i += 8) {
135 a[i >>> 3] ^= decodeLELong(data, i);
136 }
137
138 long t0;
139 long t1;
140 long t2;
141 long t3;
142 long t4;
143 long tt0;
144 long tt1;
145 long tt2;
146 long tt3;
147 long tt4;
148 long t;
149 long kt;
150 long c0;
151 long c1;
152 long c2;
153 long c3;
154 long c4;
155 long bnn;
156
157 /*
158 * Unrolling four rounds kills performance big time
159 * on Intel x86 Core2, in both 32-bit and 64-bit modes
160 * (less than 1 MB/s instead of 55 MB/s on x86-64).
161 * Unrolling two rounds appears to be fine.
162 */
163 for (int j = 0; j < 24; j += 2) {
164
165 tt0 = a[ 1] ^ a[ 6];
166 tt1 = a[11] ^ a[16];
167 tt0 ^= a[21] ^ tt1;
168 tt0 = (tt0 << 1) | (tt0 >>> 63);
169 tt2 = a[ 4] ^ a[ 9];
170 tt3 = a[14] ^ a[19];
171 tt0 ^= a[24];
172 tt2 ^= tt3;
173 t0 = tt0 ^ tt2;
174
175 tt0 = a[ 2] ^ a[ 7];
176 tt1 = a[12] ^ a[17];
177 tt0 ^= a[22] ^ tt1;
178 tt0 = (tt0 << 1) | (tt0 >>> 63);
179 tt2 = a[ 0] ^ a[ 5];
180 tt3 = a[10] ^ a[15];
181 tt0 ^= a[20];
182 tt2 ^= tt3;
183 t1 = tt0 ^ tt2;
184
185 tt0 = a[ 3] ^ a[ 8];
186 tt1 = a[13] ^ a[18];
187 tt0 ^= a[23] ^ tt1;
188 tt0 = (tt0 << 1) | (tt0 >>> 63);
189 tt2 = a[ 1] ^ a[ 6];
190 tt3 = a[11] ^ a[16];
191 tt0 ^= a[21];
192 tt2 ^= tt3;
193 t2 = tt0 ^ tt2;
194
195 tt0 = a[ 4] ^ a[ 9];
196 tt1 = a[14] ^ a[19];
197 tt0 ^= a[24] ^ tt1;
198 tt0 = (tt0 << 1) | (tt0 >>> 63);
199 tt2 = a[ 2] ^ a[ 7];
200 tt3 = a[12] ^ a[17];
201 tt0 ^= a[22];
202 tt2 ^= tt3;
203 t3 = tt0 ^ tt2;
204
205 tt0 = a[ 0] ^ a[ 5];
206 tt1 = a[10] ^ a[15];
207 tt0 ^= a[20] ^ tt1;
208 tt0 = (tt0 << 1) | (tt0 >>> 63);
209 tt2 = a[ 3] ^ a[ 8];
210 tt3 = a[13] ^ a[18];
211 tt0 ^= a[23];
212 tt2 ^= tt3;
213 t4 = tt0 ^ tt2;
214
215 a[ 0] = a[ 0] ^ t0;
216 a[ 5] = a[ 5] ^ t0;
217 a[10] = a[10] ^ t0;
218 a[15] = a[15] ^ t0;
219 a[20] = a[20] ^ t0;
220 a[ 1] = a[ 1] ^ t1;
221 a[ 6] = a[ 6] ^ t1;
222 a[11] = a[11] ^ t1;
223 a[16] = a[16] ^ t1;
224 a[21] = a[21] ^ t1;
225 a[ 2] = a[ 2] ^ t2;
226 a[ 7] = a[ 7] ^ t2;
227 a[12] = a[12] ^ t2;
228 a[17] = a[17] ^ t2;
229 a[22] = a[22] ^ t2;
230 a[ 3] = a[ 3] ^ t3;
231 a[ 8] = a[ 8] ^ t3;
232 a[13] = a[13] ^ t3;
233 a[18] = a[18] ^ t3;
234 a[23] = a[23] ^ t3;
235 a[ 4] = a[ 4] ^ t4;
236 a[ 9] = a[ 9] ^ t4;
237 a[14] = a[14] ^ t4;
238 a[19] = a[19] ^ t4;
239 a[24] = a[24] ^ t4;
240 a[ 5] = (a[ 5] << 36) | (a[ 5] >>> (64 - 36));
241 a[10] = (a[10] << 3) | (a[10] >>> (64 - 3));
242 a[15] = (a[15] << 41) | (a[15] >>> (64 - 41));
243 a[20] = (a[20] << 18) | (a[20] >>> (64 - 18));
244 a[ 1] = (a[ 1] << 1) | (a[ 1] >>> (64 - 1));
245 a[ 6] = (a[ 6] << 44) | (a[ 6] >>> (64 - 44));
246 a[11] = (a[11] << 10) | (a[11] >>> (64 - 10));
247 a[16] = (a[16] << 45) | (a[16] >>> (64 - 45));
248 a[21] = (a[21] << 2) | (a[21] >>> (64 - 2));
249 a[ 2] = (a[ 2] << 62) | (a[ 2] >>> (64 - 62));
250 a[ 7] = (a[ 7] << 6) | (a[ 7] >>> (64 - 6));
251 a[12] = (a[12] << 43) | (a[12] >>> (64 - 43));
252 a[17] = (a[17] << 15) | (a[17] >>> (64 - 15));
253 a[22] = (a[22] << 61) | (a[22] >>> (64 - 61));
254 a[ 3] = (a[ 3] << 28) | (a[ 3] >>> (64 - 28));
255 a[ 8] = (a[ 8] << 55) | (a[ 8] >>> (64 - 55));
256 a[13] = (a[13] << 25) | (a[13] >>> (64 - 25));
257 a[18] = (a[18] << 21) | (a[18] >>> (64 - 21));
258 a[23] = (a[23] << 56) | (a[23] >>> (64 - 56));
259 a[ 4] = (a[ 4] << 27) | (a[ 4] >>> (64 - 27));
260 a[ 9] = (a[ 9] << 20) | (a[ 9] >>> (64 - 20));
261 a[14] = (a[14] << 39) | (a[14] >>> (64 - 39));
262 a[19] = (a[19] << 8) | (a[19] >>> (64 - 8));
263 a[24] = (a[24] << 14) | (a[24] >>> (64 - 14));
264 bnn = ~a[12];
265 kt = a[ 6] | a[12];
266 c0 = a[ 0] ^ kt;
267 kt = bnn | a[18];
268 c1 = a[ 6] ^ kt;
269 kt = a[18] & a[24];
270 c2 = a[12] ^ kt;
271 kt = a[24] | a[ 0];
272 c3 = a[18] ^ kt;
273 kt = a[ 0] & a[ 6];
274 c4 = a[24] ^ kt;
275 a[ 0] = c0;
276 a[ 6] = c1;
277 a[12] = c2;
278 a[18] = c3;
279 a[24] = c4;
280 bnn = ~a[22];
281 kt = a[ 9] | a[10];
282 c0 = a[ 3] ^ kt;
283 kt = a[10] & a[16];
284 c1 = a[ 9] ^ kt;
285 kt = a[16] | bnn;
286 c2 = a[10] ^ kt;
287 kt = a[22] | a[ 3];
288 c3 = a[16] ^ kt;
289 kt = a[ 3] & a[ 9];
290 c4 = a[22] ^ kt;
291 a[ 3] = c0;
292 a[ 9] = c1;
293 a[10] = c2;
294 a[16] = c3;
295 a[22] = c4;
296 bnn = ~a[19];
297 kt = a[ 7] | a[13];
298 c0 = a[ 1] ^ kt;
299 kt = a[13] & a[19];
300 c1 = a[ 7] ^ kt;
301 kt = bnn & a[20];
302 c2 = a[13] ^ kt;
303 kt = a[20] | a[ 1];
304 c3 = bnn ^ kt;
305 kt = a[ 1] & a[ 7];
306 c4 = a[20] ^ kt;
307 a[ 1] = c0;
308 a[ 7] = c1;
309 a[13] = c2;
310 a[19] = c3;
311 a[20] = c4;
312 bnn = ~a[17];
313 kt = a[ 5] & a[11];
314 c0 = a[ 4] ^ kt;
315 kt = a[11] | a[17];
316 c1 = a[ 5] ^ kt;
317 kt = bnn | a[23];
318 c2 = a[11] ^ kt;
319 kt = a[23] & a[ 4];
320 c3 = bnn ^ kt;
321 kt = a[ 4] | a[ 5];
322 c4 = a[23] ^ kt;
323 a[ 4] = c0;
324 a[ 5] = c1;
325 a[11] = c2;
326 a[17] = c3;
327 a[23] = c4;
328 bnn = ~a[ 8];
329 kt = bnn & a[14];
330 c0 = a[ 2] ^ kt;
331 kt = a[14] | a[15];
332 c1 = bnn ^ kt;
333 kt = a[15] & a[21];
334 c2 = a[14] ^ kt;
335 kt = a[21] | a[ 2];
336 c3 = a[15] ^ kt;
337 kt = a[ 2] & a[ 8];
338 c4 = a[21] ^ kt;
339 a[ 2] = c0;
340 a[ 8] = c1;
341 a[14] = c2;
342 a[15] = c3;
343 a[21] = c4;
344 a[ 0] = a[ 0] ^ RC[j + 0];
345
346 tt0 = a[ 6] ^ a[ 9];
347 tt1 = a[ 7] ^ a[ 5];
348 tt0 ^= a[ 8] ^ tt1;
349 tt0 = (tt0 << 1) | (tt0 >>> 63);
350 tt2 = a[24] ^ a[22];
351 tt3 = a[20] ^ a[23];
352 tt0 ^= a[21];
353 tt2 ^= tt3;
354 t0 = tt0 ^ tt2;
355
356 tt0 = a[12] ^ a[10];
357 tt1 = a[13] ^ a[11];
358 tt0 ^= a[14] ^ tt1;
359 tt0 = (tt0 << 1) | (tt0 >>> 63);
360 tt2 = a[ 0] ^ a[ 3];
361 tt3 = a[ 1] ^ a[ 4];
362 tt0 ^= a[ 2];
363 tt2 ^= tt3;
364 t1 = tt0 ^ tt2;
365
366 tt0 = a[18] ^ a[16];
367 tt1 = a[19] ^ a[17];
368 tt0 ^= a[15] ^ tt1;
369 tt0 = (tt0 << 1) | (tt0 >>> 63);
370 tt2 = a[ 6] ^ a[ 9];
371 tt3 = a[ 7] ^ a[ 5];
372 tt0 ^= a[ 8];
373 tt2 ^= tt3;
374 t2 = tt0 ^ tt2;
375
376 tt0 = a[24] ^ a[22];
377 tt1 = a[20] ^ a[23];
378 tt0 ^= a[21] ^ tt1;
379 tt0 = (tt0 << 1) | (tt0 >>> 63);
380 tt2 = a[12] ^ a[10];
381 tt3 = a[13] ^ a[11];
382 tt0 ^= a[14];
383 tt2 ^= tt3;
384 t3 = tt0 ^ tt2;
385
386 tt0 = a[ 0] ^ a[ 3];
387 tt1 = a[ 1] ^ a[ 4];
388 tt0 ^= a[ 2] ^ tt1;
389 tt0 = (tt0 << 1) | (tt0 >>> 63);
390 tt2 = a[18] ^ a[16];
391 tt3 = a[19] ^ a[17];
392 tt0 ^= a[15];
393 tt2 ^= tt3;
394 t4 = tt0 ^ tt2;
395
396 a[ 0] = a[ 0] ^ t0;
397 a[ 3] = a[ 3] ^ t0;
398 a[ 1] = a[ 1] ^ t0;
399 a[ 4] = a[ 4] ^ t0;
400 a[ 2] = a[ 2] ^ t0;
401 a[ 6] = a[ 6] ^ t1;
402 a[ 9] = a[ 9] ^ t1;
403 a[ 7] = a[ 7] ^ t1;
404 a[ 5] = a[ 5] ^ t1;
405 a[ 8] = a[ 8] ^ t1;
406 a[12] = a[12] ^ t2;
407 a[10] = a[10] ^ t2;
408 a[13] = a[13] ^ t2;
409 a[11] = a[11] ^ t2;
410 a[14] = a[14] ^ t2;
411 a[18] = a[18] ^ t3;
412 a[16] = a[16] ^ t3;
413 a[19] = a[19] ^ t3;
414 a[17] = a[17] ^ t3;
415 a[15] = a[15] ^ t3;
416 a[24] = a[24] ^ t4;
417 a[22] = a[22] ^ t4;
418 a[20] = a[20] ^ t4;
419 a[23] = a[23] ^ t4;
420 a[21] = a[21] ^ t4;
421 a[ 3] = (a[ 3] << 36) | (a[ 3] >>> (64 - 36));
422 a[ 1] = (a[ 1] << 3) | (a[ 1] >>> (64 - 3));
423 a[ 4] = (a[ 4] << 41) | (a[ 4] >>> (64 - 41));
424 a[ 2] = (a[ 2] << 18) | (a[ 2] >>> (64 - 18));
425 a[ 6] = (a[ 6] << 1) | (a[ 6] >>> (64 - 1));
426 a[ 9] = (a[ 9] << 44) | (a[ 9] >>> (64 - 44));
427 a[ 7] = (a[ 7] << 10) | (a[ 7] >>> (64 - 10));
428 a[ 5] = (a[ 5] << 45) | (a[ 5] >>> (64 - 45));
429 a[ 8] = (a[ 8] << 2) | (a[ 8] >>> (64 - 2));
430 a[12] = (a[12] << 62) | (a[12] >>> (64 - 62));
431 a[10] = (a[10] << 6) | (a[10] >>> (64 - 6));
432 a[13] = (a[13] << 43) | (a[13] >>> (64 - 43));
433 a[11] = (a[11] << 15) | (a[11] >>> (64 - 15));
434 a[14] = (a[14] << 61) | (a[14] >>> (64 - 61));
435 a[18] = (a[18] << 28) | (a[18] >>> (64 - 28));
436 a[16] = (a[16] << 55) | (a[16] >>> (64 - 55));
437 a[19] = (a[19] << 25) | (a[19] >>> (64 - 25));
438 a[17] = (a[17] << 21) | (a[17] >>> (64 - 21));
439 a[15] = (a[15] << 56) | (a[15] >>> (64 - 56));
440 a[24] = (a[24] << 27) | (a[24] >>> (64 - 27));
441 a[22] = (a[22] << 20) | (a[22] >>> (64 - 20));
442 a[20] = (a[20] << 39) | (a[20] >>> (64 - 39));
443 a[23] = (a[23] << 8) | (a[23] >>> (64 - 8));
444 a[21] = (a[21] << 14) | (a[21] >>> (64 - 14));
445 bnn = ~a[13];
446 kt = a[ 9] | a[13];
447 c0 = a[ 0] ^ kt;
448 kt = bnn | a[17];
449 c1 = a[ 9] ^ kt;
450 kt = a[17] & a[21];
451 c2 = a[13] ^ kt;
452 kt = a[21] | a[ 0];
453 c3 = a[17] ^ kt;
454 kt = a[ 0] & a[ 9];
455 c4 = a[21] ^ kt;
456 a[ 0] = c0;
457 a[ 9] = c1;
458 a[13] = c2;
459 a[17] = c3;
460 a[21] = c4;
461 bnn = ~a[14];
462 kt = a[22] | a[ 1];
463 c0 = a[18] ^ kt;
464 kt = a[ 1] & a[ 5];
465 c1 = a[22] ^ kt;
466 kt = a[ 5] | bnn;
467 c2 = a[ 1] ^ kt;
468 kt = a[14] | a[18];
469 c3 = a[ 5] ^ kt;
470 kt = a[18] & a[22];
471 c4 = a[14] ^ kt;
472 a[18] = c0;
473 a[22] = c1;
474 a[ 1] = c2;
475 a[ 5] = c3;
476 a[14] = c4;
477 bnn = ~a[23];
478 kt = a[10] | a[19];
479 c0 = a[ 6] ^ kt;
480 kt = a[19] & a[23];
481 c1 = a[10] ^ kt;
482 kt = bnn & a[ 2];
483 c2 = a[19] ^ kt;
484 kt = a[ 2] | a[ 6];
485 c3 = bnn ^ kt;
486 kt = a[ 6] & a[10];
487 c4 = a[ 2] ^ kt;
488 a[ 6] = c0;
489 a[10] = c1;
490 a[19] = c2;
491 a[23] = c3;
492 a[ 2] = c4;
493 bnn = ~a[11];
494 kt = a[ 3] & a[ 7];
495 c0 = a[24] ^ kt;
496 kt = a[ 7] | a[11];
497 c1 = a[ 3] ^ kt;
498 kt = bnn | a[15];
499 c2 = a[ 7] ^ kt;
500 kt = a[15] & a[24];
501 c3 = bnn ^ kt;
502 kt = a[24] | a[ 3];
503 c4 = a[15] ^ kt;
504 a[24] = c0;
505 a[ 3] = c1;
506 a[ 7] = c2;
507 a[11] = c3;
508 a[15] = c4;
509 bnn = ~a[16];
510 kt = bnn & a[20];
511 c0 = a[12] ^ kt;
512 kt = a[20] | a[ 4];
513 c1 = bnn ^ kt;
514 kt = a[ 4] & a[ 8];
515 c2 = a[20] ^ kt;
516 kt = a[ 8] | a[12];
517 c3 = a[ 4] ^ kt;
518 kt = a[12] & a[16];
519 c4 = a[ 8] ^ kt;
520 a[12] = c0;
521 a[16] = c1;
522 a[20] = c2;
523 a[ 4] = c3;
524 a[ 8] = c4;
525 a[ 0] = a[ 0] ^ RC[j + 1];
526 t = a[ 5];
527 a[ 5] = a[18];
528 a[18] = a[11];
529 a[11] = a[10];
530 a[10] = a[ 6];
531 a[ 6] = a[22];
532 a[22] = a[20];
533 a[20] = a[12];
534 a[12] = a[19];
535 a[19] = a[15];
536 a[15] = a[24];
537 a[24] = a[ 8];
538 a[ 8] = t;
539 t = a[ 1];
540 a[ 1] = a[ 9];
541 a[ 9] = a[14];
542 a[14] = a[ 2];
543 a[ 2] = a[13];
544 a[13] = a[23];
545 a[23] = a[ 4];
546 a[ 4] = a[21];
547 a[21] = a[16];
548 a[16] = a[ 3];
549 a[ 3] = a[17];
550 a[17] = a[ 7];
551 a[ 7] = t;
552 }
553 }
554
555 /** @see org.ethereum.crypto.cryptohash.DigestEngine */
556 protected void doPadding(byte[] out, int off)
557 {
558 int ptr = flush();
559 byte[] buf = getBlockBuffer();
560 if ((ptr + 1) == buf.length) {
561 buf[ptr] = (byte)0x81;
562 } else {
563 buf[ptr] = (byte)0x01;
564 for (int i = ptr + 1; i < (buf.length - 1); i ++) {
565 buf[i] = 0;
566 }
567 buf[buf.length - 1] = (byte)0x80;
568 }
569 processBlock(buf);
570 a[ 1] = ~a[ 1];
571 a[ 2] = ~a[ 2];
572 a[ 8] = ~a[ 8];
573 a[12] = ~a[12];
574 a[17] = ~a[17];
575 a[20] = ~a[20];
576 int dlen = getDigestLength();
577 for (int i = 0; i < dlen; i += 8) {
578 encodeLELong(a[i >>> 3], tmpOut, i);
579 }
580 System.arraycopy(tmpOut, 0, out, off, dlen);
581 }
582
583 /** @see org.ethereum.crypto.cryptohash.DigestEngine */
584 protected void doInit()
585 {
586 a = new long[25];
587 tmpOut = new byte[(getDigestLength() + 7) & ~7];
588 doReset();
589 }
590
591 /** @see org.ethereum.crypto.cryptohash.Digest */
592 public int getBlockLength()
593 {
594 return 200 - 2 * getDigestLength();
595 }
596
597 private final void doReset()
598 {
599 for (int i = 0; i < 25; i ++) {
600 a[i] = 0;
601 }
602 a[ 1] = 0xFFFFFFFFFFFFFFFFL;
603 a[ 2] = 0xFFFFFFFFFFFFFFFFL;
604 a[ 8] = 0xFFFFFFFFFFFFFFFFL;
605 a[12] = 0xFFFFFFFFFFFFFFFFL;
606 a[17] = 0xFFFFFFFFFFFFFFFFL;
607 a[20] = 0xFFFFFFFFFFFFFFFFL;
608 }
609
610 /** @see org.ethereum.crypto.cryptohash.DigestEngine */
611 protected Digest copyState(KeccakCore dst)
612 {
613 System.arraycopy(a, 0, dst.a, 0, 25);
614 return super.copyState(dst);
615 }
616
617 /** @see org.ethereum.crypto.cryptohash.Digest */
618 public String toString()
619 {
620 return "Keccak-" + (getDigestLength() << 3);
621 }
622 }