diff --git a/obfuscator.hpp b/obfuscator.hpp index 4bab960..65f01a1 100644 --- a/obfuscator.hpp +++ b/obfuscator.hpp @@ -1,13 +1,117 @@ #ifndef OBFUSCATOR_HPP #define OBFUSCATOR_HPP +#include #include +#define COMPILE_TIME_RANDOM +#define OBFS_RAND_VAL(MOD) RAND_VAL<__LINE__, MOD> +#define COMPILE_TIME_SEQUENCE #define STRING_OBFS namespace obfs { - template + constexpr char TIME[] = __TIME__; + constexpr int digit(char c) { + return c - '0'; + } + constexpr int SEED = digit(TIME[7]) + + digit(TIME[6]) * 10 + + digit(TIME[4]) * 60 + + digit(TIME[3]) * 600 + + digit(TIME[1]) * 3600 + + digit(TIME[0]) * 36000; + + using size_t = decltype(sizeof(void*)); + + template + struct Xorshiftplus { + using prev = Xorshiftplus; + + constexpr static size_t update() { + constexpr size_t x = prev::state0 ^ (prev::state0 << 23); + constexpr size_t y = prev::state1; + return x ^ y ^ (x >> 17) ^ (y >> 26); + } + + constexpr static size_t state0 = prev::state1; + constexpr static size_t state1 = update(); + + constexpr static size_t value = state0 + state1; + }; + + template <> + struct Xorshiftplus<0> { + constexpr static size_t state0 = static_cast(SEED); + constexpr static size_t state1 = static_cast(SEED << 1); + constexpr static size_t value = state0 + state1; + }; + + template + constexpr size_t RAND_VAL = Xorshiftplus::value % Mod; +} + + +namespace obfs { + template + struct Sequence; + + template + struct Sequence { + using value_type = T; + constexpr static T value = Val; + + using now = Sequence; + using next = Sequence; + + template + using get = std::conditional_t>; + }; + + template + struct Sequence { + using value_type = T; + constexpr static T value = Val; + + template + using get = std::enable_if_t>; + }; + + template + struct TypeSeq { + using type = T; + using next = TypeSeq; + + // template + // using get = std::conditional_t>; + }; + + template + struct TypeSeq { + using type = T; + + // template + // using get = std::enable_if_t; + }; + + template + struct SeqPack { + constexpr static std::size_t size = sizeof...(T); + + template + using single_elem = Sequence::value>; + + template + using get = TypeSeq...>; + }; +} + + +namespace obfs { + using Encoder = char(*)(char); + using Decoder = char(*)(char); + + template class String { public: template @@ -32,10 +136,31 @@ namespace obfs { mutable char str[size]; }; - template + template constexpr auto make_string(char const (&str)[size]) { return String(str, std::make_index_sequence()); } + + template + using encoder_seq = Sequence; + + template + using decoder_seq = Sequence; + + template + using make_table = SeqPack; + + template + constexpr auto make_string(char const (&str)[size]) { + using pair = Table::get; + // constexpr Encoder encoder = pair::get<0>::value; + // constexpr Decoder decoder = pair::get<1>::value; + + constexpr Encoder encoder = pair::type::value; + constexpr Decoder decoder = pair::next::type::value; + + return make_string(str); + } } diff --git a/obfuscator/obfuscator.hpp b/obfuscator/obfuscator.hpp index 6e80c46..29e022e 100644 --- a/obfuscator/obfuscator.hpp +++ b/obfuscator/obfuscator.hpp @@ -1,6 +1,8 @@ #ifndef OBFUSCATOR #define OBFUSCATOR -#include "impl/string_obfs.hpp" +#include "impl/random.hpp" +#include "impl/sequence.hpp" +#include "impl/string.hpp" #endif \ No newline at end of file