QortalOS Brooklyn for Raspberry Pi 4
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

959 lines
21 KiB

// $Id: HamsiSmallCore.java 239 2010-06-21 14:58:08Z tp $
package fr.cryptohash;
/**
* This class implements Hamsi-224 and Hamsi-256.
*
* <pre>
* ==========================(LICENSE BEGIN)============================
*
* Copyright (c) 2007-2010 Projet RNRT SAPHIR
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* ===========================(LICENSE END)=============================
* </pre>
*
* @version $Revision: 239 $
* @author Thomas Pornin &lt;[email protected]&gt;
*/
abstract class HamsiSmallCore implements Digest {
private int[] h;
private long bitCount;
private int partial;
private int partialLen;
/**
* Create the object.
*/
HamsiSmallCore()
{
h = new int[8];
reset();
}
/** @see Digest */
public void update(byte in)
{
bitCount += 8;
partial = (partial << 8) | (in & 0xFF);
partialLen ++;
if (partialLen == 4) {
process(partial >>> 24, (partial >>> 16) & 0xFF,
(partial >>> 8) & 0xFF, partial & 0xFF);
partialLen = 0;
}
}
/** @see Digest */
public void update(byte[] inbuf)
{
update(inbuf, 0, inbuf.length);
}
/** @see Digest */
public void update(byte[] inbuf, int off, int len)
{
bitCount += (long)len << 3;
if (partialLen != 0) {
while (partialLen < 4 && len > 0) {
partial = (partial << 8)
| (inbuf[off ++] & 0xFF);
partialLen ++;
len --;
}
if (partialLen < 4)
return;
process(partial >>> 24, (partial >>> 16) & 0xFF,
(partial >>> 8) & 0xFF, partial & 0xFF);
partialLen = 0;
}
while (len >= 4) {
process(inbuf[off + 0] & 0xFF,
inbuf[off + 1] & 0xFF,
inbuf[off + 2] & 0xFF,
inbuf[off + 3] & 0xFF);
off += 4;
len -= 4;
}
partialLen = len;
while (len -- > 0)
partial = (partial << 8) | (inbuf[off ++] & 0xFF);
}
/** @see Digest */
public byte[] digest()
{
int n = getDigestLength();
byte[] out = new byte[n];
digest(out, 0, n);
return out;
}
/** @see Digest */
public byte[] digest(byte[] inbuf)
{
update(inbuf, 0, inbuf.length);
return digest();
}
/** @see Digest */
public int digest(byte[] outbuf, int off, int len)
{
long bitCount = this.bitCount;
update((byte)0x80);
while (partialLen != 0)
update((byte)0x00);
process((int)(bitCount >>> 56) & 0xFF,
(int)(bitCount >>> 48) & 0xFF,
(int)(bitCount >>> 40) & 0xFF,
(int)(bitCount >>> 32) & 0xFF);
processFinal(((int)bitCount >>> 24) & 0xFF,
((int)bitCount >>> 16) & 0xFF,
((int)bitCount >>> 8) & 0xFF,
(int)bitCount & 0xFF);
int n = getDigestLength();
if (len > n)
len = n;
int ch = 0;
for (int i = 0, j = 0; i < len; i ++) {
if ((i & 3) == 0)
ch = h[j ++];
outbuf[off + i] = (byte)(ch >>> 24);
ch <<= 8;
}
reset();
return len;
}
/** @see Digest */
public void reset()
{
System.arraycopy(getIV(), 0, h, 0, h.length);
bitCount = 0;
partialLen = 0;
}
/** @see Digest */
public Digest copy()
{
HamsiSmallCore d = dup();
System.arraycopy(h, 0, d.h, 0, h.length);
d.bitCount = bitCount;
d.partial = partial;
d.partialLen = partialLen;
return d;
}
/** @see Digest */
public int getBlockLength()
{
/*
* Private communication from Hamsi designer Ozgul Kucuk:
*
* << For HMAC you can calculate B = 256*ceil(k / 256)
* (same as CubeHash). >>
*/
return -32;
}
/**
* Get the IV.
*
* @return the IV (initial values for the state words)
*/
abstract int[] getIV();
/**
* Create a new instance of the same runtime class than this object.
*
* @return the duplicate
*/
abstract HamsiSmallCore dup();
private static final int[][] Tsrc = {
{ 0x045f0000, 0x9c4a93c9, 0x62fc79d0, 0x731ebdc2,
0xe0278000, 0x19dce008, 0xd7075d82, 0x5ad2e31d },
{ 0xe4788000, 0x859673c1, 0xb5fb2452, 0x29cc5edf,
0x045f0000, 0x9c4a93c9, 0x62fc79d0, 0x731ebdc2 },
{ 0xe6570000, 0x4bb33a25, 0x848598ba, 0x1041003e,
0xf44c4000, 0x10a4e3cd, 0x097f5711, 0xde77cc4c },
{ 0x121b4000, 0x5b17d9e8, 0x8dfacfab, 0xce36cc72,
0xe6570000, 0x4bb33a25, 0x848598ba, 0x1041003e },
{ 0x97530000, 0x204f6ed3, 0x77b9e80f, 0xa1ec5ec1,
0x7e792000, 0x9418e22f, 0x6643d258, 0x9c255be5 },
{ 0xe92a2000, 0xb4578cfc, 0x11fa3a57, 0x3dc90524,
0x97530000, 0x204f6ed3, 0x77b9e80f, 0xa1ec5ec1 },
{ 0xcba90000, 0x90273769, 0xbbdcf407, 0xd0f4af61,
0xbf3c1000, 0xca0c7117, 0x3321e92c, 0xce122df3 },
{ 0x74951000, 0x5a2b467e, 0x88fd1d2b, 0x1ee68292,
0xcba90000, 0x90273769, 0xbbdcf407, 0xd0f4af61 },
{ 0xe18b0000, 0x5459887d, 0xbf1283d3, 0x1b666a73,
0x3fb90800, 0x7cdad883, 0xce97a914, 0xbdd9f5e5 },
{ 0xde320800, 0x288350fe, 0x71852ac7, 0xa6bf9f96,
0xe18b0000, 0x5459887d, 0xbf1283d3, 0x1b666a73 },
{ 0x14bd0000, 0x2fba37ff, 0x6a72e5bb, 0x247febe6,
0x9b830400, 0x2227ff88, 0x05b7ad5a, 0xadf2c730 },
{ 0x8f3e0400, 0x0d9dc877, 0x6fc548e1, 0x898d2cd6,
0x14bd0000, 0x2fba37ff, 0x6a72e5bb, 0x247febe6 },
{ 0xee260000, 0x124b683e, 0x80c2d68f, 0x3bf3ab2c,
0x499e0200, 0x0d59ec0d, 0xe0272f7d, 0xa5e7de5a },
{ 0xa7b80200, 0x1f128433, 0x60e5f9f2, 0x9e147576,
0xee260000, 0x124b683e, 0x80c2d68f, 0x3bf3ab2c },
{ 0x734c0000, 0x956fa7d6, 0xa29d1297, 0x6ee56854,
0xc4e80100, 0x1f70960e, 0x2714ca3c, 0x88210c30 },
{ 0xb7a40100, 0x8a1f31d8, 0x8589d8ab, 0xe6c46464,
0x734c0000, 0x956fa7d6, 0xa29d1297, 0x6ee56854 },
{ 0x39a60000, 0x4ab753eb, 0xd14e094b, 0xb772b42b,
0x62740080, 0x0fb84b07, 0x138a651e, 0x44100618 },
{ 0x5bd20080, 0x450f18ec, 0xc2c46c55, 0xf362b233,
0x39a60000, 0x4ab753eb, 0xd14e094b, 0xb772b42b },
{ 0x78ab0000, 0xa0cd5a34, 0x5d5ca0f7, 0x727784cb,
0x35650040, 0x9b96b64a, 0x6b39cb5f, 0x5114bece },
{ 0x4dce0040, 0x3b5bec7e, 0x36656ba8, 0x23633a05,
0x78ab0000, 0xa0cd5a34, 0x5d5ca0f7, 0x727784cb },
{ 0x5c720000, 0xc9bacd12, 0x79a90df9, 0x63e92178,
0xfeca0020, 0x485d28e4, 0x806741fd, 0x814681b8 },
{ 0xa2b80020, 0x81e7e5f6, 0xf9ce4c04, 0xe2afa0c0,
0x5c720000, 0xc9bacd12, 0x79a90df9, 0x63e92178 },
{ 0x2e390000, 0x64dd6689, 0x3cd406fc, 0xb1f490bc,
0x7f650010, 0x242e1472, 0xc03320fe, 0xc0a3c0dd },
{ 0x515c0010, 0x40f372fb, 0xfce72602, 0x71575061,
0x2e390000, 0x64dd6689, 0x3cd406fc, 0xb1f490bc },
{ 0x171c0000, 0xb26e3344, 0x9e6a837e, 0x58f8485f,
0xbfb20008, 0x92170a39, 0x6019107f, 0xe051606e },
{ 0xa8ae0008, 0x2079397d, 0xfe739301, 0xb8a92831,
0x171c0000, 0xb26e3344, 0x9e6a837e, 0x58f8485f },
{ 0x6ba90000, 0x40ebf9aa, 0x98321c3d, 0x76acc733,
0xbba10004, 0xcc9d76dd, 0x05f7ac6d, 0xd9e6eee9 },
{ 0xd0080004, 0x8c768f77, 0x9dc5b050, 0xaf4a29da,
0x6ba90000, 0x40ebf9aa, 0x98321c3d, 0x76acc733 },
{ 0x51ac0000, 0x25e30f14, 0x79e22a4c, 0x1298bd46,
0xd98f0002, 0x7a04a8a7, 0xe007afe6, 0x9fed4ab7 },
{ 0x88230002, 0x5fe7a7b3, 0x99e585aa, 0x8d75f7f1,
0x51ac0000, 0x25e30f14, 0x79e22a4c, 0x1298bd46 },
{ 0xc8f10000, 0x0b2de782, 0x6bf648a4, 0x539cbdbf,
0x08bf0001, 0x38942792, 0xc5f8f3a1, 0xe6387b84 },
{ 0xc04e0001, 0x33b9c010, 0xae0ebb05, 0xb5a4c63b,
0xc8f10000, 0x0b2de782, 0x6bf648a4, 0x539cbdbf }
};
private static int[][] makeT(int x)
{
int[][] T = new int[256][8];
for (int y = 0; y < 256; y ++) {
for (int z = 0; z < 8; z ++) {
int a = 0;
for (int k = 0; k < 8; k ++) {
if ((y & (1 << (7 - k))) != 0)
a ^= Tsrc[x + k][z];
}
T[y][z] = a;
}
}
return T;
}
private static final int[][] T256_0 = makeT(0);
private static final int[][] T256_1 = makeT(8);
private static final int[][] T256_2 = makeT(16);
private static final int[][] T256_3 = makeT(24);
private static final int[] ALPHA_N = {
0xff00f0f0, 0xccccaaaa, 0xf0f0cccc, 0xff00aaaa,
0xccccaaaa, 0xf0f0ff00, 0xaaaacccc, 0xf0f0ff00,
0xf0f0cccc, 0xaaaaff00, 0xccccff00, 0xaaaaf0f0,
0xaaaaf0f0, 0xff00cccc, 0xccccf0f0, 0xff00aaaa,
0xccccaaaa, 0xff00f0f0, 0xff00aaaa, 0xf0f0cccc,
0xf0f0ff00, 0xccccaaaa, 0xf0f0ff00, 0xaaaacccc,
0xaaaaff00, 0xf0f0cccc, 0xaaaaf0f0, 0xccccff00,
0xff00cccc, 0xaaaaf0f0, 0xff00aaaa, 0xccccf0f0
};
private static final int[] ALPHA_F = {
0xcaf9639c, 0x0ff0f9c0, 0x639c0ff0, 0xcaf9f9c0,
0x0ff0f9c0, 0x639ccaf9, 0xf9c00ff0, 0x639ccaf9,
0x639c0ff0, 0xf9c0caf9, 0x0ff0caf9, 0xf9c0639c,
0xf9c0639c, 0xcaf90ff0, 0x0ff0639c, 0xcaf9f9c0,
0x0ff0f9c0, 0xcaf9639c, 0xcaf9f9c0, 0x639c0ff0,
0x639ccaf9, 0x0ff0f9c0, 0x639ccaf9, 0xf9c00ff0,
0xf9c0caf9, 0x639c0ff0, 0xf9c0639c, 0x0ff0caf9,
0xcaf90ff0, 0xf9c0639c, 0xcaf9f9c0, 0x0ff0639c
};
private void process(int b0, int b1, int b2, int b3)
{
int[] rp = T256_0[b0];
int m0 = rp[0];
int m1 = rp[1];
int m2 = rp[2];
int m3 = rp[3];
int m4 = rp[4];
int m5 = rp[5];
int m6 = rp[6];
int m7 = rp[7];
rp = T256_1[b1];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
rp = T256_2[b2];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
rp = T256_3[b3];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
int c0 = h[0];
int c1 = h[1];
int c2 = h[2];
int c3 = h[3];
int c4 = h[4];
int c5 = h[5];
int c6 = h[6];
int c7 = h[7];
int t;
m0 ^= ALPHA_N[0x00];
m1 ^= ALPHA_N[0x01] ^ 0;
c0 ^= ALPHA_N[0x02];
c1 ^= ALPHA_N[0x03];
c2 ^= ALPHA_N[0x08];
c3 ^= ALPHA_N[0x09];
m2 ^= ALPHA_N[0x0A];
m3 ^= ALPHA_N[0x0B];
m4 ^= ALPHA_N[0x10];
m5 ^= ALPHA_N[0x11];
c4 ^= ALPHA_N[0x12];
c5 ^= ALPHA_N[0x13];
c6 ^= ALPHA_N[0x18];
c7 ^= ALPHA_N[0x19];
m6 ^= ALPHA_N[0x1A];
m7 ^= ALPHA_N[0x1B];
t = m0;
m0 &= m4;
m0 ^= c6;
m4 ^= c2;
m4 ^= m0;
c6 |= t;
c6 ^= c2;
t ^= m4;
c2 = c6;
c6 |= t;
c6 ^= m0;
m0 &= c2;
t ^= m0;
c2 ^= c6;
c2 ^= t;
m0 = m4;
m4 = c2;
c2 = c6;
c6 = ~t;
t = m1;
m1 &= m5;
m1 ^= c7;
m5 ^= c3;
m5 ^= m1;
c7 |= t;
c7 ^= c3;
t ^= m5;
c3 = c7;
c7 |= t;
c7 ^= m1;
m1 &= c3;
t ^= m1;
c3 ^= c7;
c3 ^= t;
m1 = m5;
m5 = c3;
c3 = c7;
c7 = ~t;
t = c0;
c0 &= c4;
c0 ^= m6;
c4 ^= m2;
c4 ^= c0;
m6 |= t;
m6 ^= m2;
t ^= c4;
m2 = m6;
m6 |= t;
m6 ^= c0;
c0 &= m2;
t ^= c0;
m2 ^= m6;
m2 ^= t;
c0 = c4;
c4 = m2;
m2 = m6;
m6 = ~t;
t = c1;
c1 &= c5;
c1 ^= m7;
c5 ^= m3;
c5 ^= c1;
m7 |= t;
m7 ^= m3;
t ^= c5;
m3 = m7;
m7 |= t;
m7 ^= c1;
c1 &= m3;
t ^= c1;
m3 ^= m7;
m3 ^= t;
c1 = c5;
c5 = m3;
m3 = m7;
m7 = ~t;
m0 = (m0 << 13) | (m0 >>> (32 - 13));
c4 = (c4 << 3) | (c4 >>> (32 - 3));
c3 ^= m0 ^ c4;
m7 ^= c4 ^ (m0 << 3);
c3 = (c3 << 1) | (c3 >>> (32 - 1));
m7 = (m7 << 7) | (m7 >>> (32 - 7));
m0 ^= c3 ^ m7;
c4 ^= m7 ^ (c3 << 7);
m0 = (m0 << 5) | (m0 >>> (32 - 5));
c4 = (c4 << 22) | (c4 >>> (32 - 22));
m1 = (m1 << 13) | (m1 >>> (32 - 13));
c5 = (c5 << 3) | (c5 >>> (32 - 3));
m2 ^= m1 ^ c5;
c6 ^= c5 ^ (m1 << 3);
m2 = (m2 << 1) | (m2 >>> (32 - 1));
c6 = (c6 << 7) | (c6 >>> (32 - 7));
m1 ^= m2 ^ c6;
c5 ^= c6 ^ (m2 << 7);
m1 = (m1 << 5) | (m1 >>> (32 - 5));
c5 = (c5 << 22) | (c5 >>> (32 - 22));
c0 = (c0 << 13) | (c0 >>> (32 - 13));
m4 = (m4 << 3) | (m4 >>> (32 - 3));
m3 ^= c0 ^ m4;
c7 ^= m4 ^ (c0 << 3);
m3 = (m3 << 1) | (m3 >>> (32 - 1));
c7 = (c7 << 7) | (c7 >>> (32 - 7));
c0 ^= m3 ^ c7;
m4 ^= c7 ^ (m3 << 7);
c0 = (c0 << 5) | (c0 >>> (32 - 5));
m4 = (m4 << 22) | (m4 >>> (32 - 22));
c1 = (c1 << 13) | (c1 >>> (32 - 13));
m5 = (m5 << 3) | (m5 >>> (32 - 3));
c2 ^= c1 ^ m5;
m6 ^= m5 ^ (c1 << 3);
c2 = (c2 << 1) | (c2 >>> (32 - 1));
m6 = (m6 << 7) | (m6 >>> (32 - 7));
c1 ^= c2 ^ m6;
m5 ^= m6 ^ (c2 << 7);
c1 = (c1 << 5) | (c1 >>> (32 - 5));
m5 = (m5 << 22) | (m5 >>> (32 - 22));
m0 ^= ALPHA_N[0x00];
m1 ^= ALPHA_N[0x01] ^ 1;
c0 ^= ALPHA_N[0x02];
c1 ^= ALPHA_N[0x03];
c2 ^= ALPHA_N[0x08];
c3 ^= ALPHA_N[0x09];
m2 ^= ALPHA_N[0x0A];
m3 ^= ALPHA_N[0x0B];
m4 ^= ALPHA_N[0x10];
m5 ^= ALPHA_N[0x11];
c4 ^= ALPHA_N[0x12];
c5 ^= ALPHA_N[0x13];
c6 ^= ALPHA_N[0x18];
c7 ^= ALPHA_N[0x19];
m6 ^= ALPHA_N[0x1A];
m7 ^= ALPHA_N[0x1B];
t = m0;
m0 &= m4;
m0 ^= c6;
m4 ^= c2;
m4 ^= m0;
c6 |= t;
c6 ^= c2;
t ^= m4;
c2 = c6;
c6 |= t;
c6 ^= m0;
m0 &= c2;
t ^= m0;
c2 ^= c6;
c2 ^= t;
m0 = m4;
m4 = c2;
c2 = c6;
c6 = ~t;
t = m1;
m1 &= m5;
m1 ^= c7;
m5 ^= c3;
m5 ^= m1;
c7 |= t;
c7 ^= c3;
t ^= m5;
c3 = c7;
c7 |= t;
c7 ^= m1;
m1 &= c3;
t ^= m1;
c3 ^= c7;
c3 ^= t;
m1 = m5;
m5 = c3;
c3 = c7;
c7 = ~t;
t = c0;
c0 &= c4;
c0 ^= m6;
c4 ^= m2;
c4 ^= c0;
m6 |= t;
m6 ^= m2;
t ^= c4;
m2 = m6;
m6 |= t;
m6 ^= c0;
c0 &= m2;
t ^= c0;
m2 ^= m6;
m2 ^= t;
c0 = c4;
c4 = m2;
m2 = m6;
m6 = ~t;
t = c1;
c1 &= c5;
c1 ^= m7;
c5 ^= m3;
c5 ^= c1;
m7 |= t;
m7 ^= m3;
t ^= c5;
m3 = m7;
m7 |= t;
m7 ^= c1;
c1 &= m3;
t ^= c1;
m3 ^= m7;
m3 ^= t;
c1 = c5;
c5 = m3;
m3 = m7;
m7 = ~t;
m0 = (m0 << 13) | (m0 >>> (32 - 13));
c4 = (c4 << 3) | (c4 >>> (32 - 3));
c3 ^= m0 ^ c4;
m7 ^= c4 ^ (m0 << 3);
c3 = (c3 << 1) | (c3 >>> (32 - 1));
m7 = (m7 << 7) | (m7 >>> (32 - 7));
m0 ^= c3 ^ m7;
c4 ^= m7 ^ (c3 << 7);
m0 = (m0 << 5) | (m0 >>> (32 - 5));
c4 = (c4 << 22) | (c4 >>> (32 - 22));
m1 = (m1 << 13) | (m1 >>> (32 - 13));
c5 = (c5 << 3) | (c5 >>> (32 - 3));
m2 ^= m1 ^ c5;
c6 ^= c5 ^ (m1 << 3);
m2 = (m2 << 1) | (m2 >>> (32 - 1));
c6 = (c6 << 7) | (c6 >>> (32 - 7));
m1 ^= m2 ^ c6;
c5 ^= c6 ^ (m2 << 7);
m1 = (m1 << 5) | (m1 >>> (32 - 5));
c5 = (c5 << 22) | (c5 >>> (32 - 22));
c0 = (c0 << 13) | (c0 >>> (32 - 13));
m4 = (m4 << 3) | (m4 >>> (32 - 3));
m3 ^= c0 ^ m4;
c7 ^= m4 ^ (c0 << 3);
m3 = (m3 << 1) | (m3 >>> (32 - 1));
c7 = (c7 << 7) | (c7 >>> (32 - 7));
c0 ^= m3 ^ c7;
m4 ^= c7 ^ (m3 << 7);
c0 = (c0 << 5) | (c0 >>> (32 - 5));
m4 = (m4 << 22) | (m4 >>> (32 - 22));
c1 = (c1 << 13) | (c1 >>> (32 - 13));
m5 = (m5 << 3) | (m5 >>> (32 - 3));
c2 ^= c1 ^ m5;
m6 ^= m5 ^ (c1 << 3);
c2 = (c2 << 1) | (c2 >>> (32 - 1));
m6 = (m6 << 7) | (m6 >>> (32 - 7));
c1 ^= c2 ^ m6;
m5 ^= m6 ^ (c2 << 7);
c1 = (c1 << 5) | (c1 >>> (32 - 5));
m5 = (m5 << 22) | (m5 >>> (32 - 22));
m0 ^= ALPHA_N[0x00];
m1 ^= ALPHA_N[0x01] ^ 2;
c0 ^= ALPHA_N[0x02];
c1 ^= ALPHA_N[0x03];
c2 ^= ALPHA_N[0x08];
c3 ^= ALPHA_N[0x09];
m2 ^= ALPHA_N[0x0A];
m3 ^= ALPHA_N[0x0B];
m4 ^= ALPHA_N[0x10];
m5 ^= ALPHA_N[0x11];
c4 ^= ALPHA_N[0x12];
c5 ^= ALPHA_N[0x13];
c6 ^= ALPHA_N[0x18];
c7 ^= ALPHA_N[0x19];
m6 ^= ALPHA_N[0x1A];
m7 ^= ALPHA_N[0x1B];
t = m0;
m0 &= m4;
m0 ^= c6;
m4 ^= c2;
m4 ^= m0;
c6 |= t;
c6 ^= c2;
t ^= m4;
c2 = c6;
c6 |= t;
c6 ^= m0;
m0 &= c2;
t ^= m0;
c2 ^= c6;
c2 ^= t;
m0 = m4;
m4 = c2;
c2 = c6;
c6 = ~t;
t = m1;
m1 &= m5;
m1 ^= c7;
m5 ^= c3;
m5 ^= m1;
c7 |= t;
c7 ^= c3;
t ^= m5;
c3 = c7;
c7 |= t;
c7 ^= m1;
m1 &= c3;
t ^= m1;
c3 ^= c7;
c3 ^= t;
m1 = m5;
m5 = c3;
c3 = c7;
c7 = ~t;
t = c0;
c0 &= c4;
c0 ^= m6;
c4 ^= m2;
c4 ^= c0;
m6 |= t;
m6 ^= m2;
t ^= c4;
m2 = m6;
m6 |= t;
m6 ^= c0;
c0 &= m2;
t ^= c0;
m2 ^= m6;
m2 ^= t;
c0 = c4;
c4 = m2;
m2 = m6;
m6 = ~t;
t = c1;
c1 &= c5;
c1 ^= m7;
c5 ^= m3;
c5 ^= c1;
m7 |= t;
m7 ^= m3;
t ^= c5;
m3 = m7;
m7 |= t;
m7 ^= c1;
c1 &= m3;
t ^= c1;
m3 ^= m7;
m3 ^= t;
c1 = c5;
c5 = m3;
m3 = m7;
m7 = ~t;
m0 = (m0 << 13) | (m0 >>> (32 - 13));
c4 = (c4 << 3) | (c4 >>> (32 - 3));
c3 ^= m0 ^ c4;
m7 ^= c4 ^ (m0 << 3);
c3 = (c3 << 1) | (c3 >>> (32 - 1));
m7 = (m7 << 7) | (m7 >>> (32 - 7));
m0 ^= c3 ^ m7;
c4 ^= m7 ^ (c3 << 7);
m0 = (m0 << 5) | (m0 >>> (32 - 5));
c4 = (c4 << 22) | (c4 >>> (32 - 22));
m1 = (m1 << 13) | (m1 >>> (32 - 13));
c5 = (c5 << 3) | (c5 >>> (32 - 3));
m2 ^= m1 ^ c5;
c6 ^= c5 ^ (m1 << 3);
m2 = (m2 << 1) | (m2 >>> (32 - 1));
c6 = (c6 << 7) | (c6 >>> (32 - 7));
m1 ^= m2 ^ c6;
c5 ^= c6 ^ (m2 << 7);
m1 = (m1 << 5) | (m1 >>> (32 - 5));
c5 = (c5 << 22) | (c5 >>> (32 - 22));
c0 = (c0 << 13) | (c0 >>> (32 - 13));
m4 = (m4 << 3) | (m4 >>> (32 - 3));
m3 ^= c0 ^ m4;
c7 ^= m4 ^ (c0 << 3);
m3 = (m3 << 1) | (m3 >>> (32 - 1));
c7 = (c7 << 7) | (c7 >>> (32 - 7));
c0 ^= m3 ^ c7;
m4 ^= c7 ^ (m3 << 7);
c0 = (c0 << 5) | (c0 >>> (32 - 5));
m4 = (m4 << 22) | (m4 >>> (32 - 22));
c1 = (c1 << 13) | (c1 >>> (32 - 13));
m5 = (m5 << 3) | (m5 >>> (32 - 3));
c2 ^= c1 ^ m5;
m6 ^= m5 ^ (c1 << 3);
c2 = (c2 << 1) | (c2 >>> (32 - 1));
m6 = (m6 << 7) | (m6 >>> (32 - 7));
c1 ^= c2 ^ m6;
m5 ^= m6 ^ (c2 << 7);
c1 = (c1 << 5) | (c1 >>> (32 - 5));
m5 = (m5 << 22) | (m5 >>> (32 - 22));
h[7] ^= c5;
h[6] ^= c4;
h[5] ^= m5;
h[4] ^= m4;
h[3] ^= c1;
h[2] ^= c0;
h[1] ^= m1;
h[0] ^= m0;
}
private void processFinal(int b0, int b1, int b2, int b3)
{
int[] rp = T256_0[b0];
int m0 = rp[0];
int m1 = rp[1];
int m2 = rp[2];
int m3 = rp[3];
int m4 = rp[4];
int m5 = rp[5];
int m6 = rp[6];
int m7 = rp[7];
rp = T256_1[b1];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
rp = T256_2[b2];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
rp = T256_3[b3];
m0 ^= rp[0];
m1 ^= rp[1];
m2 ^= rp[2];
m3 ^= rp[3];
m4 ^= rp[4];
m5 ^= rp[5];
m6 ^= rp[6];
m7 ^= rp[7];
int c0 = h[0];
int c1 = h[1];
int c2 = h[2];
int c3 = h[3];
int c4 = h[4];
int c5 = h[5];
int c6 = h[6];
int c7 = h[7];
int t;
for (int r = 0; r < 6; r ++) {
m0 ^= ALPHA_F[0x00];
m1 ^= ALPHA_F[0x01] ^ r;
c0 ^= ALPHA_F[0x02];
c1 ^= ALPHA_F[0x03];
c2 ^= ALPHA_F[0x08];
c3 ^= ALPHA_F[0x09];
m2 ^= ALPHA_F[0x0A];
m3 ^= ALPHA_F[0x0B];
m4 ^= ALPHA_F[0x10];
m5 ^= ALPHA_F[0x11];
c4 ^= ALPHA_F[0x12];
c5 ^= ALPHA_F[0x13];
c6 ^= ALPHA_F[0x18];
c7 ^= ALPHA_F[0x19];
m6 ^= ALPHA_F[0x1A];
m7 ^= ALPHA_F[0x1B];
t = m0;
m0 &= m4;
m0 ^= c6;
m4 ^= c2;
m4 ^= m0;
c6 |= t;
c6 ^= c2;
t ^= m4;
c2 = c6;
c6 |= t;
c6 ^= m0;
m0 &= c2;
t ^= m0;
c2 ^= c6;
c2 ^= t;
m0 = m4;
m4 = c2;
c2 = c6;
c6 = ~t;
t = m1;
m1 &= m5;
m1 ^= c7;
m5 ^= c3;
m5 ^= m1;
c7 |= t;
c7 ^= c3;
t ^= m5;
c3 = c7;
c7 |= t;
c7 ^= m1;
m1 &= c3;
t ^= m1;
c3 ^= c7;
c3 ^= t;
m1 = m5;
m5 = c3;
c3 = c7;
c7 = ~t;
t = c0;
c0 &= c4;
c0 ^= m6;
c4 ^= m2;
c4 ^= c0;
m6 |= t;
m6 ^= m2;
t ^= c4;
m2 = m6;
m6 |= t;
m6 ^= c0;
c0 &= m2;
t ^= c0;
m2 ^= m6;
m2 ^= t;
c0 = c4;
c4 = m2;
m2 = m6;
m6 = ~t;
t = c1;
c1 &= c5;
c1 ^= m7;
c5 ^= m3;
c5 ^= c1;
m7 |= t;
m7 ^= m3;
t ^= c5;
m3 = m7;
m7 |= t;
m7 ^= c1;
c1 &= m3;
t ^= c1;
m3 ^= m7;
m3 ^= t;
c1 = c5;
c5 = m3;
m3 = m7;
m7 = ~t;
m0 = (m0 << 13) | (m0 >>> (32 - 13));
c4 = (c4 << 3) | (c4 >>> (32 - 3));
c3 ^= m0 ^ c4;
m7 ^= c4 ^ (m0 << 3);
c3 = (c3 << 1) | (c3 >>> (32 - 1));
m7 = (m7 << 7) | (m7 >>> (32 - 7));
m0 ^= c3 ^ m7;
c4 ^= m7 ^ (c3 << 7);
m0 = (m0 << 5) | (m0 >>> (32 - 5));
c4 = (c4 << 22) | (c4 >>> (32 - 22));
m1 = (m1 << 13) | (m1 >>> (32 - 13));
c5 = (c5 << 3) | (c5 >>> (32 - 3));
m2 ^= m1 ^ c5;
c6 ^= c5 ^ (m1 << 3);
m2 = (m2 << 1) | (m2 >>> (32 - 1));
c6 = (c6 << 7) | (c6 >>> (32 - 7));
m1 ^= m2 ^ c6;
c5 ^= c6 ^ (m2 << 7);
m1 = (m1 << 5) | (m1 >>> (32 - 5));
c5 = (c5 << 22) | (c5 >>> (32 - 22));
c0 = (c0 << 13) | (c0 >>> (32 - 13));
m4 = (m4 << 3) | (m4 >>> (32 - 3));
m3 ^= c0 ^ m4;
c7 ^= m4 ^ (c0 << 3);
m3 = (m3 << 1) | (m3 >>> (32 - 1));
c7 = (c7 << 7) | (c7 >>> (32 - 7));
c0 ^= m3 ^ c7;
m4 ^= c7 ^ (m3 << 7);
c0 = (c0 << 5) | (c0 >>> (32 - 5));
m4 = (m4 << 22) | (m4 >>> (32 - 22));
c1 = (c1 << 13) | (c1 >>> (32 - 13));
m5 = (m5 << 3) | (m5 >>> (32 - 3));
c2 ^= c1 ^ m5;
m6 ^= m5 ^ (c1 << 3);
c2 = (c2 << 1) | (c2 >>> (32 - 1));
m6 = (m6 << 7) | (m6 >>> (32 - 7));
c1 ^= c2 ^ m6;
m5 ^= m6 ^ (c2 << 7);
c1 = (c1 << 5) | (c1 >>> (32 - 5));
m5 = (m5 << 22) | (m5 >>> (32 - 22));
}
h[7] ^= c5;
h[6] ^= c4;
h[5] ^= m5;
h[4] ^= m4;
h[3] ^= c1;
h[2] ^= c0;
h[1] ^= m1;
h[0] ^= m0;
}
/** @see Digest */
public String toString()
{
return "Hamsi-" + (getDigestLength() << 3);
}
}