134 lines
2.8 KiB
C++
134 lines
2.8 KiB
C++
#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;
|
|
}
|
|
|