diff options
Diffstat (limited to 'src/microhttpd/base64.c')
-rw-r--r-- | src/microhttpd/base64.c | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/src/microhttpd/base64.c b/src/microhttpd/base64.c new file mode 100644 index 00000000..d14317b3 --- /dev/null +++ b/src/microhttpd/base64.c | |||
@@ -0,0 +1,62 @@ | |||
1 | /* | ||
2 | * This code implements the BASE64 algorithm. | ||
3 | * This code is in the public domain; do with it what you wish. | ||
4 | * | ||
5 | * @file base64.c | ||
6 | * @brief This code implements the BASE64 algorithm | ||
7 | * @author Matthieu Speder | ||
8 | */ | ||
9 | #include "base64.h" | ||
10 | |||
11 | static const char base64_chars[] = | ||
12 | "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; | ||
13 | |||
14 | static const char base64_digits[] = | ||
15 | { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
16 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
17 | 0, 0, 0, 0, 0, 62, 0, 0, 0, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, | ||
18 | 0, 0, 0, -1, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, | ||
19 | 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 0, 0, 0, 0, 0, 0, 26, | ||
20 | 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, | ||
21 | 45, 46, 47, 48, 49, 50, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
23 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
24 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
25 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; | ||
27 | |||
28 | |||
29 | char * | ||
30 | BASE64Decode(const char* src) | ||
31 | { | ||
32 | size_t in_len = strlen (src); | ||
33 | char* dest; | ||
34 | char* result; | ||
35 | |||
36 | if (in_len % 4) | ||
37 | { | ||
38 | /* Wrong base64 string length */ | ||
39 | return NULL; | ||
40 | } | ||
41 | result = dest = malloc(in_len / 4 * 3 + 1); | ||
42 | if (result == NULL) | ||
43 | return NULL; /* out of memory */ | ||
44 | while (*src) { | ||
45 | char a = base64_digits[(unsigned char)*(src++)]; | ||
46 | char b = base64_digits[(unsigned char)*(src++)]; | ||
47 | char c = base64_digits[(unsigned char)*(src++)]; | ||
48 | char d = base64_digits[(unsigned char)*(src++)]; | ||
49 | *(dest++) = (a << 2) | ((b & 0x30) >> 4); | ||
50 | if (c == (char)-1) | ||
51 | break; | ||
52 | *(dest++) = ((b & 0x0f) << 4) | ((c & 0x3c) >> 2); | ||
53 | if (d == (char)-1) | ||
54 | break; | ||
55 | *(dest++) = ((c & 0x03) << 6) | d; | ||
56 | } | ||
57 | *dest = 0; | ||
58 | return result; | ||
59 | } | ||
60 | |||
61 | |||
62 | /* end of base64.c */ | ||