15976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 25976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//********************************************************************* 35976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* C_Base64 - a simple base64 encoder and decoder. 45976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* 55976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* Copyright (c) 1999, Bob Withers - bwit@pobox.com 65976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* 75976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* This code may be freely used for any purpose, either personal 85976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* or commercial, provided the authors copyright notice remains 95976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//* intact. 105976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org//********************************************************************* 115976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 125976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#ifndef TALK_BASE_BASE64_H__ 135976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#define TALK_BASE_BASE64_H__ 145976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 155976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <string> 165976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#include <vector> 175976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 185976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgnamespace talk_base { 195976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 205976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgclass Base64 215976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org{ 225976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgpublic: 235976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org enum DecodeOption { 245976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PARSE_STRICT = 1, // Parse only base64 characters 255976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PARSE_WHITE = 2, // Parse only base64 and whitespace characters 265976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PARSE_ANY = 3, // Parse all characters 275976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PARSE_MASK = 3, 285976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 295976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PAD_YES = 4, // Padding is required 305976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PAD_ANY = 8, // Padding is optional 315976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PAD_NO = 12, // Padding is disallowed 325976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_PAD_MASK = 12, 335976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 345976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_TERM_BUFFER = 16, // Must termiante at end of buffer 355976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_TERM_CHAR = 32, // May terminate at any character boundary 365976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_TERM_ANY = 48, // May terminate at a sub-character bit offset 375976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_TERM_MASK = 48, 385976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 395976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Strictest interpretation 405976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_STRICT = DO_PARSE_STRICT | DO_PAD_YES | DO_TERM_BUFFER, 415976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 425976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DO_LAX = DO_PARSE_ANY | DO_PAD_ANY | DO_TERM_CHAR, 435976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org }; 445976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org typedef int DecodeFlags; 455976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 465976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsBase64Char(char ch); 475976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 485976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Get the char next to the |ch| from the Base64Table. 495976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // If the |ch| is the last one in the Base64Table then returns 505976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // the first one from the table. 515976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Expects the |ch| be a base64 char. 525976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // The result will be saved in |next_ch|. 535976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Returns true on success. 545976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool GetNextBase64Char(char ch, char* next_ch); 555976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 565976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Determines whether the given string consists entirely of valid base64 575976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // encoded characters. 585976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool IsBase64Encoded(const std::string& str); 595976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 605976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static void EncodeFromArray(const void* data, size_t len, 615976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string* result); 625976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DecodeFromArray(const char* data, size_t len, DecodeFlags flags, 635976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string* result, size_t* data_used); 645976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DecodeFromArray(const char* data, size_t len, DecodeFlags flags, 655976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<char>* result, size_t* data_used); 665976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 675976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org // Convenience Methods 685976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static inline std::string Encode(const std::string& data) { 695976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string result; 705976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org EncodeFromArray(data.data(), data.size(), &result); 715976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 725976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 735976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static inline std::string Decode(const std::string& data, DecodeFlags flags) { 745976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string result; 755976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DecodeFromArray(data.data(), data.size(), flags, &result, NULL); 765976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return result; 775976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 785976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static inline bool Decode(const std::string& data, DecodeFlags flags, 795976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::string* result, size_t* data_used) 805976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 815976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DecodeFromArray(data.data(), data.size(), flags, result, data_used); 825976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 835976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static inline bool Decode(const std::string& data, DecodeFlags flags, 845976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org std::vector<char>* result, size_t* data_used) 855976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org { 865976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org return DecodeFromArray(data.data(), data.size(), flags, result, data_used); 875976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org } 885976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 895976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.orgprivate: 905976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const char Base64Table[]; 915976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static const unsigned char DecodeTable[]; 925976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 935976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static size_t GetNextQuantum(DecodeFlags parse_flags, bool illegal_pads, 945976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org const char* data, size_t len, size_t* dpos, 955976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org unsigned char qbuf[4], bool* padded); 965976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org template<typename T> 975976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org static bool DecodeFromArrayTemplate(const char* data, size_t len, 985976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org DecodeFlags flags, T* result, 995976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org size_t* data_used); 1005976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org}; 1015976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1025976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org} // namespace talk_base 1035976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org 1045976650443d68ccfadf1dea24999ee459dd2819mflodman@webrtc.org#endif // TALK_BASE_BASE64_H__ 105