Crypto++ 8.9 Free C++ class library of cryptographic schemes

base64.cpp
1 // base64.cpp - originally written and placed in the public domain by Wei Dai
2
3 #include "pch.h"
4 #include "config.h"
5 #include "base64.h"
6
7 NAMESPACE_BEGIN(CryptoPP)
8 ANONYMOUS_NAMESPACE_BEGIN
9
10 const byte s_stdVec[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
11 const byte s_urlVec[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
12 const byte s_padding = '=';
13 const int s_stdArray[256] = {
14 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
15 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
16 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63,
17 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
18 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
19 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1,
20 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
21 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
22 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
23 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
24 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
25 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
26 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
27 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
28 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
29 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
30 };
31 const int s_urlArray[256] = {
32 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
33 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
34 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1,
35 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1,
36 -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
37 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, 63,
38 -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
39 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1,
40 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
41 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
42 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
43 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
44 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
45 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
46 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
47 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
48 };
49
50 ANONYMOUS_NAMESPACE_END
51
52 void Base64Encoder::IsolatedInitialize(const NameValuePairs &parameters)
53 {
54 bool insertLineBreaks = parameters.GetValueWithDefault(Name::InsertLineBreaks(), true);
55 int maxLineLength = parameters.GetIntValueWithDefault(Name::MaxLineLength(), 72);
56
57 const char *lineBreak = insertLineBreaks ? "\n" : "";
58
59 m_filter->Initialize(CombinedNameValuePairs(
60 parameters,
61 MakeParameters(Name::EncodingLookupArray(), &s_stdVec[0], false)
62 (Name::PaddingByte(), s_padding)
63 (Name::GroupSize(), insertLineBreaks ? maxLineLength : 0)
64 (Name::Separator(), ConstByteArrayParameter(lineBreak))
65 (Name::Terminator(), ConstByteArrayParameter(lineBreak))
66 (Name::Log2Base(), 6, true)));
67 }
68
69 void Base64URLEncoder::IsolatedInitialize(const NameValuePairs &parameters)
70 {
71 bool insertLineBreaks = parameters.GetValueWithDefault(Name::InsertLineBreaks(), true);
72 int maxLineLength = parameters.GetIntValueWithDefault(Name::MaxLineLength(), 72);
73
74 const char *lineBreak = insertLineBreaks ? "\n" : "";
75
76 m_filter->Initialize(CombinedNameValuePairs(
77 parameters,
78 MakeParameters(Name::EncodingLookupArray(), &s_urlVec[0], false)
79 (Name::PaddingByte(), s_padding)
80 (Name::GroupSize(), insertLineBreaks ? maxLineLength : 0)
81 (Name::Separator(), ConstByteArrayParameter(lineBreak))
82 (Name::Terminator(), ConstByteArrayParameter(lineBreak))
83 (Name::Log2Base(), 6, true)));
84 }
85
86 void Base64Decoder::IsolatedInitialize(const NameValuePairs &parameters)
87 {
88 BaseN_Decoder::IsolatedInitialize(CombinedNameValuePairs(
89 parameters,
90 MakeParameters(Name::DecodingLookupArray(), GetDecodingLookupArray(), false)(Name::Log2Base(), 6, true)));
91 }
92
93 const int *Base64Decoder::GetDecodingLookupArray()
94 {
95 return s_stdArray;
96 }
97
98 void Base64URLDecoder::IsolatedInitialize(const NameValuePairs &parameters)
99 {
100 BaseN_Decoder::IsolatedInitialize(CombinedNameValuePairs(
101 parameters,
102 MakeParameters(Name::DecodingLookupArray(), GetDecodingLookupArray(), false)(Name::Log2Base(), 6, true)));
103 }
104
105 // Unrolled initialization, http://github.com/weidai11/cryptopp/issues/376
106 const int *Base64URLDecoder::GetDecodingLookupArray()
107 {
108 return s_urlArray;
109 }
110
111 NAMESPACE_END
MakeParameters
AlgorithmParameters MakeParameters(const char *name, const T &value, bool throwIfNotUsed=true)
Create an object that implements NameValuePairs.
Definition: algparam.h:508
base64.h
Classes for the Base64Encoder, Base64Decoder, Base64URLEncoder and Base64URLDecoder.
Base64Decoder::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
Definition: base64.cpp:86
Base64Encoder::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
Definition: base64.cpp:52
Base64URLDecoder::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
Definition: base64.cpp:98
Base64URLEncoder::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Definition: base64.cpp:69
BaseN_Decoder::IsolatedInitialize
void IsolatedInitialize(const NameValuePairs &parameters)
Initialize or reinitialize this object, without signal propagation.
CombinedNameValuePairs
Combines two sets of NameValuePairs.
Definition: algparam.h:129
ConstByteArrayParameter
Used to pass byte array input as part of a NameValuePairs object.
Definition: algparam.h:25
NameValuePairs
Interface for retrieving values given their names.
Definition: cryptlib.h:327
NameValuePairs::GetValueWithDefault
T GetValueWithDefault(const char *name, T defaultValue) const
Get a named value.
Definition: cryptlib.h:397
NameValuePairs::GetIntValueWithDefault
CRYPTOPP_DLL int GetIntValueWithDefault(const char *name, int defaultValue) const
Get a named value with type int, with default.
Definition: cryptlib.h:429
config.h
Library configuration file.
CryptoPP
Crypto++ library namespace.
Name::PaddingByte
const char * PaddingByte()
byte
Definition: argnames.h:73
Name::EncodingLookupArray
const char * EncodingLookupArray()
const byte *
Definition: argnames.h:75
Name::GroupSize
const char * GroupSize()
int
Definition: argnames.h:71
Name::Terminator
const char * Terminator()
ConstByteArrayParameter.
Definition: argnames.h:69
Name::InsertLineBreaks
const char * InsertLineBreaks()
bool
Definition: argnames.h:77
Name::DecodingLookupArray
const char * DecodingLookupArray()
const byte *
Definition: argnames.h:76
Name::Separator
const char * Separator()
ConstByteArrayParameter.
Definition: argnames.h:68
Name::Log2Base
const char * Log2Base()
int
Definition: argnames.h:74
Name::MaxLineLength
const char * MaxLineLength()
int
Definition: argnames.h:78
pch.h
Precompiled header file.