/usr/include/bobcat/base64streambufbase is in libbobcat-dev 4.08.02-2build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 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 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 | #ifndef INCLUDED_BOBCAT_BASE64STREAMBUFBASE_
#define INCLUDED_BOBCAT_BASE64STREAMBUFBASE_
// See also https://en.wikipedia.org/wiki/Base64
// And https://www.ietf.org/rfc/rfc4648.txt
//
//
// Table 1: The Base 64 Alphabet
//
// Value Encoding Value Encoding Value Encoding Value Encoding
// 0 A 17 R 34 i 51 z
// 1 B 18 S 35 j 52 0
// 2 C 19 T 36 k 53 1
// 3 D 20 U 37 l 54 2
// 4 E 21 V 38 m 55 3
// 5 F 22 W 39 n 56 4
// 6 G 23 X 40 o 57 5
// 7 H 24 Y 41 p 58 6
// 8 I 25 Z 42 q 59 7
// 9 J 26 a 43 r 60 8
// 10 K 27 b 44 s 61 9
// 11 L 28 c 45 t 62 +
// 12 M 29 d 46 u 63 /
// 13 N 30 e 47 v
// 14 O 31 f 48 w (pad) =
// 15 P 32 g 49 x
// 16 Q 33 h 50 y
//
//
// Bit offset | 7 0 | 7 0 | 7 0 |
// Text content | M | a | n |
// ASCII | 77 (0x4d) | 97 (0x61) | 110 (0x6e) |
// Bit pattern | 0 1 0 0 1 1 | 0 1 | 0 1 1 0 | 0 0 0 1 | 0 1 | 1 0 1 1 1 0 |
// Index | 19 | 2 | 5 | 46 |
// Base64 | T | W | F | u |
// Variables | b0 | b1 | b2 | b3 |
//
// If the last group of four ends in '==' (i.e., b2 equals '=') then only one
// char is written;
// If the last group of four ends in '=' (i.e., b3 equals '=') then only two
// chars are written;
#include <istream>
#include <string>
#include <bobcat/ifilterstreambuf>
namespace FBB
{
namespace IUO // the facilities defined here are not further documented:
{ // the Base64StreambufBase class defined below should be
// used by IBase64Streambuf only.
class Base64StreambufBase: public FBB::IFilterStreambuf
{
std::istream &d_in; // stream to read
bool (Base64StreambufBase::*d_action)(); // encrypting or decrypting
size_t d_bufSize;
std::string d_buffer;
bool d_allDone = false;
static std::string const s_tabStr; // conversion characters
public:
Base64StreambufBase(std::istream &in, size_t bufSize);
protected:
void doEncrypt();
void doDecrypt();
private:
bool filter(char const **srcBegin, char const **srcEnd) override;
bool encrypt(); // false means: don't call again, but there
// may still be input waiting in d_buffer
bool decrypt();
template <int from, int size, int shl = 0>
static int bits(int value);
static size_t indexOf(int ch);
};
template <int from, int size, int shl>
inline int Base64StreambufBase::bits(int value)
{
return value == EOF ? 0 :
(value & ((1 << (from + size)) - 1)) >> from << shl;
}
} // IUO
} // FBB
#endif
|