//
// Created by dvc890 on 8/23/21.
//

#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 //PING_ENGINE_ANDROID_BOLT_CRYPT_H