]>
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.
19 static void base64_init(void);
21 static int base64_initialized
= 0;
22 #define BASE64_VALUE_SZ 256
23 #define BASE64_RESULT_SZ 8192
24 int base64_value
[BASE64_VALUE_SZ
];
25 const char base64_code
[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
32 for (i
= 0; i
< BASE64_VALUE_SZ
; i
++)
35 for (i
= 0; i
< 64; i
++)
36 base64_value
[(int) base64_code
[i
]] = i
;
37 base64_value
['='] = 0;
39 base64_initialized
= 1;
43 base64_decode_len(const char *data
)
48 int terminatorLen
= 0;
49 int dataLen
= strlen(data
);
52 for (i
= dataLen
- 1; i
>= 0; i
--) {
58 return dataLen
/ 4 * 3 - terminatorLen
;
62 base64_decode(char *result
, unsigned int result_size
, const char *p
)
67 if (!p
|| !result
|| result_size
== 0)
69 if (!base64_initialized
)
73 unsigned int k
= ((unsigned char) *p
) % BASE64_VALUE_SZ
;
74 if (base64_value
[k
] < 0)
77 val
+= base64_value
[k
];
80 /* One quantum of four encoding characters/24 bit */
81 if (j
+4 <= result_size
) {
82 // Speed optimization: plenty of space, avoid some per-byte checks.
83 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
84 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
85 result
[j
++] = val
& 0xff; /* Low 8 bits */
87 // part-quantum goes a bit slower with per-byte checks
88 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
91 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
94 result
[j
++] = val
& 0xff; /* Low 8 bits */
104 base64_encode_len(int len
)
106 // NP: some magic numbers + potential nil-terminator
107 return ((len
+ 2) / 3 * 4) + 1;
111 old_base64_encode(const char *decoded_str
)
113 static char result
[BASE64_RESULT_SZ
];
114 base64_encode_str(result
, sizeof(result
), decoded_str
, strlen(decoded_str
));
119 base64_encode_bin(const char *decoded_str
, int len
)
121 static char result
[BASE64_RESULT_SZ
];
122 base64_encode_str(result
, sizeof(result
), decoded_str
, len
);
127 base64_encode_str(char *result
, int result_max_size
, const char *data
, int data_size
)
129 if (result_max_size
< 1)
132 int used
= base64_encode(result
, result_max_size
, data
, data_size
);
134 if (used
>= result_max_size
) {
135 result
[result_max_size
- 1] = '\0';
136 return result_max_size
;
138 result
[used
++] = '\0';
143 /* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
145 base64_encode(char *result
, int result_size
, const char *data
, int data_size
)
151 if (!data
|| !*data
|| !result
|| result_size
< 1 || data_size
< 1)
154 if (!base64_initialized
)
157 while (data_size
--) {
158 int c
= (unsigned char) *data
++;
161 if (char_count
== 3) {
162 if (out_cnt
>= result_size
)
164 if (out_cnt
+4 <= result_size
) {
165 result
[out_cnt
++] = base64_code
[bits
>> 18];
166 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
167 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
168 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
170 // part-quantum goes a bit slower with per-byte checks
171 result
[out_cnt
++] = base64_code
[bits
>> 18];
172 if (out_cnt
>= result_size
)
174 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
175 if (out_cnt
>= result_size
)
177 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
178 if (out_cnt
>= result_size
)
180 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
188 if (char_count
!= 0) {
189 bits
<<= 16 - (8 * char_count
);
190 if (out_cnt
>= result_size
)
192 result
[out_cnt
++] = base64_code
[bits
>> 18];
193 if (out_cnt
>= result_size
)
195 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
196 if (char_count
== 1) {
197 if (out_cnt
>= result_size
)
199 result
[out_cnt
++] = '=';
200 if (out_cnt
>= result_size
)
202 result
[out_cnt
++] = '=';
204 if (out_cnt
>= result_size
)
206 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
207 if (out_cnt
>= result_size
)
209 result
[out_cnt
++] = '=';
212 return (out_cnt
>= result_size
?result_size
:out_cnt
);