// Use of this source code is governed by an ISC // license that can be found in the LICENSE file. package luffa import ( "fmt" "gitlab.com/nitya-sattva/go-x11/hash" ) // HashSize holds the size of a hash in bytes. const HashSize = int(64) // BlockSize holds the size of a block in bytes. const BlockSize = uintptr(32) //////////////// type digest struct { ptr uintptr h [5][8]uint32 b [32]byte } // New returns a new digest compute a LUFFA512 hash. func New() hash.Digest { ref := &digest{} ref.Reset() return ref } //////////////// // Reset resets the digest to its initial state. func (ref *digest) Reset() { ref.ptr = 0 for x := range kInit { for y := range kInit[x] { ref.h[x][y] = kInit[x][y] } } } // Sum appends the current hash to dst and returns the result // as a slice. It does not change the underlying hash state. func (ref *digest) Sum(dst []byte) []byte { dgt := *ref hsh := [64]byte{} dgt.Close(hsh[:], 0, 0) return append(dst, hsh[:]...) } // Write more data to the running hash, never returns an error. func (ref *digest) Write(src []byte) (int, error) { sln := uintptr(len(src)) fln := len(src) buf := ref.b[:] ptr := ref.ptr if sln < (BlockSize - ptr) { copy(ref.b[ptr:], src) ref.ptr += sln return int(sln), nil } var V00, V01, V02, V03, V04, V05, V06, V07 uint32 var V10, V11, V12, V13, V14, V15, V16, V17 uint32 var V20, V21, V22, V23, V24, V25, V26, V27 uint32 var V30, V31, V32, V33, V34, V35, V36, V37 uint32 var V40, V41, V42, V43, V44, V45, V46, V47 uint32 V00 = ref.h[0][0] V01 = ref.h[0][1] V02 = ref.h[0][2] V03 = ref.h[0][3] V04 = ref.h[0][4] V05 = ref.h[0][5] V06 = ref.h[0][6] V07 = ref.h[0][7] V10 = ref.h[1][0] V11 = ref.h[1][1] V12 = ref.h[1][2] V13 = ref.h[1][3] V14 = ref.h[1][4] V15 = ref.h[1][5] V16 = ref.h[1][6] V17 = ref.h[1][7] V20 = ref.h[2][0] V21 = ref.h[2][1] V22 = ref.h[2][2] V23 = ref.h[2][3] V24 = ref.h[2][4] V25 = ref.h[2][5] V26 = ref.h[2][6] V27 = ref.h[2][7] V30 = ref.h[3][0] V31 = ref.h[3][1] V32 = ref.h[3][2] V33 = ref.h[3][3] V34 = ref.h[3][4] V35 = ref.h[3][5] V36 = ref.h[3][6] V37 = ref.h[3][7] V40 = ref.h[4][0] V41 = ref.h[4][1] V42 = ref.h[4][2] V43 = ref.h[4][3] V44 = ref.h[4][4] V45 = ref.h[4][5] V46 = ref.h[4][6] V47 = ref.h[4][7] for sln > 0 { cln := BlockSize - ptr if cln > sln { cln = sln } sln -= cln copy(ref.b[ptr:], src[:cln]) src = src[cln:] ptr += cln if ptr == BlockSize { { var ts uint32 var M0, M1, M2, M3, M4, M5, M6, M7 uint32 var a0, a1, a2, a3, a4, a5, a6, a7 uint32 var b0, b1, b2, b3, b4, b5, b6, b7 uint32 M0 = decUInt32be(buf[0:]) M1 = decUInt32be(buf[4:]) M2 = decUInt32be(buf[8:]) M3 = decUInt32be(buf[12:]) M4 = decUInt32be(buf[16:]) M5 = decUInt32be(buf[20:]) M6 = decUInt32be(buf[24:]) M7 = decUInt32be(buf[28:]) a0 = V00 ^ V10 a1 = V01 ^ V11 a2 = V02 ^ V12 a3 = V03 ^ V13 a4 = V04 ^ V14 a5 = V05 ^ V15 a6 = V06 ^ V16 a7 = V07 ^ V17 b0 = V20 ^ V30 b1 = V21 ^ V31 b2 = V22 ^ V32 b3 = V23 ^ V33 b4 = V24 ^ V34 b5 = V25 ^ V35 b6 = V26 ^ V36 b7 = V27 ^ V37 a0 ^= b0 a1 ^= b1 a2 ^= b2 a3 ^= b3 a4 ^= b4 a5 ^= b5 a6 ^= b6 a7 ^= b7 a0 ^= V40 a1 ^= V41 a2 ^= V42 a3 ^= V43 a4 ^= V44 a5 ^= V45 a6 ^= V46 a7 ^= V47 ts = a7 a7 = a6 a6 = a5 a5 = a4 a4 = a3 ^ ts a3 = a2 ^ ts a2 = a1 a1 = a0 ^ ts a0 = ts V00 ^= a0 V01 ^= a1 V02 ^= a2 V03 ^= a3 V04 ^= a4 V05 ^= a5 V06 ^= a6 V07 ^= a7 V10 ^= a0 V11 ^= a1 V12 ^= a2 V13 ^= a3 V14 ^= a4 V15 ^= a5 V16 ^= a6 V17 ^= a7 V20 ^= a0 V21 ^= a1 V22 ^= a2 V23 ^= a3 V24 ^= a4 V25 ^= a5 V26 ^= a6 V27 ^= a7 V30 ^= a0 V31 ^= a1 V32 ^= a2 V33 ^= a3 V34 ^= a4 V35 ^= a5 V36 ^= a6 V37 ^= a7 V40 ^= a0 V41 ^= a1 V42 ^= a2 V43 ^= a3 V44 ^= a4 V45 ^= a5 V46 ^= a6 V47 ^= a7 ts = V07 b7 = V06 b6 = V05 b5 = V04 b4 = V03 ^ ts b3 = V02 ^ ts b2 = V01 b1 = V00 ^ ts b0 = ts b0 ^= V10 b1 ^= V11 b2 ^= V12 b3 ^= V13 b4 ^= V14 b5 ^= V15 b6 ^= V16 b7 ^= V17 ts = V17 V17 = V16 V16 = V15 V15 = V14 V14 = V13 ^ ts V13 = V12 ^ ts V12 = V11 V11 = V10 ^ ts V10 = ts V10 ^= V20 V11 ^= V21 V12 ^= V22 V13 ^= V23 V14 ^= V24 V15 ^= V25 V16 ^= V26 V17 ^= V27 ts = V27 V27 = V26 V26 = V25 V25 = V24 V24 = V23 ^ ts V23 = V22 ^ ts V22 = V21 V21 = V20 ^ ts V20 = ts V20 ^= V30 V21 ^= V31 V22 ^= V32 V23 ^= V33 V24 ^= V34 V25 ^= V35 V26 ^= V36 V27 ^= V37 ts = V37 V37 = V36 V36 = V35 V35 = V34 V34 = V33 ^ ts V33 = V32 ^ ts V32 = V31 V31 = V30 ^ ts V30 = ts V30 ^= V40 V31 ^= V41 V32 ^= V42 V33 ^= V43 V34 ^= V44 V35 ^= V45 V36 ^= V46 V37 ^= V47 ts = V47 V47 = V46 V46 = V45 V45 = V44 V44 = V43 ^ ts V43 = V42 ^ ts V42 = V41 V41 = V40 ^ ts V40 = ts V40 ^= V00 V41 ^= V01 V42 ^= V02 V43 ^= V03 V44 ^= V04 V45 ^= V05 V46 ^= V06 V47 ^= V07 ts = b7 V07 = b6 V06 = b5 V05 = b4 V04 = b3 ^ ts V03 = b2 ^ ts V02 = b1 V01 = b0 ^ ts V00 = ts V00 ^= V40 V01 ^= V41 V02 ^= V42 V03 ^= V43 V04 ^= V44 V05 ^= V45 V06 ^= V46 V07 ^= V47 ts = V47 V47 = V46 V46 = V45 V45 = V44 V44 = V43 ^ ts V43 = V42 ^ ts V42 = V41 V41 = V40 ^ ts V40 = ts V40 ^= V30 V41 ^= V31 V42 ^= V32 V43 ^= V33 V44 ^= V34 V45 ^= V35 V46 ^= V36 V47 ^= V37 ts = V37 V37 = V36 V36 = V35 V35 = V34 V34 = V33 ^ ts V33 = V32 ^ ts V32 = V31 V31 = V30 ^ ts V30 = ts V30 ^= V20 V31 ^= V21 V32 ^= V22 V33 ^= V23 V34 ^= V24 V35 ^= V25 V36 ^= V26 V37 ^= V27 ts = V27 V27 = V26 V26 = V25 V25 = V24 V24 = V23 ^ ts V23 = V22 ^ ts V22 = V21 V21 = V20 ^ ts V20 = ts V20 ^= V10 V21 ^= V11 V22 ^= V12 V23 ^= V13 V24 ^= V14 V25 ^= V15 V26 ^= V16 V27 ^= V17 ts = V17 V17 = V16 V16 = V15 V15 = V14 V14 = V13 ^ ts V13 = V12 ^ ts V12 = V11 V11 = V10 ^ ts V10 = ts V10 ^= b0 V11 ^= b1 V12 ^= b2 V13 ^= b3 V14 ^= b4 V15 ^= b5 V16 ^= b6 V17 ^= b7 V00 ^= M0 V01 ^= M1 V02 ^= M2 V03 ^= M3 V04 ^= M4 V05 ^= M5 V06 ^= M6 V07 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V10 ^= M0 V11 ^= M1 V12 ^= M2 V13 ^= M3 V14 ^= M4 V15 ^= M5 V16 ^= M6 V17 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V20 ^= M0 V21 ^= M1 V22 ^= M2 V23 ^= M3 V24 ^= M4 V25 ^= M5 V26 ^= M6 V27 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V30 ^= M0 V31 ^= M1 V32 ^= M2 V33 ^= M3 V34 ^= M4 V35 ^= M5 V36 ^= M6 V37 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V40 ^= M0 V41 ^= M1 V42 ^= M2 V43 ^= M3 V44 ^= M4 V45 ^= M5 V46 ^= M6 V47 ^= M7 } { var ul, uh, vl, vh, tws uint32 var W0, W1, W2, W3, W4, W5, W6, W7, tw uint64 V14 = ((V14 << 1) | (V14 >> (32 - 1))) V15 = ((V15 << 1) | (V15 >> (32 - 1))) V16 = ((V16 << 1) | (V16 >> (32 - 1))) V17 = ((V17 << 1) | (V17 >> (32 - 1))) V24 = ((V24 << 2) | (V24 >> (32 - 2))) V25 = ((V25 << 2) | (V25 >> (32 - 2))) V26 = ((V26 << 2) | (V26 >> (32 - 2))) V27 = ((V27 << 2) | (V27 >> (32 - 2))) V34 = ((V34 << 3) | (V34 >> (32 - 3))) V35 = ((V35 << 3) | (V35 >> (32 - 3))) V36 = ((V36 << 3) | (V36 >> (32 - 3))) V37 = ((V37 << 3) | (V37 >> (32 - 3))) V44 = ((V44 << 4) | (V44 >> (32 - 4))) V45 = ((V45 << 4) | (V45 >> (32 - 4))) V46 = ((V46 << 4) | (V46 >> (32 - 4))) V47 = ((V47 << 4) | (V47 >> (32 - 4))) W0 = uint64(V00) | (uint64(V10) << 32) W1 = uint64(V01) | (uint64(V11) << 32) W2 = uint64(V02) | (uint64(V12) << 32) W3 = uint64(V03) | (uint64(V13) << 32) W4 = uint64(V04) | (uint64(V14) << 32) W5 = uint64(V05) | (uint64(V15) << 32) W6 = uint64(V06) | (uint64(V16) << 32) W7 = uint64(V07) | (uint64(V17) << 32) for r := uintptr(0); r < 8; r++ { tw = W0 W0 |= W1 W2 ^= W3 W1 = ^W1 W0 ^= W3 W3 &= tw W1 ^= W3 W3 ^= W2 W2 &= W0 W0 = ^W0 W2 ^= W1 W1 |= W3 tw ^= W1 W3 ^= W2 W2 &= W1 W1 ^= W0 W0 = tw tw = W5 W5 |= W6 W7 ^= W4 W6 = ^W6 W5 ^= W4 W4 &= tw W6 ^= W4 W4 ^= W7 W7 &= W5 W5 = ^W5 W7 ^= W6 W6 |= W4 tw ^= W6 W4 ^= W7 W7 &= W6 W6 ^= W5 W5 = tw W4 ^= W0 ul = uint32(W0) uh = uint32((W0 >> 32)) vl = uint32(W4) vh = uint32((W4 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W0 = uint64(ul) | (uint64(uh) << 32) W4 = uint64(vl) | (uint64(vh) << 32) W5 ^= W1 ul = uint32(W1) uh = uint32((W1 >> 32)) vl = uint32(W5) vh = uint32((W5 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W1 = uint64(ul) | (uint64(uh) << 32) W5 = uint64(vl) | (uint64(vh) << 32) W6 ^= W2 ul = uint32(W2) uh = uint32((W2 >> 32)) vl = uint32(W6) vh = uint32((W6 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W2 = uint64(ul) | (uint64(uh) << 32) W6 = uint64(vl) | (uint64(vh) << 32) W7 ^= W3 ul = uint32(W3) uh = uint32((W3 >> 32)) vl = uint32(W7) vh = uint32((W7 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W3 = uint64(ul) | (uint64(uh) << 32) W7 = uint64(vl) | (uint64(vh) << 32) W0 ^= kRCW010[r] W4 ^= kRCW014[r] } V00 = uint32(W0) V10 = uint32((W0 >> 32)) V01 = uint32(W1) V11 = uint32((W1 >> 32)) V02 = uint32(W2) V12 = uint32((W2 >> 32)) V03 = uint32(W3) V13 = uint32((W3 >> 32)) V04 = uint32(W4) V14 = uint32((W4 >> 32)) V05 = uint32(W5) V15 = uint32((W5 >> 32)) V06 = uint32(W6) V16 = uint32((W6 >> 32)) V07 = uint32(W7) V17 = uint32((W7 >> 32)) W0 = uint64(V20) | (uint64(V30) << 32) W1 = uint64(V21) | (uint64(V31) << 32) W2 = uint64(V22) | (uint64(V32) << 32) W3 = uint64(V23) | (uint64(V33) << 32) W4 = uint64(V24) | (uint64(V34) << 32) W5 = uint64(V25) | (uint64(V35) << 32) W6 = uint64(V26) | (uint64(V36) << 32) W7 = uint64(V27) | (uint64(V37) << 32) for r := uintptr(0); r < 8; r++ { tw = W0 W0 |= W1 W2 ^= W3 W1 = ^W1 W0 ^= W3 W3 &= tw W1 ^= W3 W3 ^= W2 W2 &= W0 W0 = ^W0 W2 ^= W1 W1 |= W3 tw ^= W1 W3 ^= W2 W2 &= W1 W1 ^= W0 W0 = tw tw = W5 W5 |= W6 W7 ^= W4 W6 = ^W6 W5 ^= W4 W4 &= tw W6 ^= W4 W4 ^= W7 W7 &= W5 W5 = ^W5 W7 ^= W6 W6 |= W4 tw ^= W6 W4 ^= W7 W7 &= W6 W6 ^= W5 W5 = tw W4 ^= W0 ul = uint32(W0) uh = uint32((W0 >> 32)) vl = uint32(W4) vh = uint32((W4 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W0 = uint64(ul) | (uint64(uh) << 32) W4 = uint64(vl) | (uint64(vh) << 32) W5 ^= W1 ul = uint32(W1) uh = uint32((W1 >> 32)) vl = uint32(W5) vh = uint32((W5 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W1 = uint64(ul) | (uint64(uh) << 32) W5 = uint64(vl) | (uint64(vh) << 32) W6 ^= W2 ul = uint32(W2) uh = uint32((W2 >> 32)) vl = uint32(W6) vh = uint32((W6 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W2 = uint64(ul) | (uint64(uh) << 32) W6 = uint64(vl) | (uint64(vh) << 32) W7 ^= W3 ul = uint32(W3) uh = uint32((W3 >> 32)) vl = uint32(W7) vh = uint32((W7 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W3 = uint64(ul) | (uint64(uh) << 32) W7 = uint64(vl) | (uint64(vh) << 32) W0 ^= kRCW230[r] W4 ^= kRCW234[r] } V20 = uint32(W0) V30 = uint32((W0 >> 32)) V21 = uint32(W1) V31 = uint32((W1 >> 32)) V22 = uint32(W2) V32 = uint32((W2 >> 32)) V23 = uint32(W3) V33 = uint32((W3 >> 32)) V24 = uint32(W4) V34 = uint32((W4 >> 32)) V25 = uint32(W5) V35 = uint32((W5 >> 32)) V26 = uint32(W6) V36 = uint32((W6 >> 32)) V27 = uint32(W7) V37 = uint32((W7 >> 32)) for r := uintptr(0); r < 8; r++ { tws = V40 V40 |= V41 V42 ^= V43 V41 = ^V41 V40 ^= V43 V43 &= tws V41 ^= V43 V43 ^= V42 V42 &= V40 V40 = ^V40 V42 ^= V41 V41 |= V43 tws ^= V41 V43 ^= V42 V42 &= V41 V41 ^= V40 V40 = tws tws = V45 V45 |= V46 V47 ^= V44 V46 = ^V46 V45 ^= V44 V44 &= tws V46 ^= V44 V44 ^= V47 V47 &= V45 V45 = ^V45 V47 ^= V46 V46 |= V44 tws ^= V46 V44 ^= V47 V47 &= V46 V46 ^= V45 V45 = tws V44 ^= V40 V40 = ((V40 << 2) | (V40 >> (32 - 2))) ^ V44 V44 = ((V44 << 14) | (V44 >> (32 - 14))) ^ V40 V40 = ((V40 << 10) | (V40 >> (32 - 10))) ^ V44 V44 = ((V44 << 1) | (V44 >> (32 - 1))) V45 ^= V41 V41 = ((V41 << 2) | (V41 >> (32 - 2))) ^ V45 V45 = ((V45 << 14) | (V45 >> (32 - 14))) ^ V41 V41 = ((V41 << 10) | (V41 >> (32 - 10))) ^ V45 V45 = ((V45 << 1) | (V45 >> (32 - 1))) V46 ^= V42 V42 = ((V42 << 2) | (V42 >> (32 - 2))) ^ V46 V46 = ((V46 << 14) | (V46 >> (32 - 14))) ^ V42 V42 = ((V42 << 10) | (V42 >> (32 - 10))) ^ V46 V46 = ((V46 << 1) | (V46 >> (32 - 1))) V47 ^= V43 V43 = ((V43 << 2) | (V43 >> (32 - 2))) ^ V47 V47 = ((V47 << 14) | (V47 >> (32 - 14))) ^ V43 V43 = ((V43 << 10) | (V43 >> (32 - 10))) ^ V47 V47 = ((V47 << 1) | (V47 >> (32 - 1))) V40 ^= kRC40[r] V44 ^= kRC44[r] } } ptr = 0 } } ref.h[0][0] = V00 ref.h[0][1] = V01 ref.h[0][2] = V02 ref.h[0][3] = V03 ref.h[0][4] = V04 ref.h[0][5] = V05 ref.h[0][6] = V06 ref.h[0][7] = V07 ref.h[1][0] = V10 ref.h[1][1] = V11 ref.h[1][2] = V12 ref.h[1][3] = V13 ref.h[1][4] = V14 ref.h[1][5] = V15 ref.h[1][6] = V16 ref.h[1][7] = V17 ref.h[2][0] = V20 ref.h[2][1] = V21 ref.h[2][2] = V22 ref.h[2][3] = V23 ref.h[2][4] = V24 ref.h[2][5] = V25 ref.h[2][6] = V26 ref.h[2][7] = V27 ref.h[3][0] = V30 ref.h[3][1] = V31 ref.h[3][2] = V32 ref.h[3][3] = V33 ref.h[3][4] = V34 ref.h[3][5] = V35 ref.h[3][6] = V36 ref.h[3][7] = V37 ref.h[4][0] = V40 ref.h[4][1] = V41 ref.h[4][2] = V42 ref.h[4][3] = V43 ref.h[4][4] = V44 ref.h[4][5] = V45 ref.h[4][6] = V46 ref.h[4][7] = V47 ref.ptr = ptr return fln, nil } // Close the digest by writing the last bits and storing the hash // in dst. This prepares the digest for reuse by calling reset. A call // to Close with a dst that is smaller then HashSize will return an error. func (ref *digest) Close(dst []byte, bits uint8, bcnt uint8) error { if ln := len(dst); HashSize > ln { return fmt.Errorf("Luffa Close: dst min length: %d, got %d", HashSize, ln) } buf := ref.b[:] ptr := ref.ptr + 1 { off := uint8(0x80) >> bcnt buf[ref.ptr] = uint8((bits & -off) | off) } memset(buf[ptr:], 0) var V00, V01, V02, V03, V04, V05, V06, V07 uint32 var V10, V11, V12, V13, V14, V15, V16, V17 uint32 var V20, V21, V22, V23, V24, V25, V26, V27 uint32 var V30, V31, V32, V33, V34, V35, V36, V37 uint32 var V40, V41, V42, V43, V44, V45, V46, V47 uint32 V00 = ref.h[0][0] V01 = ref.h[0][1] V02 = ref.h[0][2] V03 = ref.h[0][3] V04 = ref.h[0][4] V05 = ref.h[0][5] V06 = ref.h[0][6] V07 = ref.h[0][7] V10 = ref.h[1][0] V11 = ref.h[1][1] V12 = ref.h[1][2] V13 = ref.h[1][3] V14 = ref.h[1][4] V15 = ref.h[1][5] V16 = ref.h[1][6] V17 = ref.h[1][7] V20 = ref.h[2][0] V21 = ref.h[2][1] V22 = ref.h[2][2] V23 = ref.h[2][3] V24 = ref.h[2][4] V25 = ref.h[2][5] V26 = ref.h[2][6] V27 = ref.h[2][7] V30 = ref.h[3][0] V31 = ref.h[3][1] V32 = ref.h[3][2] V33 = ref.h[3][3] V34 = ref.h[3][4] V35 = ref.h[3][5] V36 = ref.h[3][6] V37 = ref.h[3][7] V40 = ref.h[4][0] V41 = ref.h[4][1] V42 = ref.h[4][2] V43 = ref.h[4][3] V44 = ref.h[4][4] V45 = ref.h[4][5] V46 = ref.h[4][6] V47 = ref.h[4][7] for i := uintptr(0); i < 3; i++ { { var ts uint32 var M0, M1, M2, M3, M4, M5, M6, M7 uint32 var a0, a1, a2, a3, a4, a5, a6, a7 uint32 var b0, b1, b2, b3, b4, b5, b6, b7 uint32 M0 = decUInt32be(buf[0:]) M1 = decUInt32be(buf[4:]) M2 = decUInt32be(buf[8:]) M3 = decUInt32be(buf[12:]) M4 = decUInt32be(buf[16:]) M5 = decUInt32be(buf[20:]) M6 = decUInt32be(buf[24:]) M7 = decUInt32be(buf[28:]) a0 = V00 ^ V10 a1 = V01 ^ V11 a2 = V02 ^ V12 a3 = V03 ^ V13 a4 = V04 ^ V14 a5 = V05 ^ V15 a6 = V06 ^ V16 a7 = V07 ^ V17 b0 = V20 ^ V30 b1 = V21 ^ V31 b2 = V22 ^ V32 b3 = V23 ^ V33 b4 = V24 ^ V34 b5 = V25 ^ V35 b6 = V26 ^ V36 b7 = V27 ^ V37 a0 ^= b0 a1 ^= b1 a2 ^= b2 a3 ^= b3 a4 ^= b4 a5 ^= b5 a6 ^= b6 a7 ^= b7 a0 ^= V40 a1 ^= V41 a2 ^= V42 a3 ^= V43 a4 ^= V44 a5 ^= V45 a6 ^= V46 a7 ^= V47 ts = a7 a7 = a6 a6 = a5 a5 = a4 a4 = a3 ^ ts a3 = a2 ^ ts a2 = a1 a1 = a0 ^ ts a0 = ts V00 ^= a0 V01 ^= a1 V02 ^= a2 V03 ^= a3 V04 ^= a4 V05 ^= a5 V06 ^= a6 V07 ^= a7 V10 ^= a0 V11 ^= a1 V12 ^= a2 V13 ^= a3 V14 ^= a4 V15 ^= a5 V16 ^= a6 V17 ^= a7 V20 ^= a0 V21 ^= a1 V22 ^= a2 V23 ^= a3 V24 ^= a4 V25 ^= a5 V26 ^= a6 V27 ^= a7 V30 ^= a0 V31 ^= a1 V32 ^= a2 V33 ^= a3 V34 ^= a4 V35 ^= a5 V36 ^= a6 V37 ^= a7 V40 ^= a0 V41 ^= a1 V42 ^= a2 V43 ^= a3 V44 ^= a4 V45 ^= a5 V46 ^= a6 V47 ^= a7 ts = V07 b7 = V06 b6 = V05 b5 = V04 b4 = V03 ^ ts b3 = V02 ^ ts b2 = V01 b1 = V00 ^ ts b0 = ts b0 ^= V10 b1 ^= V11 b2 ^= V12 b3 ^= V13 b4 ^= V14 b5 ^= V15 b6 ^= V16 b7 ^= V17 ts = V17 V17 = V16 V16 = V15 V15 = V14 V14 = V13 ^ ts V13 = V12 ^ ts V12 = V11 V11 = V10 ^ ts V10 = ts V10 ^= V20 V11 ^= V21 V12 ^= V22 V13 ^= V23 V14 ^= V24 V15 ^= V25 V16 ^= V26 V17 ^= V27 ts = V27 V27 = V26 V26 = V25 V25 = V24 V24 = V23 ^ ts V23 = V22 ^ ts V22 = V21 V21 = V20 ^ ts V20 = ts V20 ^= V30 V21 ^= V31 V22 ^= V32 V23 ^= V33 V24 ^= V34 V25 ^= V35 V26 ^= V36 V27 ^= V37 ts = V37 V37 = V36 V36 = V35 V35 = V34 V34 = V33 ^ ts V33 = V32 ^ ts V32 = V31 V31 = V30 ^ ts V30 = ts V30 ^= V40 V31 ^= V41 V32 ^= V42 V33 ^= V43 V34 ^= V44 V35 ^= V45 V36 ^= V46 V37 ^= V47 ts = V47 V47 = V46 V46 = V45 V45 = V44 V44 = V43 ^ ts V43 = V42 ^ ts V42 = V41 V41 = V40 ^ ts V40 = ts V40 ^= V00 V41 ^= V01 V42 ^= V02 V43 ^= V03 V44 ^= V04 V45 ^= V05 V46 ^= V06 V47 ^= V07 ts = b7 V07 = b6 V06 = b5 V05 = b4 V04 = b3 ^ ts V03 = b2 ^ ts V02 = b1 V01 = b0 ^ ts V00 = ts V00 ^= V40 V01 ^= V41 V02 ^= V42 V03 ^= V43 V04 ^= V44 V05 ^= V45 V06 ^= V46 V07 ^= V47 ts = V47 V47 = V46 V46 = V45 V45 = V44 V44 = V43 ^ ts V43 = V42 ^ ts V42 = V41 V41 = V40 ^ ts V40 = ts V40 ^= V30 V41 ^= V31 V42 ^= V32 V43 ^= V33 V44 ^= V34 V45 ^= V35 V46 ^= V36 V47 ^= V37 ts = V37 V37 = V36 V36 = V35 V35 = V34 V34 = V33 ^ ts V33 = V32 ^ ts V32 = V31 V31 = V30 ^ ts V30 = ts V30 ^= V20 V31 ^= V21 V32 ^= V22 V33 ^= V23 V34 ^= V24 V35 ^= V25 V36 ^= V26 V37 ^= V27 ts = V27 V27 = V26 V26 = V25 V25 = V24 V24 = V23 ^ ts V23 = V22 ^ ts V22 = V21 V21 = V20 ^ ts V20 = ts V20 ^= V10 V21 ^= V11 V22 ^= V12 V23 ^= V13 V24 ^= V14 V25 ^= V15 V26 ^= V16 V27 ^= V17 ts = V17 V17 = V16 V16 = V15 V15 = V14 V14 = V13 ^ ts V13 = V12 ^ ts V12 = V11 V11 = V10 ^ ts V10 = ts V10 ^= b0 V11 ^= b1 V12 ^= b2 V13 ^= b3 V14 ^= b4 V15 ^= b5 V16 ^= b6 V17 ^= b7 V00 ^= M0 V01 ^= M1 V02 ^= M2 V03 ^= M3 V04 ^= M4 V05 ^= M5 V06 ^= M6 V07 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V10 ^= M0 V11 ^= M1 V12 ^= M2 V13 ^= M3 V14 ^= M4 V15 ^= M5 V16 ^= M6 V17 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V20 ^= M0 V21 ^= M1 V22 ^= M2 V23 ^= M3 V24 ^= M4 V25 ^= M5 V26 ^= M6 V27 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V30 ^= M0 V31 ^= M1 V32 ^= M2 V33 ^= M3 V34 ^= M4 V35 ^= M5 V36 ^= M6 V37 ^= M7 ts = M7 M7 = M6 M6 = M5 M5 = M4 M4 = M3 ^ ts M3 = M2 ^ ts M2 = M1 M1 = M0 ^ ts M0 = ts V40 ^= M0 V41 ^= M1 V42 ^= M2 V43 ^= M3 V44 ^= M4 V45 ^= M5 V46 ^= M6 V47 ^= M7 } { var ul, uh, vl, vh, tws uint32 var W0, W1, W2, W3, W4, W5, W6, W7, tw uint64 V14 = ((V14 << 1) | (V14 >> (32 - 1))) V15 = ((V15 << 1) | (V15 >> (32 - 1))) V16 = ((V16 << 1) | (V16 >> (32 - 1))) V17 = ((V17 << 1) | (V17 >> (32 - 1))) V24 = ((V24 << 2) | (V24 >> (32 - 2))) V25 = ((V25 << 2) | (V25 >> (32 - 2))) V26 = ((V26 << 2) | (V26 >> (32 - 2))) V27 = ((V27 << 2) | (V27 >> (32 - 2))) V34 = ((V34 << 3) | (V34 >> (32 - 3))) V35 = ((V35 << 3) | (V35 >> (32 - 3))) V36 = ((V36 << 3) | (V36 >> (32 - 3))) V37 = ((V37 << 3) | (V37 >> (32 - 3))) V44 = ((V44 << 4) | (V44 >> (32 - 4))) V45 = ((V45 << 4) | (V45 >> (32 - 4))) V46 = ((V46 << 4) | (V46 >> (32 - 4))) V47 = ((V47 << 4) | (V47 >> (32 - 4))) W0 = uint64(V00) | (uint64(V10) << 32) W1 = uint64(V01) | (uint64(V11) << 32) W2 = uint64(V02) | (uint64(V12) << 32) W3 = uint64(V03) | (uint64(V13) << 32) W4 = uint64(V04) | (uint64(V14) << 32) W5 = uint64(V05) | (uint64(V15) << 32) W6 = uint64(V06) | (uint64(V16) << 32) W7 = uint64(V07) | (uint64(V17) << 32) for r := uintptr(0); r < 8; r++ { tw = W0 W0 |= W1 W2 ^= W3 W1 = ^W1 W0 ^= W3 W3 &= tw W1 ^= W3 W3 ^= W2 W2 &= W0 W0 = ^W0 W2 ^= W1 W1 |= W3 tw ^= W1 W3 ^= W2 W2 &= W1 W1 ^= W0 W0 = tw tw = W5 W5 |= W6 W7 ^= W4 W6 = ^W6 W5 ^= W4 W4 &= tw W6 ^= W4 W4 ^= W7 W7 &= W5 W5 = ^W5 W7 ^= W6 W6 |= W4 tw ^= W6 W4 ^= W7 W7 &= W6 W6 ^= W5 W5 = tw W4 ^= W0 ul = uint32(W0) uh = uint32((W0 >> 32)) vl = uint32(W4) vh = uint32((W4 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W0 = uint64(ul) | (uint64(uh) << 32) W4 = uint64(vl) | (uint64(vh) << 32) W5 ^= W1 ul = uint32(W1) uh = uint32((W1 >> 32)) vl = uint32(W5) vh = uint32((W5 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W1 = uint64(ul) | (uint64(uh) << 32) W5 = uint64(vl) | (uint64(vh) << 32) W6 ^= W2 ul = uint32(W2) uh = uint32((W2 >> 32)) vl = uint32(W6) vh = uint32((W6 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W2 = uint64(ul) | (uint64(uh) << 32) W6 = uint64(vl) | (uint64(vh) << 32) W7 ^= W3 ul = uint32(W3) uh = uint32((W3 >> 32)) vl = uint32(W7) vh = uint32((W7 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W3 = uint64(ul) | (uint64(uh) << 32) W7 = uint64(vl) | (uint64(vh) << 32) W0 ^= kRCW010[r] W4 ^= kRCW014[r] } V00 = uint32(W0) V10 = uint32((W0 >> 32)) V01 = uint32(W1) V11 = uint32((W1 >> 32)) V02 = uint32(W2) V12 = uint32((W2 >> 32)) V03 = uint32(W3) V13 = uint32((W3 >> 32)) V04 = uint32(W4) V14 = uint32((W4 >> 32)) V05 = uint32(W5) V15 = uint32((W5 >> 32)) V06 = uint32(W6) V16 = uint32((W6 >> 32)) V07 = uint32(W7) V17 = uint32((W7 >> 32)) W0 = uint64(V20) | (uint64(V30) << 32) W1 = uint64(V21) | (uint64(V31) << 32) W2 = uint64(V22) | (uint64(V32) << 32) W3 = uint64(V23) | (uint64(V33) << 32) W4 = uint64(V24) | (uint64(V34) << 32) W5 = uint64(V25) | (uint64(V35) << 32) W6 = uint64(V26) | (uint64(V36) << 32) W7 = uint64(V27) | (uint64(V37) << 32) for r := uintptr(0); r < 8; r++ { tw = W0 W0 |= W1 W2 ^= W3 W1 = ^W1 W0 ^= W3 W3 &= tw W1 ^= W3 W3 ^= W2 W2 &= W0 W0 = ^W0 W2 ^= W1 W1 |= W3 tw ^= W1 W3 ^= W2 W2 &= W1 W1 ^= W0 W0 = tw tw = W5 W5 |= W6 W7 ^= W4 W6 = ^W6 W5 ^= W4 W4 &= tw W6 ^= W4 W4 ^= W7 W7 &= W5 W5 = ^W5 W7 ^= W6 W6 |= W4 tw ^= W6 W4 ^= W7 W7 &= W6 W6 ^= W5 W5 = tw W4 ^= W0 ul = uint32(W0) uh = uint32((W0 >> 32)) vl = uint32(W4) vh = uint32((W4 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W0 = uint64(ul) | (uint64(uh) << 32) W4 = uint64(vl) | (uint64(vh) << 32) W5 ^= W1 ul = uint32(W1) uh = uint32((W1 >> 32)) vl = uint32(W5) vh = uint32((W5 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W1 = uint64(ul) | (uint64(uh) << 32) W5 = uint64(vl) | (uint64(vh) << 32) W6 ^= W2 ul = uint32(W2) uh = uint32((W2 >> 32)) vl = uint32(W6) vh = uint32((W6 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W2 = uint64(ul) | (uint64(uh) << 32) W6 = uint64(vl) | (uint64(vh) << 32) W7 ^= W3 ul = uint32(W3) uh = uint32((W3 >> 32)) vl = uint32(W7) vh = uint32((W7 >> 32)) ul = ((ul << 2) | (ul >> (32 - 2))) ^ vl vl = ((vl << 14) | (vl >> (32 - 14))) ^ ul ul = ((ul << 10) | (ul >> (32 - 10))) ^ vl vl = ((vl << 1) | (vl >> (32 - 1))) uh = ((uh << 2) | (uh >> (32 - 2))) ^ vh vh = ((vh << 14) | (vh >> (32 - 14))) ^ uh uh = ((uh << 10) | (uh >> (32 - 10))) ^ vh vh = ((vh << 1) | (vh >> (32 - 1))) W3 = uint64(ul) | (uint64(uh) << 32) W7 = uint64(vl) | (uint64(vh) << 32) W0 ^= kRCW230[r] W4 ^= kRCW234[r] } V20 = uint32(W0) V30 = uint32((W0 >> 32)) V21 = uint32(W1) V31 = uint32((W1 >> 32)) V22 = uint32(W2) V32 = uint32((W2 >> 32)) V23 = uint32(W3) V33 = uint32((W3 >> 32)) V24 = uint32(W4) V34 = uint32((W4 >> 32)) V25 = uint32(W5) V35 = uint32((W5 >> 32)) V26 = uint32(W6) V36 = uint32((W6 >> 32)) V27 = uint32(W7) V37 = uint32((W7 >> 32)) for r := uintptr(0); r < 8; r++ { tws = V40 V40 |= V41 V42 ^= V43 V41 = ^V41 V40 ^= V43 V43 &= tws V41 ^= V43 V43 ^= V42 V42 &= V40 V40 = ^V40 V42 ^= V41 V41 |= V43 tws ^= V41 V43 ^= V42 V42 &= V41 V41 ^= V40 V40 = tws tws = V45 V45 |= V46 V47 ^= V44 V46 = ^V46 V45 ^= V44 V44 &= tws V46 ^= V44 V44 ^= V47 V47 &= V45 V45 = ^V45 V47 ^= V46 V46 |= V44 tws ^= V46 V44 ^= V47 V47 &= V46 V46 ^= V45 V45 = tws V44 ^= V40 V40 = ((V40 << 2) | (V40 >> (32 - 2))) ^ V44 V44 = ((V44 << 14) | (V44 >> (32 - 14))) ^ V40 V40 = ((V40 << 10) | (V40 >> (32 - 10))) ^ V44 V44 = ((V44 << 1) | (V44 >> (32 - 1))) V45 ^= V41 V41 = ((V41 << 2) | (V41 >> (32 - 2))) ^ V45 V45 = ((V45 << 14) | (V45 >> (32 - 14))) ^ V41 V41 = ((V41 << 10) | (V41 >> (32 - 10))) ^ V45 V45 = ((V45 << 1) | (V45 >> (32 - 1))) V46 ^= V42 V42 = ((V42 << 2) | (V42 >> (32 - 2))) ^ V46 V46 = ((V46 << 14) | (V46 >> (32 - 14))) ^ V42 V42 = ((V42 << 10) | (V42 >> (32 - 10))) ^ V46 V46 = ((V46 << 1) | (V46 >> (32 - 1))) V47 ^= V43 V43 = ((V43 << 2) | (V43 >> (32 - 2))) ^ V47 V47 = ((V47 << 14) | (V47 >> (32 - 14))) ^ V43 V43 = ((V43 << 10) | (V43 >> (32 - 10))) ^ V47 V47 = ((V47 << 1) | (V47 >> (32 - 1))) V40 ^= kRC40[r] V44 ^= kRC44[r] } } switch i { case 0: memset(buf[:], 0) break case 1: encUInt32be(dst[0:], V00^V10^V20^V30^V40) encUInt32be(dst[4:], V01^V11^V21^V31^V41) encUInt32be(dst[8:], V02^V12^V22^V32^V42) encUInt32be(dst[12:], V03^V13^V23^V33^V43) encUInt32be(dst[16:], V04^V14^V24^V34^V44) encUInt32be(dst[20:], V05^V15^V25^V35^V45) encUInt32be(dst[24:], V06^V16^V26^V36^V46) encUInt32be(dst[28:], V07^V17^V27^V37^V47) break case 2: encUInt32be(dst[32:], V00^V10^V20^V30^V40) encUInt32be(dst[36:], V01^V11^V21^V31^V41) encUInt32be(dst[40:], V02^V12^V22^V32^V42) encUInt32be(dst[44:], V03^V13^V23^V33^V43) encUInt32be(dst[48:], V04^V14^V24^V34^V44) encUInt32be(dst[52:], V05^V15^V25^V35^V45) encUInt32be(dst[56:], V06^V16^V26^V36^V46) encUInt32be(dst[60:], V07^V17^V27^V37^V47) break } } ref.Reset() return nil } // Size returns the number of bytes required to store the hash. func (*digest) Size() int { return HashSize } // BlockSize returns the block size of the hash. func (*digest) BlockSize() int { return int(BlockSize) } //////////////// func memset(dst []byte, src byte) { for i := range dst { dst[i] = src } } func decUInt32be(src []byte) uint32 { return (uint32(src[0])<<24 | uint32(src[1])<<16 | uint32(src[2])<<8 | uint32(src[3])) } func encUInt32be(dst []byte, src uint32) { dst[0] = uint8(src >> 24) dst[1] = uint8(src >> 16) dst[2] = uint8(src >> 8) dst[3] = uint8(src) } //////////////// var kInit = [5][8]uint32{ { uint32(0x6d251e69), uint32(0x44b051e0), uint32(0x4eaa6fb4), uint32(0xdbf78465), uint32(0x6e292011), uint32(0x90152df4), uint32(0xee058139), uint32(0xdef610bb), }, { uint32(0xc3b44b95), uint32(0xd9d2f256), uint32(0x70eee9a0), uint32(0xde099fa3), uint32(0x5d9b0557), uint32(0x8fc944b3), uint32(0xcf1ccf0e), uint32(0x746cd581), }, { uint32(0xf7efc89d), uint32(0x5dba5781), uint32(0x04016ce5), uint32(0xad659c05), uint32(0x0306194f), uint32(0x666d1836), uint32(0x24aa230a), uint32(0x8b264ae7), }, { uint32(0x858075d5), uint32(0x36d79cce), uint32(0xe571f7d7), uint32(0x204b1f67), uint32(0x35870c6a), uint32(0x57e9e923), uint32(0x14bcb808), uint32(0x7cde72ce), }, { uint32(0x6c68e9be), uint32(0x5ec41e22), uint32(0xc825b7c7), uint32(0xaffb4363), uint32(0xf5df3999), uint32(0x0fc688f1), uint32(0xb07224cc), uint32(0x03e86cea), }, } var kRC40 = [8]uint32{ uint32(0xf0d2e9e3), uint32(0xac11d7fa), uint32(0x1bcb66f2), uint32(0x6f2d9bc9), uint32(0x78602649), uint32(0x8edae952), uint32(0x3b6ba548), uint32(0xedae9520), } var kRC44 = [8]uint32{ uint32(0x5090d577), uint32(0x2d1925ab), uint32(0xb46496ac), uint32(0xd1925ab0), uint32(0x29131ab6), uint32(0x0fc053c3), uint32(0x3f014f0c), uint32(0xfc053c31), } var kRCW010 = [8]uint64{ uint64(0xb6de10ed303994a6), uint64(0x70f47aaec0e65299), uint64(0x0707a3d46cc33a12), uint64(0x1c1e8f51dc56983e), uint64(0x707a3d451e00108f), uint64(0xaeb285627800423d), uint64(0xbaca15898f5b7882), uint64(0x40a46f3e96e1db12), } var kRCW014 = [8]uint64{ uint64(0x01685f3de0337818), uint64(0x05a17cf4441ba90d), uint64(0xbd09caca7f34d442), uint64(0xf4272b289389217f), uint64(0x144ae5cce5a8bce6), uint64(0xfaa7ae2b5274baf4), uint64(0x2e48f1c126889ba7), uint64(0xb923c7049a226e9d), } var kRCW230 = [8]uint64{ uint64(0xb213afa5fc20d9d2), uint64(0xc84ebe9534552e25), uint64(0x4e608a227ad8818f), uint64(0x56d858fe8438764a), uint64(0x343b138fbb6de032), uint64(0xd0ec4e3dedb780c8), uint64(0x2ceb4882d9847356), uint64(0xb3ad2208a2c78434), } var kRCW234 = [8]uint64{ uint64(0xe028c9bfe25e72c1), uint64(0x44756f91e623bb72), uint64(0x7e8fce325c58a4a4), uint64(0x956548be1e38e2e7), uint64(0xfe191be278e38b9d), uint64(0x3cb226e527586719), uint64(0x5944a28e36eda57f), uint64(0xa1c4c355703aace7), }