hc
2024-03-22 f63cd4c03ea42695d5f9b0e1798edd196923aae6
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
From 372bdf0348fb86d671e73baab19daa34bd0cf73d Mon Sep 17 00:00:00 2001
From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
Date: Tue, 9 Nov 2021 19:01:20 +0100
Subject: [PATCH] Revert "workaround a miscompilation issue in clang 12
 (XCode 13)"
 
This reverts commit 219329f8e777af54d785ae7259f8be32a714b751.
 
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
[Upstream status: https://github.com/randombit/botan/issues/2845]
---
 src/lib/hash/sha3/sha3.cpp                | 46 ++++++-----------------
 src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp | 46 ++++++-----------------
 2 files changed, 22 insertions(+), 70 deletions(-)
 
diff --git a/src/lib/hash/sha3/sha3.cpp b/src/lib/hash/sha3/sha3.cpp
index 289e451ff..690c2b264 100644
--- a/src/lib/hash/sha3/sha3.cpp
+++ b/src/lib/hash/sha3/sha3.cpp
@@ -11,47 +11,23 @@
 #include <botan/exceptn.h>
 #include <botan/cpuid.h>
 
-#include <tuple>
-
 namespace Botan {
 
 namespace {
 
-// This is a workaround for a suspected bug in clang 12 (and XCode 13)
-// that caused a miscompile of the SHA3 implementation for optimization
-// level -O2 and higher.
-//
-// For details, see: https://github.com/randombit/botan/issues/2802
-#if    defined(__clang__) && \
-    (( defined(__apple_build_version__) && __clang_major__ == 13) || \
-     (!defined(__apple_build_version__) && __clang_major__ == 12))
-#define BOTAN_WORKAROUND_MAYBE_INLINE __attribute__((noinline))
-#else
-#define BOTAN_WORKAROUND_MAYBE_INLINE inline
-#endif
-
-BOTAN_WORKAROUND_MAYBE_INLINE std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>
-   xor_CNs(const uint64_t A[25])
-   {
-   return {
-      A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20],
-      A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21],
-      A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22],
-      A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23],
-      A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24]};
-   }
-
-#undef BOTAN_WORKAROUND_MAYBE_INLINE
-
 inline void SHA3_round(uint64_t T[25], const uint64_t A[25], uint64_t RC)
    {
-   const auto Cs = xor_CNs(A);
-
-   const uint64_t D0 = rotl<1>(std::get<0>(Cs)) ^ std::get<3>(Cs);
-   const uint64_t D1 = rotl<1>(std::get<1>(Cs)) ^ std::get<4>(Cs);
-   const uint64_t D2 = rotl<1>(std::get<2>(Cs)) ^ std::get<0>(Cs);
-   const uint64_t D3 = rotl<1>(std::get<3>(Cs)) ^ std::get<1>(Cs);
-   const uint64_t D4 = rotl<1>(std::get<4>(Cs)) ^ std::get<2>(Cs);
+   const uint64_t C0 = A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20];
+   const uint64_t C1 = A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21];
+   const uint64_t C2 = A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22];
+   const uint64_t C3 = A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23];
+   const uint64_t C4 = A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24];
+
+   const uint64_t D0 = rotl<1>(C0) ^ C3;
+   const uint64_t D1 = rotl<1>(C1) ^ C4;
+   const uint64_t D2 = rotl<1>(C2) ^ C0;
+   const uint64_t D3 = rotl<1>(C3) ^ C1;
+   const uint64_t D4 = rotl<1>(C4) ^ C2;
 
    const uint64_t B00 =          A[ 0] ^ D1;
    const uint64_t B01 = rotl<44>(A[ 6] ^ D2);
diff --git a/src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp b/src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp
index c7f1914a3..a9650ad9d 100644
--- a/src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp
+++ b/src/lib/hash/sha3/sha3_bmi2/sha3_bmi2.cpp
@@ -8,47 +8,23 @@
 #include <botan/sha3.h>
 #include <botan/rotate.h>
 
-#include <tuple>
-
 namespace Botan {
 
 namespace {
 
-// This is a workaround for a suspected bug in clang 12 (and XCode 13)
-// that caused a miscompile of the SHA3 implementation for optimization
-// level -O2 and higher.
-//
-// For details, see: https://github.com/randombit/botan/issues/2802
-#if    defined(__clang__) && \
-    (( defined(__apple_build_version__) && __clang_major__ == 13) || \
-     (!defined(__apple_build_version__) && __clang_major__ == 12))
-#define BOTAN_WORKAROUND_MAYBE_INLINE __attribute__((noinline))
-#else
-#define BOTAN_WORKAROUND_MAYBE_INLINE inline
-#endif
-
-BOTAN_WORKAROUND_MAYBE_INLINE std::tuple<uint64_t, uint64_t, uint64_t, uint64_t, uint64_t>
-   xor_CNs(const uint64_t A[25])
-   {
-   return {
-      A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20],
-      A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21],
-      A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22],
-      A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23],
-      A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24]};
-   }
-
-#undef BOTAN_WORKAROUND_MAYBE_INLINE
-
 inline void SHA3_BMI2_round(uint64_t T[25], const uint64_t A[25], uint64_t RC)
    {
-   const auto Cs = xor_CNs(A);
-
-   const uint64_t D0 = rotl<1>(std::get<0>(Cs)) ^ std::get<3>(Cs);
-   const uint64_t D1 = rotl<1>(std::get<1>(Cs)) ^ std::get<4>(Cs);
-   const uint64_t D2 = rotl<1>(std::get<2>(Cs)) ^ std::get<0>(Cs);
-   const uint64_t D3 = rotl<1>(std::get<3>(Cs)) ^ std::get<1>(Cs);
-   const uint64_t D4 = rotl<1>(std::get<4>(Cs)) ^ std::get<2>(Cs);
+   const uint64_t C0 = A[0] ^ A[5] ^ A[10] ^ A[15] ^ A[20];
+   const uint64_t C1 = A[1] ^ A[6] ^ A[11] ^ A[16] ^ A[21];
+   const uint64_t C2 = A[2] ^ A[7] ^ A[12] ^ A[17] ^ A[22];
+   const uint64_t C3 = A[3] ^ A[8] ^ A[13] ^ A[18] ^ A[23];
+   const uint64_t C4 = A[4] ^ A[9] ^ A[14] ^ A[19] ^ A[24];
+
+   const uint64_t D0 = rotl<1>(C0) ^ C3;
+   const uint64_t D1 = rotl<1>(C1) ^ C4;
+   const uint64_t D2 = rotl<1>(C2) ^ C0;
+   const uint64_t D3 = rotl<1>(C3) ^ C1;
+   const uint64_t D4 = rotl<1>(C4) ^ C2;
 
    const uint64_t B00 =          A[ 0] ^ D1;
    const uint64_t B01 = rotl<44>(A[ 6] ^ D2);
-- 
2.33.0