Introduction
This page describes the secure variable feature of Hercules.
Before using the secure variable feature, you first have to setup the Hive SDK beforehand.
A secure variable has the following characteristics:
- It is a encrypted value in memory so that it cannot be retrieved by external tools.
- Even if the encrypted value is tampered with, it will be verified when it is read.
- The supported languages include C/C++ and C# (Unity).
How to Use Secure Variable
C# (Unity)
- Basically, the data types available in C# can be used as a Generic class.
- There are secure data types that match each data type as follows.
- Since all basic types are cast to 8-byte types, it is recommended to use 8-byte types, such as using long instead of int and double instead of float.
| Basic Type | Secured Type | Basic Type | Secured Type | 
|---|---|---|---|
| bool | HerculesVar<bool> | int | HerculesVar<int> | 
| char | HerculesVar<char> | uint | HerculesVar<uint> | 
| sbyte | HerculesVar<sbyte> | long | HerculesVar<long> | 
| byte | HerculesVar<byte> | ulong | HerculesVar<ulong> | 
| short | HerculesVar<short> | float | HerculesVar<float> | 
| ushort | HerculesVar<ushort> | double | HerculesVar<double> | 
| string | HerculesString | 
C# Example
    | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | // The two codes below do the same thing and allocate a new object.      HerculesVar x = 100;      HerculesVar y = new HerculesVar(100); int a = x;    // The value is copied from the secure variable to the normal variable. y = 300;     // The old object allocated to y is released and the new object is re-allocated to y. y.Set(300);   // Change the value of y. (y should already have been assigned with an object, and this type of allocation is faster than the above one.) y = (int)x;    // y is reassigned as the value of x. Both x and y starts to refer a different object other than the original object assigned to x. y = x;        // caution: y will refer to x. If you use the Set function, the both values are replaced. // If a build error occurs when directly operating an unsigned type secure variable // U must be specified after a constant or you should use explicit casting. (as 1U or (uint)1) // For the frequently updated values, it is advantageous to use it as obj.Set(v); form for better performance. // A string can be used like this: Only in-memory strings are protected. // When assigning a static string like “TEST”, the original string may be exposed to the code. HerculesString securityString = <A string value downloaded from the server or generated dynamically>; string plainString = securityString; | 
iOS, Android
- In case of C, whenever you save or read the value of a variable, you must directly call the API, so it is recommended to use C++. C++ has a template class defined.
- If possible, it is recommended to use the secure variable as a global variable or to use it after placing it in a place where allocation and deallocation are not performed too frequently.
- Do not put #include statements inside an exteren "C"block.
- It should be used after the Hive SDK is initialized.
C++
    | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include "Hercules.h" class CUserInfo { public:     CHercules hp;     CHercules mp;     CHercules critical; }; // If it is used as a global variable, an issue occurs because the variable is tried to be initialized before the Hive SDK is initialized. // CHercules g_temp; // When using it as a global variable, declare it in the form of a pointer as follows. CUserInfo *g_user; CHercules *g_var; CHerculesString *g_string; void BeginBattle) {     // Creates a secure variable. (Example: at the start of a battle in a game)     g_user = new CUserInfo;     g_var = new CHercules;     g_string = new CHerculesString(<A string value downloaded from the server or generated dynamically>); } void EndBattle) {      // Deletes the secure variable. (Example: at the end of a battle in a game)      delete g_user; delete g_var; delete g_string; g_user = nullptr; … } void Sample() {     // Assignments can be made in any form as shown below.     int localvar = 0;     CHercules x = localvar;     *g_var = localvar;     *g_var = x + 2;     g_user->hp = 100;     // When assigning a static string like “TEST”, the original string may be exposed to the code. CHerculesString localSecurityString1 = <A new string downloaded from the server or generated dynamically>; // initialize to string CHerculesString localSecurityString2 = *g_securityString; // Initialize to a CHerculesString object      std::string localString = *g_securityString; // CHerculesString to std::string  localSecurityString2 = localSecurityString1; // CHerculesString to CHerculesString  localSecurityString1 = localString.c_str(); // std::string to CHerculesString } | 
C Example
    | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | #include "Hercules.h" HERCULES g_x; HERCULES g_y; HERCULES g_str; void callbackint error, const char *message) {     // puts"Detected !"); } void StartApp) {      // Creates a secure variable.      // Can be used by putting basic types and structure variables.      int var = 0;      g_x = HerculesAddVar(&var, sizeof(var)); g_y = HerculesAddVar(&var, sizeof(var)); // When assigning a static string like “TEST”, the original string may be exposed to the code. g_str = HerculesAddVar(<A string downloaded from the server or generated dynamically>); } void Sample() {     // Gets the value of x and store it in y. At this time, the second parameter set in each function     // must be a variable with the same size as the size set when calling HerculesAddVar.     int var;     HerculesGetVar(g_x, &var);     HerculesSetVar(g_y, &var);     // After you get the secured string as a regular string, you need to free it with the HerculesFreeMem function.     char *str = HerculesGetString(g_str);     HerculesFreeMem(str);     // Before assigning a new string variable, it must be deleted using the HerculesRemoveVar function.     HerculesRemoveVar(g_str);     g_str = HerculesAddString(<A new string downloaded from the server or generated dynamically>); } | 
Reference (C++)
- Use it when the secure variable is initialized with a value. (the status that an object is allocated)
- Use it as assigning the final result, which is generated after all the necessary calculations are completed.
- Refer to the example below. (C++ has operator overloading.)
- Recommended:
| 1 2 3 4 5 6 7 8 9 | // CHercules *securityVar = ... int var = 0; int values[5] = {5, 4, 6, 8, 11}; forint i = 0; i < 5; i++)     sum += values[i]; *securityVar += sum; | 
- Not Recommended (Frequent Access)
| 1 2 3 4 5 6 | // CHercules *securityVar = ... int values[5] = {5, 4, 6, 8, 11}; forint i = 0; i < 5; i++)     *securityVar += values[i]; | 
