gmsm/sm4/ecb_cipher_asm.go
2024-03-05 09:47:49 +08:00

65 lines
1.2 KiB
Go

//go:build (amd64 || arm64) && !purego
package sm4
import (
"crypto/cipher"
"github.com/emmansun/gmsm/internal/alias"
)
// Assert that sm4CipherAsm implements the ecbEncAble and ecbDecAble interfaces.
var _ ecbEncAble = (*sm4CipherAsm)(nil)
var _ ecbDecAble = (*sm4CipherAsm)(nil)
const ecbEncrypt = 1
const ecbDecrypt = 0
type ecb struct {
b *sm4CipherAsm
enc int
}
func (x *ecb) validate(dst, src []byte) {
if len(src)%BlockSize != 0 {
panic("cipher: input not full blocks")
}
if len(dst) < len(src) {
panic("cipher: output smaller than input")
}
if alias.InexactOverlap(dst[:len(src)], src) {
panic("cipher: invalid buffer overlap")
}
}
func (b *sm4CipherAsm) NewECBEncrypter() cipher.BlockMode {
var c ecb
c.b = b
c.enc = ecbEncrypt
return &c
}
func (b *sm4CipherAsm) NewECBDecrypter() cipher.BlockMode {
var c ecb
c.b = b
c.enc = ecbDecrypt
return &c
}
func (x *ecb) BlockSize() int { return BlockSize }
//go:noescape
func encryptSm4Ecb(xk *uint32, dst, src []byte)
func (x *ecb) CryptBlocks(dst, src []byte) {
x.validate(dst, src)
if len(src) == 0 {
return
}
xk := &x.b.enc[0]
if x.enc == ecbDecrypt {
xk = &x.b.dec[0]
}
encryptSm4Ecb(xk, dst, src)
}