LicenseSpring C++ SDK 7.31.0
Easily add Software Licensing to your application
EncryptString.h
Go to the documentation of this file.
1#ifndef LS_ENCRYPT_STRING_H
2#define LS_ENCRYPT_STRING_H
3
4// -----------------------------------------------------------------------------------------------------------------
5// This code provided as is, without any guarantees.
6// Credit to https://stackoverflow.com/questions/4102320/c-how-to-encrypt-strings-at-compile-time/56847099#56847099
7// https://creativecommons.org/licenses/by-sa/4.0/
8// -----------------------------------------------------------------------------------------------------------------
9
10#include <iostream>
11
12namespace LicenseSpring
13{
14
15#if 1
16// Convert __TIME__ == "hh:mm:ss" to a sum of seconds this gives a compile-time seed
17#define TBX_XSTR_SEED ((__TIME__[7] - '0') * 1ull + (__TIME__[6] - '0') * 10ull + \
18 (__TIME__[4] - '0') * 60ull + (__TIME__[3] - '0') * 600ull + \
19 (__TIME__[1] - '0') * 3600ull + (__TIME__[0] - '0') * 36000ull)
20#else
21// Use constant seed
22#define TBX_XSTR_SEED (3600ull)
23#endif
24
25// -----------------------------------------------------------------------------
26
27// return a pseudo random number clamped at 0xFFFFFFFF
28constexpr unsigned long long linear_congruent_generator( unsigned rounds )
29{
30 return 1013904223ull + (1664525ull * ((rounds> 0) ? linear_congruent_generator(rounds - 1) : (TBX_XSTR_SEED) )) % 0xFFFFFFFF;
31}
32
33// -----------------------------------------------------------------------------
34
35#define Random_LCG() linear_congruent_generator(10)
36#define XSTR_RANDOM_NUMBER(Min, Max) (Min + (Random_LCG() % (Max - Min + 1)))
37
38// -----------------------------------------------------------------------------
39
40constexpr const unsigned long long XORKEY = XSTR_RANDOM_NUMBER(0, 0xFF);
41
42// -----------------------------------------------------------------------------
43
44template<typename Char> constexpr Char encrypt_character( const Char character, int index )
45{
46 return character ^ static_cast<Char>( XORKEY + index );
47}
48
49// -----------------------------------------------------------------------------
50
51template <unsigned size, typename Char> class Xor_string
52{
53public:
54 const unsigned _nb_chars = (size - 1);
55 Char _string[size];
56
57 // If everything goes right this constructor should be executed at compile time
58 inline constexpr Xor_string( const Char* string ) : _string{}
59 {
60 for( unsigned i = 0u; i < size; ++i )
61 _string[i] = encrypt_character<Char>( string[i], i );
62 }
63
64 // This is executed at runtime
65 const Char* decrypt()
66 {
67 Char* string = _string;
68 for( unsigned t = 0; t < _nb_chars; t++ )
69 string[t] = string[t] ^ static_cast<Char>( XORKEY + t );
70 string[ _nb_chars ] = '\0';
71 return string;
72 }
73};
74
75} // namespace LicenseSpring
76
77// -----------------------------------------------------------------------------
78
79#define XorS(name, my_string) constexpr LicenseSpring::Xor_string<(sizeof(my_string)/sizeof(char)), char> name(my_string)
80#define XorString(my_string) []{ constexpr LicenseSpring::Xor_string<(sizeof(my_string)/sizeof(char)), char> expr(my_string); return expr; }().decrypt()
81
82#define XorWS(name, my_string) constexpr LicenseSpring::Xor_string<(sizeof(my_string)/sizeof(wchar_t)), wchar_t> name(my_string)
83#define XorWideString(my_string) []{ constexpr LicenseSpring::Xor_string<(sizeof(my_string)/sizeof(wchar_t)), wchar_t> expr(my_string); return expr; }().decrypt()
84
92#define EncryptStr(s) XorString(s)
93
101#define EncryptWStr(s) XorWideString(s)
102
103#endif // LS_ENCRYPT_STRING_H
#define XSTR_RANDOM_NUMBER(Min, Max)
Definition: EncryptString.h:36
#define TBX_XSTR_SEED
Definition: EncryptString.h:17
constexpr Xor_string(const Char *string)
Definition: EncryptString.h:58
const unsigned _nb_chars
Definition: EncryptString.h:54
constexpr Char encrypt_character(const Char character, int index)
Definition: EncryptString.h:44
constexpr unsigned long long linear_congruent_generator(unsigned rounds)
Definition: EncryptString.h:28
constexpr const unsigned long long XORKEY
Definition: EncryptString.h:40