130 lines
2.7 KiB
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;
|
|
}
|