Batch #17343 by ragnarok-clanker: no function's compiled code changes; checked with 10 compiled unit(s), including every includer of Source/Utility/Cipher/Obfuscate.h.
83 lines
2.5 KiB
C++
83 lines
2.5 KiB
C++
#ifndef RAGNAROK_SOURCE_UTILITY_CIPHER_OBFUSCATE_H
|
|
#define RAGNAROK_SOURCE_UTILITY_CIPHER_OBFUSCATE_H
|
|
|
|
#include <array>
|
|
#include <cstddef>
|
|
#include <cstdint>
|
|
|
|
namespace utility {
|
|
|
|
template <std::size_t Length, std::uint64_t Key>
|
|
class Obfuscator {
|
|
public:
|
|
// INLINED
|
|
consteval explicit Obfuscator(const char (&text)[Length]) : m_data{} {
|
|
for (std::size_t index = 0; index < Length; ++index) {
|
|
this->m_data[index] = static_cast<char>(text[index] ^ static_cast<char>(Key >> ((index % 8) * 8)));
|
|
}
|
|
}
|
|
|
|
// INLINED
|
|
template <typename Element>
|
|
consteval std::array<Element, Length> Array() const {
|
|
std::array<Element, Length> out{};
|
|
for (std::size_t index = 0; index < Length; ++index) {
|
|
out[index] = static_cast<Element>(this->m_data[index]);
|
|
}
|
|
return out;
|
|
}
|
|
|
|
char m_data[Length];
|
|
};
|
|
|
|
}
|
|
|
|
#define OBFUSCATE_NAME_(text, key, variable) \
|
|
constexpr ::utility::Obfuscator<sizeof(text), key> obfuscator(text); \
|
|
thread_local EncryptedName<sizeof(text), key> variable(obfuscator.m_data)
|
|
|
|
#define OBFUSCATE_NAME_SOURCE_(text, key, variable) \
|
|
constexpr ::utility::Obfuscator<sizeof(text), key> obfuscator(text); \
|
|
constexpr EncryptedSource<sizeof(text)> source(obfuscator.m_data); \
|
|
thread_local EncryptedName<sizeof(text), key> variable(source)
|
|
|
|
#define OBFUSCATE_NAME_ARRAY_(text, key, element, variable) \
|
|
constexpr std::array<element, sizeof(text)> source = ::utility::Obfuscator<sizeof(text), key>(text).Array<element>(); \
|
|
thread_local EncryptedName<sizeof(text), key> variable(source)
|
|
|
|
#define OBFUSCATE_ARRAY(text, key, element) \
|
|
[]() -> EncryptedName<sizeof(text), key>& { \
|
|
OBFUSCATE_NAME_ARRAY_(text, key, element, name); \
|
|
return name; \
|
|
}()
|
|
|
|
#define OBFUSCATE_ARRAY_BODY(text, key, element) \
|
|
OBFUSCATE_NAME_ARRAY_(text, key, element, name); \
|
|
return name
|
|
|
|
#define OBFUSCATE_STRING_BODY(text, key) \
|
|
OBFUSCATE_NAME_(text, key, name); \
|
|
return name
|
|
|
|
#define OBFUSCATE_STRING(text, key) \
|
|
[]() -> EncryptedName<sizeof(text), key>& { \
|
|
OBFUSCATE_NAME_(text, key, name); \
|
|
return name; \
|
|
}()
|
|
|
|
#define OBFUSCATE_TEXT_NAMED(text, key, variable) \
|
|
[]() { \
|
|
OBFUSCATE_NAME_(text, key, variable); \
|
|
return variable.Text(); \
|
|
}()
|
|
|
|
#define OBFUSCATE_SOURCE_TEXT_NAMED(text, key, variable) \
|
|
[]() { \
|
|
OBFUSCATE_NAME_SOURCE_(text, key, variable); \
|
|
return variable.Text(); \
|
|
}()
|
|
|
|
#define OBFUSCATE_TEXT(text, key) OBFUSCATE_TEXT_NAMED(text, key, name)
|
|
#define OBFUSCATE_SOURCE_TEXT(text, key) OBFUSCATE_SOURCE_TEXT_NAMED(text, key, name)
|
|
|
|
#endif
|