]>
git.ipfire.org Git - thirdparty/squid.git/blob - lib/base64.c
2 * AUTHOR: Markus Moeller
4 * Encoders adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments.
17 static void base64_init(void);
19 static int base64_initialized
= 0;
20 #define BASE64_VALUE_SZ 256
21 #define BASE64_RESULT_SZ 8192
22 int base64_value
[BASE64_VALUE_SZ
];
23 const char base64_code
[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
30 for (i
= 0; i
< BASE64_VALUE_SZ
; i
++)
33 for (i
= 0; i
< 64; i
++)
34 base64_value
[(int) base64_code
[i
]] = i
;
35 base64_value
['='] = 0;
37 base64_initialized
= 1;
41 base64_decode_len(const char *data
)
46 int terminatorLen
= 0;
47 int dataLen
= strlen(data
);
50 for (i
= dataLen
- 1; i
>= 0; i
--) {
56 return dataLen
/ 4 * 3 - terminatorLen
;
60 base64_decode(char *result
, unsigned int result_size
, const char *p
)
65 if (!p
|| !result
|| result_size
== 0)
67 if (!base64_initialized
)
71 unsigned int k
= ((unsigned char) *p
) % BASE64_VALUE_SZ
;
72 if (base64_value
[k
] < 0)
75 val
+= base64_value
[k
];
78 /* One quantum of four encoding characters/24 bit */
79 if (j
+4 <= result_size
) {
80 // Speed optimization: plenty of space, avoid some per-byte checks.
81 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
82 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
83 result
[j
++] = val
& 0xff; /* Low 8 bits */
85 // part-quantum goes a bit slower with per-byte checks
86 result
[j
++] = (val
>> 16) & 0xff; /* High 8 bits */
89 result
[j
++] = (val
>> 8) & 0xff; /* Mid 8 bits */
92 result
[j
++] = val
& 0xff; /* Low 8 bits */
102 base64_encode_len(int len
)
104 // NP: some magic numbers + potential nil-terminator
105 return ((len
+ 2) / 3 * 4) + 1;
109 old_base64_encode(const char *decoded_str
)
111 static char result
[BASE64_RESULT_SZ
];
112 base64_encode_str(result
, sizeof(result
), decoded_str
, strlen(decoded_str
));
117 base64_encode_bin(const char *decoded_str
, int len
)
119 static char result
[BASE64_RESULT_SZ
];
120 base64_encode_str(result
, sizeof(result
), decoded_str
, len
);
125 base64_encode_str(char *result
, int result_max_size
, const char *data
, int data_size
)
127 if (result_max_size
< 1)
130 int used
= base64_encode(result
, result_max_size
, data
, data_size
);
132 if (used
>= result_max_size
) {
133 result
[result_max_size
- 1] = '\0';
134 return result_max_size
;
136 result
[used
++] = '\0';
141 /* adopted from http://ftp.sunet.se/pub2/gnu/vm/base64-encode.c with adjustments */
143 base64_encode(char *result
, int result_size
, const char *data
, int data_size
)
149 if (!data
|| !*data
|| !result
|| result_size
< 1 || data_size
< 1)
152 if (!base64_initialized
)
155 while (data_size
--) {
156 int c
= (unsigned char) *data
++;
159 if (char_count
== 3) {
160 if (out_cnt
>= result_size
)
162 if (out_cnt
+4 <= result_size
) {
163 result
[out_cnt
++] = base64_code
[bits
>> 18];
164 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
165 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
166 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
168 // part-quantum goes a bit slower with per-byte checks
169 result
[out_cnt
++] = base64_code
[bits
>> 18];
170 if (out_cnt
>= result_size
)
172 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
173 if (out_cnt
>= result_size
)
175 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
176 if (out_cnt
>= result_size
)
178 result
[out_cnt
++] = base64_code
[bits
& 0x3f];
186 if (char_count
!= 0) {
187 bits
<<= 16 - (8 * char_count
);
188 if (out_cnt
>= result_size
)
190 result
[out_cnt
++] = base64_code
[bits
>> 18];
191 if (out_cnt
>= result_size
)
193 result
[out_cnt
++] = base64_code
[(bits
>> 12) & 0x3f];
194 if (char_count
== 1) {
195 if (out_cnt
>= result_size
)
197 result
[out_cnt
++] = '=';
198 if (out_cnt
>= result_size
)
200 result
[out_cnt
++] = '=';
202 if (out_cnt
>= result_size
)
204 result
[out_cnt
++] = base64_code
[(bits
>> 6) & 0x3f];
205 if (out_cnt
>= result_size
)
207 result
[out_cnt
++] = '=';
210 return (out_cnt
>= result_size
?result_size
:out_cnt
);