1 /* Licensed to the Apache Software Foundation (ASF) under one or more
2 * contributor license agreements. See the NOTICE file distributed with
3 * this work for additional information regarding copyright ownership.
4 * The ASF licenses this file to You under the Apache License, Version 2.0
5 * (the "License"); you may not use this file except in compliance with
6 * the License. You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
17 /* encode/decode functions.
19 * These functions perform various encoding operations, and are provided in
20 * pairs, a function to query the length of and encode existing buffers, as
21 * well as companion functions to perform the same process to memory
22 * allocated from a pool.
24 * The API is designed to have the smallest possible RAM footprint, and so
25 * will only allocate the exact amount of RAM needed for each conversion.
28 #include "apr_encode.h"
30 #include "apr_strings.h"
31 #include "apr_encode_private.h"
33 /* lookup table: fast and const should make it shared text page. */
34 static const unsigned char pr2six[256] =
36 #if !APR_CHARSET_EBCDIC
38 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
39 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
40 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 62, 64, 63,
41 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 128, 64, 64,
42 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
43 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 63,
44 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
45 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
46 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
47 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
48 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
49 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
50 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
51 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
52 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
53 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
54 #else /* APR_CHARSET_EBCDIC */
56 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
57 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
58 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
59 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
60 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64,
61 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
62 62, 63, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 63, 64, 64,
63 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 128, 64,
64 64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 64, 64, 64, 64, 64, 64,
65 64, 35, 36, 37, 38, 39, 40, 41, 42, 43, 64, 64, 64, 64, 64, 64,
66 64, 64, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64, 64,
67 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
68 64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 64, 64, 64, 64, 64, 64,
69 64, 9, 10, 11, 12, 13, 14, 15, 16, 17, 64, 64, 64, 64, 64, 64,
70 64, 64, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64, 64,
71 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64
72 #endif /* APR_CHARSET_EBCDIC */
75 static const unsigned char pr2five[256] =
77 #if !APR_CHARSET_EBCDIC
79 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
80 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
81 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
82 32, 32, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 128, 32, 32,
83 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
84 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 32, 32, 32, 32, 32,
85 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
86 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
87 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
88 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
89 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
90 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
91 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
92 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
93 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
94 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
95 #else /* APR_CHARSET_EBCDIC */
97 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
98 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
99 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
100 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
101 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
102 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
103 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
104 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 128, 32,
105 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
106 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
107 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
108 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
109 32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 32, 32, 32, 32, 32, 32,
110 32, 9, 10, 11, 12, 13, 14, 15, 16, 17, 32, 32, 32, 32, 32, 32,
111 32, 32, 18, 19, 20, 21, 22, 23, 24, 25, 32, 32, 32, 32, 32, 32,
112 32, 32, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32
113 #endif /* APR_CHARSET_EBCDIC */
116 static const unsigned char pr2fivehex[256] =
118 #if !APR_CHARSET_EBCDIC
120 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
121 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
122 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
123 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 32, 32, 32, 128, 32, 32,
124 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
125 25, 26, 27, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32,
126 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
127 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
128 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
129 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
130 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
131 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
132 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
133 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
134 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
135 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32
136 #else /* APR_CHARSET_EBCDIC */
138 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
139 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
140 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
141 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
142 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
143 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
144 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
145 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 128, 32,
146 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
147 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
148 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
149 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
150 32, 10, 11, 12, 13, 14, 15, 16, 17, 18, 32, 32, 32, 32, 32, 32,
151 32, 19, 20, 21, 22, 23, 24, 25, 26, 27, 32, 32, 32, 32, 32, 32,
152 32, 32, 28, 29, 30, 31, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
153 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 32, 32, 32, 32, 32, 32
154 #endif /* APR_CHARSET_EBCDIC */
157 static const unsigned char pr2two[256] =
159 #if !APR_CHARSET_EBCDIC
161 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
162 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
163 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
164 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 32, 16, 16, 16, 16, 16,
165 16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
166 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
167 16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
168 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
169 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
170 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
171 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
172 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
173 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
174 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
175 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
176 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16
177 #else /* APR_CHARSET_EBCDIC */
179 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
180 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
181 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
182 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
183 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
184 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
185 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
186 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 32, 16, 16, 16, 16, 16,
187 16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
188 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
189 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
190 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
191 16, 10, 11, 12, 13, 14, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16,
192 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
193 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
194 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 16, 16, 16, 16, 16
195 #endif /* APR_CHARSET_EBCDIC */
198 static const char base64[] =
199 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
200 static const char base64url[] =
201 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
203 static const char base32[] =
204 "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
205 static const char base32hex[] =
206 "0123456789ABCDEFGHIJKLMNOPQRSTUV";
208 static const char base16[] = "0123456789ABCDEF";
209 static const char base16lower[] = "0123456789abcdef";
211 APR_DECLARE(apr_status_t) apr_encode_base64(char *dest, const char *src,
212 apr_ssize_t slen, int flags, apr_size_t * len)
220 if (APR_ENCODE_STRING == slen) {
225 register char *bufout = dest;
228 if (0 == ((flags & APR_ENCODE_BASE64URL))) {
235 for (i = 0; i < slen - 2; i += 3) {
236 *bufout++ = base[ENCODE_TO_ASCII(((src[i]) >> 2) & 0x3F)];
237 *bufout++ = base[ENCODE_TO_ASCII((((src[i]) & 0x3) << 4)
238 | ((int)((src[i + 1]) & 0xF0) >> 4))];
239 *bufout++ = base[ENCODE_TO_ASCII((((src[i + 1]) & 0xF) << 2)
240 | ((int)(ENCODE_TO_ASCII(src[i + 2]) & 0xC0) >> 6))];
241 *bufout++ = base[ENCODE_TO_ASCII((src[i + 2]) & 0x3F)];
244 *bufout++ = base[ENCODE_TO_ASCII(((src[i]) >> 2) & 0x3F)];
245 if (i == (slen - 1)) {
246 *bufout++ = base[ENCODE_TO_ASCII((((src[i]) & 0x3) << 4))];
247 if (!(flags & APR_ENCODE_NOPADDING)) {
252 *bufout++ = base[ENCODE_TO_ASCII((((src[i]) & 0x3) << 4)
253 | ((int)((src[i + 1]) & 0xF0) >> 4))];
254 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 1]) & 0xF) << 2)];
256 if (!(flags & APR_ENCODE_NOPADDING)) {
262 *len = bufout - dest;
271 *len = ((slen + 2) / 3 * 4) + 1;
277 APR_DECLARE(apr_status_t) apr_encode_base64_binary(char *dest, const unsigned char *src,
278 apr_ssize_t slen, int flags, apr_size_t * len)
287 register char *bufout = dest;
290 if (0 == ((flags & APR_ENCODE_BASE64URL))) {
297 for (i = 0; i < slen - 2; i += 3) {
298 *bufout++ = base[(src[i] >> 2) & 0x3F];
299 *bufout++ = base[((src[i] & 0x3) << 4)
300 | ((int)(src[i + 1] & 0xF0) >> 4)];
301 *bufout++ = base[((src[i + 1] & 0xF) << 2)
302 | ((int)(src[i + 2] & 0xC0) >> 6)];
303 *bufout++ = base[src[i + 2] & 0x3F];
306 *bufout++ = base[(src[i] >> 2) & 0x3F];
307 if (i == (slen - 1)) {
308 *bufout++ = base[((src[i] & 0x3) << 4)];
309 if (!(flags & APR_ENCODE_NOPADDING)) {
314 *bufout++ = base[((src[i] & 0x3) << 4)
315 | ((int)(src[i + 1] & 0xF0) >> 4)];
316 *bufout++ = base[((src[i + 1] & 0xF) << 2)];
318 if (!(flags & APR_ENCODE_NOPADDING)) {
324 *len = bufout - dest;
333 *len = ((slen + 2) / 3 * 4) + 1;
339 APR_DECLARE(const char *)apr_pencode_base64(apr_pool_t * p, const char *src,
340 apr_ssize_t slen, int flags, apr_size_t * len)
344 switch (apr_encode_base64(NULL, src, slen, flags, &size)) {
346 char *cmd = apr_palloc(p, size);
347 apr_encode_base64(cmd, src, slen, flags, len);
358 APR_DECLARE(const char *)apr_pencode_base64_binary(apr_pool_t * p, const unsigned char *src,
359 apr_ssize_t slen, int flags, apr_size_t * len)
363 switch (apr_encode_base64_binary(NULL, src, slen, flags, &size)) {
365 char *cmd = apr_palloc(p, size);
366 apr_encode_base64_binary(cmd, src, slen, flags, len);
377 APR_DECLARE(apr_status_t) apr_decode_base64(char *dest, const char *src,
378 apr_ssize_t slen, int flags, apr_size_t * len)
384 if (APR_ENCODE_STRING == slen) {
389 register const unsigned char *bufin;
390 register unsigned char *bufout;
391 register apr_size_t nprbytes;
392 register apr_size_t count = slen;
396 bufin = (const unsigned char *)src;
397 while (pr2six[*(bufin++)] < 64 && count)
399 nprbytes = (bufin - (const unsigned char *)src) - 1;
400 while (pr2six[*(bufin++)] > 64 && count)
403 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
404 count ? APR_BADCH : APR_SUCCESS;
406 bufout = (unsigned char *)dest;
407 bufin = (const unsigned char *)src;
409 while (nprbytes > 4) {
410 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2six[bufin[0]] << 2
411 | pr2six[bufin[1]] >> 4);
412 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
413 pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
414 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
415 pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
424 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
425 pr2six[*bufin] << 2 | pr2six[bufin[1]] >> 4);
428 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
429 pr2six[bufin[1]] << 4 | pr2six[bufin[2]] >> 2);
432 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
433 pr2six[bufin[2]] << 6 | pr2six[bufin[3]]);
437 *len = bufout - (unsigned char *)dest;
446 *len = (((int)slen + 3) / 4) * 3 + 1;
452 APR_DECLARE(apr_status_t) apr_decode_base64_binary(unsigned char *dest,
453 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
459 if (APR_ENCODE_STRING == slen) {
464 register const unsigned char *bufin;
465 register unsigned char *bufout;
466 register apr_size_t nprbytes;
467 register apr_size_t count = slen;
471 bufin = (const unsigned char *)src;
472 while (pr2six[*(bufin++)] < 64 && count)
474 nprbytes = (bufin - (const unsigned char *)src) - 1;
475 while (pr2six[*(bufin++)] > 64 && count)
478 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
479 count ? APR_BADCH : APR_SUCCESS;
481 bufout = (unsigned char *)dest;
482 bufin = (const unsigned char *)src;
484 while (nprbytes > 4) {
485 *(bufout++) = (unsigned char)(pr2six[bufin[0]] << 2
486 | pr2six[bufin[1]] >> 4);
487 *(bufout++) = (unsigned char)(pr2six[bufin[1]] << 4
488 | pr2six[bufin[2]] >> 2);
489 *(bufout++) = (unsigned char)(pr2six[bufin[2]] << 6
499 *(bufout++) = (unsigned char)(pr2six[bufin[0]] << 2
500 | pr2six[bufin[1]] >> 4);
503 *(bufout++) = (unsigned char)(pr2six[bufin[1]] << 4
504 | pr2six[bufin[2]] >> 2);
507 *(bufout++) = (unsigned char)(pr2six[bufin[2]] << 6
512 *len = bufout - dest;
519 *len = (((int)slen + 3) / 4) * 3;
525 APR_DECLARE(const char *)apr_pdecode_base64(apr_pool_t * p, const char *str,
526 apr_ssize_t slen, int flags, apr_size_t * len)
530 switch (apr_decode_base64(NULL, str, slen, flags, &size)) {
532 void *cmd = apr_palloc(p, size);
533 apr_decode_base64(cmd, str, slen, flags, len);
545 APR_DECLARE(const unsigned char *)apr_pdecode_base64_binary(apr_pool_t * p,
546 const char *str, apr_ssize_t slen, int flags, apr_size_t * len)
550 switch (apr_decode_base64_binary(NULL, str, slen, flags, &size)) {
552 unsigned char *cmd = apr_palloc(p, size + 1);
554 apr_decode_base64_binary(cmd, str, slen, flags, len);
566 APR_DECLARE(apr_status_t) apr_encode_base32(char *dest, const char *src,
567 apr_ssize_t slen, int flags, apr_size_t * len)
575 if (APR_ENCODE_STRING == slen) {
580 register char *bufout = dest;
583 if (!((flags & APR_ENCODE_BASE32HEX))) {
590 for (i = 0; i < slen - 4; i += 5) {
591 *bufout++ = base[ENCODE_TO_ASCII((src[i] >> 3) & 0x1F)];
592 *bufout++ = base[ENCODE_TO_ASCII(((src[i] << 2) & 0x1C)
593 | ((src[i + 1] >> 6) & 0x3))];
594 *bufout++ = base[ENCODE_TO_ASCII((src[i + 1] >> 1) & 0x1F)];
595 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 1] << 4) & 0x10)
596 | ((src[i + 2] >> 4) & 0xF))];
597 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 2] << 1) & 0x1E)
598 | ((src[i + 3] >> 7) & 0x1))];
599 *bufout++ = base[ENCODE_TO_ASCII((src[i + 3] >> 2) & 0x1F)];
600 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 3] << 3) & 0x18)
601 | ((src[i + 4] >> 5) & 0x7))];
602 *bufout++ = base[ENCODE_TO_ASCII(src[i + 4] & 0x1F)];
605 *bufout++ = base[ENCODE_TO_ASCII(src[i] >> 3) & 0x1F];
606 if (i == (slen - 1)) {
607 *bufout++ = base[ENCODE_TO_ASCII((src[i] << 2) & 0x1C)];
608 if (!(flags & APR_ENCODE_NOPADDING)) {
617 else if (i == (slen - 2)) {
618 *bufout++ = base[ENCODE_TO_ASCII(((src[i] << 2) & 0x1C)
619 | ((src[i + 1] >> 6) & 0x3))];
620 *bufout++ = base[ENCODE_TO_ASCII((src[i + 1] >> 1) & 0x1F)];
621 *bufout++ = base[ENCODE_TO_ASCII((src[i + 1] << 4) & 0x10)];
622 if (!(flags & APR_ENCODE_NOPADDING)) {
629 else if (i == (slen - 3)) {
630 *bufout++ = base[ENCODE_TO_ASCII(((src[i] << 2) & 0x1C)
631 | ((src[i + 1] >> 6) & 0x3))];
632 *bufout++ = base[ENCODE_TO_ASCII((src[i + 1] >> 1) & 0x1F)];
633 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 1] << 4) & 0x10)
634 | ((src[i + 2] >> 4) & 0xF))];
635 *bufout++ = base[ENCODE_TO_ASCII((src[i + 2] << 1) & 0x1E)];
636 if (!(flags & APR_ENCODE_NOPADDING)) {
643 *bufout++ = base[ENCODE_TO_ASCII(((src[i] << 2) & 0x1C)
644 | ((src[i + 1] >> 6) & 0x3))];
645 *bufout++ = base[ENCODE_TO_ASCII((src[i + 1] >> 1) & 0x1F)];
646 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 1] << 4) & 0x10)
647 | ((src[i + 2] >> 4) & 0xF))];
648 *bufout++ = base[ENCODE_TO_ASCII(((src[i + 2] << 1) & 0x1E)
649 | ((src[i + 3] >> 7) & 0x1))];
650 *bufout++ = base[ENCODE_TO_ASCII((src[i + 3] >> 2) & 0x1F)];
651 *bufout++ = base[ENCODE_TO_ASCII((src[i + 3] << 3) & 0x18)];
652 if (!(flags & APR_ENCODE_NOPADDING)) {
659 *len = bufout - dest;
668 *len = ((slen + 2) / 3 * 4) + 1;
674 APR_DECLARE(apr_status_t) apr_encode_base32_binary(char *dest, const unsigned char *src,
675 apr_ssize_t slen, int flags, apr_size_t * len)
684 register char *bufout = dest;
687 if (!((flags & APR_ENCODE_BASE32HEX))) {
694 for (i = 0; i < slen - 4; i += 5) {
695 *bufout++ = base[((src[i] >> 3) & 0x1F)];
696 *bufout++ = base[(((src[i] << 2) & 0x1C)
697 | ((src[i + 1] >> 6) & 0x3))];
698 *bufout++ = base[((src[i + 1] >> 1) & 0x1F)];
699 *bufout++ = base[(((src[i + 1] << 4) & 0x10)
700 | ((src[i + 2] >> 4) & 0xF))];
701 *bufout++ = base[(((src[i + 2] << 1) & 0x1E)
702 | ((src[i + 3] >> 7) & 0x1))];
703 *bufout++ = base[((src[i + 3] >> 2) & 0x1F)];
704 *bufout++ = base[(((src[i + 3] << 3) & 0x18)
705 | ((src[i + 4] >> 5) & 0x7))];
706 *bufout++ = base[(src[i + 4] & 0x1F)];
709 *bufout++ = base[(src[i] >> 3) & 0x1F];
710 if (i == (slen - 1)) {
711 *bufout++ = base[((src[i] << 2) & 0x1C)];
712 if (!(flags & APR_ENCODE_NOPADDING)) {
721 else if (i == (slen - 2)) {
722 *bufout++ = base[(((src[i] << 2) & 0x1C)
723 | ((src[i + 1] >> 6) & 0x3))];
724 *bufout++ = base[((src[i + 1] >> 1) & 0x1F)];
725 *bufout++ = base[((src[i + 1] << 4) & 0x10)];
726 if (!(flags & APR_ENCODE_NOPADDING)) {
733 else if (i == (slen - 3)) {
734 *bufout++ = base[(((src[i] << 2) & 0x1C)
735 | ((src[i + 1] >> 6) & 0x3))];
736 *bufout++ = base[((src[i + 1] >> 1) & 0x1F)];
737 *bufout++ = base[(((src[i + 1] << 4) & 0x10)
738 | ((int)(src[i + 2] >> 4) & 0xF))];
739 *bufout++ = base[((src[i + 2] << 1) & 0x1E)];
740 if (!(flags & APR_ENCODE_NOPADDING)) {
747 *bufout++ = base[(((src[i] << 2) & 0x1C)
748 | ((src[i + 1] >> 6) & 0x3))];
749 *bufout++ = base[((src[i + 1] >> 1) & 0x1F)];
750 *bufout++ = base[(((src[i + 1] << 4) & 0x10)
751 | ((src[i + 2] >> 4) & 0xF))];
752 *bufout++ = base[(((src[i + 2] << 1) & 0x1E)
753 | ((src[i + 3] >> 7) & 0x1))];
754 *bufout++ = base[((src[i + 3] >> 2) & 0x1F)];
755 *bufout++ = base[((src[i + 3] << 3) & 0x18)];
756 if (!(flags & APR_ENCODE_NOPADDING)) {
763 *len = bufout - dest;
772 *len = ((slen + 4) / 5 * 8) + 1;
778 APR_DECLARE(const char *)apr_pencode_base32(apr_pool_t * p, const char *src,
779 apr_ssize_t slen, int flags, apr_size_t * len)
783 switch (apr_encode_base32(NULL, src, slen, flags, &size)) {
785 char *cmd = apr_palloc(p, size);
786 apr_encode_base32(cmd, src, slen, flags, len);
797 APR_DECLARE(const char *)apr_pencode_base32_binary(apr_pool_t * p, const unsigned char *src,
798 apr_ssize_t slen, int flags, apr_size_t * len)
802 switch (apr_encode_base32_binary(NULL, src, slen, flags, &size)) {
804 char *cmd = apr_palloc(p, size);
805 apr_encode_base32_binary(cmd, src, slen, flags, len);
816 APR_DECLARE(apr_status_t) apr_decode_base32(char *dest, const char *src,
817 apr_ssize_t slen, int flags, apr_size_t * len)
823 if (APR_ENCODE_STRING == slen) {
828 register const unsigned char *bufin;
829 register unsigned char *bufout;
830 register apr_size_t nprbytes;
831 register apr_size_t count = slen;
833 const unsigned char *pr2;
837 if ((flags & APR_ENCODE_BASE32HEX)) {
844 bufin = (const unsigned char *)src;
845 while (pr2[*(bufin++)] < 32 && count)
847 nprbytes = (bufin - (const unsigned char *)src) - 1;
848 while (pr2[*(bufin++)] > 32 && count)
851 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
852 count ? APR_BADCH : APR_SUCCESS;
854 bufout = (unsigned char *)dest;
855 bufin = (const unsigned char *)src;
857 while (nprbytes > 8) {
858 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[0]] << 3
859 | pr2[bufin[1]] >> 2);
860 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[1]] << 6
861 | pr2[bufin[2]] << 1 | pr2[bufin[3]] >> 4);
862 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[3]] << 4
863 | pr2[bufin[4]] >> 1);
864 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[4]] << 7
865 | pr2[bufin[5]] << 2 | pr2[bufin[6]] >> 3);
866 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[6]] << 5
876 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
877 pr2[bufin[0]] << 3 | pr2[bufin[1]] >> 2);
883 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
884 pr2[bufin[1]] << 6 | pr2[bufin[2]] << 1
885 | pr2[bufin[3]] >> 4);
888 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[3]] << 4
889 | pr2[bufin[4]] >> 1);
895 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[4]] << 7
896 | pr2[bufin[5]] << 2 | pr2[bufin[6]] >> 3);
899 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(pr2[bufin[6]] << 5
904 *len = bufout - (unsigned char *)dest;
913 *len = (((int)slen + 7) / 8) * 5 + 1;
919 APR_DECLARE(apr_status_t) apr_decode_base32_binary(unsigned char *dest,
920 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
926 if (APR_ENCODE_STRING == slen) {
931 register const unsigned char *bufin;
932 register unsigned char *bufout;
933 register apr_size_t nprbytes;
934 register apr_size_t count = slen;
936 const unsigned char *pr2;
940 if ((flags & APR_ENCODE_BASE32HEX)) {
947 bufin = (const unsigned char *)src;
948 while (pr2[*(bufin++)] < 32 && count)
950 nprbytes = (bufin - (const unsigned char *)src) - 1;
951 while (pr2[*(bufin++)] > 32 && count)
954 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
955 count ? APR_BADCH : APR_SUCCESS;
957 bufout = (unsigned char *)dest;
958 bufin = (const unsigned char *)src;
960 while (nprbytes > 8) {
961 *(bufout++) = (unsigned char)(pr2[bufin[0]] << 3
962 | pr2[bufin[1]] >> 2);
963 *(bufout++) = (unsigned char)(pr2[bufin[1]] << 6
964 | pr2[bufin[2]] << 1 | pr2[bufin[3]] >> 4);
965 *(bufout++) = (unsigned char)(pr2[bufin[3]] << 4
966 | pr2[bufin[4]] >> 1);
967 *(bufout++) = (unsigned char)(pr2[bufin[4]] << 7
968 | pr2[bufin[5]] << 2 | pr2[bufin[6]] >> 3);
969 *(bufout++) = (unsigned char)(pr2[bufin[6]] << 5
979 *(bufout++) = (unsigned char)(
980 pr2[bufin[0]] << 3 | pr2[bufin[1]] >> 2);
986 *(bufout++) = (unsigned char)(
987 pr2[bufin[1]] << 6 | pr2[bufin[2]] << 1
988 | pr2[bufin[3]] >> 4);
991 *(bufout++) = (unsigned char)(pr2[bufin[3]] << 4
992 | pr2[bufin[4]] >> 1);
998 *(bufout++) = (unsigned char)(pr2[bufin[4]] << 7
999 | pr2[bufin[5]] << 2 | pr2[bufin[6]] >> 3);
1001 if (nprbytes == 8) {
1002 *(bufout++) = (unsigned char)(pr2[bufin[6]] << 5
1007 *len = bufout - dest;
1014 *len = (((int)slen + 7) / 8) * 5;
1020 APR_DECLARE(const char *)apr_pdecode_base32(apr_pool_t * p, const char *str,
1021 apr_ssize_t slen, int flags, apr_size_t * len)
1025 switch (apr_decode_base32(NULL, str, slen, flags, &size)) {
1027 void *cmd = apr_palloc(p, size);
1028 apr_decode_base32(cmd, str, slen, flags, len);
1040 APR_DECLARE(const unsigned char *)apr_pdecode_base32_binary(apr_pool_t * p,
1041 const char *str, apr_ssize_t slen, int flags, apr_size_t * len)
1045 switch (apr_decode_base32_binary(NULL, str, slen, flags, &size)) {
1047 unsigned char *cmd = apr_palloc(p, size + 1);
1049 apr_decode_base32_binary(cmd, str, slen, flags, len);
1061 APR_DECLARE(apr_status_t) apr_encode_base16(char *dest,
1062 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
1064 const char *in = src;
1068 return APR_NOTFOUND;
1072 register char *bufout = dest;
1075 if ((flags & APR_ENCODE_LOWER)) {
1082 for (size = 0; (APR_ENCODE_STRING == slen) ? in[size] : size < slen; size++) {
1083 if ((flags & APR_ENCODE_COLON) && size) {
1086 *(bufout++) = base[(const unsigned char)(ENCODE_TO_ASCII(in[size])) >> 4];
1087 *(bufout++) = base[(const unsigned char)(ENCODE_TO_ASCII(in[size])) & 0xf];
1091 *len = bufout - dest;
1100 if (APR_ENCODE_STRING == slen) {
1103 if ((flags & APR_ENCODE_COLON) && slen) {
1107 *len = slen * 2 + 1;
1114 APR_DECLARE(apr_status_t) apr_encode_base16_binary(char *dest,
1115 const unsigned char *src, apr_ssize_t slen, int flags, apr_size_t * len)
1117 const unsigned char *in = src;
1121 return APR_NOTFOUND;
1125 register char *bufout = dest;
1128 if ((flags & APR_ENCODE_LOWER)) {
1135 for (size = 0; size < slen; size++) {
1136 if ((flags & APR_ENCODE_COLON) && size) {
1139 *(bufout++) = base[in[size] >> 4];
1140 *(bufout++) = base[in[size] & 0xf];
1144 *len = bufout - dest;
1153 if ((flags & APR_ENCODE_COLON) && slen) {
1157 *len = slen * 2 + 1;
1164 APR_DECLARE(const char *)apr_pencode_base16(apr_pool_t * p,
1165 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
1169 switch (apr_encode_base16(NULL, src, slen, flags, &size)) {
1171 char *cmd = apr_palloc(p, size);
1172 apr_encode_base16(cmd, src, slen, flags, len);
1183 APR_DECLARE(const char *)apr_pencode_base16_binary(apr_pool_t * p,
1184 const unsigned char *src, apr_ssize_t slen, int flags,
1189 switch (apr_encode_base16_binary(NULL, src, slen, flags, &size)) {
1191 char *cmd = apr_palloc(p, size);
1192 apr_encode_base16_binary(cmd, src, slen, flags, len);
1203 APR_DECLARE(apr_status_t) apr_decode_base16(char *dest,
1204 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
1206 register const unsigned char *bufin;
1207 register unsigned char *bufout;
1208 register apr_size_t nprbytes;
1209 register apr_size_t count;
1211 apr_status_t status;
1214 return APR_NOTFOUND;
1217 if (APR_ENCODE_STRING == slen) {
1222 bufin = (const unsigned char *)src;
1223 while (pr2two[*(bufin++)] != 16 && count)
1225 nprbytes = (bufin - (const unsigned char *)src) - 1;
1226 while (pr2two[*(bufin++)] > 16 && count)
1229 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
1230 count ? APR_BADCH : APR_SUCCESS;
1234 bufout = (unsigned char *)dest;
1235 bufin = (const unsigned char *)src;
1237 while (nprbytes >= 2) {
1238 if (pr2two[bufin[0]] > 16) {
1243 *(bufout++) = (unsigned char)ENCODE_TO_NATIVE(
1244 pr2two[bufin[0]] << 4 | pr2two[bufin[1]]);
1250 if (nprbytes == 1) {
1255 *len = bufout - (unsigned char *)dest;
1266 bufin = (const unsigned char *)src;
1268 while (nprbytes >= 2) {
1269 if (pr2two[bufin[0]] > 16) {
1280 if (nprbytes == 1) {
1293 APR_DECLARE(apr_status_t) apr_decode_base16_binary(unsigned char *dest,
1294 const char *src, apr_ssize_t slen, int flags, apr_size_t * len)
1296 register const unsigned char *bufin;
1297 register unsigned char *bufout;
1298 register apr_size_t nprbytes;
1299 register apr_size_t count;
1301 apr_status_t status;
1304 return APR_NOTFOUND;
1307 if (APR_ENCODE_STRING == slen) {
1312 bufin = (const unsigned char *)src;
1313 while (pr2two[*(bufin++)] != 16 && count)
1315 nprbytes = (bufin - (const unsigned char *)src) - 1;
1316 while (pr2two[*(bufin++)] > 16 && count)
1319 status = flags & APR_ENCODE_RELAXED ? APR_SUCCESS :
1320 count ? APR_BADCH : APR_SUCCESS;
1324 bufout = (unsigned char *)dest;
1325 bufin = (const unsigned char *)src;
1327 while (nprbytes >= 2) {
1328 if (pr2two[bufin[0]] > 16) {
1333 *(bufout++) = (unsigned char)(
1334 pr2two[bufin[0]] << 4 | pr2two[bufin[1]]);
1340 if (nprbytes == 1) {
1345 *len = bufout - (unsigned char *)dest;
1354 bufin = (const unsigned char *)src;
1356 while (nprbytes >= 2) {
1357 if (pr2two[bufin[0]] > 16) {
1368 if (nprbytes == 1) {
1380 APR_DECLARE(const char *)apr_pdecode_base16(apr_pool_t * p,
1381 const char *str, apr_ssize_t slen, int flags, apr_size_t * len)
1385 switch (apr_decode_base16(NULL, str, slen, flags, &size)) {
1387 void *cmd = apr_palloc(p, size);
1388 apr_decode_base16(cmd, str, slen, flags, len);
1400 APR_DECLARE(const unsigned char *)apr_pdecode_base16_binary(apr_pool_t * p,
1401 const char *str, apr_ssize_t slen, int flags, apr_size_t * len)
1405 switch (apr_decode_base16_binary(NULL, str, slen, flags, &size)) {
1407 unsigned char *cmd = apr_palloc(p, size + 1);
1409 apr_decode_base16_binary(cmd, str, slen, flags, len);