func (c *sm4CipherAsm) NewGCM(nonceSize, tagSize int) (cipher.AEAD, error) {
	var key [gcmBlockSize]byte
	c.Encrypt(key[:], key[:])
	g := &gcm{cipher: c, nonceSize: nonceSize, tagSize: tagSize}
	x := gcmFieldElement{
		binary.BigEndian.Uint64(key[:8]),
		binary.BigEndian.Uint64(key[8:]),
	}
	g.productTable[reverseBits(1)] = x
	for i := 2; i < 16; i += 2 {
		g.productTable[reverseBits(i)] = gcmDouble(&g.productTable[reverseBits(i/2)])
		g.productTable[reverseBits(i+1)] = gcmAdd(&g.productTable[reverseBits(i)], &x)
	}
	return g, nil
}
NewGCM returns the SM4 cipher wrapped in Galois Counter Mode. This is only
called by crypto/cipher.NewGCM via the gcmAble interface.
package sm4
import (
	"crypto/cipher"
	goSubtle "crypto/subtle"
	"encoding/binary"
	"errors"
	"github.com/emmansun/gmsm/internal/subtle"
	"github.com/emmansun/gmsm/internal/xor"
)
var _ gcmAble = (*sm4CipherAsm)(nil)