|
5 | 5 | #include "sha3/sha3_256.hpp" |
6 | 6 | #include "sha3/sha3_512.hpp" |
7 | 7 | #include "sha3/shake256.hpp" |
| 8 | +#include "subtle.hpp" |
8 | 9 | #include <algorithm> |
9 | 10 | #include <array> |
10 | 11 | #include <cstddef> |
@@ -88,15 +89,15 @@ encapsulate(std::span<const uint8_t, 32> m, |
88 | 89 | const auto has_mod_check_passed = k_pke::encrypt<k, eta1, eta2, du, dv>(pubkey, m, g_out_span1, cipher); |
89 | 90 | if (!has_mod_check_passed) { |
90 | 91 | // Got an invalid public key |
91 | | - ml_kem_utils::secure_zeroize(g_in); |
92 | | - ml_kem_utils::secure_zeroize(g_out); |
| 92 | + subtle::ct_zeroize(g_in_span); |
| 93 | + subtle::ct_zeroize(g_out_span); |
93 | 94 | return has_mod_check_passed; |
94 | 95 | } |
95 | 96 |
|
96 | 97 | std::copy(g_out_span0.begin(), g_out_span0.end(), shared_secret.begin()); |
97 | 98 |
|
98 | | - ml_kem_utils::secure_zeroize(g_in); |
99 | | - ml_kem_utils::secure_zeroize(g_out); |
| 99 | + subtle::ct_zeroize(g_in_span); |
| 100 | + subtle::ct_zeroize(g_out_span); |
100 | 101 | return true; |
101 | 102 | } |
102 | 103 |
|
@@ -158,14 +159,14 @@ decapsulate(std::span<const uint8_t, ml_kem_utils::get_kem_secret_key_len(k)> se |
158 | 159 | (void)k_pke::encrypt<k, eta1, eta2, du, dv>(pubkey, g_in_span0, g_out_span1, c_prime); |
159 | 160 |
|
160 | 161 | // line 9-12 of algorithm 17, in constant-time |
161 | | - using kdf_t = std::span<const uint8_t, shared_secret.size()>; |
162 | | - const uint32_t cond = ml_kem_utils::ct_memcmp(cipher, std::span<const uint8_t, ctlen>(c_prime)); |
163 | | - ml_kem_utils::ct_cond_memcpy(cond, shared_secret, kdf_t(g_out_span0), kdf_t(j_out)); |
164 | | - |
165 | | - ml_kem_utils::secure_zeroize(g_in); |
166 | | - ml_kem_utils::secure_zeroize(g_out); |
167 | | - ml_kem_utils::secure_zeroize(j_out); |
168 | | - ml_kem_utils::secure_zeroize(c_prime); |
| 162 | + std::copy(j_out.begin(), j_out.end(), shared_secret.begin()); |
| 163 | + const uint32_t cond = subtle::ct_memcmp<uint8_t, uint32_t>(cipher, std::span<const uint8_t, ctlen>(c_prime)); |
| 164 | + subtle::ct_conditional_memcpy<uint32_t, uint8_t, 32>(cond, shared_secret, g_out_span0); |
| 165 | + |
| 166 | + subtle::ct_zeroize(g_in_span); |
| 167 | + subtle::ct_zeroize(g_out_span); |
| 168 | + subtle::ct_zeroize(std::span(j_out)); |
| 169 | + subtle::ct_zeroize(std::span(c_prime)); |
169 | 170 | } |
170 | 171 |
|
171 | 172 | } |
0 commit comments