1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

base64: add decode variant that uses in_len instead of NUL term

This commit is contained in:
Andy Green 2017-10-19 07:33:25 +08:00
parent 2639b276f4
commit aebf187b98
2 changed files with 35 additions and 7 deletions

View file

@ -5288,10 +5288,22 @@ lws_b64_encode_string_url(const char *in, int in_len, char *out, int out_size);
* \param out: result buffer
* \param out_size: length of result buffer
*
* Decodes a string using b64
* Decodes a NUL-terminated string using b64
*/
LWS_VISIBLE LWS_EXTERN int
lws_b64_decode_string(const char *in, char *out, int out_size);
/**
* lws_b64_decode_string_len(): decode a string from base 64
*
* \param in: incoming buffer
* \param in_len: length of incoming buffer
* \param out: result buffer
* \param out_size: length of result buffer
*
* Decodes a range of chars using b64
*/
LWS_VISIBLE LWS_EXTERN int
lws_b64_decode_string_len(const char *in, int in_len, char *out, int out_size);
///@}

View file

@ -107,23 +107,27 @@ lws_b64_encode_string_url(const char *in, int in_len, char *out, int out_size)
/*
* returns length of decoded string in out, or -1 if out was too small
* according to out_size
*
* Only reads up to in_len chars, otherwise if in_len is -1 on entry reads until
* the first NUL in the input.
*/
LWS_VISIBLE int
lws_b64_decode_string(const char *in, char *out, int out_size)
static int
_lws_b64_decode_string(const char *in, int in_len, char *out, int out_size)
{
int len, i, c = 0, done = 0;
unsigned char v, quad[4];
while (*in) {
while (in_len && *in) {
len = 0;
for (i = 0; i < 4 && *in; i++) {
for (i = 0; i < 4 && in_len && *in; i++) {
v = 0;
c = 0;
while (*in && !v) {
while (in_len && *in && !v) {
c = v = *in++;
in_len--;
/* support the url base64 variant too */
if (v == '-')
c = v = '+';
@ -151,7 +155,7 @@ lws_b64_decode_string(const char *in, char *out, int out_size)
* bytes." (wikipedia)
*/
if (!*in && c == '=')
if ((!in_len || !*in) && c == '=')
len--;
if (len >= 2)
@ -172,6 +176,18 @@ lws_b64_decode_string(const char *in, char *out, int out_size)
return done;
}
LWS_VISIBLE int
lws_b64_decode_string(const char *in, char *out, int out_size)
{
return _lws_b64_decode_string(in, -1, out, out_size);
}
LWS_VISIBLE int
lws_b64_decode_string_len(const char *in, int in_len, char *out, int out_size)
{
return _lws_b64_decode_string(in, in_len, out, out_size);
}
#if 0
int
lws_b64_selftest(void)