metasploit-framework/external/source/exploits/drunkpotato/Common_Src_Files/base64.c

130 lines
2.7 KiB
C

#include "pch.h"
/**
Takes data, allocate a buffer in heap of size 4/3 + 2 to handle the result,
base64 encode it and returns a pointer to result buffer.
@param const unsigned char* data The data to be encoded.
@param unsigned short input_length Length of unencoded data (length of previous arg)
@param unsigned short input_length An address to handle the length of b64 encoded result data.
Will be 4/3 + 2 of input_length
@return char* A pointer to the heap buffer containing the b64 encoded result
*/
char* base64_encode(const unsigned char* data,
unsigned short input_length,
unsigned short* output_length)
{
char* encoded_data = NULL;
DWORD local_output_len = 0;
if (!CryptBinaryToStringA
(
data,
input_length,
CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF,
NULL,
&local_output_len
))
{
return NULL;
}
encoded_data = (char*)calloc(local_output_len, sizeof(char));
if (!encoded_data)
{
return NULL;
}
if (!CryptBinaryToStringA
(
data,
input_length,
CRYPT_STRING_BASE64 | CRYPT_STRING_NOCRLF,
encoded_data,
&local_output_len
))
{
return NULL;
}
if (local_output_len <= 65535)
{
*output_length = (unsigned short)local_output_len;
}
else
return NULL;
return encoded_data;
}
/**
Builds a decoding table in heap. Then takes base 64 encoded data data,
allocate a buffer in heap of size 3/4 of input length to handle the result,
base64 decode it and returns a pointer to the result buffer. Then, free the
base64 decoding table.
@param const unsigned char* data The data to be decoded.
@param unsigned short input_length Length of encoded data (length of previous arg)
@param unsigned short input_length An address to handle the length of b64 encoded result data.
Will be 3/4 of input_length
@return char* A pointer to the heap buffer containing the decoded result
*/
unsigned char* base64_decode(const char* data,
unsigned short input_length,
unsigned short* output_length)
{
unsigned char* decoded_data = NULL;
DWORD local_output_len = 0;
if (!CryptStringToBinaryA
(
data,
0,
CRYPT_STRING_BASE64,
NULL,
&local_output_len,
NULL,
NULL
))
{
return NULL;
}
decoded_data = (unsigned char*)calloc(local_output_len, sizeof(char));
if (!decoded_data)
{
return NULL;
}
if (!CryptStringToBinaryA
(
data,
0,
CRYPT_STRING_BASE64,
decoded_data,
&local_output_len,
NULL,
NULL
))
{
return NULL;
}
if (local_output_len <= 65535)
{
*output_length = (unsigned short)local_output_len;
}
else
return NULL;
return decoded_data;
}