Line data Source code
1 : /*
2 : base64.cpp and base64.h
3 :
4 : Copyright (C) 2004-2008 René Nyffenegger
5 :
6 : This source code is provided 'as-is', without any express or implied
7 : warranty. In no event will the author be held liable for any damages
8 : arising from the use of this software.
9 :
10 : Permission is granted to anyone to use this software for any purpose,
11 : including commercial applications, and to alter it and redistribute it
12 : freely, subject to the following restrictions:
13 :
14 : 1. The origin of this source code must not be misrepresented; you must not
15 : claim that you wrote the original source code. If you use this source code
16 : in a product, an acknowledgment in the product documentation would be
17 : appreciated but is not required.
18 :
19 : 2. Altered source versions must be plainly marked as such, and must not be
20 : misrepresented as being the original source code.
21 :
22 : 3. This notice may not be removed or altered from any source distribution.
23 :
24 : René Nyffenegger rene.nyffenegger@adp-gmbh.ch
25 :
26 : */
27 :
28 : #include "base64.h"
29 : #include <iostream>
30 :
31 1 : static const std::string base64_chars =
32 : "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
33 : "abcdefghijklmnopqrstuvwxyz"
34 : "0123456789+/";
35 :
36 :
37 71145 : static inline bool is_base64(unsigned char c) {
38 71145 : return (isalnum(c) || (c == '+') || (c == '/'));
39 : }
40 :
41 0 : bool base64_is_valid(std::string const& s)
42 : {
43 0 : for(size_t i=0; i<s.size(); i++)
44 0 : if(!is_base64(s[i])) return false;
45 0 : return true;
46 : }
47 :
48 0 : std::string base64_encode(unsigned char const* bytes_to_encode, unsigned int in_len) {
49 0 : std::string ret;
50 0 : int i = 0;
51 0 : int j = 0;
52 : unsigned char char_array_3[3];
53 : unsigned char char_array_4[4];
54 :
55 0 : while (in_len--) {
56 0 : char_array_3[i++] = *(bytes_to_encode++);
57 0 : if (i == 3) {
58 0 : char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
59 0 : char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
60 0 : char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
61 0 : char_array_4[3] = char_array_3[2] & 0x3f;
62 :
63 0 : for(i = 0; (i <4) ; i++)
64 0 : ret += base64_chars[char_array_4[i]];
65 0 : i = 0;
66 : }
67 : }
68 :
69 0 : if (i)
70 : {
71 0 : for(j = i; j < 3; j++)
72 0 : char_array_3[j] = '\0';
73 :
74 0 : char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
75 0 : char_array_4[1] = ((char_array_3[0] & 0x03) << 4) + ((char_array_3[1] & 0xf0) >> 4);
76 0 : char_array_4[2] = ((char_array_3[1] & 0x0f) << 2) + ((char_array_3[2] & 0xc0) >> 6);
77 0 : char_array_4[3] = char_array_3[2] & 0x3f;
78 :
79 0 : for (j = 0; (j < i + 1); j++)
80 0 : ret += base64_chars[char_array_4[j]];
81 :
82 : // Don't pad it with =
83 : /*while((i++ < 3))
84 : ret += '=';*/
85 :
86 : }
87 :
88 0 : return ret;
89 :
90 : }
91 :
92 2635 : std::string base64_decode(std::string const& encoded_string) {
93 2635 : int in_len = encoded_string.size();
94 2635 : int i = 0;
95 2635 : int j = 0;
96 2635 : int in_ = 0;
97 : unsigned char char_array_4[4], char_array_3[3];
98 2635 : std::string ret;
99 :
100 144925 : while (in_len-- && ( encoded_string[in_] != '=') && is_base64(encoded_string[in_])) {
101 71145 : char_array_4[i++] = encoded_string[in_]; in_++;
102 71145 : if (i ==4) {
103 79050 : for (i = 0; i <4; i++)
104 63240 : char_array_4[i] = base64_chars.find(char_array_4[i]);
105 :
106 15810 : char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
107 15810 : char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
108 15810 : char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
109 :
110 63240 : for (i = 0; (i < 3); i++)
111 47430 : ret += char_array_3[i];
112 15810 : i = 0;
113 : }
114 : }
115 :
116 2635 : if (i) {
117 5270 : for (j = i; j <4; j++)
118 2635 : char_array_4[j] = 0;
119 :
120 13175 : for (j = 0; j <4; j++)
121 10540 : char_array_4[j] = base64_chars.find(char_array_4[j]);
122 :
123 2635 : char_array_3[0] = (char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4);
124 2635 : char_array_3[1] = ((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2);
125 2635 : char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];
126 :
127 2635 : for (j = 0; (j < i - 1); j++) ret += char_array_3[j];
128 : }
129 :
130 2635 : return ret;
131 3 : }
|