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