1+ diff --git a/CMakeLists.txt b/CMakeLists.txt
2+ index b8a895a..cbd7a95 100644
3+ --- a/CMakeLists.txt
4+ +++ b/CMakeLists.txt
5+ @@ -84,6 +84,32 @@ if(CPU_X86_64)
6+ set(CMAKE_ASM_NASM_FLAGS "-f elf64 -D LINUX")
7+ endif()
8+ set(USE_NASM ON)
9+ +
10+ + set(NASM_VERSION_REQUIRED "2.14.01")
11+ + set(NASM_VERSION_SHA512NI "2.16.02")
12+ + set(NASM_KNOWS_SHA512NI OFF)
13+ +
14+ + execute_process(
15+ + COMMAND "${CMAKE_ASM_NASM_COMPILER}" -v
16+ + OUTPUT_VARIABLE NASM_VERSION_OUTPUT
17+ + OUTPUT_STRIP_TRAILING_WHITESPACE
18+ + )
19+ + string(REGEX MATCH "NASM version ([0-9]+\\.[0-9]+(\\.[0-9]+)?)" NASM_VERSION
20+ + "${NASM_VERSION_OUTPUT}")
21+ + if(NASM_VERSION)
22+ + if(${CMAKE_MATCH_1} VERSION_LESS ${NASM_VERSION_REQUIRED})
23+ + message(FATAL_ERROR "NASM version must be at least ${NASM_VERSION_REQUIRED}!")
24+ + endif()
25+ + message(STATUS "NASM version: ${CMAKE_MATCH_1}")
26+ + if(${CMAKE_MATCH_1} VERSION_LESS ${NASM_VERSION_SHA512NI})
27+ + message(NOTICE "Minimum required NASM version for SHA512-NI: ${NASM_VERSION_SHA512NI}. SHA512-NI code not compiled - update NASM.")
28+ + else()
29+ + set(NASM_KNOWS_SHA512NI ON)
30+ + endif()
31+ + else()
32+ + message(WARNING "Could not parse NASM version string: ${NASM_VERSION_OUTPUT}.\nPlease, be sure that ${CMAKE_ASM_NASM_COMPILER} version is >= ${NASM_VERSION_REQUIRED}")
33+ + endif()
34+ +
35+ elseif(CPU_AARCH64 OR CPU_RISCV64)
36+ # Configure ASM for ARM and RISC-V (uses GAS with .S files)
37+ set(CMAKE_ASM_FLAGS "${CMAKE_C_FLAGS} -D__ASSEMBLY__")
38+ @@ -138,6 +164,11 @@ if(FIPS_MODE)
39+ endif()
40+ endif()
41+
42+ + if(NASM_KNOWS_SHA512NI)
43+ + add_compile_definitions(HAVE_AS_KNOWS_SHA512NI)
44+ + set(CMAKE_ASM_NASM_FLAGS "${CMAKE_ASM_NASM_FLAGS} -DHAVE_AS_KNOWS_SHA512NI")
45+ + endif()
46+ +
47+ # Library version (semantic versioning)
48+ set(LIBISAL_CRYPTO_CURRENT 2)
49+ set(LIBISAL_CRYPTO_REVISION 25)
50+ @@ -351,5 +382,6 @@ message(STATUS " Build perf apps: ${BUILD_PERF}")
51+ message(STATUS " Safe data: ${SAFE_DATA}")
52+ message(STATUS " Safe param: ${SAFE_PARAM}")
53+ message(STATUS " FIPS mode: ${FIPS_MODE}")
54+ + message(STATUS " SHA512-NI support: ${NASM_KNOWS_SHA512NI}")
55+ message(STATUS " Install prefix: ${CMAKE_INSTALL_PREFIX}")
56+ message(STATUS "")
57+ diff --git a/configure.ac b/configure.ac
58+ index f3ed13a..28519c5 100644
59+ --- a/configure.ac
60+ +++ b/configure.ac
61+ @@ -202,10 +202,14 @@ int main(int argc, char **argv)
62+ fi
63+ fi
64+
65+ - AC_MSG_CHECKING([for optional nasm SHA512-NI support])
66+ - AC_LANG_CONFTEST([AC_LANG_SOURCE([[vsha512rnds2 ymm2, ymm1, xmm0;]])])
67+ - sed -i -e '/vsha512rnds2/!d' conftest.c
68+ - if nasm -f elf64 conftest.c 2> /dev/null; then
69+ + AC_MSG_CHECKING([for optional nasm SHA512-NI support (NASM >= 2.16.02)])
70+ + nasm_ver=$(nasm -v 2>/dev/null | cut -d " " -f 3)
71+ + nasm_major=$(echo "$nasm_ver" | cut -d "." -f 1)
72+ + nasm_minor=$(echo "$nasm_ver" | cut -d "." -f 2 | cut -c 1-2)
73+ + nasm_rev=$(echo "$nasm_ver" | cut -d "." -f 3 | cut -c 1-2)
74+ + nasm_numeric=$(expr ${nasm_major:-0} \* 10000 + ${nasm_minor:-0} \* 100 + ${nasm_rev:-0})
75+ + nasm_min_sha512ni=$(expr 2 \* 10000 + 16 \* 100 + 2)
76+ + if test $nasm_numeric -ge $nasm_min_sha512ni; then
77+ AC_MSG_RESULT([yes])
78+ as_knows_sha512ni=yes
79+ else
80+ @@ -259,10 +263,14 @@ int main(int argc, char **argv)
81+ fi
82+ fi
83+
84+ - AC_MSG_CHECKING([for optional nasm SHA512-NI support])
85+ - AC_LANG_CONFTEST([AC_LANG_SOURCE([[vsha512rnds2 ymm2, ymm1, xmm0;]])])
86+ - sed -i -e '/vsha512rnds2/!d' conftest.c
87+ - if $AS -f elf64 conftest.c 2> /dev/null; then
88+ + AC_MSG_CHECKING([for optional nasm SHA512-NI support (NASM >= 2.16.02)])
89+ + nasm_ver=$(nasm -v 2>/dev/null | cut -d " " -f 3)
90+ + nasm_major=$(echo "$nasm_ver" | cut -d "." -f 1)
91+ + nasm_minor=$(echo "$nasm_ver" | cut -d "." -f 2 | cut -c 1-2)
92+ + nasm_rev=$(echo "$nasm_ver" | cut -d "." -f 3 | cut -c 1-2)
93+ + nasm_numeric=$(expr ${nasm_major:-0} \* 10000 + ${nasm_minor:-0} \* 100 + ${nasm_rev:-0})
94+ + nasm_min_sha512ni=$(expr 2 \* 10000 + 16 \* 100 + 2)
95+ + if test $nasm_numeric -ge $nasm_min_sha512ni; then
96+ AC_MSG_RESULT([yes])
97+ as_knows_sha512ni=yes
98+ else
99+ @@ -271,7 +279,8 @@ int main(int argc, char **argv)
100+
101+ fi
102+
103+ - if test $as_feature_level -lt 10 ; then
104+ + nasm_min_req=$(expr 2 \* 10000 + 14 \* 100 + 1)
105+ + if test $nasm_numeric -lt $nasm_min_req ; then
106+ AC_MSG_ERROR([No modern nasm found as required. Nasm should be v2.14.01 or later.])
107+ fi
108+
109+ diff --git a/make.inc b/make.inc
110+ index 1317e9a..780ec30 100644
111+ --- a/make.inc
112+ +++ b/make.inc
113+ @@ -131,6 +131,55 @@ CFLAGS += -DFIPS_MODE
114+ ASFLAGS += -DFIPS_MODE
115+ endif
116+
117+ + ifneq ($(filter x86_%,$(host_cpu)),)
118+ + # Detect NASM version (minimum required: 2.14.01)
119+ + MINGW ?= $(shell $(CC) -dM -E - < /dev/null | grep -i mingw | wc -l | sed 's/^ *//')
120+ + ifeq ($(MINGW),0)
121+ + MULT = \*
122+ + else
123+ + MULT = \\*
124+ + endif
125+ +
126+ + NASM_VERSION = $(shell $(AS) -v | cut -d " " -f 3)
127+ +
128+ + NASM_MAJOR_REQ = 2
129+ + NASM_MINOR_REQ = 14
130+ + NASM_REV_REQ = 01
131+ + NASM_MIN_REQ = $(shell expr $(NASM_MAJOR_REQ) $(MULT) 10000 + $(NASM_MINOR_REQ) $(MULT) 100 + $(NASM_REV_REQ))
132+ +
133+ + ifeq ($(NASM_VERSION),)
134+ + $(error NASM is not installed! Minimum required version: $(NASM_MAJOR_REQ).$(NASM_MINOR_REQ).$(NASM_REV_REQ))
135+ + else
136+ + NASM_MAJOR_VER = $(shell echo $(NASM_VERSION) | cut -d "." -f 1)
137+ + NASM_MINOR_VER = $(shell echo $(NASM_VERSION) | cut -d "." -f 2 | cut -c 1-2)
138+ + NASM_REV_VER = $(shell echo $(NASM_VERSION) | cut -d "." -f 3 | cut -c 1-2)
139+ + ifeq ($(NASM_REV_VER),)
140+ + NASM_REV_VER = 0
141+ + endif
142+ + NASM_VER = $(shell expr $(NASM_MAJOR_VER) $(MULT) 10000 + $(NASM_MINOR_VER) $(MULT) 100 + $(NASM_REV_VER))
143+ +
144+ + NASM_GE_REQ = $(shell [ $(NASM_VER) -ge $(NASM_MIN_REQ) ] && echo true)
145+ + $(info NASM '$(AS)' version: $(NASM_VERSION))
146+ + ifneq ($(NASM_GE_REQ),true)
147+ + $(error Minimum required NASM version: $(NASM_MAJOR_REQ).$(NASM_MINOR_REQ).$(NASM_REV_REQ))
148+ + endif # NASM_GE_REQ
149+ +
150+ + # Minimum version of NASM with SHA512-NI support: 2.16.02
151+ + NASM_MAJOR_SHA512NI = 2
152+ + NASM_MINOR_SHA512NI = 16
153+ + NASM_REV_SHA512NI = 02
154+ + NASM_MIN_SHA512NI = $(shell expr $(NASM_MAJOR_SHA512NI) $(MULT) 10000 + $(NASM_MINOR_SHA512NI) $(MULT) 100 + $(NASM_REV_SHA512NI))
155+ +
156+ + NASM_SHA512NI_GE_REQ = $(shell [ $(NASM_VER) -ge $(NASM_MIN_SHA512NI) ] && echo true)
157+ + ifneq ($(NASM_SHA512NI_GE_REQ),true)
158+ + $(warning Minimum required NASM version for SHA512-NI: $(NASM_MAJOR_SHA512NI).$(NASM_MINOR_SHA512NI).$(NASM_REV_SHA512NI) SHA512-NI code not compiled - update NASM.)
159+ + else
160+ + CFLAGS += -DHAVE_AS_KNOWS_SHA512NI
161+ + ASFLAGS += -DHAVE_AS_KNOWS_SHA512NI
162+ + endif # NASM_SHA512NI_GE_REQ
163+ + endif # NASM_VERSION
164+ + endif # x86
165+ +
166+ ifeq ($(filter aarch64 x86_%,$(host_cpu)),)
167+ host_cpu=base_aliases
168+ endif
169+ diff --git a/sha512_mb/sha512_multibinary.asm b/sha512_mb/sha512_multibinary.asm
170+ index 4406afa..df61e2f 100644
171+ --- a/sha512_mb/sha512_multibinary.asm
172+ +++ b/sha512_mb/sha512_multibinary.asm
173+ @@ -129,9 +129,11 @@ extern _sha512_ctx_mgr_init_avx2
174+ extern _sha512_ctx_mgr_submit_avx2
175+ extern _sha512_ctx_mgr_flush_avx2
176+
177+ + %ifdef HAVE_AS_KNOWS_SHA512NI
178+ extern _sha512_ctx_mgr_init_avx2_ni
179+ extern _sha512_ctx_mgr_submit_avx2_ni
180+ extern _sha512_ctx_mgr_flush_avx2_ni
181+ + %endif
182+
183+ extern _sha512_ctx_mgr_init_base
184+ extern _sha512_ctx_mgr_submit_base
185+ diff --git a/sm3_mb/sm3_multibinary.asm b/sm3_mb/sm3_multibinary.asm
186+ index 2a6bee6..69890ab 100644
187+ --- a/sm3_mb/sm3_multibinary.asm
188+ +++ b/sm3_mb/sm3_multibinary.asm
189+ @@ -119,9 +119,11 @@ extern _sm3_ctx_mgr_init_avx2
190+ extern _sm3_ctx_mgr_submit_avx2
191+ extern _sm3_ctx_mgr_flush_avx2
192+
193+ + %ifdef HAVE_AS_KNOWS_SHA512NI
194+ extern _sm3_ctx_mgr_init_avx2_ni
195+ extern _sm3_ctx_mgr_submit_avx2_ni
196+ extern _sm3_ctx_mgr_flush_avx2_ni
197+ + %endif
198+
199+ extern _sm3_ctx_mgr_init_avx512
200+ extern _sm3_ctx_mgr_submit_avx512
0 commit comments