#include "encrypt.h" ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // exporting api: dyn_mem_ptr packet_encrypt(dyn_mem_ptr packet, uint32_t cmd_type, uint32_t type, uint8_t enc_data) { dyn_mem_ptr ret = packet; LPPACK_BASE pack = (LPPACK_BASE)packet->ptr(); ret->add_ref(); if (cmd_type == ENCRYPT_CMD_XOR_PID) pack->cmd ^= pack->pack_id; else if (cmd_type == ENCRYPT_CMD_ADD_PID) pack->cmd += pack->pack_id; else if (cmd_type == ENCRYPT_CMD_SUB_PID) pack->cmd -= pack->pack_id; pack->enc_cmd = cmd_type; if (type != ENCRYPT_NONE) { std::string cont(""); if (type == ENCRYPT_BASE64) { } else if (type == ENCRYPT_AES) { } else if (type == ENCRYPT_ZIP) { } if (cont.length()) { // space is enough ? if (cont.length() + sizeof(PACK_BASE) > packet->space()) { ret->release(); ret = dyn_mem::memory(sizeof(PACK_BASE) + cont.length()); memcpy(ret->ptr(), packet->ptr(), sizeof(PACK_BASE)); pack = (LPPACK_BASE)ret->ptr(); } // copy cipher text and set encrypt type ... memcpy(pack->payload, cont.c_str(), cont.length()); ret->set_len(sizeof(PACK_BASE) + cont.length()); pack->payload_len = cont.length(); pack->encrypt = type; pack->enc_data = enc_data; } } return ret; } dyn_mem_ptr packet_decrypt(dyn_mem_ptr packet) { dyn_mem_ptr ret = packet; LPPACK_BASE pack = (LPPACK_BASE)packet->ptr(); ret->add_ref(); if (pack->enc_cmd == ENCRYPT_CMD_XOR_PID) pack->cmd ^= pack->pack_id; else if (pack->enc_cmd == ENCRYPT_CMD_ADD_PID) pack->cmd -= pack->pack_id; else if (pack->enc_cmd == ENCRYPT_CMD_SUB_PID) pack->cmd += pack->pack_id; if (pack->encrypt != ENCRYPT_NONE && pack->payload_len && packet->get_rest() >= sizeof(PACK_BASE) + pack->payload_len) { std::string cont(""); if (pack->encrypt == ENCRYPT_BASE64) { } else if (pack->encrypt == ENCRYPT_AES) { } else if (pack->encrypt == ENCRYPT_ZIP) { } if (cont.length()) { // have out-packet data ? if (packet->get_rest() > sizeof(PACK_BASE) + pack->payload_len) cont += std::string(pack->payload + pack->payload_len, packet->get_rest() - (sizeof(PACK_BASE) + pack->payload_len)); // space is enough ? if (cont.length() + sizeof(PACK_BASE) > packet->space()) { ret->release(); ret = dyn_mem::memory(sizeof(PACK_BASE) + cont.length()); memcpy(ret->ptr(), packet->ptr(), sizeof(PACK_BASE)); pack = (LPPACK_BASE)ret->ptr(); } // copy plain text and set encrypt type to none ... memcpy(pack->payload, cont.c_str(), cont.length()); ret->set_len(sizeof(PACK_BASE) + cont.length()); pack->encrypt = ENCRYPT_NONE; pack->payload_len = cont.length(); } } return ret; }