diff --git a/internal/cpuid/cpuid_amd64.go b/internal/cpuid/cpuid_amd64.go new file mode 100644 index 0000000..74bac09 --- /dev/null +++ b/internal/cpuid/cpuid_amd64.go @@ -0,0 +1,6 @@ +package cpuid + +import "golang.org/x/sys/cpu" + +var HasAES = cpu.X86.HasAES +var HasGFMUL = cpu.X86.HasPCLMULQDQ diff --git a/internal/cpuid/cpuid_arm64.go b/internal/cpuid/cpuid_arm64.go new file mode 100644 index 0000000..bb7fd87 --- /dev/null +++ b/internal/cpuid/cpuid_arm64.go @@ -0,0 +1,6 @@ +package cpuid + +import "golang.org/x/sys/cpu" + +var HasAES = cpu.ARM64.HasAES +var HasGFMUL = cpu.ARM64.HasPMULL diff --git a/internal/cpuid/cpuid_arm64_darwin.go b/internal/cpuid/cpuid_arm64_darwin.go new file mode 100644 index 0000000..4ffbb53 --- /dev/null +++ b/internal/cpuid/cpuid_arm64_darwin.go @@ -0,0 +1,10 @@ +//go:build arm64 && darwin && !ios + +package cpuid + +// There are no hw.optional sysctl values for the below features on Mac OS 11.0 +// to detect their supported state dynamically. Assume the CPU features that +// Apple Silicon M1 supports to be available as a minimal set of features +// to all Go programs running on darwin/arm64. +var HasAES = true +var HasGFMUL = true diff --git a/sm4/cipher_asm.go b/sm4/cipher_asm.go index d701885..55877bf 100644 --- a/sm4/cipher_asm.go +++ b/sm4/cipher_asm.go @@ -7,12 +7,13 @@ import ( "os" "github.com/emmansun/gmsm/internal/alias" + "github.com/emmansun/gmsm/internal/cpuid" "golang.org/x/sys/cpu" ) var supportSM4 = cpu.ARM64.HasSM4 && os.Getenv("DISABLE_SM4NI") != "1" -var supportsAES = cpu.X86.HasAES || cpu.ARM64.HasAES -var supportsGFMUL = cpu.X86.HasPCLMULQDQ || cpu.ARM64.HasPMULL +var supportsAES = cpuid.HasAES +var supportsGFMUL = cpuid.HasGFMUL var useAVX2 = cpu.X86.HasAVX2 var useAVX = cpu.X86.HasAVX diff --git a/zuc/eia_asm.go b/zuc/eia_asm.go index 33cef7e..d525760 100644 --- a/zuc/eia_asm.go +++ b/zuc/eia_asm.go @@ -2,11 +2,14 @@ package zuc -import "golang.org/x/sys/cpu" +import ( + "github.com/emmansun/gmsm/internal/cpuid" + "golang.org/x/sys/cpu" +) -var supportsAES = cpu.X86.HasAES || cpu.ARM64.HasAES +var supportsAES = cpuid.HasAES +var supportsGFMUL = cpuid.HasGFMUL var useAVX = cpu.X86.HasAVX -var supportsGFMUL = cpu.X86.HasPCLMULQDQ || cpu.ARM64.HasPMULL //go:noescape func eia3Round16B(t *uint32, keyStream *uint32, p *byte, tagSize int)