aboutsummaryrefslogtreecommitdiff
path: root/crypto
diff options
context:
space:
mode:
Diffstat (limited to 'crypto')
-rw-r--r--crypto/CMakeLists.txt88
-rw-r--r--crypto/Makefile.am58
-rw-r--r--crypto/Makefile.am.elf-arm18
-rw-r--r--crypto/Makefile.am.elf-x86_647
-rw-r--r--crypto/Makefile.am.macosx-x86_647
-rw-r--r--crypto/Makefile.am.masm-x86_645
-rw-r--r--crypto/Makefile.am.mingw64-x86_645
-rw-r--r--crypto/arch/aarch64/crypto_cpu_caps_darwin.c60
-rw-r--r--crypto/arch/aarch64/crypto_cpu_caps_linux.c62
-rw-r--r--crypto/arch/aarch64/crypto_cpu_caps_none.c26
-rw-r--r--crypto/arch/aarch64/crypto_cpu_caps_windows.c36
-rw-r--r--crypto/compat/.gitignore31
-rw-r--r--crypto/compat/b_win.c5
-rw-r--r--crypto/compat/posix_win.c85
14 files changed, 351 insertions, 142 deletions
diff --git a/crypto/CMakeLists.txt b/crypto/CMakeLists.txt
index 64bccd8..047c228 100644
--- a/crypto/CMakeLists.txt
+++ b/crypto/CMakeLists.txt
@@ -1,30 +1,28 @@
1add_definitions(-DLIBRESSL_CRYPTO_INTERNAL) 1#
2# Copyright (c) 2014 Brent Cook
3#
4# Permission to use, copy, modify, and distribute this software for any
5# purpose with or without fee is hereby granted, provided that the above
6# copyright notice and this permission notice appear in all copies.
7#
8# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
2 15
3if(HOST_ASM_ELF_ARMV4) 16add_definitions(-DLIBRESSL_CRYPTO_INTERNAL)
4 set(
5 ASM_ARMV4_ELF_SRC
6 aes/aes-elf-armv4.S
7 bn/mont-elf-armv4.S
8 sha/sha1-elf-armv4.S
9 sha/sha512-elf-armv4.S
10 sha/sha256-elf-armv4.S
11 modes/ghash-elf-armv4.S
12 armv4cpuid.S
13 armcap.c
14 )
15 add_definitions(-DAES_ASM)
16 add_definitions(-DOPENSSL_BN_ASM_MONT)
17 add_definitions(-DGHASH_ASM)
18 add_definitions(-DOPENSSL_CPUID_OBJ)
19 set(CRYPTO_SRC ${CRYPTO_SRC} ${ASM_ARMV4_ELF_SRC})
20endif()
21 17
22if(HOST_ASM_ELF_X86_64) 18if(HOST_ASM_ELF_X86_64)
19 set(CRYPTO_SRC ${CRYPTO_SRC} aes/aes_amd64.c)
20 set(CRYPTO_SRC ${CRYPTO_SRC} bn/arch/amd64/bn_arch.c)
21 set(CRYPTO_SRC ${CRYPTO_SRC} modes/gcm128_amd64.c)
22
23 set( 23 set(
24 ASM_X86_64_ELF_SRC 24 ASM_X86_64_ELF_SRC
25 aes/aes-elf-x86_64.S 25 aes/aes-elf-x86_64.S
26 aes/bsaes-elf-x86_64.S
27 aes/vpaes-elf-x86_64.S
28 aes/aesni-elf-x86_64.S 26 aes/aesni-elf-x86_64.S
29 bn/modexp512-elf-x86_64.S 27 bn/modexp512-elf-x86_64.S
30 bn/mont-elf-x86_64.S 28 bn/mont-elf-x86_64.S
@@ -43,7 +41,6 @@ if(HOST_ASM_ELF_X86_64)
43 bn/arch/amd64/bignum_sqr_8_16_alt.S 41 bn/arch/amd64/bignum_sqr_8_16_alt.S
44 bn/arch/amd64/bignum_sub.S 42 bn/arch/amd64/bignum_sub.S
45 bn/arch/amd64/word_clz.S 43 bn/arch/amd64/word_clz.S
46 bn/arch/amd64/bn_arch.c
47 ) 44 )
48 add_definitions(-DAES_ASM) 45 add_definitions(-DAES_ASM)
49 add_definitions(-DBSAES_ASM) 46 add_definitions(-DBSAES_ASM)
@@ -57,11 +54,13 @@ if(HOST_ASM_ELF_X86_64)
57endif() 54endif()
58 55
59if(HOST_ASM_MACOSX_X86_64) 56if(HOST_ASM_MACOSX_X86_64)
57 set(CRYPTO_SRC ${CRYPTO_SRC} aes/aes_amd64.c)
58 set(CRYPTO_SRC ${CRYPTO_SRC} bn/arch/amd64/bn_arch.c)
59 set(CRYPTO_SRC ${CRYPTO_SRC} modes/gcm128_amd64.c)
60
60 set( 61 set(
61 ASM_X86_64_MACOSX_SRC 62 ASM_X86_64_MACOSX_SRC
62 aes/aes-macosx-x86_64.S 63 aes/aes-macosx-x86_64.S
63 aes/bsaes-macosx-x86_64.S
64 aes/vpaes-macosx-x86_64.S
65 aes/aesni-macosx-x86_64.S 64 aes/aesni-macosx-x86_64.S
66 bn/modexp512-macosx-x86_64.S 65 bn/modexp512-macosx-x86_64.S
67 bn/mont-macosx-x86_64.S 66 bn/mont-macosx-x86_64.S
@@ -80,7 +79,6 @@ if(HOST_ASM_MACOSX_X86_64)
80 bn/arch/amd64/bignum_sqr_8_16_alt.S 79 bn/arch/amd64/bignum_sqr_8_16_alt.S
81 bn/arch/amd64/bignum_sub.S 80 bn/arch/amd64/bignum_sub.S
82 bn/arch/amd64/word_clz.S 81 bn/arch/amd64/word_clz.S
83 bn/arch/amd64/bn_arch.c
84 ) 82 )
85 add_definitions(-DAES_ASM) 83 add_definitions(-DAES_ASM)
86 add_definitions(-DBSAES_ASM) 84 add_definitions(-DBSAES_ASM)
@@ -95,11 +93,12 @@ if(HOST_ASM_MACOSX_X86_64)
95endif() 93endif()
96 94
97if(HOST_ASM_MASM_X86_64) 95if(HOST_ASM_MASM_X86_64)
96 set(CRYPTO_SRC ${CRYPTO_SRC} aes/aes_amd64.c)
97 set(CRYPTO_SRC ${CRYPTO_SRC} modes/gcm128_amd64.c)
98
98 set( 99 set(
99 ASM_X86_64_MASM_SRC 100 ASM_X86_64_MASM_SRC
100 aes/aes-masm-x86_64.S 101 aes/aes-masm-x86_64.S
101 aes/bsaes-masm-x86_64.S
102 aes/vpaes-masm-x86_64.S
103 aes/aesni-masm-x86_64.S 102 aes/aesni-masm-x86_64.S
104 #bn/modexp512-masm-x86_64.S 103 #bn/modexp512-masm-x86_64.S
105 #bn/mont-masm-x86_64.S 104 #bn/mont-masm-x86_64.S
@@ -121,11 +120,12 @@ if(HOST_ASM_MASM_X86_64)
121endif() 120endif()
122 121
123if(HOST_ASM_MINGW64_X86_64) 122if(HOST_ASM_MINGW64_X86_64)
123 set(CRYPTO_SRC ${CRYPTO_SRC} aes/aes_amd64.c)
124 set(CRYPTO_SRC ${CRYPTO_SRC} modes/gcm128_amd64.c)
125
124 set( 126 set(
125 ASM_X86_64_MINGW64_SRC 127 ASM_X86_64_MINGW64_SRC
126 aes/aes-mingw64-x86_64.S 128 aes/aes-mingw64-x86_64.S
127 aes/bsaes-mingw64-x86_64.S
128 aes/vpaes-mingw64-x86_64.S
129 aes/aesni-mingw64-x86_64.S 129 aes/aesni-mingw64-x86_64.S
130 #bn/modexp512-mingw64-x86_64.S 130 #bn/modexp512-mingw64-x86_64.S
131 #bn/mont-mingw64-x86_64.S 131 #bn/mont-mingw64-x86_64.S
@@ -146,7 +146,17 @@ if(HOST_ASM_MINGW64_X86_64)
146endif() 146endif()
147 147
148if(HOST_AARCH64) 148if(HOST_AARCH64)
149 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps.c) 149 if(APPLE)
150 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps_darwin.c)
151 elseif(LINUX)
152 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps_linux.c)
153 elseif(CMAKE_SYSTEM_NAME STREQUAL "OpenBSD")
154 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps.c)
155 elseif(WIN32)
156 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps_windows.c)
157 else()
158 set(CRYPTO_SRC ${CRYPTO_SRC} arch/aarch64/crypto_cpu_caps_none.c)
159 endif()
150elseif(HOST_X86_64) 160elseif(HOST_X86_64)
151 set(CRYPTO_SRC ${CRYPTO_SRC} arch/amd64/crypto_cpu_caps.c) 161 set(CRYPTO_SRC ${CRYPTO_SRC} arch/amd64/crypto_cpu_caps.c)
152elseif(HOST_I386) 162elseif(HOST_I386)
@@ -163,7 +173,6 @@ set(
163 crypto_memory.c 173 crypto_memory.c
164 aes/aes.c 174 aes/aes.c
165 aes/aes_core.c 175 aes/aes_core.c
166 aes/aes_ige.c
167 asn1/a_bitstr.c 176 asn1/a_bitstr.c
168 asn1/a_enum.c 177 asn1/a_enum.c
169 asn1/a_int.c 178 asn1/a_int.c
@@ -213,10 +222,8 @@ set(
213 asn1/x_bignum.c 222 asn1/x_bignum.c
214 asn1/x_crl.c 223 asn1/x_crl.c
215 asn1/x_exten.c 224 asn1/x_exten.c
216 asn1/x_info.c
217 asn1/x_long.c 225 asn1/x_long.c
218 asn1/x_name.c 226 asn1/x_name.c
219 asn1/x_pkey.c
220 asn1/x_pubkey.c 227 asn1/x_pubkey.c
221 asn1/x_req.c 228 asn1/x_req.c
222 asn1/x_sig.c 229 asn1/x_sig.c
@@ -245,6 +252,7 @@ set(
245 bio/bss_null.c 252 bio/bss_null.c
246 bio/bss_sock.c 253 bio/bss_sock.c
247 bn/bn_add.c 254 bn/bn_add.c
255 bn/bn_add_sub.c
248 bn/bn_bpsw.c 256 bn/bn_bpsw.c
249 bn/bn_const.c 257 bn/bn_const.c
250 bn/bn_convert.c 258 bn/bn_convert.c
@@ -258,6 +266,7 @@ set(
258 bn/bn_lib.c 266 bn/bn_lib.c
259 bn/bn_mod.c 267 bn/bn_mod.c
260 bn/bn_mod_sqrt.c 268 bn/bn_mod_sqrt.c
269 bn/bn_mod_words.c
261 bn/bn_mont.c 270 bn/bn_mont.c
262 bn/bn_mul.c 271 bn/bn_mul.c
263 bn/bn_prime.c 272 bn/bn_prime.c
@@ -339,11 +348,13 @@ set(
339 ec/ec_convert.c 348 ec/ec_convert.c
340 ec/ec_curve.c 349 ec/ec_curve.c
341 ec/ec_err.c 350 ec/ec_err.c
351 ec/ec_field.c
342 ec/ec_key.c 352 ec/ec_key.c
343 ec/ec_lib.c 353 ec/ec_lib.c
344 ec/ec_mult.c 354 ec/ec_mult.c
345 ec/ec_pmeth.c 355 ec/ec_pmeth.c
346 ec/eck_prn.c 356 ec/eck_prn.c
357 ec/ecp_hp_methods.c
347 ec/ecp_methods.c 358 ec/ecp_methods.c
348 ec/ecx_methods.c 359 ec/ecx_methods.c
349 ecdh/ecdh.c 360 ecdh/ecdh.c
@@ -464,11 +475,7 @@ set(
464 rand/rand_err.c 475 rand/rand_err.c
465 rand/rand_lib.c 476 rand/rand_lib.c
466 rand/randfile.c 477 rand/randfile.c
467 rc2/rc2_cbc.c 478 rc2/rc2.c
468 rc2/rc2_ecb.c
469 rc2/rc2_skey.c
470 rc2/rc2cfb64.c
471 rc2/rc2ofb64.c
472 rc4/rc4.c 479 rc4/rc4.c
473 ripemd/ripemd.c 480 ripemd/ripemd.c
474 rsa/rsa_ameth.c 481 rsa/rsa_ameth.c
@@ -570,17 +577,17 @@ set(
570 577
571set(COMPAT_SRC empty.c) 578set(COMPAT_SRC empty.c)
572 579
580set(CRYPTO_UNEXPORT ${CRYPTO_UNEXPORT} BIO_s_log)
581
573if(UNIX) 582if(UNIX)
574 set(CRYPTO_SRC ${CRYPTO_SRC} crypto_lock.c) 583 set(CRYPTO_SRC ${CRYPTO_SRC} crypto_lock.c)
575 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_posix.c) 584 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_posix.c)
576 set(CRYPTO_SRC ${CRYPTO_SRC} bio/bss_log.c)
577 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl.c) 585 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl.c)
578endif() 586endif()
579 587
580if(WIN32) 588if(WIN32)
581 set(CRYPTO_SRC ${CRYPTO_SRC} compat/crypto_lock_win.c) 589 set(CRYPTO_SRC ${CRYPTO_SRC} compat/crypto_lock_win.c)
582 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_win.c) 590 set(CRYPTO_SRC ${CRYPTO_SRC} bio/b_win.c)
583 set(CRYPTO_UNEXPORT ${CRYPTO_UNEXPORT} BIO_s_log)
584 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl_win.c) 591 set(CRYPTO_SRC ${CRYPTO_SRC} ui/ui_openssl_win.c)
585endif() 592endif()
586 593
@@ -736,6 +743,7 @@ add_library(crypto_obj OBJECT ${CRYPTO_SRC})
736target_include_directories(crypto_obj 743target_include_directories(crypto_obj
737 PRIVATE 744 PRIVATE
738 . 745 .
746 aes
739 asn1 747 asn1
740 bio 748 bio
741 bn 749 bn
diff --git a/crypto/Makefile.am b/crypto/Makefile.am
index d1c5b76..ad241ab 100644
--- a/crypto/Makefile.am
+++ b/crypto/Makefile.am
@@ -1,6 +1,22 @@
1#
2# Copyright (c) 2014 Brent Cook
3#
4# Permission to use, copy, modify, and distribute this software for any
5# purpose with or without fee is hereby granted, provided that the above
6# copyright notice and this permission notice appear in all copies.
7#
8# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15
1include $(top_srcdir)/Makefile.am.common 16include $(top_srcdir)/Makefile.am.common
2 17
3AM_CPPFLAGS += -DLIBRESSL_CRYPTO_INTERNAL 18AM_CPPFLAGS += -DLIBRESSL_CRYPTO_INTERNAL
19AM_CPPFLAGS += -I$(top_srcdir)/crypto/aes
4AM_CPPFLAGS += -I$(top_srcdir)/crypto/asn1 20AM_CPPFLAGS += -I$(top_srcdir)/crypto/asn1
5AM_CPPFLAGS += -I$(top_srcdir)/crypto/bio 21AM_CPPFLAGS += -I$(top_srcdir)/crypto/bio
6AM_CPPFLAGS += -I$(top_srcdir)/crypto/bn 22AM_CPPFLAGS += -I$(top_srcdir)/crypto/bn
@@ -51,20 +67,18 @@ crypto_portable.sym: crypto.sym Makefile
51 -echo "generating crypto_portable.sym ..." 67 -echo "generating crypto_portable.sym ..."
52 -cp $(top_srcdir)/crypto/crypto.sym crypto_portable.sym 68 -cp $(top_srcdir)/crypto/crypto.sym crypto_portable.sym
53 -chmod u+w crypto_portable.sym 69 -chmod u+w crypto_portable.sym
54if HOST_WIN
55 -grep -v BIO_s_log crypto_portable.sym > crypto_portable.sym.tmp 70 -grep -v BIO_s_log crypto_portable.sym > crypto_portable.sym.tmp
56 -mv crypto_portable.sym.tmp crypto_portable.sym 71 -mv crypto_portable.sym.tmp crypto_portable.sym
57endif
58 72
59libcrypto_la_objects.mk: Makefile 73libcrypto_la_objects.mk: Makefile
60 @echo "libcrypto_la_objects= $(libcrypto_la_OBJECTS)" \ 74 @echo "libcrypto_la_objects= $(libcrypto_la_OBJECTS)" \
61 | sed 's/ */ $$\(abs_top_builddir\)\/crypto\//g' \ 75 | sed 's/ */ $$\(top_builddir\)\/crypto\//g' \
62 > libcrypto_la_objects.mk 76 > libcrypto_la_objects.mk
63 @echo "libcompat_la_objects= $(libcompat_la_OBJECTS)" \ 77 @echo "libcompat_la_objects= $(libcompat_la_OBJECTS)" \
64 | sed 's/compat\// $$\(abs_top_builddir\)\/crypto\/&/g' \ 78 | sed 's/compat\// $$\(top_builddir\)\/crypto\/&/g' \
65 >> libcrypto_la_objects.mk 79 >> libcrypto_la_objects.mk
66 @echo "libcompatnoopt_la_objects= $(libcompatnoopt_la_OBJECTS)" \ 80 @echo "libcompatnoopt_la_objects= $(libcompatnoopt_la_OBJECTS)" \
67 | sed 's/compat\// $$\(abs_top_builddir\)\/crypto\/&/g' \ 81 | sed 's/compat\// $$\(top_builddir\)\/crypto\/&/g' \
68 >> libcrypto_la_objects.mk 82 >> libcrypto_la_objects.mk
69 83
70libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym 84libcrypto_la_LDFLAGS = -version-info @LIBCRYPTO_VERSION@ -no-undefined -export-symbols crypto_portable.sym
@@ -187,7 +201,6 @@ include Makefile.am.arc4random
187libcrypto_la_SOURCES = 201libcrypto_la_SOURCES =
188EXTRA_libcrypto_la_SOURCES = 202EXTRA_libcrypto_la_SOURCES =
189 203
190include Makefile.am.elf-arm
191include Makefile.am.elf-mips 204include Makefile.am.elf-mips
192include Makefile.am.elf-mips64 205include Makefile.am.elf-mips64
193include Makefile.am.elf-x86_64 206include Makefile.am.elf-x86_64
@@ -195,7 +208,6 @@ include Makefile.am.macosx-x86_64
195include Makefile.am.masm-x86_64 208include Makefile.am.masm-x86_64
196include Makefile.am.mingw64-x86_64 209include Makefile.am.mingw64-x86_64
197 210
198if !HOST_ASM_ELF_ARM
199if !HOST_ASM_ELF_MIPS 211if !HOST_ASM_ELF_MIPS
200if !HOST_ASM_ELF_MIPS64 212if !HOST_ASM_ELF_MIPS64
201if !HOST_ASM_ELF_X86_64 213if !HOST_ASM_ELF_X86_64
@@ -209,11 +221,23 @@ endif
209endif 221endif
210endif 222endif
211endif 223endif
212endif
213 224
214if HOST_AARCH64 225if HOST_AARCH64
226if HOST_DARWIN
227libcrypto_la_SOURCES += arch/aarch64/crypto_cpu_caps_darwin.c
228else
229if HOST_LINUX
230libcrypto_la_SOURCES += arch/aarch64/crypto_cpu_caps_linux.c
231else
232if HOST_OPENBSD
215libcrypto_la_SOURCES += arch/aarch64/crypto_cpu_caps.c 233libcrypto_la_SOURCES += arch/aarch64/crypto_cpu_caps.c
234else
235libcrypto_la_SOURCES += arch/aarch64/crypto_cpu_caps_none.c
236endif
237endif
238endif
216endif 239endif
240
217if HOST_X86_64 241if HOST_X86_64
218libcrypto_la_SOURCES += arch/amd64/crypto_cpu_caps.c 242libcrypto_la_SOURCES += arch/amd64/crypto_cpu_caps.c
219endif 243endif
@@ -231,7 +255,6 @@ else
231libcrypto_la_SOURCES += compat/crypto_lock_win.c 255libcrypto_la_SOURCES += compat/crypto_lock_win.c
232endif 256endif
233libcrypto_la_SOURCES += crypto_memory.c 257libcrypto_la_SOURCES += crypto_memory.c
234noinst_HEADERS += arm_arch.h
235noinst_HEADERS += constant_time.h 258noinst_HEADERS += constant_time.h
236noinst_HEADERS += crypto_internal.h 259noinst_HEADERS += crypto_internal.h
237noinst_HEADERS += crypto_local.h 260noinst_HEADERS += crypto_local.h
@@ -240,7 +263,6 @@ noinst_HEADERS += x86_arch.h
240# aes 263# aes
241libcrypto_la_SOURCES += aes/aes.c 264libcrypto_la_SOURCES += aes/aes.c
242libcrypto_la_SOURCES += aes/aes_core.c 265libcrypto_la_SOURCES += aes/aes_core.c
243libcrypto_la_SOURCES += aes/aes_ige.c
244noinst_HEADERS += aes/aes_local.h 266noinst_HEADERS += aes/aes_local.h
245 267
246# asn1 268# asn1
@@ -293,10 +315,8 @@ libcrypto_la_SOURCES += asn1/x_attrib.c
293libcrypto_la_SOURCES += asn1/x_bignum.c 315libcrypto_la_SOURCES += asn1/x_bignum.c
294libcrypto_la_SOURCES += asn1/x_crl.c 316libcrypto_la_SOURCES += asn1/x_crl.c
295libcrypto_la_SOURCES += asn1/x_exten.c 317libcrypto_la_SOURCES += asn1/x_exten.c
296libcrypto_la_SOURCES += asn1/x_info.c
297libcrypto_la_SOURCES += asn1/x_long.c 318libcrypto_la_SOURCES += asn1/x_long.c
298libcrypto_la_SOURCES += asn1/x_name.c 319libcrypto_la_SOURCES += asn1/x_name.c
299libcrypto_la_SOURCES += asn1/x_pkey.c
300libcrypto_la_SOURCES += asn1/x_pubkey.c 320libcrypto_la_SOURCES += asn1/x_pubkey.c
301libcrypto_la_SOURCES += asn1/x_req.c 321libcrypto_la_SOURCES += asn1/x_req.c
302libcrypto_la_SOURCES += asn1/x_sig.c 322libcrypto_la_SOURCES += asn1/x_sig.c
@@ -334,9 +354,6 @@ libcrypto_la_SOURCES += bio/bss_conn.c
334libcrypto_la_SOURCES += bio/bss_dgram.c 354libcrypto_la_SOURCES += bio/bss_dgram.c
335libcrypto_la_SOURCES += bio/bss_fd.c 355libcrypto_la_SOURCES += bio/bss_fd.c
336libcrypto_la_SOURCES += bio/bss_file.c 356libcrypto_la_SOURCES += bio/bss_file.c
337if !HOST_WIN
338libcrypto_la_SOURCES += bio/bss_log.c
339endif
340libcrypto_la_SOURCES += bio/bss_mem.c 357libcrypto_la_SOURCES += bio/bss_mem.c
341libcrypto_la_SOURCES += bio/bss_null.c 358libcrypto_la_SOURCES += bio/bss_null.c
342libcrypto_la_SOURCES += bio/bss_sock.c 359libcrypto_la_SOURCES += bio/bss_sock.c
@@ -344,6 +361,7 @@ noinst_HEADERS += bio/bio_local.h
344 361
345# bn 362# bn
346libcrypto_la_SOURCES += bn/bn_add.c 363libcrypto_la_SOURCES += bn/bn_add.c
364libcrypto_la_SOURCES += bn/bn_add_sub.c
347libcrypto_la_SOURCES += bn/bn_bpsw.c 365libcrypto_la_SOURCES += bn/bn_bpsw.c
348libcrypto_la_SOURCES += bn/bn_const.c 366libcrypto_la_SOURCES += bn/bn_const.c
349libcrypto_la_SOURCES += bn/bn_convert.c 367libcrypto_la_SOURCES += bn/bn_convert.c
@@ -357,6 +375,7 @@ libcrypto_la_SOURCES += bn/bn_kron.c
357libcrypto_la_SOURCES += bn/bn_lib.c 375libcrypto_la_SOURCES += bn/bn_lib.c
358libcrypto_la_SOURCES += bn/bn_mod.c 376libcrypto_la_SOURCES += bn/bn_mod.c
359libcrypto_la_SOURCES += bn/bn_mod_sqrt.c 377libcrypto_la_SOURCES += bn/bn_mod_sqrt.c
378libcrypto_la_SOURCES += bn/bn_mod_words.c
360libcrypto_la_SOURCES += bn/bn_mont.c 379libcrypto_la_SOURCES += bn/bn_mont.c
361libcrypto_la_SOURCES += bn/bn_mul.c 380libcrypto_la_SOURCES += bn/bn_mul.c
362libcrypto_la_SOURCES += bn/bn_prime.c 381libcrypto_la_SOURCES += bn/bn_prime.c
@@ -562,13 +581,16 @@ libcrypto_la_SOURCES += ec/ec_asn1.c
562libcrypto_la_SOURCES += ec/ec_convert.c 581libcrypto_la_SOURCES += ec/ec_convert.c
563libcrypto_la_SOURCES += ec/ec_curve.c 582libcrypto_la_SOURCES += ec/ec_curve.c
564libcrypto_la_SOURCES += ec/ec_err.c 583libcrypto_la_SOURCES += ec/ec_err.c
584libcrypto_la_SOURCES += ec/ec_field.c
565libcrypto_la_SOURCES += ec/ec_key.c 585libcrypto_la_SOURCES += ec/ec_key.c
566libcrypto_la_SOURCES += ec/ec_lib.c 586libcrypto_la_SOURCES += ec/ec_lib.c
567libcrypto_la_SOURCES += ec/ec_mult.c 587libcrypto_la_SOURCES += ec/ec_mult.c
568libcrypto_la_SOURCES += ec/ec_pmeth.c 588libcrypto_la_SOURCES += ec/ec_pmeth.c
569libcrypto_la_SOURCES += ec/eck_prn.c 589libcrypto_la_SOURCES += ec/eck_prn.c
590libcrypto_la_SOURCES += ec/ecp_hp_methods.c
570libcrypto_la_SOURCES += ec/ecp_methods.c 591libcrypto_la_SOURCES += ec/ecp_methods.c
571libcrypto_la_SOURCES += ec/ecx_methods.c 592libcrypto_la_SOURCES += ec/ecx_methods.c
593noinst_HEADERS += ec/ec_internal.h
572noinst_HEADERS += ec/ec_local.h 594noinst_HEADERS += ec/ec_local.h
573 595
574# ecdh 596# ecdh
@@ -800,11 +822,7 @@ libcrypto_la_SOURCES += rand/rand_lib.c
800libcrypto_la_SOURCES += rand/randfile.c 822libcrypto_la_SOURCES += rand/randfile.c
801 823
802# rc2 824# rc2
803libcrypto_la_SOURCES += rc2/rc2_cbc.c 825libcrypto_la_SOURCES += rc2/rc2.c
804libcrypto_la_SOURCES += rc2/rc2_ecb.c
805libcrypto_la_SOURCES += rc2/rc2_skey.c
806libcrypto_la_SOURCES += rc2/rc2cfb64.c
807libcrypto_la_SOURCES += rc2/rc2ofb64.c
808noinst_HEADERS += rc2/rc2_local.h 826noinst_HEADERS += rc2/rc2_local.h
809 827
810# rc4 828# rc4
diff --git a/crypto/Makefile.am.elf-arm b/crypto/Makefile.am.elf-arm
deleted file mode 100644
index 6a9fa50..0000000
--- a/crypto/Makefile.am.elf-arm
+++ /dev/null
@@ -1,18 +0,0 @@
1ASM_ARM_ELF = aes/aes-elf-armv4.S
2ASM_ARM_ELF += bn/mont-elf-armv4.S
3ASM_ARM_ELF += sha/sha1-elf-armv4.S
4ASM_ARM_ELF += sha/sha512-elf-armv4.S
5ASM_ARM_ELF += sha/sha256-elf-armv4.S
6ASM_ARM_ELF += modes/ghash-elf-armv4.S
7ASM_ARM_ELF += armv4cpuid.S
8ASM_ARM_ELF += armcap.c
9
10EXTRA_DIST += $(ASM_ARM_ELF)
11
12if HOST_ASM_ELF_ARM
13libcrypto_la_CPPFLAGS += -DAES_ASM
14libcrypto_la_CPPFLAGS += -DOPENSSL_BN_ASM_MONT
15libcrypto_la_CPPFLAGS += -DGHASH_ASM
16libcrypto_la_CPPFLAGS += -DOPENSSL_CPUID_OBJ
17libcrypto_la_SOURCES += $(ASM_ARM_ELF)
18endif
diff --git a/crypto/Makefile.am.elf-x86_64 b/crypto/Makefile.am.elf-x86_64
index c62662c..ad49787 100644
--- a/crypto/Makefile.am.elf-x86_64
+++ b/crypto/Makefile.am.elf-x86_64
@@ -1,7 +1,5 @@
1 1
2ASM_X86_64_ELF = aes/aes-elf-x86_64.S 2ASM_X86_64_ELF = aes/aes-elf-x86_64.S
3ASM_X86_64_ELF += aes/bsaes-elf-x86_64.S
4ASM_X86_64_ELF += aes/vpaes-elf-x86_64.S
5ASM_X86_64_ELF += aes/aesni-elf-x86_64.S 3ASM_X86_64_ELF += aes/aesni-elf-x86_64.S
6ASM_X86_64_ELF += bn/modexp512-elf-x86_64.S 4ASM_X86_64_ELF += bn/modexp512-elf-x86_64.S
7ASM_X86_64_ELF += bn/mont-elf-x86_64.S 5ASM_X86_64_ELF += bn/mont-elf-x86_64.S
@@ -20,11 +18,14 @@ ASM_X86_64_ELF += bn/arch/amd64/bignum_sqr_4_8_alt.S
20ASM_X86_64_ELF += bn/arch/amd64/bignum_sqr_8_16_alt.S 18ASM_X86_64_ELF += bn/arch/amd64/bignum_sqr_8_16_alt.S
21ASM_X86_64_ELF += bn/arch/amd64/bignum_sub.S 19ASM_X86_64_ELF += bn/arch/amd64/bignum_sub.S
22ASM_X86_64_ELF += bn/arch/amd64/word_clz.S 20ASM_X86_64_ELF += bn/arch/amd64/word_clz.S
23ASM_X86_64_ELF += bn/arch/amd64/bn_arch.c
24 21
25EXTRA_DIST += $(ASM_X86_64_ELF) 22EXTRA_DIST += $(ASM_X86_64_ELF)
26 23
27if HOST_ASM_ELF_X86_64 24if HOST_ASM_ELF_X86_64
25libcrypto_la_SOURCES += aes/aes_amd64.c
26libcrypto_la_SOURCES += bn/arch/amd64/bn_arch.c
27libcrypto_la_SOURCES += modes/gcm128_amd64.c
28
28libcrypto_la_CPPFLAGS += -DAES_ASM 29libcrypto_la_CPPFLAGS += -DAES_ASM
29libcrypto_la_CPPFLAGS += -DBSAES_ASM 30libcrypto_la_CPPFLAGS += -DBSAES_ASM
30libcrypto_la_CPPFLAGS += -DVPAES_ASM 31libcrypto_la_CPPFLAGS += -DVPAES_ASM
diff --git a/crypto/Makefile.am.macosx-x86_64 b/crypto/Makefile.am.macosx-x86_64
index 010e3be..bbccfd6 100644
--- a/crypto/Makefile.am.macosx-x86_64
+++ b/crypto/Makefile.am.macosx-x86_64
@@ -1,7 +1,5 @@
1 1
2ASM_X86_64_MACOSX = aes/aes-macosx-x86_64.S 2ASM_X86_64_MACOSX = aes/aes-macosx-x86_64.S
3ASM_X86_64_MACOSX += aes/bsaes-macosx-x86_64.S
4ASM_X86_64_MACOSX += aes/vpaes-macosx-x86_64.S
5ASM_X86_64_MACOSX += aes/aesni-macosx-x86_64.S 3ASM_X86_64_MACOSX += aes/aesni-macosx-x86_64.S
6ASM_X86_64_MACOSX += bn/modexp512-macosx-x86_64.S 4ASM_X86_64_MACOSX += bn/modexp512-macosx-x86_64.S
7ASM_X86_64_MACOSX += bn/mont-macosx-x86_64.S 5ASM_X86_64_MACOSX += bn/mont-macosx-x86_64.S
@@ -20,11 +18,14 @@ ASM_X86_64_MACOSX += bn/arch/amd64/bignum_sqr_4_8_alt.S
20ASM_X86_64_MACOSX += bn/arch/amd64/bignum_sqr_8_16_alt.S 18ASM_X86_64_MACOSX += bn/arch/amd64/bignum_sqr_8_16_alt.S
21ASM_X86_64_MACOSX += bn/arch/amd64/bignum_sub.S 19ASM_X86_64_MACOSX += bn/arch/amd64/bignum_sub.S
22ASM_X86_64_MACOSX += bn/arch/amd64/word_clz.S 20ASM_X86_64_MACOSX += bn/arch/amd64/word_clz.S
23ASM_X86_64_MACOSX += bn/arch/amd64/bn_arch.c
24 21
25EXTRA_DIST += $(ASM_X86_64_MACOSX) 22EXTRA_DIST += $(ASM_X86_64_MACOSX)
26 23
27if HOST_ASM_MACOSX_X86_64 24if HOST_ASM_MACOSX_X86_64
25libcrypto_la_SOURCES += aes/aes_amd64.c
26libcrypto_la_SOURCES += bn/arch/amd64/bn_arch.c
27libcrypto_la_SOURCES += modes/gcm128_amd64.c
28
28libcrypto_la_CPPFLAGS += -DAES_ASM 29libcrypto_la_CPPFLAGS += -DAES_ASM
29libcrypto_la_CPPFLAGS += -DBSAES_ASM 30libcrypto_la_CPPFLAGS += -DBSAES_ASM
30libcrypto_la_CPPFLAGS += -DVPAES_ASM 31libcrypto_la_CPPFLAGS += -DVPAES_ASM
diff --git a/crypto/Makefile.am.masm-x86_64 b/crypto/Makefile.am.masm-x86_64
index 2ef7e1b..bb94e3a 100644
--- a/crypto/Makefile.am.masm-x86_64
+++ b/crypto/Makefile.am.masm-x86_64
@@ -1,7 +1,5 @@
1 1
2ASM_X86_64_MASM = aes/aes-masm-x86_64.S 2ASM_X86_64_MASM = aes/aes-masm-x86_64.S
3ASM_X86_64_MASM += aes/bsaes-masm-x86_64.S
4ASM_X86_64_MASM += aes/vpaes-masm-x86_64.S
5ASM_X86_64_MASM += aes/aesni-masm-x86_64.S 3ASM_X86_64_MASM += aes/aesni-masm-x86_64.S
6ASM_X86_64_MASM += bn/modexp512-masm-x86_64.S 4ASM_X86_64_MASM += bn/modexp512-masm-x86_64.S
7ASM_X86_64_MASM += bn/mont-masm-x86_64.S 5ASM_X86_64_MASM += bn/mont-masm-x86_64.S
@@ -12,6 +10,9 @@ ASM_X86_64_MASM += rc4/rc4-masm-x86_64.S
12EXTRA_DIST += $(ASM_X86_64_MASM) 10EXTRA_DIST += $(ASM_X86_64_MASM)
13 11
14if HOST_ASM_MASM_X86_64 12if HOST_ASM_MASM_X86_64
13libcrypto_la_SOURCES += aes/aes_amd64.c
14libcrypto_la_SOURCES += modes/gcm128_amd64.c
15
15libcrypto_la_CPPFLAGS += -DAES_ASM 16libcrypto_la_CPPFLAGS += -DAES_ASM
16libcrypto_la_CPPFLAGS += -DBSAES_ASM 17libcrypto_la_CPPFLAGS += -DBSAES_ASM
17libcrypto_la_CPPFLAGS += -DVPAES_ASM 18libcrypto_la_CPPFLAGS += -DVPAES_ASM
diff --git a/crypto/Makefile.am.mingw64-x86_64 b/crypto/Makefile.am.mingw64-x86_64
index 8e39e9f..efe2643 100644
--- a/crypto/Makefile.am.mingw64-x86_64
+++ b/crypto/Makefile.am.mingw64-x86_64
@@ -1,7 +1,5 @@
1 1
2ASM_X86_64_MINGW64 = aes/aes-mingw64-x86_64.S 2ASM_X86_64_MINGW64 = aes/aes-mingw64-x86_64.S
3ASM_X86_64_MINGW64 += aes/bsaes-mingw64-x86_64.S
4ASM_X86_64_MINGW64 += aes/vpaes-mingw64-x86_64.S
5ASM_X86_64_MINGW64 += aes/aesni-mingw64-x86_64.S 3ASM_X86_64_MINGW64 += aes/aesni-mingw64-x86_64.S
6#ASM_X86_64_MINGW64 += bn/modexp512-mingw64-x86_64.S 4#ASM_X86_64_MINGW64 += bn/modexp512-mingw64-x86_64.S
7#ASM_X86_64_MINGW64 += bn/mont-mingw64-x86_64.S 5#ASM_X86_64_MINGW64 += bn/mont-mingw64-x86_64.S
@@ -12,6 +10,9 @@ ASM_X86_64_MINGW64 += rc4/rc4-mingw64-x86_64.S
12EXTRA_DIST += $(ASM_X86_64_MINGW64) 10EXTRA_DIST += $(ASM_X86_64_MINGW64)
13 11
14if HOST_ASM_MINGW64_X86_64 12if HOST_ASM_MINGW64_X86_64
13libcrypto_la_SOURCES += aes/aes_amd64.c
14libcrypto_la_SOURCES += modes/gcm128_amd64.c
15
15libcrypto_la_CPPFLAGS += -Dendbr32=endbr64 16libcrypto_la_CPPFLAGS += -Dendbr32=endbr64
16libcrypto_la_CPPFLAGS += -DAES_ASM 17libcrypto_la_CPPFLAGS += -DAES_ASM
17libcrypto_la_CPPFLAGS += -DBSAES_ASM 18libcrypto_la_CPPFLAGS += -DBSAES_ASM
diff --git a/crypto/arch/aarch64/crypto_cpu_caps_darwin.c b/crypto/arch/aarch64/crypto_cpu_caps_darwin.c
new file mode 100644
index 0000000..1dd91b2
--- /dev/null
+++ b/crypto/arch/aarch64/crypto_cpu_caps_darwin.c
@@ -0,0 +1,60 @@
1/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/11/12 13:52:31 jsing Exp $ */
2/*
3 * Copyright (c) 2025 Brent Cook <bcook@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/sysctl.h>
19
20#include "crypto_arch.h"
21
22/* Machine dependent CPU capabilities. */
23uint64_t crypto_cpu_caps_aarch64;
24
25static uint64_t
26check_cpu_cap(const char *cap_name, uint64_t cap_flag)
27{
28 int has_cap = 0;
29 size_t len = sizeof(has_cap);
30
31 sysctlbyname(cap_name, &has_cap, &len, NULL, 0);
32
33 return has_cap ? cap_flag : 0;
34}
35
36void
37crypto_cpu_caps_init(void)
38{
39 crypto_cpu_caps_aarch64 = 0;
40
41 /* from https://developer.apple.com/documentation/kernel/1387446-sysctlbyname/determining_instruction_set_characteristics#3918855 */
42
43 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_AES",
44 CRYPTO_CPU_CAPS_AARCH64_AES);
45
46 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_PMULL",
47 CRYPTO_CPU_CAPS_AARCH64_PMULL);
48
49 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_SHA1",
50 CRYPTO_CPU_CAPS_AARCH64_SHA1);
51
52 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_SHA256",
53 CRYPTO_CPU_CAPS_AARCH64_SHA2);
54
55 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_SHA512",
56 CRYPTO_CPU_CAPS_AARCH64_SHA512);
57
58 crypto_cpu_caps_aarch64 |= check_cpu_cap("hw.optional.arm.FEAT_SHA3",
59 CRYPTO_CPU_CAPS_AARCH64_SHA3);
60}
diff --git a/crypto/arch/aarch64/crypto_cpu_caps_linux.c b/crypto/arch/aarch64/crypto_cpu_caps_linux.c
new file mode 100644
index 0000000..ae28120
--- /dev/null
+++ b/crypto/arch/aarch64/crypto_cpu_caps_linux.c
@@ -0,0 +1,62 @@
1/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/11/12 13:52:31 jsing Exp $ */
2/*
3 * Copyright (c) 2025 Brent Cook <bcook@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/auxv.h>
19
20/* from arch/arm64/include/uapi/asm/hwcap.h */
21#define HWCAP_AES (1 << 3)
22#define HWCAP_PMULL (1 << 4)
23#define HWCAP_SHA1 (1 << 5)
24#define HWCAP_SHA2 (1 << 6)
25#define HWCAP_CRC32 (1 << 7)
26#define HWCAP_SHA3 (1 << 17)
27#define HWCAP_SHA512 (1 << 21)
28
29#include "crypto_arch.h"
30
31/* Machine dependent CPU capabilities. */
32uint64_t crypto_cpu_caps_aarch64;
33
34static uint64_t
35check_cpu_cap(unsigned long hwcap, uint64_t cap_flag)
36{
37 return (getauxval(AT_HWCAP) & hwcap) ? cap_flag : 0;
38}
39
40void
41crypto_cpu_caps_init(void)
42{
43 crypto_cpu_caps_aarch64 = 0;
44
45 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_AES,
46 CRYPTO_CPU_CAPS_AARCH64_AES);
47
48 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_PMULL,
49 CRYPTO_CPU_CAPS_AARCH64_PMULL);
50
51 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_SHA1,
52 CRYPTO_CPU_CAPS_AARCH64_SHA1);
53
54 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_SHA2,
55 CRYPTO_CPU_CAPS_AARCH64_SHA2);
56
57 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_SHA512,
58 CRYPTO_CPU_CAPS_AARCH64_SHA512);
59
60 crypto_cpu_caps_aarch64 |= check_cpu_cap(HWCAP_SHA3,
61 CRYPTO_CPU_CAPS_AARCH64_SHA3);
62}
diff --git a/crypto/arch/aarch64/crypto_cpu_caps_none.c b/crypto/arch/aarch64/crypto_cpu_caps_none.c
new file mode 100644
index 0000000..dcd96b7
--- /dev/null
+++ b/crypto/arch/aarch64/crypto_cpu_caps_none.c
@@ -0,0 +1,26 @@
1/*
2 * Copyright (c) 2025 Brent Cook <bcook@openbsd.org>
3 *
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include "crypto_arch.h"
18
19/* Machine dependent CPU capabilities. */
20uint64_t crypto_cpu_caps_aarch64;
21
22void
23crypto_cpu_caps_init(void)
24{
25 crypto_cpu_caps_aarch64 = 0;
26}
diff --git a/crypto/arch/aarch64/crypto_cpu_caps_windows.c b/crypto/arch/aarch64/crypto_cpu_caps_windows.c
new file mode 100644
index 0000000..e7cdded
--- /dev/null
+++ b/crypto/arch/aarch64/crypto_cpu_caps_windows.c
@@ -0,0 +1,36 @@
1/* $OpenBSD: crypto_cpu_caps.c,v 1.2 2024/11/12 13:52:31 jsing Exp $ */
2/*
3 * Copyright (c) 2025 Brent Cook <bcook@openbsd.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <windows.h>
19
20#include "crypto_arch.h"
21
22/* Machine dependent CPU capabilities. */
23uint64_t crypto_cpu_caps_aarch64;
24
25void
26crypto_cpu_caps_init(void)
27{
28 crypto_cpu_caps_aarch64 = 0;
29
30 if (IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE)) {
31 crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_AES;
32 crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_PMULL;
33 crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA1;
34 crypto_cpu_caps_aarch64 |= CRYPTO_CPU_CAPS_AARCH64_SHA2;
35 }
36}
diff --git a/crypto/compat/.gitignore b/crypto/compat/.gitignore
new file mode 100644
index 0000000..7f05049
--- /dev/null
+++ b/crypto/compat/.gitignore
@@ -0,0 +1,31 @@
1arc4random.c
2arc4random_aix.h
3arc4random_freebsd.h
4arc4random_hpux.h
5arc4random_linux.h
6arc4random_netbsd.h
7arc4random_osx.h
8arc4random_solaris.h
9arc4random_uniform.c
10arc4random_win.h
11chacha_private.h
12explicit_bzero.c
13getentropy_aix.c
14getentropy_freebsd.c
15getentropy_hpux.c
16getentropy_linux.c
17getentropy_netbsd.c
18getentropy_osx.c
19getentropy_solaris.c
20getentropy_win.c
21reallocarray.c
22recallocarray.c
23strcasecmp.c
24strlcat.c
25strlcpy.c
26strndup.c
27strnlen.c
28strsep.c
29strtonum.c
30timingsafe_bcmp.c
31timingsafe_memcmp.c
diff --git a/crypto/compat/b_win.c b/crypto/compat/b_win.c
index e261cd2..45af839 100644
--- a/crypto/compat/b_win.c
+++ b/crypto/compat/b_win.c
@@ -8,7 +8,8 @@
8#include <ws2tcpip.h> 8#include <ws2tcpip.h>
9 9
10#include <openssl/bio.h> 10#include <openssl/bio.h>
11#include <openssl/err.h> 11
12#include "err_local.h"
12 13
13int 14int
14BIO_sock_init(void) 15BIO_sock_init(void)
@@ -29,7 +30,7 @@ BIO_sock_init(void)
29 } 30 }
30 wsa_init_done = 1; 31 wsa_init_done = 1;
31 } 32 }
32 return (1); 33 return (1);
33} 34}
34 35
35void 36void
diff --git a/crypto/compat/posix_win.c b/crypto/compat/posix_win.c
index 1fbfce1..572e527 100644
--- a/crypto/compat/posix_win.c
+++ b/crypto/compat/posix_win.c
@@ -22,6 +22,25 @@
22#include <string.h> 22#include <string.h>
23#include <unistd.h> 23#include <unistd.h>
24 24
25#include <sys/stat.h>
26
27static int
28is_socket(int fd)
29{
30 // Border case: Don't break std* file descriptors
31 if (fd < 3)
32 return 0;
33
34 // All locally-allocated file descriptors will have the high bit set
35 return (fd & 0x80000000) == 0;
36}
37
38static int
39get_real_fd(int fd)
40{
41 return (fd & 0x7fffffff);
42}
43
25void 44void
26posix_perror(const char *s) 45posix_perror(const char *s)
27{ 46{
@@ -44,6 +63,12 @@ posix_fopen(const char *path, const char *mode)
44} 63}
45 64
46int 65int
66libressl_fstat(int fd, struct stat *statbuf)
67{
68 return fstat(get_real_fd(fd), statbuf);
69}
70
71int
47posix_open(const char *path, ...) 72posix_open(const char *path, ...)
48{ 73{
49 va_list ap; 74 va_list ap;
@@ -62,7 +87,11 @@ posix_open(const char *path, ...)
62 flags |= O_NOINHERIT; 87 flags |= O_NOINHERIT;
63 } 88 }
64 flags &= ~O_NONBLOCK; 89 flags &= ~O_NONBLOCK;
65 return open(path, flags, mode); 90
91 const int fh = open(path, flags, mode);
92
93 // Set high bit to mark file descriptor as a file handle
94 return fh + 0x80000000;
66} 95}
67 96
68char * 97char *
@@ -150,52 +179,6 @@ wsa_errno(int err)
150 return -1; 179 return -1;
151} 180}
152 181
153/*
154 * Employ a similar trick to cpython (pycore_fileutils.h) where the CRT report
155 * handler is disabled while checking if a descriptor is a socket or a file
156 */
157#if defined _MSC_VER && _MSC_VER >= 1900
158
159#include <crtdbg.h>
160#include <stdlib.h>
161
162static void noop_handler(const wchar_t *expression, const wchar_t *function,
163 const wchar_t *file, unsigned int line, uintptr_t pReserved)
164{
165 return;
166}
167
168#define BEGIN_SUPPRESS_IPH \
169 const int old_report_mode = _CrtSetReportMode(_CRT_ASSERT, 0); \
170 const _invalid_parameter_handler old_handler = _set_thread_local_invalid_parameter_handler(noop_handler)
171#define END_SUPPRESS_IPH \
172 (void)old_report_mode; /* Silence warning in release mode when _CrtSetReportMode compiles to void. */ \
173 _CrtSetReportMode(_CRT_ASSERT, old_report_mode); \
174 _set_thread_local_invalid_parameter_handler(old_handler)
175
176#else
177
178#define BEGIN_SUPPRESS_IPH
179#define END_SUPPRESS_IPH
180
181#endif
182
183static int
184is_socket(int fd)
185{
186 intptr_t hd;
187
188 BEGIN_SUPPRESS_IPH;
189 hd = _get_osfhandle(fd);
190 END_SUPPRESS_IPH;
191
192 if (hd == (intptr_t)INVALID_HANDLE_VALUE) {
193 return 1; /* fd is not file descriptor */
194 }
195
196 return 0;
197}
198
199int 182int
200posix_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen) 183posix_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen)
201{ 184{
@@ -209,14 +192,13 @@ int
209posix_close(int fd) 192posix_close(int fd)
210{ 193{
211 int rc; 194 int rc;
212
213 if (is_socket(fd)) { 195 if (is_socket(fd)) {
214 if ((rc = closesocket(fd)) == SOCKET_ERROR) { 196 if ((rc = closesocket(fd)) == SOCKET_ERROR) {
215 int err = WSAGetLastError(); 197 int err = WSAGetLastError();
216 rc = wsa_errno(err); 198 rc = wsa_errno(err);
217 } 199 }
218 } else { 200 } else {
219 rc = close(fd); 201 rc = close(get_real_fd(fd));
220 } 202 }
221 return rc; 203 return rc;
222} 204}
@@ -225,14 +207,13 @@ ssize_t
225posix_read(int fd, void *buf, size_t count) 207posix_read(int fd, void *buf, size_t count)
226{ 208{
227 ssize_t rc; 209 ssize_t rc;
228
229 if (is_socket(fd)) { 210 if (is_socket(fd)) {
230 if ((rc = recv(fd, buf, count, 0)) == SOCKET_ERROR) { 211 if ((rc = recv(fd, buf, count, 0)) == SOCKET_ERROR) {
231 int err = WSAGetLastError(); 212 int err = WSAGetLastError();
232 rc = wsa_errno(err); 213 rc = wsa_errno(err);
233 } 214 }
234 } else { 215 } else {
235 rc = read(fd, buf, count); 216 rc = read(get_real_fd(fd), buf, count);
236 } 217 }
237 return rc; 218 return rc;
238} 219}
@@ -246,7 +227,7 @@ posix_write(int fd, const void *buf, size_t count)
246 rc = wsa_errno(WSAGetLastError()); 227 rc = wsa_errno(WSAGetLastError());
247 } 228 }
248 } else { 229 } else {
249 rc = write(fd, buf, count); 230 rc = write(get_real_fd(fd), buf, count);
250 } 231 }
251 return rc; 232 return rc;
252} 233}