-func g(n uint64, hsh, data *[BlockSize]byte) *[BlockSize]byte {
- ns := make([]byte, 8)
- binary.LittleEndian.PutUint64(ns, n)
- r := new([BlockSize]byte)
- for i := 0; i < 8; i++ {
- r[i] = hsh[i] ^ ns[i]
- }
- copy(r[8:], hsh[8:])
- return blockXor(blockXor(e(l(ps(r)), data), hsh), data)
+func (h *Hash) g(n uint64, hsh, data []byte) []byte {
+ r := make([]byte, BlockSize)
+ copy(r, hsh)
+ r[0] ^= byte((n >> 0) & 0xFF)
+ r[1] ^= byte((n >> 8) & 0xFF)
+ r[2] ^= byte((n >> 16) & 0xFF)
+ r[3] ^= byte((n >> 24) & 0xFF)
+ r[4] ^= byte((n >> 32) & 0xFF)
+ r[5] ^= byte((n >> 40) & 0xFF)
+ r[6] ^= byte((n >> 48) & 0xFF)
+ r[7] ^= byte((n >> 56) & 0xFF)
+ return blockXor(h.gBuf, blockXor(h.gBuf, h.e(l(r, h.ps(r)), data), hsh), data)