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 &lt;thomas.pornin@cryptolog.com&gt; 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 }