diff --git a/blake2b.go b/blake2b.go index f3eb388..e2a9f11 100644 --- a/blake2b.go +++ b/blake2b.go @@ -34,6 +34,7 @@ type digest struct { isKeyed bool // indicates whether hash was keyed size uint8 // digest size in bytes isLastNode bool // indicates processing of the last node in tree hashing + sseOptimized bool // temp bool to indicate use of SSE (during dev only) } // Initialization values. @@ -162,9 +163,12 @@ func (d *digest) initialize(c *Config) { } // New512 returns a new hash.Hash computing the BLAKE2b 64-byte checksum. -func New512() hash.Hash { +func New512(enableSSE bool) hash.Hash { d := new(digest) d.initialize(defaultConfig) + if enableSSE { + d.EnableSSE() + } return d } @@ -206,6 +210,9 @@ func (d *digest) Size() int { return int(d.size) } // BlockSize returns the algorithm block size in bytes. func (d *digest) BlockSize() int { return BlockSize } +// Enable SSE +func (d *digest) EnableSSE() { d.sseOptimized = true } + func (d *digest) Write(p []byte) (nn int, err error) { nn = len(p) left := BlockSize - d.nx @@ -213,7 +220,11 @@ func (d *digest) Write(p []byte) (nn int, err error) { // Process buffer. copy(d.x[d.nx:], p[:left]) p = p[left:] - blocks(d, d.x[:]) + if d.sseOptimized { + compress(d, d.x[:]) + } else { + blocks(d, d.x[:]) + } d.nx = 0 } // Process full blocks except for the last one. @@ -222,7 +233,11 @@ func (d *digest) Write(p []byte) (nn int, err error) { if n == len(p) { n -= BlockSize } - blocks(d, p[:n]) + if d.sseOptimized { + compress(d, p[:n]) + } else { + blocks(d, p[:n]) + } p = p[n:] } // Fill buffer. @@ -262,7 +277,11 @@ func (d *digest) checkSum() [Size]byte { d.f[1] = 0xffffffffffffffff } // Compress last block. - blocks(d, d.x[:]) + if d.sseOptimized { + compress(d, d.x[:]) + } else { + blocks(d, d.x[:]) + } var out [Size]byte j := 0 diff --git a/blake2b_test.go b/blake2b_test.go index cfc00d6..661ffa8 100644 --- a/blake2b_test.go +++ b/blake2b_test.go @@ -27,9 +27,17 @@ func TestCompress(t *testing.T) { for i := range in { in[i] = byte(i) } - good := "2319e3789c47e2daa5fe807f61bec2a1a6537fa03f19ff32e87eecbfd64b7e0e8ccff439ac333b040f19b0c4ddd11a61e24ac1fe0f10a039806c5dcc0da3d115" - if good != fmt.Sprintf("%x", Sum512([]byte(in))) { - digest := fmt.Sprintf("%x", Sum512([]byte(in))) - t.Errorf("Sum512(): \nexpected %s\ngot %s", good, digest) + + hGo := New512(false) + hSSE := New512(true) + + hGo.Write(in) + sumGo := fmt.Sprintf("%x", hGo.Sum(nil)) + + hSSE.Write(in) + sumSSE := fmt.Sprintf("%x", hSSE.Sum(nil)) + + if sumGo != sumSSE { + t.Errorf("expected %s\ngot %s", sumGo, sumSSE) } } diff --git a/block.go b/block.go index 2f04bb7..f8161e1 100644 --- a/block.go +++ b/block.go @@ -37,1373 +37,1373 @@ func blocks(d *digest, p []uint8) { j += 8 } - // Round 1. - v0 += m[0] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[2] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[4] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[6] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[5] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[7] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[3] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[1] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[8] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[10] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[12] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[14] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[13] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[15] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[11] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[9] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 2. - v0 += m[14] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[4] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[9] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[13] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[15] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[6] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[8] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[10] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[1] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[0] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[11] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[5] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[7] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[3] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[2] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[12] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 3. - v0 += m[11] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[12] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[5] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[15] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[2] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[13] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[0] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[8] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[10] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[3] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[7] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[9] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[1] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[4] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[6] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[14] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 4. - v0 += m[7] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[3] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[13] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[11] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[12] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[14] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[1] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[9] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[2] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[5] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[4] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[15] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[0] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[8] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[10] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[6] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 5. - v0 += m[9] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[5] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[2] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[10] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[4] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[15] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[7] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[0] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[14] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[11] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[6] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[3] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[8] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[13] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[12] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[1] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 6. - v0 += m[2] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[6] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[0] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[8] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[11] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[3] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[10] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[12] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[4] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[7] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[15] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[1] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[14] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[9] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[5] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[13] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 7. - v0 += m[12] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[1] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[14] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[4] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[13] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[10] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[15] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[5] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[0] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[6] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[9] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[8] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[2] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[11] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[3] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[7] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 8. - v0 += m[13] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[7] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[12] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[3] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[1] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[9] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[14] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[11] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[5] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[15] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[8] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[2] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[6] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[10] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[4] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[0] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 9. - v0 += m[6] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[14] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[11] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[0] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[3] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[8] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[9] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[15] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[12] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[13] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[1] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[10] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[4] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[5] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[7] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[2] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 10. - v0 += m[10] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[8] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[7] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[1] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[6] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[5] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[4] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[2] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[15] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[9] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[3] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[13] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[12] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[0] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[14] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[11] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 11. - v0 += m[0] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[2] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[4] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[6] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[5] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[7] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[3] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[1] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[8] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[10] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[12] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[14] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[13] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[15] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[11] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[9] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 - - // Round 12. - v0 += m[14] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-32) | v12>>32 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-24) | v4>>24 - v1 += m[4] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-32) | v13>>32 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-24) | v5>>24 - v2 += m[9] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-32) | v14>>32 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-24) | v6>>24 - v3 += m[13] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-32) | v15>>32 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-24) | v7>>24 - v2 += m[15] - v2 += v6 - v14 ^= v2 - v14 = v14<<(64-16) | v14>>16 - v10 += v14 - v6 ^= v10 - v6 = v6<<(64-63) | v6>>63 - v3 += m[6] - v3 += v7 - v15 ^= v3 - v15 = v15<<(64-16) | v15>>16 - v11 += v15 - v7 ^= v11 - v7 = v7<<(64-63) | v7>>63 - v1 += m[8] - v1 += v5 - v13 ^= v1 - v13 = v13<<(64-16) | v13>>16 - v9 += v13 - v5 ^= v9 - v5 = v5<<(64-63) | v5>>63 - v0 += m[10] - v0 += v4 - v12 ^= v0 - v12 = v12<<(64-16) | v12>>16 - v8 += v12 - v4 ^= v8 - v4 = v4<<(64-63) | v4>>63 - v0 += m[1] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-32) | v15>>32 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-24) | v5>>24 - v1 += m[0] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-32) | v12>>32 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-24) | v6>>24 - v2 += m[11] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-32) | v13>>32 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-24) | v7>>24 - v3 += m[5] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-32) | v14>>32 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-24) | v4>>24 - v2 += m[7] - v2 += v7 - v13 ^= v2 - v13 = v13<<(64-16) | v13>>16 - v8 += v13 - v7 ^= v8 - v7 = v7<<(64-63) | v7>>63 - v3 += m[3] - v3 += v4 - v14 ^= v3 - v14 = v14<<(64-16) | v14>>16 - v9 += v14 - v4 ^= v9 - v4 = v4<<(64-63) | v4>>63 - v1 += m[2] - v1 += v6 - v12 ^= v1 - v12 = v12<<(64-16) | v12>>16 - v11 += v12 - v6 ^= v11 - v6 = v6<<(64-63) | v6>>63 - v0 += m[12] - v0 += v5 - v15 ^= v0 - v15 = v15<<(64-16) | v15>>16 - v10 += v15 - v5 ^= v10 - v5 = v5<<(64-63) | v5>>63 + //// Round 1. + //v0 += m[0] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[2] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[4] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[6] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[5] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[7] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[3] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[1] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[8] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[10] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[12] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[14] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[13] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[15] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[11] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[9] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 2. + //v0 += m[14] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[4] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[9] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[13] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[15] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[6] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[8] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[10] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[1] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[0] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[11] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[5] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[7] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[3] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[2] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[12] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 3. + //v0 += m[11] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[12] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[5] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[15] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[2] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[13] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[0] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[8] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[10] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[3] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[7] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[9] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[1] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[4] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[6] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[14] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 4. + //v0 += m[7] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[3] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[13] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[11] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[12] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[14] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[1] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[9] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[2] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[5] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[4] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[15] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[0] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[8] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[10] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[6] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 5. + //v0 += m[9] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[5] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[2] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[10] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[4] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[15] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[7] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[0] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[14] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[11] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[6] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[3] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[8] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[13] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[12] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[1] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 6. + //v0 += m[2] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[6] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[0] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[8] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[11] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[3] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[10] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[12] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[4] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[7] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[15] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[1] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[14] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[9] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[5] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[13] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 7. + //v0 += m[12] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[1] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[14] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[4] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[13] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[10] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[15] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[5] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[0] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[6] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[9] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[8] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[2] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[11] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[3] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[7] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 8. + //v0 += m[13] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[7] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[12] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[3] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[1] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[9] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[14] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[11] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[5] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[15] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[8] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[2] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[6] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[10] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[4] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[0] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 9. + //v0 += m[6] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[14] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[11] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[0] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[3] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[8] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[9] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[15] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[12] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[13] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[1] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[10] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[4] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[5] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[7] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[2] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 10. + //v0 += m[10] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[8] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[7] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[1] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[6] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[5] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[4] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[2] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[15] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[9] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[3] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[13] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[12] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[0] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[14] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[11] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 11. + //v0 += m[0] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[2] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[4] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[6] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[5] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[7] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[3] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[1] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[8] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[10] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[12] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[14] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[13] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[15] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[11] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[9] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 + // + //// Round 12. + //v0 += m[14] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-32) | v12>>32 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-24) | v4>>24 + //v1 += m[4] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-32) | v13>>32 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-24) | v5>>24 + //v2 += m[9] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-32) | v14>>32 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-24) | v6>>24 + //v3 += m[13] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-32) | v15>>32 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-24) | v7>>24 + //v2 += m[15] + //v2 += v6 + //v14 ^= v2 + //v14 = v14<<(64-16) | v14>>16 + //v10 += v14 + //v6 ^= v10 + //v6 = v6<<(64-63) | v6>>63 + //v3 += m[6] + //v3 += v7 + //v15 ^= v3 + //v15 = v15<<(64-16) | v15>>16 + //v11 += v15 + //v7 ^= v11 + //v7 = v7<<(64-63) | v7>>63 + //v1 += m[8] + //v1 += v5 + //v13 ^= v1 + //v13 = v13<<(64-16) | v13>>16 + //v9 += v13 + //v5 ^= v9 + //v5 = v5<<(64-63) | v5>>63 + //v0 += m[10] + //v0 += v4 + //v12 ^= v0 + //v12 = v12<<(64-16) | v12>>16 + //v8 += v12 + //v4 ^= v8 + //v4 = v4<<(64-63) | v4>>63 + //v0 += m[1] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-32) | v15>>32 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-24) | v5>>24 + //v1 += m[0] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-32) | v12>>32 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-24) | v6>>24 + //v2 += m[11] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-32) | v13>>32 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-24) | v7>>24 + //v3 += m[5] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-32) | v14>>32 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-24) | v4>>24 + //v2 += m[7] + //v2 += v7 + //v13 ^= v2 + //v13 = v13<<(64-16) | v13>>16 + //v8 += v13 + //v7 ^= v8 + //v7 = v7<<(64-63) | v7>>63 + //v3 += m[3] + //v3 += v4 + //v14 ^= v3 + //v14 = v14<<(64-16) | v14>>16 + //v9 += v14 + //v4 ^= v9 + //v4 = v4<<(64-63) | v4>>63 + //v1 += m[2] + //v1 += v6 + //v12 ^= v1 + //v12 = v12<<(64-16) | v12>>16 + //v11 += v12 + //v6 ^= v11 + //v6 = v6<<(64-63) | v6>>63 + //v0 += m[12] + //v0 += v5 + //v15 ^= v0 + //v15 = v15<<(64-16) | v15>>16 + //v10 += v15 + //v5 ^= v10 + //v5 = v5<<(64-63) | v5>>63 h0 ^= v0 ^ v8 h1 ^= v1 ^ v9 diff --git a/compress_amd64.go b/compress_amd64.go new file mode 100644 index 0000000..8cf54a8 --- /dev/null +++ b/compress_amd64.go @@ -0,0 +1,48 @@ +//+build !noasm +//+build !appengine + +/* + * Copyright 2016 Frank Wessels + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package blake2b + +//go:noescape +func compressSSE(p []uint8, in, iv, t, f, out []uint64) + +func compress(d *digest, p []uint8) { + h0, h1, h2, h3, h4, h5, h6, h7 := d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] + + in := make([]uint64, 8, 8) + out := make([]uint64, 8, 8) + + for len(p) >= BlockSize { + // Increment counter. + d.t[0] += BlockSize + if d.t[0] < BlockSize { + d.t[1]++ + } + + in[0], in[1], in[2], in[3], in[4], in[5], in[6], in[7] = h0, h1, h2, h3, h4, h5, h6, h7 + + compressSSE(p, in, iv[:], d.t[:], d.f[:], out) + + h0, h1, h2, h3, h4, h5, h6, h7 = out[0], out[1], out[2], out[3], out[4], out[5], out[6], out[7] + + p = p[BlockSize:] + } + + d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 +} diff --git a/compress_amd64.s b/compress_amd64.s new file mode 100644 index 0000000..8edcc1f --- /dev/null +++ b/compress_amd64.s @@ -0,0 +1,66 @@ +//+build !noasm !appengine + +// +// Copyright 2016 Frank Wessels +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// + +// func compressSSE(compressSSE(p []uint8, in, iv, t, f, out []uint64) +TEXT ·compressSSE(SB), 7, $0 + + // Load digest + MOVQ in+24(FP), SI // SI: &in + MOVOU 0(SI), X0 // X0 = in[0]+in[1] /* row1l = LOAD( &S->h[0] ); */ + MOVOU 16(SI), X1 // X1 = in[2]+in[3] /* row1h = LOAD( &S->h[2] ); */ + MOVOU 32(SI), X2 // X2 = in[4]+in[5] /* row2l = LOAD( &S->h[4] ); */ + MOVOU 48(SI), X3 // X3 = in[6]+in[7] /* row2h = LOAD( &S->h[6] ); */ + + // Load initialization vector + MOVQ iv+48(FP), DX // DX: &iv + MOVOU 0(DX), X4 // X4 = iv[0]+iv[1] /* row3l = LOAD( &blake2b_IV[0] ); */ + MOVOU 16(DX), X5 // X5 = iv[2]+iv[3] /* row3h = LOAD( &blake2b_IV[2] ); */ + MOVOU 32(DX), X6 // X6 = iv[4]+iv[5] /* LOAD( &blake2b_IV[4] ) */ + MOVQ t+72(FP), SI // SI: &t + MOVOU 0(SI), X7 // X7 = t[0]+t[1] /* LOAD( &S->t[0] ) */ + PXOR X7, X6 // X6 = X6 ^ X7 /* row4l = _mm_xor_si128( , ); */ + MOVOU 48(DX), X7 // X7 = iv[6]+iv[7] /* LOAD( &blake2b_IV[6] ) */ + MOVQ t+96(FP), SI // SI: &f + MOVOU 0(SI), X8 // X8 = f[0]+f[0] /* row4h = _mm_xor_si128( LOAD( &S->f[0] ) */ + PXOR X8, X7 // X7 = X7 ^ X8 /* row4h = _mm_xor_si128( , ); */ + + // Reload digest + MOVQ in+24(FP), SI // SI: &in + MOVOU 0(SI), X12 // X12 = in[0]+in[1] /* row1l = LOAD( &S->h[0] ); */ + MOVOU 16(SI), X13 // X13 = in[2]+in[3] /* row1h = LOAD( &S->h[2] ); */ + MOVOU 32(SI), X14 // X14 = in[4]+in[5] /* row2l = LOAD( &S->h[4] ); */ + MOVOU 48(SI), X15 // X15 = in[6]+in[7] /* row2h = LOAD( &S->h[6] ); */ + + // Final computations and prepare for storing + PXOR X4, X0 // X0 = X0 ^ X4 /* row1l = _mm_xor_si128( row3l, row1l ); */ + PXOR X5, X1 // X1 = X1 ^ X5 /* row1h = _mm_xor_si128( row3h, row1h ); */ + PXOR X12, X0 // X0 = X0 ^ X12 /* STORE( &S->h[0], _mm_xor_si128( LOAD( &S->h[0] ), row1l ) ); */ + PXOR X13, X1 // X1 = X1 ^ X13 /* STORE( &S->h[2], _mm_xor_si128( LOAD( &S->h[2] ), row1h ) ); */ + PXOR X6, X2 // X2 = X2 ^ X6 /* row2l = _mm_xor_si128( row4l, row2l ); */ + PXOR X7, X3 // X3 = X3 ^ X7 /* row2h = _mm_xor_si128( row4h, row2h ); */ + PXOR X14, X2 // X2 = X2 ^ X14 /* STORE( &S->h[4], _mm_xor_si128( LOAD( &S->h[4] ), row2l ) ); */ + PXOR X15, X3 // X3 = X3 ^ X15 /* STORE( &S->h[6], _mm_xor_si128( LOAD( &S->h[6] ), row2h ) ); */ + + // Store digest + MOVQ out+120(FP), DX // DX: &out + MOVOU X0, 0(DX) // out[0]+out[1] = X0 + MOVOU X1, 16(DX) // out[2]+out[3] = X1 + MOVOU X2, 32(DX) // out[4]+out[5] = X2 + MOVOU X3, 48(DX) // out[6]+out[7] = X3 + + RET diff --git a/compress_noasm.go b/compress_noasm.go new file mode 100644 index 0000000..ee1ee9e --- /dev/null +++ b/compress_noasm.go @@ -0,0 +1,1420 @@ +//+build !amd64 noasm appengine + +// Written in 2012 by Dmitry Chestnykh. +// +// To the extent possible under law, the author have dedicated all copyright +// and related and neighboring rights to this software to the public domain +// worldwide. This software is distributed without any warranty. +// http://creativecommons.org/publicdomain/zero/1.0/ + +package blake2b + +func compress(d *digest, p []uint8) { + h0, h1, h2, h3, h4, h5, h6, h7 := d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] + + for len(p) >= BlockSize { + // Increment counter. + d.t[0] += BlockSize + if d.t[0] < BlockSize { + d.t[1]++ + } + // Initialize compression function. + v0, v1, v2, v3, v4, v5, v6, v7 := h0, h1, h2, h3, h4, h5, h6, h7 + v8 := iv[0] + v9 := iv[1] + v10 := iv[2] + v11 := iv[3] + v12 := iv[4] ^ d.t[0] + v13 := iv[5] ^ d.t[1] + v14 := iv[6] ^ d.f[0] + v15 := iv[7] ^ d.f[1] + var m [16]uint64 + + j := 0 + for i := 0; i < 16; i++ { + m[i] = uint64(p[j]) | uint64(p[j+1])<<8 | uint64(p[j+2])<<16 | uint64(p[j+3])<<24 | + uint64(p[j+4])<<32 | uint64(p[j+5])<<40 | uint64(p[j+6])<<48 | uint64(p[j+7])<<56 + j += 8 + } + + // Round 1. + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[2] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[7] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[1] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[8] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[14] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[13] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[9] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 2. + v0 += m[14] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[9] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[15] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[0] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[11] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[2] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 3. + v0 += m[11] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[12] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[15] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[2] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[0] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[8] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[10] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[3] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[9] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[1] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[4] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[6] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[14] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 4. + v0 += m[7] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[13] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[11] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[12] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[14] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[1] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[9] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[2] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[5] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[4] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[0] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[8] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[6] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 5. + v0 += m[9] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[5] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[2] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[10] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[15] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[7] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[14] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[6] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[8] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[13] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[12] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 6. + v0 += m[2] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[6] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[0] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[8] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[11] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[3] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[10] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[12] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[4] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[7] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[15] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[1] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[14] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[9] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[5] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[13] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 7. + v0 += m[12] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[1] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[14] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[4] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[13] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[10] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[15] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[5] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[0] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[6] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[9] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[8] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[2] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[11] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[3] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[7] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 8. + v0 += m[13] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[7] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[12] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[3] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[1] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[9] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[14] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[11] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[5] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[15] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[8] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[2] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[6] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[10] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[4] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[0] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 9. + v0 += m[6] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[14] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[11] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[0] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[3] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[8] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[9] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[15] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[13] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[1] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[10] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[4] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[7] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[2] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 10. + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[7] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[1] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[6] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[5] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[2] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[15] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[9] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[3] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[13] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[0] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[14] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[11] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 11. + v0 += m[0] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[2] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[4] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[5] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[7] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[3] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[1] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[8] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[10] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[12] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[14] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[13] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[15] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[11] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[9] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + // Round 12. + v0 += m[14] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-32) | v12>>32 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-24) | v4>>24 + v1 += m[4] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-32) | v13>>32 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-24) | v5>>24 + v2 += m[9] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-32) | v14>>32 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-24) | v6>>24 + v3 += m[13] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-32) | v15>>32 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-24) | v7>>24 + v2 += m[15] + v2 += v6 + v14 ^= v2 + v14 = v14<<(64-16) | v14>>16 + v10 += v14 + v6 ^= v10 + v6 = v6<<(64-63) | v6>>63 + v3 += m[6] + v3 += v7 + v15 ^= v3 + v15 = v15<<(64-16) | v15>>16 + v11 += v15 + v7 ^= v11 + v7 = v7<<(64-63) | v7>>63 + v1 += m[8] + v1 += v5 + v13 ^= v1 + v13 = v13<<(64-16) | v13>>16 + v9 += v13 + v5 ^= v9 + v5 = v5<<(64-63) | v5>>63 + v0 += m[10] + v0 += v4 + v12 ^= v0 + v12 = v12<<(64-16) | v12>>16 + v8 += v12 + v4 ^= v8 + v4 = v4<<(64-63) | v4>>63 + v0 += m[1] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-32) | v15>>32 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-24) | v5>>24 + v1 += m[0] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-32) | v12>>32 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-24) | v6>>24 + v2 += m[11] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-32) | v13>>32 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-24) | v7>>24 + v3 += m[5] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-32) | v14>>32 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-24) | v4>>24 + v2 += m[7] + v2 += v7 + v13 ^= v2 + v13 = v13<<(64-16) | v13>>16 + v8 += v13 + v7 ^= v8 + v7 = v7<<(64-63) | v7>>63 + v3 += m[3] + v3 += v4 + v14 ^= v3 + v14 = v14<<(64-16) | v14>>16 + v9 += v14 + v4 ^= v9 + v4 = v4<<(64-63) | v4>>63 + v1 += m[2] + v1 += v6 + v12 ^= v1 + v12 = v12<<(64-16) | v12>>16 + v11 += v12 + v6 ^= v11 + v6 = v6<<(64-63) | v6>>63 + v0 += m[12] + v0 += v5 + v15 ^= v0 + v15 = v15<<(64-16) | v15>>16 + v10 += v15 + v5 ^= v10 + v5 = v5<<(64-63) | v5>>63 + + h0 ^= v0 ^ v8 + h1 ^= v1 ^ v9 + h2 ^= v2 ^ v10 + h3 ^= v3 ^ v11 + h4 ^= v4 ^ v12 + h5 ^= v5 ^ v13 + h6 ^= v6 ^ v14 + h7 ^= v7 ^ v15 + + p = p[BlockSize:] + } + d.h[0], d.h[1], d.h[2], d.h[3], d.h[4], d.h[5], d.h[6], d.h[7] = h0, h1, h2, h3, h4, h5, h6, h7 +}