/*
* Base64 Decoder, for the webserver basic authentication
* stuff, not mine found it kicking about at
* http://local.15seconds.com/faq/pg00934.htm
* All credit to John Ludeman for this code :)
*
* Only change made is to cast the data access to pr2six
* to type (int) to prevent gcc from moaning its head off
* while using -Wall
*/
#include <stdio.h>
/* Thanks to John Ludeman for this code...
* Define translation matrix for Base64 decode.
* it's fast and const should make it shared text page.
*/
const int pr2six[256] =
{
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,62,64,64,64,63,
52,53,54,55,56,57,58,59,60,61,64,64,64,64,64,64,64,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,64,64,64,64,64,64,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,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,64,
64,64,64,64,64,64,64,64,64,64,64,64,64
};
/*
* Decode a base64 encoded string
*/
void Base64Decode(
char *bufcoded,
unsigned char *bufplain,
int outbufsize
)
{
int nbytesdecoded;
int nprbytes;
char *bufin = bufcoded;
unsigned char *bufout = bufplain;
/* Strip leading whitespace */
while (*bufcoded == ' ' || *bufcoded == '\t')
++bufcoded;
/*
* Figure out how many characters are in the input buffer.
* If this would decode into more bytes than would fit into
* the output buffer, adjust the number of input bytes downwards.
*/
bufin = bufcoded;
while (pr2six[(int)*(bufin++)] <= 63)
;
nprbytes = bufin - bufcoded - 1;
nbytesdecoded = ((nprbytes + 3) / 4) * 3;
if (nbytesdecoded > outbufsize)
nprbytes = (outbufsize * 4) / 3;
bufin = bufcoded;
while (nprbytes > 0)
{
*(bufout++) =
(unsigned char) (pr2six[(int)*bufin] << 2 | pr2six[(int)bufin[1]] >> 4);
*(bufout++) =
(unsigned char) (pr2six[(int)bufin[1]] << 4 | pr2six[(int)bufin[2]] >> 2);
*(bufout++) =
(unsigned char) (pr2six[(int)bufin[2]] << 6 | pr2six[(int)bufin[3]]);
bufin += 4;
nprbytes -= 4;
}
if(nprbytes & 03)
{
if(pr2six[(int)bufin[-2]] > 63)
nbytesdecoded -= 2;
else
nbytesdecoded -= 1;
}
bufplain[nbytesdecoded] = '\0';
}