You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.0 KiB
151 lines
4.0 KiB
8 years ago
|
//++ BulliT
|
||
|
|
||
|
#include "agbase64.h"
|
||
|
#include <string.h>
|
||
|
#include <assert.h>
|
||
|
|
||
|
// define the US-ASCII chars
|
||
|
static char s_szBase64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\0";
|
||
|
|
||
|
// how many bits per byte?
|
||
|
#define NUM_BITS 8
|
||
|
#define BYTES_TO_READ 60 // only for my test method Encode-file
|
||
|
|
||
|
// define masks for Base64-encode
|
||
|
static int i_aMsbMask[] = { 0xfc, 0xf0, 0xc0, 0x00 };
|
||
|
static int i_aLsbMask[] = { 0x00, 0x03, 0x0f, 0x3f };
|
||
|
|
||
|
// Define array for conversion between chars in base64 message and their weight according to array s_szBase64
|
||
|
// This could be done by counting offset in s_szBase64. But sorry, too slow!
|
||
|
// start with asccii 2B (ie '+')
|
||
|
static int i_a64CharWeight [] =
|
||
|
{
|
||
|
62, -1, -1, -1, 63, // I have defined '+' and '/'
|
||
|
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, // I have defined 0 through 9
|
||
|
-1, -1, -1, -1, -1, -1, -1, // have undefined ascii 3A to 40
|
||
|
// lets define 'A' to 'Z'
|
||
|
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25, // A - Z
|
||
|
-1, -1, -1, -1, -1, -1, // have undefined ascii 5B to 40
|
||
|
// lets define 'a' to 'z'
|
||
|
26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
|
||
|
49,50,51 // defined 'a' to 'z'
|
||
|
};
|
||
|
|
||
|
static int i_aDecodeMsbMask[] = { 0x3f, 0x0f, 0x03 };
|
||
|
static int i_aDecodeLsbMask[] = { 0x30, 0x3c, 0x3f };
|
||
|
|
||
|
|
||
|
//Decodes base64-encoded string.
|
||
|
//Assumptions: Incoming buffer (pszBuffer) is large enough.
|
||
|
void AgBase64Decode(const char* pszString,unsigned long ulInLen,unsigned char* pszBuffer, unsigned short& usOutLen)
|
||
|
{
|
||
|
char* p = (char*)pszBuffer;
|
||
|
const char* pszSource = (const char*)pszString;
|
||
|
usOutLen = 0;
|
||
|
assert(0 == (ulInLen % 4)); // base-64 coded text should always be done in parts of 4 bytes
|
||
|
|
||
|
while(ulInLen > 0)
|
||
|
{
|
||
|
int iAsciiO = i_a64CharWeight[*pszSource++ - 0x2B];
|
||
|
for (int i = 1; i <= 3; i++)
|
||
|
{
|
||
|
int iAsciiChar = (iAsciiO & i_aDecodeMsbMask[i-1]) << (2*i);
|
||
|
int iChar = i_a64CharWeight[*pszSource++ - 0x2B];
|
||
|
iAsciiChar += (iChar & i_aDecodeLsbMask[i-1]) >> (6-2*i);
|
||
|
iAsciiO = iChar;
|
||
|
*p++ = (char)iAsciiChar;
|
||
|
--ulInLen;
|
||
|
if (!('\0' == *(p-1) && '\0' == iAsciiChar)) //BAD BAD BAD! need to check what chars is padded better.
|
||
|
++usOutLen;
|
||
|
}
|
||
|
--ulInLen;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
//Encodes incoming string to Base64.
|
||
|
//Assumptions: Incoming buffer (pszBuffer) is large enough.
|
||
|
//Haven't bothered to optimize this one since we only do it when we create file.
|
||
|
void AgBase64Encode(const unsigned char* pszString,unsigned long ulInLen,char* pszBuffer)
|
||
|
{
|
||
|
assert(pszString);
|
||
|
assert(pszBuffer);
|
||
|
|
||
|
char* p = (char*)pszString;
|
||
|
|
||
|
while (ulInLen > 0)
|
||
|
{
|
||
|
int iAsciiO = 0;
|
||
|
// encode 3 characters (will become 4 chars when Base64 encoded)
|
||
|
for (int i = 0; i < 4; i++)
|
||
|
{
|
||
|
int iAsciiN = 0;
|
||
|
|
||
|
if (ulInLen)
|
||
|
iAsciiN = (int)*p;
|
||
|
|
||
|
int iMsbRightShift = NUM_BITS - (6-2*i);
|
||
|
int iLsbLeftShift = NUM_BITS - iMsbRightShift;
|
||
|
|
||
|
int iChar64 = ((iAsciiN & i_aMsbMask[i]) >> iMsbRightShift);
|
||
|
iChar64 += ((iAsciiO & i_aLsbMask[i]) << iLsbLeftShift);
|
||
|
|
||
|
iAsciiO = iAsciiN;
|
||
|
|
||
|
assert(iChar64 >= 0 && iChar64 <= 63);
|
||
|
|
||
|
if (i < 3)
|
||
|
{
|
||
|
p++;
|
||
|
if (ulInLen)
|
||
|
ulInLen--;
|
||
|
}
|
||
|
|
||
|
*pszBuffer++ = s_szBase64[iChar64];
|
||
|
}
|
||
|
|
||
|
}
|
||
|
*pszBuffer = 0;
|
||
|
}
|
||
|
|
||
|
//-- Martin Webrant
|
||
|
|
||
|
/*
|
||
|
|
||
|
static char* s_szBadCodes[] =
|
||
|
{
|
||
|
"glhack",
|
||
|
"opengl.ini",
|
||
|
"TWCheat",
|
||
|
"B.teraphy",
|
||
|
"Flautz",
|
||
|
"sw!zz3r",
|
||
|
"ANAKiN",
|
||
|
"hooker.dll",
|
||
|
"UPX!", //whb31
|
||
|
"c:\\opengl32.dll",
|
||
|
"hlh.dll",
|
||
|
"GRiM-F_H",
|
||
|
"ChromaxS",
|
||
|
"ogc.dll",
|
||
|
"Unhooker", // eller hlh.dll
|
||
|
"eZ!$7v", //Swizz hack
|
||
|
"coders.dll", //wh_beta4, wh_beta5
|
||
|
"ogc.cfg",
|
||
|
"xqz2", //xqz2_b71
|
||
|
"xqb6", //xqz2_b80
|
||
|
"p@gram", //XQZ2Beta85
|
||
|
};
|
||
|
|
||
|
int ix = 0;
|
||
|
for (ix = 0; ix < sizeof(s_szBadCodes)/sizeof(s_szBadCodes[0]); ix++)
|
||
|
{
|
||
|
char szBuff[256];
|
||
|
AgBase64Encode((unsigned char*)s_szBadCodes[ix],strlen(s_szBadCodes[ix]),szBuff);
|
||
|
|
||
|
char szTest[512];
|
||
|
sprintf(szTest,"\"%s\", //%s\n",szBuff,s_szBadCodes[ix]);
|
||
|
OutputDebugString(szTest);
|
||
|
}
|
||
|
*/
|