whirlpool.java

来自「linux下建立JAVA虚拟机的源码KAFFE」· Java 代码 · 共 627 行 · 第 1/2 页

JAVA
627
字号
    this.H2 = md.H2;    this.H3 = md.H3;    this.H4 = md.H4;    this.H5 = md.H5;    this.H6 = md.H6;    this.H7 = md.H7;    this.count = md.count;    this.buffer = (byte[]) md.buffer.clone();  }  // Class methods  // -------------------------------------------------------------------------  // Instance methods  // -------------------------------------------------------------------------  // java.lang.Cloneable interface implementation ----------------------------  public Object clone()  {    return (new Whirlpool(this));  }  // Implementation of concrete methods in BaseHash --------------------------  protected void transform(byte[] in, int offset)  {    // apply mu to the input    n0 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n1 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n2 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n3 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n4 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n5 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n6 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    n7 = (in[offset++] & 0xFFL) << 56 | (in[offset++] & 0xFFL) << 48         | (in[offset++] & 0xFFL) << 40 | (in[offset++] & 0xFFL) << 32         | (in[offset++] & 0xFFL) << 24 | (in[offset++] & 0xFFL) << 16         | (in[offset++] & 0xFFL) << 8 | (in[offset++] & 0xFFL);    // transform K into the key schedule Kr; 0 <= r <= R    k00 = H0;    k01 = H1;    k02 = H2;    k03 = H3;    k04 = H4;    k05 = H5;    k06 = H6;    k07 = H7;    nn0 = n0 ^ k00;    nn1 = n1 ^ k01;    nn2 = n2 ^ k02;    nn3 = n3 ^ k03;    nn4 = n4 ^ k04;    nn5 = n5 ^ k05;    nn6 = n6 ^ k06;    nn7 = n7 ^ k07;    // intermediate cipher output    w0 = w1 = w2 = w3 = w4 = w5 = w6 = w7 = 0L;    for (int r = 0; r < R; r++)      {        // 1. compute intermediate round key schedule by applying ro[rc]        // to the previous round key schedule --rc being the round constant        Kr0 = T0[(int) ((k00 >> 56) & 0xFFL)] ^ T1[(int) ((k07 >> 48) & 0xFFL)]              ^ T2[(int) ((k06 >> 40) & 0xFFL)]              ^ T3[(int) ((k05 >> 32) & 0xFFL)]              ^ T4[(int) ((k04 >> 24) & 0xFFL)]              ^ T5[(int) ((k03 >> 16) & 0xFFL)]              ^ T6[(int) ((k02 >> 8) & 0xFFL)] ^ T7[(int) (k01 & 0xFFL)]              ^ rc[r];        Kr1 = T0[(int) ((k01 >> 56) & 0xFFL)] ^ T1[(int) ((k00 >> 48) & 0xFFL)]              ^ T2[(int) ((k07 >> 40) & 0xFFL)]              ^ T3[(int) ((k06 >> 32) & 0xFFL)]              ^ T4[(int) ((k05 >> 24) & 0xFFL)]              ^ T5[(int) ((k04 >> 16) & 0xFFL)]              ^ T6[(int) ((k03 >> 8) & 0xFFL)] ^ T7[(int) (k02 & 0xFFL)];        Kr2 = T0[(int) ((k02 >> 56) & 0xFFL)] ^ T1[(int) ((k01 >> 48) & 0xFFL)]              ^ T2[(int) ((k00 >> 40) & 0xFFL)]              ^ T3[(int) ((k07 >> 32) & 0xFFL)]              ^ T4[(int) ((k06 >> 24) & 0xFFL)]              ^ T5[(int) ((k05 >> 16) & 0xFFL)]              ^ T6[(int) ((k04 >> 8) & 0xFFL)] ^ T7[(int) (k03 & 0xFFL)];        Kr3 = T0[(int) ((k03 >> 56) & 0xFFL)] ^ T1[(int) ((k02 >> 48) & 0xFFL)]              ^ T2[(int) ((k01 >> 40) & 0xFFL)]              ^ T3[(int) ((k00 >> 32) & 0xFFL)]              ^ T4[(int) ((k07 >> 24) & 0xFFL)]              ^ T5[(int) ((k06 >> 16) & 0xFFL)]              ^ T6[(int) ((k05 >> 8) & 0xFFL)] ^ T7[(int) (k04 & 0xFFL)];        Kr4 = T0[(int) ((k04 >> 56) & 0xFFL)] ^ T1[(int) ((k03 >> 48) & 0xFFL)]              ^ T2[(int) ((k02 >> 40) & 0xFFL)]              ^ T3[(int) ((k01 >> 32) & 0xFFL)]              ^ T4[(int) ((k00 >> 24) & 0xFFL)]              ^ T5[(int) ((k07 >> 16) & 0xFFL)]              ^ T6[(int) ((k06 >> 8) & 0xFFL)] ^ T7[(int) (k05 & 0xFFL)];        Kr5 = T0[(int) ((k05 >> 56) & 0xFFL)] ^ T1[(int) ((k04 >> 48) & 0xFFL)]              ^ T2[(int) ((k03 >> 40) & 0xFFL)]              ^ T3[(int) ((k02 >> 32) & 0xFFL)]              ^ T4[(int) ((k01 >> 24) & 0xFFL)]              ^ T5[(int) ((k00 >> 16) & 0xFFL)]              ^ T6[(int) ((k07 >> 8) & 0xFFL)] ^ T7[(int) (k06 & 0xFFL)];        Kr6 = T0[(int) ((k06 >> 56) & 0xFFL)] ^ T1[(int) ((k05 >> 48) & 0xFFL)]              ^ T2[(int) ((k04 >> 40) & 0xFFL)]              ^ T3[(int) ((k03 >> 32) & 0xFFL)]              ^ T4[(int) ((k02 >> 24) & 0xFFL)]              ^ T5[(int) ((k01 >> 16) & 0xFFL)]              ^ T6[(int) ((k00 >> 8) & 0xFFL)] ^ T7[(int) (k07 & 0xFFL)];        Kr7 = T0[(int) ((k07 >> 56) & 0xFFL)] ^ T1[(int) ((k06 >> 48) & 0xFFL)]              ^ T2[(int) ((k05 >> 40) & 0xFFL)]              ^ T3[(int) ((k04 >> 32) & 0xFFL)]              ^ T4[(int) ((k03 >> 24) & 0xFFL)]              ^ T5[(int) ((k02 >> 16) & 0xFFL)]              ^ T6[(int) ((k01 >> 8) & 0xFFL)] ^ T7[(int) (k00 & 0xFFL)];        k00 = Kr0;        k01 = Kr1;        k02 = Kr2;        k03 = Kr3;        k04 = Kr4;        k05 = Kr5;        k06 = Kr6;        k07 = Kr7;        // 2. incrementally compute the cipher output        w0 = T0[(int) ((nn0 >> 56) & 0xFFL)] ^ T1[(int) ((nn7 >> 48) & 0xFFL)]             ^ T2[(int) ((nn6 >> 40) & 0xFFL)]             ^ T3[(int) ((nn5 >> 32) & 0xFFL)]             ^ T4[(int) ((nn4 >> 24) & 0xFFL)]             ^ T5[(int) ((nn3 >> 16) & 0xFFL)] ^ T6[(int) ((nn2 >> 8) & 0xFFL)]             ^ T7[(int) (nn1 & 0xFFL)] ^ Kr0;        w1 = T0[(int) ((nn1 >> 56) & 0xFFL)] ^ T1[(int) ((nn0 >> 48) & 0xFFL)]             ^ T2[(int) ((nn7 >> 40) & 0xFFL)]             ^ T3[(int) ((nn6 >> 32) & 0xFFL)]             ^ T4[(int) ((nn5 >> 24) & 0xFFL)]             ^ T5[(int) ((nn4 >> 16) & 0xFFL)] ^ T6[(int) ((nn3 >> 8) & 0xFFL)]             ^ T7[(int) (nn2 & 0xFFL)] ^ Kr1;        w2 = T0[(int) ((nn2 >> 56) & 0xFFL)] ^ T1[(int) ((nn1 >> 48) & 0xFFL)]             ^ T2[(int) ((nn0 >> 40) & 0xFFL)]             ^ T3[(int) ((nn7 >> 32) & 0xFFL)]             ^ T4[(int) ((nn6 >> 24) & 0xFFL)]             ^ T5[(int) ((nn5 >> 16) & 0xFFL)] ^ T6[(int) ((nn4 >> 8) & 0xFFL)]             ^ T7[(int) (nn3 & 0xFFL)] ^ Kr2;        w3 = T0[(int) ((nn3 >> 56) & 0xFFL)] ^ T1[(int) ((nn2 >> 48) & 0xFFL)]             ^ T2[(int) ((nn1 >> 40) & 0xFFL)]             ^ T3[(int) ((nn0 >> 32) & 0xFFL)]             ^ T4[(int) ((nn7 >> 24) & 0xFFL)]             ^ T5[(int) ((nn6 >> 16) & 0xFFL)] ^ T6[(int) ((nn5 >> 8) & 0xFFL)]             ^ T7[(int) (nn4 & 0xFFL)] ^ Kr3;        w4 = T0[(int) ((nn4 >> 56) & 0xFFL)] ^ T1[(int) ((nn3 >> 48) & 0xFFL)]             ^ T2[(int) ((nn2 >> 40) & 0xFFL)]             ^ T3[(int) ((nn1 >> 32) & 0xFFL)]             ^ T4[(int) ((nn0 >> 24) & 0xFFL)]             ^ T5[(int) ((nn7 >> 16) & 0xFFL)] ^ T6[(int) ((nn6 >> 8) & 0xFFL)]             ^ T7[(int) (nn5 & 0xFFL)] ^ Kr4;        w5 = T0[(int) ((nn5 >> 56) & 0xFFL)] ^ T1[(int) ((nn4 >> 48) & 0xFFL)]             ^ T2[(int) ((nn3 >> 40) & 0xFFL)]             ^ T3[(int) ((nn2 >> 32) & 0xFFL)]             ^ T4[(int) ((nn1 >> 24) & 0xFFL)]             ^ T5[(int) ((nn0 >> 16) & 0xFFL)] ^ T6[(int) ((nn7 >> 8) & 0xFFL)]             ^ T7[(int) (nn6 & 0xFFL)] ^ Kr5;        w6 = T0[(int) ((nn6 >> 56) & 0xFFL)] ^ T1[(int) ((nn5 >> 48) & 0xFFL)]             ^ T2[(int) ((nn4 >> 40) & 0xFFL)]             ^ T3[(int) ((nn3 >> 32) & 0xFFL)]             ^ T4[(int) ((nn2 >> 24) & 0xFFL)]             ^ T5[(int) ((nn1 >> 16) & 0xFFL)] ^ T6[(int) ((nn0 >> 8) & 0xFFL)]             ^ T7[(int) (nn7 & 0xFFL)] ^ Kr6;        w7 = T0[(int) ((nn7 >> 56) & 0xFFL)] ^ T1[(int) ((nn6 >> 48) & 0xFFL)]             ^ T2[(int) ((nn5 >> 40) & 0xFFL)]             ^ T3[(int) ((nn4 >> 32) & 0xFFL)]             ^ T4[(int) ((nn3 >> 24) & 0xFFL)]             ^ T5[(int) ((nn2 >> 16) & 0xFFL)] ^ T6[(int) ((nn1 >> 8) & 0xFFL)]             ^ T7[(int) (nn0 & 0xFFL)] ^ Kr7;        nn0 = w0;        nn1 = w1;        nn2 = w2;        nn3 = w3;        nn4 = w4;        nn5 = w5;        nn6 = w6;        nn7 = w7;      }    // apply the Miyaguchi-Preneel hash scheme    H0 ^= w0 ^ n0;    H1 ^= w1 ^ n1;    H2 ^= w2 ^ n2;    H3 ^= w3 ^ n3;    H4 ^= w4 ^ n4;    H5 ^= w5 ^ n5;    H6 ^= w6 ^ n6;    H7 ^= w7 ^ n7;  }  protected byte[] padBuffer()  {    // [WHIRLPOOL] p. 6:    // "...padded with a 1-bit, then with as few 0-bits as necessary to    // obtain a bit string whose length is an odd multiple of 256, and    // finally with the 256-bit right-justified binary representation of L."    // in this implementation we use 'count' as the number of bytes hashed    // so far. hence the minimal number of bytes added to the message proper    // are 33 (1 for the 1-bit followed by the 0-bits and the encoding of    // the count framed in a 256-bit block). our formula is then:    //		count + 33 + padding = 0 (mod BLOCK_SIZE)    int n = (int) ((count + 33) % BLOCK_SIZE);    int padding = n == 0 ? 33 : BLOCK_SIZE - n + 33;    byte[] result = new byte[padding];    // padding is always binary 1 followed by binary 0s    result[0] = (byte) 0x80;    // save (right justified) the number of bits hashed    long bits = count * 8;    int i = padding - 8;    result[i++] = (byte) (bits >>> 56);    result[i++] = (byte) (bits >>> 48);    result[i++] = (byte) (bits >>> 40);    result[i++] = (byte) (bits >>> 32);    result[i++] = (byte) (bits >>> 24);    result[i++] = (byte) (bits >>> 16);    result[i++] = (byte) (bits >>> 8);    result[i] = (byte) bits;    return result;  }  protected byte[] getResult()  {    // apply inverse mu to the context    byte[] result = new byte[] { (byte) (H0 >>> 56), (byte) (H0 >>> 48),                                (byte) (H0 >>> 40), (byte) (H0 >>> 32),                                (byte) (H0 >>> 24), (byte) (H0 >>> 16),                                (byte) (H0 >>> 8), (byte) H0,                                (byte) (H1 >>> 56), (byte) (H1 >>> 48),                                (byte) (H1 >>> 40), (byte) (H1 >>> 32),                                (byte) (H1 >>> 24), (byte) (H1 >>> 16),                                (byte) (H1 >>> 8), (byte) H1,                                (byte) (H2 >>> 56), (byte) (H2 >>> 48),                                (byte) (H2 >>> 40), (byte) (H2 >>> 32),                                (byte) (H2 >>> 24), (byte) (H2 >>> 16),                                (byte) (H2 >>> 8), (byte) H2,                                (byte) (H3 >>> 56), (byte) (H3 >>> 48),                                (byte) (H3 >>> 40), (byte) (H3 >>> 32),                                (byte) (H3 >>> 24), (byte) (H3 >>> 16),                                (byte) (H3 >>> 8), (byte) H3,                                (byte) (H4 >>> 56), (byte) (H4 >>> 48),                                (byte) (H4 >>> 40), (byte) (H4 >>> 32),                                (byte) (H4 >>> 24), (byte) (H4 >>> 16),                                (byte) (H4 >>> 8), (byte) H4,                                (byte) (H5 >>> 56), (byte) (H5 >>> 48),                                (byte) (H5 >>> 40), (byte) (H5 >>> 32),                                (byte) (H5 >>> 24), (byte) (H5 >>> 16),                                (byte) (H5 >>> 8), (byte) H5,                                (byte) (H6 >>> 56), (byte) (H6 >>> 48),                                (byte) (H6 >>> 40), (byte) (H6 >>> 32),                                (byte) (H6 >>> 24), (byte) (H6 >>> 16),                                (byte) (H6 >>> 8), (byte) H6,                                (byte) (H7 >>> 56), (byte) (H7 >>> 48),                                (byte) (H7 >>> 40), (byte) (H7 >>> 32),                                (byte) (H7 >>> 24), (byte) (H7 >>> 16),                                (byte) (H7 >>> 8), (byte) H7 };    return result;  }  protected void resetContext()  {    H0 = H1 = H2 = H3 = H4 = H5 = H6 = H7 = 0L;  }  public boolean selfTest()  {    if (valid == null)      {        valid = new Boolean(                            DIGEST0.equals(Util.toString(new Whirlpool().digest())));      }    return valid.booleanValue();  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?