2023-09-07 16:27:58 +08:00
|
|
|
//go:build (amd64 && !purego) || (arm64 && !purego)
|
|
|
|
// +build amd64,!purego arm64,!purego
|
2022-07-15 16:42:39 +08:00
|
|
|
|
|
|
|
package zuc
|
|
|
|
|
|
|
|
import (
|
2022-08-18 14:49:35 +08:00
|
|
|
"github.com/emmansun/gmsm/internal/subtle"
|
2022-07-15 16:42:39 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
//go:noescape
|
|
|
|
func genKeyStreamRev32Asm(keyStream []byte, pState *zucState32)
|
|
|
|
|
|
|
|
func xorKeyStream(c *zucState32, dst, src []byte) {
|
|
|
|
if supportsAES {
|
|
|
|
words := len(src) / 4
|
|
|
|
// handle complete words first
|
|
|
|
if words > 0 {
|
|
|
|
dstWords := dst[:words*4]
|
|
|
|
genKeyStreamRev32Asm(dstWords, c)
|
2022-08-18 14:49:35 +08:00
|
|
|
subtle.XORBytes(dst, src, dstWords)
|
2022-07-15 16:42:39 +08:00
|
|
|
}
|
|
|
|
// handle remain bytes
|
|
|
|
if words*4 < len(src) {
|
|
|
|
var singleWord [4]byte
|
|
|
|
genKeyStreamRev32Asm(singleWord[:], c)
|
2022-08-18 14:49:35 +08:00
|
|
|
subtle.XORBytes(dst[words*4:], src[words*4:], singleWord[:])
|
2022-07-15 16:42:39 +08:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
xorKeyStreamGeneric(c, dst, src)
|
|
|
|
}
|
|
|
|
}
|