From 4f099fc59333205164f411653a518c5c57a0b7c4 Mon Sep 17 00:00:00 2001
From: Frank Denis <124872+jedisct1@users.noreply.github.com>
Date: Wed, 19 Jul 2023 18:27:36 +0200
Subject: [PATCH] Add proper CET support (followup to #1290) (#1291)
---
builds/msvc/vs2010/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2010/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2012/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2012/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2013/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2013/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2015/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2015/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2017/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2017/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2019/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2019/libsodium/libsodium.vcxproj.filters | 3 +++
builds/msvc/vs2022/libsodium/libsodium.vcxproj | 1 +
.../msvc/vs2022/libsodium/libsodium.vcxproj.filters | 3 +++
configure | 7 +++++++
configure.ac | 1 +
libsodium.vcxproj | 1 +
libsodium.vcxproj.filters | 3 +++
src/libsodium/Makefile.am | 1 +
src/libsodium/Makefile.in | 4 ++--
.../crypto_scalarmult/curve25519/sandy2x/fe51_mul.S | 3 +++
.../curve25519/sandy2x/fe51_nsquare.S | 2 ++
.../crypto_scalarmult/curve25519/sandy2x/fe51_pack.S | 2 ++
.../crypto_scalarmult/curve25519/sandy2x/ladder.S | 2 ++
.../crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S | 5 +++++
src/libsodium/include/sodium/private/asm_cet.h | 11 +++++++++++
26 files changed, 68 insertions(+), 2 deletions(-)
create mode 100644 src/libsodium/include/sodium/private/asm_cet.h
diff --git a/builds/msvc/vs2010/libsodium/libsodium.vcxproj b/builds/msvc/vs2010/libsodium/libsodium.vcxproj
index dc209abe..f3a583d5 100644
--- a/builds/msvc/vs2010/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2010/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2010/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2012/libsodium/libsodium.vcxproj b/builds/msvc/vs2012/libsodium/libsodium.vcxproj
index e6996119..1dd1edda 100644
--- a/builds/msvc/vs2012/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2012/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2012/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2013/libsodium/libsodium.vcxproj b/builds/msvc/vs2013/libsodium/libsodium.vcxproj
index 34299f0c..65df6a06 100644
--- a/builds/msvc/vs2013/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2013/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2013/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2015/libsodium/libsodium.vcxproj b/builds/msvc/vs2015/libsodium/libsodium.vcxproj
index 47218f0e..dcf7d14b 100644
--- a/builds/msvc/vs2015/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2015/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2015/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2017/libsodium/libsodium.vcxproj b/builds/msvc/vs2017/libsodium/libsodium.vcxproj
index 7220e6ca..e2274cda 100644
--- a/builds/msvc/vs2017/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2017/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2017/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2019/libsodium/libsodium.vcxproj b/builds/msvc/vs2019/libsodium/libsodium.vcxproj
index fe2f2a2c..61e8fe29 100644
--- a/builds/msvc/vs2019/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2019/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2019/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2019/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2019/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2019/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/builds/msvc/vs2022/libsodium/libsodium.vcxproj b/builds/msvc/vs2022/libsodium/libsodium.vcxproj
index 3e81bce6..57c5f660 100644
--- a/builds/msvc/vs2022/libsodium/libsodium.vcxproj
+++ b/builds/msvc/vs2022/libsodium/libsodium.vcxproj
@@ -260,6 +260,7 @@
+
diff --git a/builds/msvc/vs2022/libsodium/libsodium.vcxproj.filters b/builds/msvc/vs2022/libsodium/libsodium.vcxproj.filters
index bd41cf43..6425d6ea 100644
--- a/builds/msvc/vs2022/libsodium/libsodium.vcxproj.filters
+++ b/builds/msvc/vs2022/libsodium/libsodium.vcxproj.filters
@@ -569,6 +569,9 @@
include\sodium\private
+
+ include\sodium\private
+
include\sodium\private
diff --git a/configure b/configure
index 7b5b8803..adb0e868 100755
--- a/configure
+++ b/configure
@@ -19767,6 +19767,13 @@ then :
fi
+ac_fn_c_check_header_compile "$LINENO" "cet.h" "ac_cv_header_cet_h" "$ac_includes_default"
+if test "x$ac_cv_header_cet_h" = xyes
+then :
+ printf "%s\n" "#define HAVE_CET_H 1" >>confdefs.h
+
+fi
+
{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking if _xgetbv() is available" >&5
printf %s "checking if _xgetbv() is available... " >&6; }
diff --git a/configure.ac b/configure.ac
index 51ad0f7b..de285a1a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -585,6 +585,7 @@ AC_SUBST(CFLAGS_PCLMUL)
AC_SUBST(CFLAGS_RDRAND)
AC_CHECK_HEADERS([sys/mman.h sys/param.h sys/random.h intrin.h])
+AC_CHECK_HEADERS([cet.h])
AC_MSG_CHECKING([if _xgetbv() is available])
AC_LINK_IFELSE(
diff --git a/libsodium.vcxproj b/libsodium.vcxproj
index 65f5fab5..a37ce3ea 100644
--- a/libsodium.vcxproj
+++ b/libsodium.vcxproj
@@ -498,6 +498,7 @@
+
diff --git a/libsodium.vcxproj.filters b/libsodium.vcxproj.filters
index e443ed39..ac201d69 100644
--- a/libsodium.vcxproj.filters
+++ b/libsodium.vcxproj.filters
@@ -560,6 +560,9 @@
Header Files
+
+ Header Files
+
Header Files
diff --git a/src/libsodium/Makefile.am b/src/libsodium/Makefile.am
index 92de4fd3..d65af0e3 100644
--- a/src/libsodium/Makefile.am
+++ b/src/libsodium/Makefile.am
@@ -82,6 +82,7 @@ libsodium_la_SOURCES = \
crypto_stream/salsa20/stream_salsa20.h \
crypto_stream/xsalsa20/stream_xsalsa20.c \
crypto_verify/sodium/verify.c \
+ include/sodium/private/asm_cet.h \
include/sodium/private/chacha20_ietf_ext.h \
include/sodium/private/common.h \
include/sodium/private/ed25519_ref10.h \
diff --git a/src/libsodium/Makefile.in b/src/libsodium/Makefile.in
index ada6b052..f28959f6 100644
--- a/src/libsodium/Makefile.in
+++ b/src/libsodium/Makefile.in
@@ -326,7 +326,7 @@ am__libsodium_la_SOURCES_DIST = \
crypto_stream/salsa20/stream_salsa20.c \
crypto_stream/salsa20/stream_salsa20.h \
crypto_stream/xsalsa20/stream_xsalsa20.c \
- crypto_verify/sodium/verify.c \
+ crypto_verify/sodium/verify.c include/sodium/private/asm_cet.h \
include/sodium/private/chacha20_ietf_ext.h \
include/sodium/private/common.h \
include/sodium/private/ed25519_ref10.h \
@@ -990,7 +990,7 @@ libsodium_la_SOURCES = \
crypto_stream/salsa20/stream_salsa20.c \
crypto_stream/salsa20/stream_salsa20.h \
crypto_stream/xsalsa20/stream_xsalsa20.c \
- crypto_verify/sodium/verify.c \
+ crypto_verify/sodium/verify.c include/sodium/private/asm_cet.h \
include/sodium/private/chacha20_ietf_ext.h \
include/sodium/private/common.h \
include/sodium/private/ed25519_ref10.h \
diff --git a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_mul.S b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_mul.S
index 83501b03..94e36150 100644
--- a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_mul.S
+++ b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_mul.S
@@ -3,6 +3,7 @@
/*
This file is basically amd64-51/fe25519_mul.s.
*/
+#include "private/asm_cet.h"
#include "fe51_namespace.h"
#include "consts_namespace.h"
.text
@@ -19,6 +20,8 @@ ASM_HIDE_SYMBOL _fe51_mul
#endif
fe51_mul:
_fe51_mul:
+
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $96,%r11
diff --git a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S
index 41c30548..75465b0b 100644
--- a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S
+++ b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S
@@ -4,6 +4,7 @@
This file is adapted from amd64-51/fe25519_square.s:
Adding loop to perform n squares.
*/
+#include "private/asm_cet.h"
#include "fe51_namespace.h"
#include "consts_namespace.h"
.p2align 5
@@ -21,6 +22,7 @@ ASM_HIDE_SYMBOL _fe51_nsquare
fe51_nsquare:
_fe51_nsquare:
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $64,%r11
diff --git a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_pack.S b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_pack.S
index 500c8584..fb7a39a5 100644
--- a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_pack.S
+++ b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_pack.S
@@ -4,6 +4,7 @@
This file is the result of merging
amd64-51/fe25519_pack.c and amd64-51/fe25519_freeze.s.
*/
+#include "private/asm_cet.h"
#include "fe51_namespace.h"
#include "consts_namespace.h"
.p2align 5
@@ -21,6 +22,7 @@ ASM_HIDE_SYMBOL _fe51_pack
fe51_pack:
_fe51_pack:
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $32,%r11
diff --git a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.S b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.S
index c5c06021..a25e57b3 100644
--- a/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.S
+++ b/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.S
@@ -1,5 +1,6 @@
#ifdef IN_SANDY2X
+#include "private/asm_cet.h"
#include "ladder_namespace.h"
#include "consts_namespace.h"
.p2align 5
@@ -17,6 +18,7 @@ ASM_HIDE_SYMBOL _ladder
ladder:
_ladder:
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $1856,%r11
diff --git a/src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S b/src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S
index 6d9f354e..51ac26ab 100644
--- a/src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S
+++ b/src/libsodium/crypto_stream/salsa20/xmm6/salsa20_xmm6-asm.S
@@ -1,5 +1,7 @@
#ifdef HAVE_AMD64_ASM
+#include "private/asm_cet.h"
+
.text
.p2align 5
@@ -15,6 +17,8 @@ ASM_HIDE_SYMBOL _stream_salsa20_xmm6
#endif
stream_salsa20_xmm6:
_stream_salsa20_xmm6:
+
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $512,%r11
@@ -56,6 +60,7 @@ ASM_HIDE_SYMBOL _stream_salsa20_xmm6_xor_ic
stream_salsa20_xmm6_xor_ic:
_stream_salsa20_xmm6_xor_ic:
+_CET_ENDBR
mov %rsp,%r11
and $31,%r11
add $512,%r11
diff --git a/src/libsodium/include/sodium/private/asm_cet.h b/src/libsodium/include/sodium/private/asm_cet.h
new file mode 100644
index 00000000..4428c97f
--- /dev/null
+++ b/src/libsodium/include/sodium/private/asm_cet.h
@@ -0,0 +1,11 @@
+#ifndef asm_cet_H
+#define asm_cet_H 1
+
+#if HAVE_CET_H
+# include
+#endif
+#ifndef _CET_ENDBR
+# define _CET_ENDBR
+#endif
+
+#endif