00001
00002
00003
00004
00005
00006 #include "base64.h"
00007
00008 unsigned int Base64EncodeGetLength( unsigned long size )
00009 {
00010
00011
00012
00013
00014
00015
00016 DWORD BASE64_INPUT = 3;
00017 DWORD BASE64_OUTPUT = 4;
00018 return (((size + BASE64_INPUT - 1) / BASE64_INPUT) * BASE64_OUTPUT);
00019 }
00020
00021 unsigned int Base64DecodeGetLength( unsigned long size )
00022 {
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 DWORD BASE64_INPUT = 4;
00033 DWORD BASE64_OUTPUT = 3;
00034 return (((size + BASE64_INPUT - 1) / BASE64_INPUT) * BASE64_OUTPUT);
00035 }
00036
00037
00038
00039
00040 static const char base64digits[] =
00041 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
00042
00043 #define BAD -1
00044 static const char base64val[] = {
00045 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
00046 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD,
00047 BAD,BAD,BAD,BAD, BAD,BAD,BAD,BAD, BAD,BAD,BAD, 62, BAD,BAD,BAD, 63,
00048 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,BAD,BAD, BAD,BAD,BAD,BAD,
00049 BAD, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
00050 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,BAD, BAD,BAD,BAD,BAD,
00051 BAD, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
00052 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,BAD, BAD,BAD,BAD,BAD
00053 };
00054 #define DECODE64(c) (isascii(c) ? base64val[c] : BAD)
00055
00056
00057
00058 int Base64Encode( unsigned char* out, const unsigned char* in, int inlen )
00059 {
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070 int resultado=Base64EncodeGetLength(inlen);
00071 for (; inlen >= 3; inlen -= 3)
00072 {
00073 *out++ = base64digits[in[0] >> 2];
00074 *out++ = base64digits[((in[0] << 4) & 0x30) | (in[1] >> 4)];
00075 *out++ = base64digits[((in[1] << 2) & 0x3c) | (in[2] >> 6)];
00076 *out++ = base64digits[in[2] & 0x3f];
00077 in += 3;
00078 }
00079
00080 if (inlen > 0)
00081 {
00082 unsigned char fragment;
00083
00084 *out++ = base64digits[in[0] >> 2];
00085 fragment = (in[0] << 4) & 0x30;
00086
00087 if (inlen > 1)
00088 fragment |= in[1] >> 4;
00089
00090 *out++ = base64digits[fragment];
00091 *out++ = (inlen < 2) ? '=' : base64digits[(in[1] << 2) & 0x3c];
00092 *out++ = '=';
00093 }
00094
00095
00096
00097 return(resultado);
00098 }
00099
00100 int Base64Decode( char* out, const char* in, unsigned long size )
00101 {
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116 int len = 0;
00117 register unsigned char digit1, digit2, digit3, digit4;
00118
00119 if (in[0] == '+' && in[1] == ' ')
00120 in += 2;
00121 if (*in == '\r')
00122 return(0);
00123
00124 do {
00125 digit1 = in[0];
00126 if (DECODE64(digit1) == BAD)
00127 return(-1);
00128 digit2 = in[1];
00129 if (DECODE64(digit2) == BAD)
00130 return(-1);
00131 digit3 = in[2];
00132 if (digit3 != '=' && DECODE64(digit3) == BAD)
00133 return(-1);
00134 digit4 = in[3];
00135 if (digit4 != '=' && DECODE64(digit4) == BAD)
00136 return(-1);
00137 in += 4;
00138 *out++ = (DECODE64(digit1) << 2) | (DECODE64(digit2) >> 4);
00139 ++len;
00140 if (digit3 != '=')
00141 {
00142 *out++ = ((DECODE64(digit2) << 4) & 0xf0) | (DECODE64(digit3) >> 2);
00143 ++len;
00144 if (digit4 != '=')
00145 {
00146 *out++ = ((DECODE64(digit3) << 6) & 0xc0) | DECODE64(digit4);
00147 ++len;
00148 }
00149 }
00150 } while (*in && *in != '\r' && digit4 != '=');
00151
00152 return (len);
00153 }
00154