1
+ #ifndef _BASE64DECODE_H
2
+ #define _BASE64DECODE_H
3
+
4
+ // Copy from
5
+ // https://stackoverflow.com/questions/342409/how-do-i-base64-encode-decode-in-c
6
+
7
+ #include <stdint.h>
8
+ #include <stdlib.h>
9
+
10
+ static char encoding_table [] = {
11
+ 'A' , 'B' , 'C' , 'D' , 'E' , 'F' , 'G' , 'H' , 'I' , 'J' , 'K' , 'L' , 'M' ,
12
+ 'N' , 'O' , 'P' , 'Q' , 'R' , 'S' , 'T' , 'U' , 'V' , 'W' , 'X' , 'Y' , 'Z' ,
13
+ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' ,
14
+ 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' ,
15
+ '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , '+' , '/' };
16
+ static char decoding_table [256 ] = {
17
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
18
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
19
+ 0 , 0 , 0 , 0 , 0 , 62 , 0 , 0 , 0 , 63 , 52 , 53 , 54 , 55 , 56 , 57 , 58 , 59 , 60 ,
20
+ 61 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ,
21
+ 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 , 24 , 25 , 0 , 0 , 0 , 0 ,
22
+ 0 , 0 , 26 , 27 , 28 , 29 , 30 , 31 , 32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 , 40 , 41 , 42 ,
23
+ 43 , 44 , 45 , 46 , 47 , 48 , 49 , 50 , 51 , 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 ,
25
+ 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 ,
27
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
28
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
29
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ,
30
+ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 };
31
+ static int mod_table [] = {0 , 2 , 1 };
32
+
33
+ unsigned char * base64_decode (const char * data ,
34
+ size_t input_length ,
35
+ size_t * output_length ) {
36
+ if (input_length % 4 != 0 )
37
+ return NULL ;
38
+
39
+ * output_length = input_length / 4 * 3 ;
40
+ if (data [input_length - 1 ] == '=' )
41
+ (* output_length )-- ;
42
+ if (data [input_length - 2 ] == '=' )
43
+ (* output_length )-- ;
44
+
45
+ unsigned char * decoded_data = (unsigned char * )malloc (* output_length );
46
+ if (decoded_data == NULL )
47
+ return NULL ;
48
+
49
+ for (int i = 0 , j = 0 ; i < input_length ;) {
50
+ uint32_t sextet_a =
51
+ data [i ] == '=' ? 0 & i ++ : decoding_table [data [i ++ ]];
52
+ uint32_t sextet_b =
53
+ data [i ] == '=' ? 0 & i ++ : decoding_table [data [i ++ ]];
54
+ uint32_t sextet_c =
55
+ data [i ] == '=' ? 0 & i ++ : decoding_table [data [i ++ ]];
56
+ uint32_t sextet_d =
57
+ data [i ] == '=' ? 0 & i ++ : decoding_table [data [i ++ ]];
58
+
59
+ uint32_t triple = (sextet_a << 3 * 6 ) + (sextet_b << 2 * 6 ) +
60
+ (sextet_c << 1 * 6 ) + (sextet_d << 0 * 6 );
61
+
62
+ if (j < * output_length )
63
+ decoded_data [j ++ ] = (triple >> 2 * 8 ) & 0xFF ;
64
+ if (j < * output_length )
65
+ decoded_data [j ++ ] = (triple >> 1 * 8 ) & 0xFF ;
66
+ if (j < * output_length )
67
+ decoded_data [j ++ ] = (triple >> 0 * 8 ) & 0xFF ;
68
+ }
69
+
70
+ return decoded_data ;
71
+ }
72
+
73
+ #endif
0 commit comments