func GfnDouble(input []byte) []byte
GfnDouble computes 2 * input in the field of 2^n elements. The irreducible polynomial in the finite field for n=128 is x^128 + x^7 + x^2 + x + 1 (equals 0x87) Constant-time execution in order to avoid side-channel attacks
func RightXor(X, Y []byte) []byte
RightXor XORs smaller input (assumed Y) at the right of the larger input (assumed X)
func ShiftBytesLeft(x []byte) []byte
ShiftBytesLeft outputs the byte array corresponding to x << 1 in binary.
func ShiftNBytesLeft(dst, x []byte, n int)
ShiftNBytesLeft puts in dst the byte array corresponding to x << n in binary.
func SliceForAppend(in []byte, n int) (head, tail []byte)
SliceForAppend takes a slice and a requested number of bytes. It returns a slice with the contents of the given slice followed by that many bytes and a second slice that aliases into it and contains only the extra bytes. If the original slice has sufficient capacity then no allocation is performed.
func XorBytes(Z, X, Y []byte)
XorBytes assumes equal input length, puts X XOR Y into Z
func XorBytesMut(X, Y []byte)
XorBytesMut assumes equal input length, replaces X with X XOR Y