00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "Base64.h"
00033 #include "IFile.h"
00034
00035 #ifdef SOCKETS_NAMESPACE
00036 namespace SOCKETS_NAMESPACE {
00037 #endif
00038
00039
00040 const char *Base64::bstr =
00041 "ABCDEFGHIJKLMNOPQ"
00042 "RSTUVWXYZabcdefgh"
00043 "ijklmnopqrstuvwxy"
00044 "z0123456789+/";
00045
00046 const char Base64::rstr[] = {
00047 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00048 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00049 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 63,
00050 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 0, 0, 0, 0, 0, 0,
00051 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
00052 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0,
00053 0, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
00054 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0};
00055
00056
00057 Base64::Base64()
00058 {
00059 }
00060
00061
00062 void Base64::encode(IFile *fil, std::string& output, bool add_crlf)
00063 {
00064 size_t remain;
00065 size_t i = 0;
00066 size_t o = 0;
00067 char input[4];
00068
00069 output = "";
00070 remain = fil -> fread(input,1,3);
00071 while (remain > 0)
00072 {
00073 if (add_crlf && o && o % 76 == 0)
00074 output += "\n";
00075 switch (remain)
00076 {
00077 case 1:
00078 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00079 output += bstr[ ((input[i] << 4) & 0x30) ];
00080 output += "==";
00081 break;
00082 case 2:
00083 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00084 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00085 output += bstr[ ((input[i + 1] << 2) & 0x3c) ];
00086 output += "=";
00087 break;
00088 default:
00089 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00090 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00091 output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ];
00092 output += bstr[ (input[i + 2] & 0x3f) ];
00093 }
00094 o += 4;
00095
00096 remain = fil -> fread(input,1,3);
00097 }
00098 }
00099
00100
00101 void Base64::encode(FILE *fil, std::string& output, bool add_crlf)
00102 {
00103 size_t remain;
00104 size_t i = 0;
00105 size_t o = 0;
00106 char input[4];
00107
00108 output = "";
00109 remain = fread(input,1,3,fil);
00110 while (remain > 0)
00111 {
00112 if (add_crlf && o && o % 76 == 0)
00113 output += "\n";
00114 switch (remain)
00115 {
00116 case 1:
00117 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00118 output += bstr[ ((input[i] << 4) & 0x30) ];
00119 output += "==";
00120 break;
00121 case 2:
00122 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00123 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00124 output += bstr[ ((input[i + 1] << 2) & 0x3c) ];
00125 output += "=";
00126 break;
00127 default:
00128 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00129 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00130 output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ];
00131 output += bstr[ (input[i + 2] & 0x3f) ];
00132 }
00133 o += 4;
00134
00135 remain = fread(input,1,3,fil);
00136 }
00137 }
00138
00139
00140 void Base64::encode(const std::string& str_in, std::string& str_out, bool add_crlf)
00141 {
00142 encode(str_in.c_str(), str_in.size(), str_out, add_crlf);
00143 }
00144
00145
00146 void Base64::encode(const char* input,size_t l,std::string& output, bool add_crlf)
00147 {
00148 size_t i = 0;
00149 size_t o = 0;
00150
00151 output = "";
00152 while (i < l)
00153 {
00154 size_t remain = l - i;
00155 if (add_crlf && o && o % 76 == 0)
00156 output += "\n";
00157 switch (remain)
00158 {
00159 case 1:
00160 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00161 output += bstr[ ((input[i] << 4) & 0x30) ];
00162 output += "==";
00163 break;
00164 case 2:
00165 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00166 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00167 output += bstr[ ((input[i + 1] << 2) & 0x3c) ];
00168 output += "=";
00169 break;
00170 default:
00171 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00172 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00173 output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ];
00174 output += bstr[ (input[i + 2] & 0x3f) ];
00175 }
00176 o += 4;
00177 i += 3;
00178 }
00179 }
00180
00181
00182 void Base64::encode(const unsigned char* input,size_t l,std::string& output,bool add_crlf)
00183 {
00184 size_t i = 0;
00185 size_t o = 0;
00186
00187 output = "";
00188 while (i < l)
00189 {
00190 size_t remain = l - i;
00191 if (add_crlf && o && o % 76 == 0)
00192 output += "\n";
00193 switch (remain)
00194 {
00195 case 1:
00196 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00197 output += bstr[ ((input[i] << 4) & 0x30) ];
00198 output += "==";
00199 break;
00200 case 2:
00201 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00202 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00203 output += bstr[ ((input[i + 1] << 2) & 0x3c) ];
00204 output += "=";
00205 break;
00206 default:
00207 output += bstr[ ((input[i] >> 2) & 0x3f) ];
00208 output += bstr[ ((input[i] << 4) & 0x30) + ((input[i + 1] >> 4) & 0x0f) ];
00209 output += bstr[ ((input[i + 1] << 2) & 0x3c) + ((input[i + 2] >> 6) & 0x03) ];
00210 output += bstr[ (input[i + 2] & 0x3f) ];
00211 }
00212 o += 4;
00213 i += 3;
00214 }
00215 }
00216
00217
00218 void Base64::decode(const std::string& input,std::string& output)
00219 {
00220 size_t i = 0;
00221 size_t l = input.size();
00222
00223 output = "";
00224 while (i < l)
00225 {
00226 while (i < l && (input[i] == 13 || input[i] == 10))
00227 i++;
00228 if (i < l)
00229 {
00230 char b1 = (char)((rstr[(int)input[i]] << 2 & 0xfc) +
00231 (rstr[(int)input[i + 1]] >> 4 & 0x03));
00232 output += b1;
00233 if (input[i + 2] != '=')
00234 {
00235 char b2 = (char)((rstr[(int)input[i + 1]] << 4 & 0xf0) +
00236 (rstr[(int)input[i + 2]] >> 2 & 0x0f));
00237 output += b2;
00238 }
00239 if (input[i + 3] != '=')
00240 {
00241 char b3 = (char)((rstr[(int)input[i + 2]] << 6 & 0xc0) +
00242 rstr[(int)input[i + 3]]);
00243 output += b3;
00244 }
00245 i += 4;
00246 }
00247 }
00248 }
00249
00250
00251 void Base64::decode(const std::string& input, unsigned char *output, size_t& sz)
00252 {
00253 size_t i = 0;
00254 size_t l = input.size();
00255 size_t j = 0;
00256
00257 while (i < l)
00258 {
00259 while (i < l && (input[i] == 13 || input[i] == 10))
00260 i++;
00261 if (i < l)
00262 {
00263 unsigned char b1 = (unsigned char)((rstr[(int)input[i]] << 2 & 0xfc) +
00264 (rstr[(int)input[i + 1]] >> 4 & 0x03));
00265 if (output)
00266 {
00267 output[j] = b1;
00268 }
00269 j++;
00270 if (input[i + 2] != '=')
00271 {
00272 unsigned char b2 = (unsigned char)((rstr[(int)input[i + 1]] << 4 & 0xf0) +
00273 (rstr[(int)input[i + 2]] >> 2 & 0x0f));
00274 if (output)
00275 {
00276 output[j] = b2;
00277 }
00278 j++;
00279 }
00280 if (input[i + 3] != '=')
00281 {
00282 unsigned char b3 = (unsigned char)((rstr[(int)input[i + 2]] << 6 & 0xc0) +
00283 rstr[(int)input[i + 3]]);
00284 if (output)
00285 {
00286 output[j] = b3;
00287 }
00288 j++;
00289 }
00290 i += 4;
00291 }
00292 }
00293 sz = j;
00294 }
00295
00296
00297 size_t Base64::decode_length(const std::string& str64)
00298 {
00299 if (!str64.size() || str64.size() % 4)
00300 return 0;
00301 size_t l = 3 * (str64.size() / 4 - 1) + 1;
00302 if (str64[str64.size() - 2] != '=')
00303 l++;
00304 if (str64[str64.size() - 1] != '=')
00305 l++;
00306 return l;
00307 }
00308
00309
00310 #ifdef SOCKETS_NAMESPACE
00311 }
00312 #endif
00313
00314