078dafcc948554ced3863e8651bb31122983c8bf
[WebKit-https.git] / Source / WTF / wtf / text / Base64.h
1 /*
2  * Copyright (C) 2006 Alexey Proskuryakov <ap@webkit.org>
3  * Copyright (C) 2010 Patrick Gansterer <paroga@paroga.com>
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
25  */
26
27 #ifndef Base64_h
28 #define Base64_h
29
30 #include <wtf/Vector.h>
31 #include <wtf/text/CString.h>
32 #include <wtf/text/WTFString.h>
33
34 namespace WTF {
35
36 enum Base64EncodePolicy {
37     Base64DoNotInsertLFs,
38     Base64InsertLFs,
39     Base64URLPolicy // No padding, no LFs.
40 };
41
42 enum Base64DecodePolicy {
43     Base64FailOnInvalidCharacterOrExcessPadding,
44     Base64FailOnInvalidCharacter,
45     Base64IgnoreWhitespace,
46     Base64IgnoreInvalidCharacters
47 };
48
49 WTF_EXPORT_PRIVATE void base64Encode(const char*, unsigned, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
50 WTF_EXPORT_PRIVATE void base64Encode(const Vector<char>&, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
51 WTF_EXPORT_PRIVATE void base64Encode(const CString&, Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
52 WTF_EXPORT_PRIVATE String base64Encode(const char*, unsigned, Base64EncodePolicy = Base64DoNotInsertLFs);
53 WTF_EXPORT_PRIVATE String base64Encode(const Vector<char>&, Base64EncodePolicy = Base64DoNotInsertLFs);
54 WTF_EXPORT_PRIVATE String base64Encode(const CString&, Base64EncodePolicy = Base64DoNotInsertLFs);
55
56 WTF_EXPORT_PRIVATE bool base64Decode(const String&, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
57 WTF_EXPORT_PRIVATE bool base64Decode(const Vector<char>&, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
58 WTF_EXPORT_PRIVATE bool base64Decode(const char*, unsigned, Vector<char>&, Base64DecodePolicy = Base64FailOnInvalidCharacter);
59
60 inline void base64Encode(const Vector<char>& in, Vector<char>& out, Base64EncodePolicy policy)
61 {
62     base64Encode(in.data(), in.size(), out, policy);
63 }
64
65 inline void base64Encode(const CString& in, Vector<char>& out, Base64EncodePolicy policy)
66 {
67     base64Encode(in.data(), in.length(), out, policy);
68 }
69
70 inline String base64Encode(const Vector<char>& in, Base64EncodePolicy policy)
71 {
72     return base64Encode(in.data(), in.size(), policy);
73 }
74
75 inline String base64Encode(const CString& in, Base64EncodePolicy policy)
76 {
77     return base64Encode(in.data(), in.length(), policy);
78 }
79
80 // ======================================================================================
81 // All the same functions modified for base64url, as defined in RFC 4648.
82 // This format uses '-' and '_' instead of '+' and '/' respectively.
83 // ======================================================================================
84
85 WTF_EXPORT_PRIVATE void base64URLEncode(const char*, unsigned, Vector<char>&);
86 WTF_EXPORT_PRIVATE void base64URLEncode(const Vector<char>&, Vector<char>&);
87 WTF_EXPORT_PRIVATE void base64URLEncode(const CString&, Vector<char>&);
88 WTF_EXPORT_PRIVATE String base64URLEncode(const char*, unsigned);
89 WTF_EXPORT_PRIVATE String base64URLEncode(const Vector<char>&);
90 WTF_EXPORT_PRIVATE String base64URLEncode(const CString&);
91
92 WTF_EXPORT_PRIVATE bool base64URLDecode(const String&, Vector<char>&);
93 WTF_EXPORT_PRIVATE bool base64URLDecode(const Vector<char>&, Vector<char>&);
94 WTF_EXPORT_PRIVATE bool base64URLDecode(const char*, unsigned, Vector<char>&);
95
96 inline void base64URLEncode(const Vector<char>& in, Vector<char>& out)
97 {
98     base64URLEncode(in.data(), in.size(), out);
99 }
100
101 inline void base64URLEncode(const CString& in, Vector<char>& out)
102 {
103     base64URLEncode(in.data(), in.length(), out);
104 }
105
106 inline String base64URLEncode(const Vector<char>& in)
107 {
108     return base64URLEncode(in.data(), in.size());
109 }
110
111 inline String base64URLEncode(const CString& in)
112 {
113     return base64URLEncode(in.data(), in.length());
114 }
115
116 } // namespace WTF
117
118 using WTF::Base64EncodePolicy;
119 using WTF::Base64DoNotInsertLFs;
120 using WTF::Base64InsertLFs;
121 using WTF::Base64DecodePolicy;
122 using WTF::Base64FailOnInvalidCharacterOrExcessPadding;
123 using WTF::Base64FailOnInvalidCharacter;
124 using WTF::Base64IgnoreWhitespace;
125 using WTF::Base64IgnoreInvalidCharacters;
126 using WTF::base64Encode;
127 using WTF::base64Decode;
128 using WTF::base64URLDecode;
129
130 #endif // Base64_h