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 
12 namespace 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
28 constexpr 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 
40 constexpr const unsigned long long XORKEY = XSTR_RANDOM_NUMBER(0, 0xFF);
41 
42 // -----------------------------------------------------------------------------
43 
44 template<typename Char> constexpr Char encrypt_character( const Char character, int index )
45 {
46  return character ^ static_cast<Char>( XORKEY + index );
47 }
48 
49 // -----------------------------------------------------------------------------
50 
51 template <unsigned size, typename Char> class Xor_string
52 {
53 public:
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
LicenseSpring::XORKEY
constexpr const unsigned long long XORKEY
Definition: EncryptString.h:40
LicenseSpring::Xor_string::_string
Char _string[size]
Definition: EncryptString.h:55
LicenseSpring::Xor_string::Xor_string
constexpr Xor_string(const Char *string)
Definition: EncryptString.h:58
LicenseSpring::Xor_string
Definition: EncryptString.h:51
LicenseSpring::Xor_string::decrypt
const Char * decrypt()
Definition: EncryptString.h:65
LicenseSpring
Definition: BaseManager.h:15
LicenseSpring::linear_congruent_generator
constexpr unsigned long long linear_congruent_generator(unsigned rounds)
Definition: EncryptString.h:28
LicenseSpring::encrypt_character
constexpr Char encrypt_character(const Char character, int index)
Definition: EncryptString.h:44
XSTR_RANDOM_NUMBER
#define XSTR_RANDOM_NUMBER(Min, Max)
Definition: EncryptString.h:36
TBX_XSTR_SEED
#define TBX_XSTR_SEED
Definition: EncryptString.h:17
LicenseSpring::Xor_string::_nb_chars
const unsigned _nb_chars
Definition: EncryptString.h:54