diff --git a/src/util/obfuscation.h b/src/util/obfuscation.h index a9de5f2f038..e9a2e6093b6 100644 --- a/src/util/obfuscation.h +++ b/src/util/obfuscation.h @@ -36,21 +36,21 @@ public: KeyType rot_key{m_rotations[key_offset % KEY_SIZE]}; // Continue obfuscation from where we left off if (target.size() > KEY_SIZE) { - // Obfuscate until 64-bit alignment boundary - if (const auto misalign{std::bit_cast(target.data()) % KEY_SIZE}) { - const size_t alignment{std::min(KEY_SIZE - misalign, target.size())}; + // Obfuscate until KEY_SIZE alignment boundary + if (const auto misalign{reinterpret_cast(target.data()) % KEY_SIZE}) { + const size_t alignment{KEY_SIZE - misalign}; XorWord(target.first(alignment), rot_key); target = {std::assume_aligned(target.data() + alignment), target.size() - alignment}; rot_key = m_rotations[(key_offset + alignment) % KEY_SIZE]; } - // Aligned obfuscation in 64-byte chunks + // Aligned obfuscation in 8*KEY_SIZE chunks for (constexpr auto unroll{8}; target.size() >= KEY_SIZE * unroll; target = target.subspan(KEY_SIZE * unroll)) { for (size_t i{0}; i < unroll; ++i) { XorWord(target.subspan(i * KEY_SIZE, KEY_SIZE), rot_key); } } - // Aligned obfuscation in 64-bit chunks + // Aligned obfuscation in KEY_SIZE chunks for (; target.size() >= KEY_SIZE; target = target.subspan(KEY_SIZE)) { XorWord(target.first(), rot_key); }