|
|
|
|
|
|
|
|
|
#ifndef PING_ENGINE_ANDROID_BOLT_CRYPT_H |
|
#define PING_ENGINE_ANDROID_BOLT_CRYPT_H |
|
|
|
enum CRYPT_TYPE { |
|
NONE = 0, |
|
XOR = 1 |
|
}; |
|
|
|
namespace xor_ { |
|
static void crypt(char* data, int data_len, char key){ |
|
for (int i = 0; i < data_len; i++){ |
|
data[i] = data[i] ^ key; |
|
} |
|
} |
|
|
|
static void crypt2(const char* indata, int data_len, char key, char* outdata) { |
|
for (int i = 0; i < data_len; i++){ |
|
outdata[i] = indata[i] ^ key; |
|
} |
|
} |
|
} |
|
|
|
|
|
#define GENERATE_ENCRYPT_EXTEN(extend, extend_len, encrypt) \ |
|
char extend[6] = {0}; \ |
|
int extend_len = 0; \ |
|
if(encrypt) { \ |
|
extend_len = sprintf(extend, "ept=1"); \ |
|
} \ |
|
|
|
#define GENERATE_DECRYPT_KEY(extend, extend_len, ept_type, ept_key) \ |
|
char extend[21] = {0}; \ |
|
int extend_len = 0; \ |
|
int type_len = snprintf(extend, sizeof(extend), "ept_type=%d", ept_type); \ |
|
if (ept_type == XOR) { \ |
|
extend_len = snprintf(extend + type_len, sizeof(extend) - type_len, ";ept_key=%c", ept_key);\ |
|
} \ |
|
|
|
#define EXTRACTION_DECRYPT_KEY(ept_type, ept_key, extend, extend_len) \ |
|
CRYPT_TYPE ept_type = NONE; \ |
|
char ept_key; \ |
|
if(extend_len > 0) { \ |
|
if(char* type_ptr = strstr(extend, "ept_type")) { \ |
|
ept_type = (CRYPT_TYPE)(type_ptr[9]); \ |
|
} \ |
|
switch (ept_type) { \ |
|
case XOR: { \ |
|
if(char* key_ptr = strstr(extend, "ept_key")) { \ |
|
ept_key = key_ptr[8]; \ |
|
} \ |
|
break; \ |
|
} \ |
|
default: \ |
|
break; \ |
|
} \ |
|
} \ |
|
|
|
#endif |
|
|