]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/base64.c
4 * AUTHOR: Markus Moeller
6 * Encoders adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments.
20 static void base64_init(void);
22 static int base64_initialized
= 0;
23 #define BASE64_VALUE_SZ 256
24 #define BASE64_RESULT_SZ 8192
25 int base64_value
[BASE64_VALUE_SZ
];
26 const char base64_code
[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
34 for (i
= 0; i
< BASE64_VALUE_SZ
; i
++)
37 for (i
= 0; i
< 64; i
++)
38 base64_value
[(int) base64_code
[i
]] = i
;
39 base64_value
['='] = 0;
41 base64_initialized
= 1;
45 base64_decode_len(const char *data
)
50 int terminatorLen
= 0;
51 int dataLen
= strlen(data
);
54 for (i
= dataLen
- 1; i
>= 0; i
--) {
60 return dataLen
/ 4 * 3 - terminatorLen
;
64 base64_decode(char *result
, unsigned int result_size
, const char *p
)
69 if (!p
|| !result
|| result_size
== 0)
71 if (!base64_initialized
)
75 unsigned int k
= ((unsigned char) *p
) % BASE64_VALUE_SZ
;
76 if (base64_value
[k
] < 0)
79 val
+= base64_value
[k
];
82 /* One quantum of four encoding characters/24 bit */
83 if (j
+4 <= result_size
) {
84 // Speed optimization: plenty of space, avoid some per-byte checks.
85 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
86 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
87 result
[j
++] = val
& 0xff; /* Low 8 bits */
89 // part-quantum goes a bit slower with per-byte checks
90 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
93 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
96 result
[j
++] = val
& 0xff; /* Low 8 bits */
106 base64_encode_len(int len
)
108 // NP: some magic numbers + potential nil-terminator
109 return ((len
+ 2) / 3 * 4) + 1;
113 old_base64_encode(const char *decoded_str
)
115 static char result
[BASE64_RESULT_SZ
];
116 base64_encode_str(result
, sizeof(result
), decoded_str
, strlen(decoded_str
));
121 base64_encode_bin(const char *decoded_str
, int len
)
123 static char result
[BASE64_RESULT_SZ
];
124 base64_encode_str(result
, sizeof(result
), decoded_str
, len
);
129 base64_encode_str(char *result
, int result_max_size
, const char *data
, int data_size
)
131 if (result_max_size
< 1)
134 int used
= base64_encode(result
, result_max_size
, data
, data_size
);
136 if (used
>= result_max_size
) {
137 result
[result_max_size
- 1] = '\0';
138 return result_max_size
;
140 result
[used
++] = '\0';
145 /* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
147 base64_encode(char *result
, int result_size
, const char *data
, int data_size
)
153 if (!data
|| !*data
|| !result
|| result_size
< 1 || data_size
< 1)
156 if (!base64_initialized
)
159 while (data_size
--) {
160 int c
= (unsigned char) *data
++;
163 if (char_count
== 3) {
164 if (out_cnt
>= result_size
)
166 if (out_cnt
+4 <= result_size
) {
167 result
[out_cnt
++] = base64_code
[bits
>> 18];
168 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
169 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
170 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
172 // part-quantum goes a bit slower with per-byte checks
173 result
[out_cnt
++] = base64_code
[bits
>> 18];
174 if (out_cnt
>= result_size
)
176 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
177 if (out_cnt
>= result_size
)
179 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
180 if (out_cnt
>= result_size
)
182 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
190 if (char_count
!= 0) {
191 bits
<<= 16 - (8 * char_count
);
192 if (out_cnt
>= result_size
)
194 result
[out_cnt
++] = base64_code
[bits
>> 18];
195 if (out_cnt
>= result_size
)
197 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
198 if (char_count
== 1) {
199 if (out_cnt
>= result_size
)
201 result
[out_cnt
++] = '=';
202 if (out_cnt
>= result_size
)
204 result
[out_cnt
++] = '=';
206 if (out_cnt
>= result_size
)
208 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
209 if (out_cnt
>= result_size
)
211 result
[out_cnt
++] = '=';
214 return (out_cnt
>= result_size
?result_size
:out_cnt
);