rodecomp/Source/Utility/Cipher/Obfuscate.h
ragnarok-clanker 91764efdbf Maintenance: OBFUSCATE_STRING: the client's string encryption is the public-domain Obfuscate library (AY_OBFUSCATE_KEY: every key is
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.
2026-11-11 21:53:17 +00:00

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