2022-11-22 11:02:37 +08:00
|
|
|
//go:build (amd64 && !purego) || (arm64 && !purego)
|
2022-07-15 16:42:39 +08:00
|
|
|
|
|
|
|
package zuc
|
|
|
|
|
|
|
|
import "golang.org/x/sys/cpu"
|
|
|
|
|
2023-09-07 08:50:10 +08:00
|
|
|
var supportsAES = cpu.X86.HasAES || cpu.ARM64.HasAES
|
|
|
|
var useAVX = cpu.X86.HasAVX
|
2022-07-15 16:42:39 +08:00
|
|
|
var supportsGFMUL = cpu.X86.HasPCLMULQDQ || cpu.ARM64.HasPMULL
|
|
|
|
|
|
|
|
//go:noescape
|
|
|
|
func eia3Round16B(t *uint32, keyStream *uint32, p *byte, tagSize int)
|
|
|
|
|
|
|
|
func block(m *ZUC128Mac, p []byte) {
|
|
|
|
if supportsGFMUL {
|
|
|
|
for len(p) >= chunk {
|
|
|
|
m.genKeywords(m.k0[4:])
|
|
|
|
eia3Round16B(&m.t, &m.k0[0], &p[0], m.tagSize)
|
|
|
|
p = p[chunk:]
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
blockGeneric(m, p)
|
|
|
|
}
|
|
|
|
}
|