gmsm/sm4/sm4ni_xts.go

57 lines
1.3 KiB
Go
Raw Normal View History

2023-08-25 13:13:43 +08:00
//go:build (amd64 && !purego) || (arm64 && !purego)
// +build amd64,!purego arm64,!purego
package sm4
import (
"crypto/cipher"
)
// Assert that sm4CipherAsm implements the xtsEncAble and xtsDecAble interfaces.
var _ xtsEncAble = (*sm4CipherNI)(nil)
var _ xtsDecAble = (*sm4CipherNI)(nil)
type xtsNI struct {
b *sm4CipherNI
tweak [BlockSize]byte
isGB bool // if true, follows GB/T 17964-2021
enc int
}
func (b *sm4CipherNI) NewXTSEncrypter(encryptedTweak *[BlockSize]byte, isGB bool) cipher.BlockMode {
var c xtsNI
c.b = b
c.enc = xtsEncrypt
c.isGB = isGB
copy(c.tweak[:], encryptedTweak[:])
return &c
}
func (b *sm4CipherNI) NewXTSDecrypter(encryptedTweak *[BlockSize]byte, isGB bool) cipher.BlockMode {
var c xtsNI
c.b = b
c.enc = xtsDecrypt
c.isGB = isGB
copy(c.tweak[:], encryptedTweak[:])
return &c
}
func (x *xtsNI) BlockSize() int { return BlockSize }
func (x *xtsNI) CryptBlocks(dst, src []byte) {
validateXtsInput(dst, src)
if x.enc == xtsEncrypt {
if x.isGB {
encryptSm4XtsGB(&x.b.enc[0], &x.tweak, dst, src)
} else {
encryptSm4Xts(&x.b.enc[0], &x.tweak, dst, src)
}
} else {
if x.isGB {
decryptSm4XtsGB(&x.b.dec[0], &x.tweak, dst, src)
} else {
decryptSm4Xts(&x.b.dec[0], &x.tweak, dst, src)
}
}
}