1 |
|
|
#ifndef SRC_BASE64_H_ |
2 |
|
|
#define SRC_BASE64_H_ |
3 |
|
|
|
4 |
|
|
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
5 |
|
|
|
6 |
|
|
#include "util.h" |
7 |
|
|
|
8 |
|
|
#include <cmath> |
9 |
|
|
#include <cstddef> |
10 |
|
|
#include <cstdint> |
11 |
|
|
|
12 |
|
|
namespace node { |
13 |
|
|
//// Base 64 //// |
14 |
|
|
|
15 |
|
|
enum class Base64Mode { |
16 |
|
|
NORMAL, |
17 |
|
|
URL |
18 |
|
|
}; |
19 |
|
|
|
20 |
|
|
static constexpr char base64_table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
21 |
|
|
"abcdefghijklmnopqrstuvwxyz" |
22 |
|
|
"0123456789+/"; |
23 |
|
|
|
24 |
|
|
static constexpr char base64_table_url[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
25 |
|
|
"abcdefghijklmnopqrstuvwxyz" |
26 |
|
|
"0123456789-_"; |
27 |
|
|
|
28 |
|
4354 |
static inline const char* base64_select_table(Base64Mode mode) { |
29 |
✗✓✗ |
4354 |
switch (mode) { |
30 |
|
|
case Base64Mode::NORMAL: return base64_table; |
31 |
|
4354 |
case Base64Mode::URL: return base64_table_url; |
32 |
|
|
default: UNREACHABLE(); |
33 |
|
|
} |
34 |
|
|
} |
35 |
|
|
|
36 |
|
18994 |
static inline constexpr size_t base64_encoded_size( |
37 |
|
|
size_t size, |
38 |
|
|
Base64Mode mode = Base64Mode::NORMAL) { |
39 |
✓✓ |
18994 |
return mode == Base64Mode::NORMAL ? ((size + 2) / 3 * 4) |
40 |
|
13060 |
: static_cast<size_t>(std::ceil( |
41 |
|
18994 |
static_cast<double>(size * 4) / 3)); |
42 |
|
|
} |
43 |
|
|
|
44 |
|
|
// Doesn't check for padding at the end. Can be 1-2 bytes over. |
45 |
|
6994 |
static inline constexpr size_t base64_decoded_size_fast(size_t size) { |
46 |
|
|
// 1-byte input cannot be decoded |
47 |
✓✗ |
6994 |
return size > 1 ? (size / 4) * 3 + (size % 4 + 1) / 2 : 0; |
48 |
|
|
} |
49 |
|
|
|
50 |
|
|
inline uint32_t ReadUint32BE(const unsigned char* p); |
51 |
|
|
|
52 |
|
|
template <typename TypeName> |
53 |
|
|
size_t base64_decoded_size(const TypeName* src, size_t size); |
54 |
|
|
|
55 |
|
|
template <typename TypeName> |
56 |
|
|
size_t base64_decode(char* const dst, const size_t dstlen, |
57 |
|
|
const TypeName* const src, const size_t srclen); |
58 |
|
|
|
59 |
|
|
inline size_t base64_encode(const char* src, |
60 |
|
|
size_t slen, |
61 |
|
|
char* dst, |
62 |
|
|
size_t dlen, |
63 |
|
|
Base64Mode mode = Base64Mode::NORMAL); |
64 |
|
|
} // namespace node |
65 |
|
|
|
66 |
|
|
|
67 |
|
|
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS |
68 |
|
|
|
69 |
|
|
#endif // SRC_BASE64_H_ |