//go:build (amd64 && !generic) || (arm64 && !generic) // +build amd64,!generic arm64,!generic package sm4 import ( "crypto/cipher" "github.com/emmansun/gmsm/internal/subtle" ) type sm4CipherNI struct { sm4Cipher } func newCipherNI(key []byte) (cipher.Block, error) { c := &sm4CipherNI{sm4Cipher{make([]uint32, rounds), make([]uint32, rounds)}} expandKeyAsm(&key[0], &ck[0], &c.enc[0], &c.dec[0], INST_SM4) if supportsGFMUL { return &sm4CipherNIGCM{c}, nil } return c, nil } func (c *sm4CipherNI) Encrypt(dst, src []byte) { if len(src) < BlockSize { panic("sm4: input not full block") } if len(dst) < BlockSize { panic("sm4: output not full block") } if subtle.InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("sm4: invalid buffer overlap") } encryptBlockAsm(&c.enc[0], &dst[0], &src[0], INST_SM4) } func (c *sm4CipherNI) Decrypt(dst, src []byte) { if len(src) < BlockSize { panic("sm4: input not full block") } if len(dst) < BlockSize { panic("sm4: output not full block") } if subtle.InexactOverlap(dst[:BlockSize], src[:BlockSize]) { panic("sm4: invalid buffer overlap") } encryptBlockAsm(&c.dec[0], &dst[0], &src[0], INST_SM4) }