29 #define BASE64_TABLE_MAX 122
33 static const int b64table[] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
34 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
35 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
36 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
37 -1, -1, -1, 62, -1, -1, -1, 63, 52, 53,
38 54, 55, 56, 57, 58, 59, 60, 61, -1, -1,
39 -1, -1, -1, -1, -1, 0, 1, 2, 3, 4,
40 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
41 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
42 25, -1, -1, -1, -1, -1, -1, 26, 27, 28,
43 29, 30, 31, 32, 33, 34, 35, 36, 37, 38,
44 39, 40, 41, 42, 43, 44, 45, 46, 47, 48,
54 static inline int GetBase64Value(uint8_t c)
60 val = b64table[(int) c];
76 ascii[0] = (uint8_t) (b64[0] << 2) | (b64[1] >> 4);
77 ascii[1] = (uint8_t) (b64[1] << 4) | (b64[2] >> 2);
78 ascii[2] = (uint8_t) (b64[2] << 6) | (b64[3]);
95 uint32_t *consumed_bytes, uint32_t *decoded_bytes,
Base64Mode mode)
98 uint32_t
padding = 0, bbidx = 0, sp = 0, leading_sp = 0;
106 for (uint32_t i = 0; i <
len; i++) {
108 val = GetBase64Value(
src[i]);
132 b64[bbidx++] = (val > 0 ? (uint8_t)val : 0);
139 if (dest_size < *decoded_bytes + numDecoded_blk) {
146 DecodeBase64Block(dptr, b64);
147 dptr += numDecoded_blk;
148 *decoded_bytes += numDecoded_blk;
155 memset(&b64, 0,
sizeof(b64));
162 DecodeBase64Block(dptr, b64);
163 *consumed_bytes += bbidx;
170 DecodeBase64Block(dptr, b64);
173 if (*decoded_bytes == 0) {
177 *consumed_bytes += leading_sp;
183 #define TEST_RFC2045(src, fin_str, dest_size, exp_decoded, exp_consumed, ecode) \
185 uint32_t consumed_bytes = 0, num_decoded = 0; \
186 uint8_t dst[dest_size]; \
187 Base64Ecode code = DecodeBase64(dst, strlen(fin_str), (const uint8_t *)src, strlen(src), \
188 &consumed_bytes, &num_decoded, BASE64_MODE_RFC2045); \
189 FAIL_IF(code != ecode); \
190 FAIL_IF(memcmp(dst, fin_str, strlen(fin_str)) != 0); \
191 FAIL_IF(num_decoded != exp_decoded); \
192 FAIL_IF(consumed_bytes != exp_consumed); \
195 #define TEST_RFC4648(src, fin_str, dest_size, exp_decoded, exp_consumed, ecode) \
197 uint32_t consumed_bytes = 0, num_decoded = 0; \
198 uint8_t dst[dest_size]; \
199 Base64Ecode code = DecodeBase64(dst, strlen(fin_str), (const uint8_t *)src, strlen(src), \
200 &consumed_bytes, &num_decoded, BASE64_MODE_RFC4648); \
201 FAIL_IF(code != ecode); \
202 FAIL_IF(memcmp(dst, fin_str, strlen(fin_str)) != 0); \
203 FAIL_IF(num_decoded != exp_decoded); \
204 FAIL_IF(consumed_bytes != exp_consumed); \
207 static int B64DecodeCompleteString(
void)
212 const char *
src =
"SGVsbG8gV29ybGR6";
213 const char *fin_str =
"Hello Worldz";
218 static int B64DecodeInCompleteString(
void)
223 const char *
src =
"SGVsbG8gV29ybGR";
224 const char *fin_str =
"Hello Wor";
229 static int B64DecodeCompleteStringWSp(
void)
235 const char *
src =
"SGVs bG8 gV29y bGQ=";
236 const char *fin_str =
"Hello World";
241 static int B64DecodeInCompleteStringWSp(
void)
248 const char *
src =
"SGVs bG8 gV29y bGQ";
249 const char *fin_str =
"Hello Wor";
254 static int B64DecodeStringBiggerThanBuffer(
void)
260 const char *
src =
"SGVs bG8 gV29y bGQ=";
261 const char *fin_str =
"Hello Wor";
267 static int B64DecodeStringEndingSpaces(
void)
269 const char *
src =
"0YPhA d H";
270 uint32_t consumed_bytes = 0, num_decoded = 0;
280 static int B64TestVectorsRFC2045(
void)
282 const char *src1 =
"";
283 const char *fin_str1 =
"";
285 const char *src2 =
"Zg==";
286 const char *fin_str2 =
"f";
288 const char *src3 =
"Zm8=";
289 const char *fin_str3 =
"fo";
291 const char *src4 =
"Zm9v";
292 const char *fin_str4 =
"foo";
294 const char *src5 =
"Zm9vYg==";
295 const char *fin_str5 =
"foob";
297 const char *src6 =
"Zm9vYmE=";
298 const char *fin_str6 =
"fooba";
300 const char *src7 =
"Zm9vYmFy";
301 const char *fin_str7 =
"foobar";
303 const char *src8 =
"Zm 9v Ym Fy";
304 const char *fin_str8 =
"foobar";
306 const char *src9 =
"Zm$9vYm.Fy";
307 const char *fin_str9 =
"";
322 static int B64TestVectorsRFC4648(
void)
324 const char *src1 =
"";
325 const char *fin_str1 =
"";
327 const char *src2 =
"Zg==";
328 const char *fin_str2 =
"f";
330 const char *src3 =
"Zm8=";
331 const char *fin_str3 =
"fo";
333 const char *src4 =
"Zm9v";
334 const char *fin_str4 =
"foo";
336 const char *src5 =
"Zm9vYg==";
337 const char *fin_str5 =
"foob";
339 const char *src6 =
"Zm9vYmE=";
340 const char *fin_str6 =
"fooba";
342 const char *src7 =
"Zm9vYmFy";
343 const char *fin_str7 =
"foobar";
345 const char *src8 =
"Zm 9v Ym Fy";
346 const char *fin_str8 =
"f";
348 const char *src9 =
"Zm$9vYm.Fy";
349 const char *fin_str9 =
"f";
365 UtRegisterTest(
"B64DecodeCompleteStringWSp", B64DecodeCompleteStringWSp);
366 UtRegisterTest(
"B64DecodeInCompleteStringWSp", B64DecodeInCompleteStringWSp);
367 UtRegisterTest(
"B64DecodeCompleteString", B64DecodeCompleteString);
368 UtRegisterTest(
"B64DecodeInCompleteString", B64DecodeInCompleteString);
369 UtRegisterTest(
"B64DecodeStringBiggerThanBuffer", B64DecodeStringBiggerThanBuffer);
370 UtRegisterTest(
"B64DecodeStringEndingSpaces", B64DecodeStringEndingSpaces);