diff --git a/src/irc.c b/src/irc.c index dd226df..dc57c7d 100644 --- a/src/irc.c +++ b/src/irc.c @@ -2166,8 +2166,8 @@ static int irc_server_sasl_authenticate(struct link_server *ircs) size_t p_len = strlen(sasl_password); size_t raw_len = u_len * 2 + p_len + 2; size_t enc_len; - unsigned char *raw_str = bip_malloc(raw_len + 1); - unsigned char *enc_str; + char *raw_str = bip_malloc(raw_len + 1); + char *enc_str; memcpy(raw_str, sasl_username, u_len); raw_str[u_len] = '\0'; diff --git a/src/utils/base64.c b/src/utils/base64.c index f901294..982be3e 100644 --- a/src/utils/base64.c +++ b/src/utils/base64.c @@ -1,45 +1,44 @@ /* * Base64 encoding/decoding (RFC1341) - * Copyright (c) 2005-2011, Jouni Malinen + * Copyright (c) 2005-2019, Jouni Malinen * Copyright (c) 2022 Loïc Gomez * + * Source: http://w1.fi/cgit/hostap/commit/src/utils/base64.c + * Last synchronization date: 2022-03-18 + * (c7e6dbdad8ee043a9d7f856502196dbeb65cb4ac hostap commit was then used) + * * This software may be distributed under the terms of the BSD license. * See README for more details. */ #include +#include #include #include #include "base64.h" -static const unsigned char base64_table[65] = +static const char base64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -/** - * base64_encode - Base64 encode - * @src: Data to be encoded - * @len: Length of the data to be encoded - * @out_len: Pointer to output length variable, or %NULL if not used - * Returns: Allocated buffer of out_len bytes of encoded data, - * or %NULL on failure - * - * Caller is responsible for freeing the returned buffer. Returned buffer is - * nul terminated to make it easier to use as a C string. The nul terminator is - * not included in out_len. - * - * BIP change: remove line returns. - */ -unsigned char *base64_encode(const unsigned char *src, size_t len, - size_t *out_len) + +#define BASE64_PAD 1 +#define BASE64_LF 2 + + +static char *base64_gen_encode(const unsigned char *src, size_t len, + size_t *out_len, const char *table, int add_pad) { - unsigned char *out, *pos; + char *out, *pos; const unsigned char *end, *in; size_t olen; int line_len; + if (len >= SIZE_MAX / 4) + return NULL; olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ - olen += olen / 72; /* line feeds */ - olen++; /* nul termination */ + if (add_pad & BASE64_LF) + olen += olen / 72; /* line feeds */ + olen++; /* nul termination */ if (olen < len) return NULL; /* integer overflow */ out = malloc(olen); @@ -51,43 +50,56 @@ unsigned char *base64_encode(const unsigned char *src, size_t len, pos = out; line_len = 0; while (end - in >= 3) { - *pos++ = base64_table[in[0] >> 2]; - *pos++ = base64_table[((in[0] & 0x03) << 4) | (in[1] >> 4)]; - *pos++ = base64_table[((in[1] & 0x0f) << 2) | (in[2] >> 6)]; - *pos++ = base64_table[in[2] & 0x3f]; + *pos++ = table[(in[0] >> 2) & 0x3f]; + *pos++ = table[(((in[0] & 0x03) << 4) | (in[1] >> 4)) & 0x3f]; + *pos++ = table[(((in[1] & 0x0f) << 2) | (in[2] >> 6)) & 0x3f]; + *pos++ = table[in[2] & 0x3f]; in += 3; line_len += 4; - /* - * BIP change: remove line returns. - if (line_len >= 72) { + if ((add_pad & BASE64_LF) && line_len >= 72) { *pos++ = '\n'; line_len = 0; } - */ } if (end - in) { - *pos++ = base64_table[in[0] >> 2]; + *pos++ = table[(in[0] >> 2) & 0x3f]; if (end - in == 1) { - *pos++ = base64_table[(in[0] & 0x03) << 4]; - *pos++ = '='; + *pos++ = table[((in[0] & 0x03) << 4) & 0x3f]; + if (add_pad & BASE64_PAD) + *pos++ = '='; } else { - *pos++ = base64_table[((in[0] & 0x03) << 4) - | (in[1] >> 4)]; - *pos++ = base64_table[(in[1] & 0x0f) << 2]; + *pos++ = table[(((in[0] & 0x03) << 4) | (in[1] >> 4)) + & 0x3f]; + *pos++ = table[((in[1] & 0x0f) << 2) & 0x3f]; } - *pos++ = '='; + if (add_pad & BASE64_PAD) + *pos++ = '='; line_len += 4; } - /* - * BIP change: remove line returns. - if (line_len) + if ((add_pad & BASE64_LF) && line_len) *pos++ = '\n'; - */ *pos = '\0'; if (out_len) *out_len = (size_t)(pos - out); return out; } + +/** + * base64_encode - Base64 encode without line feeds + * @src: Data to be encoded + * @len: Length of the data to be encoded + * @out_len: Pointer to output length variable, or %NULL if not used + * Returns: Allocated buffer of out_len bytes of encoded data, + * or %NULL on failure + * + * Caller is responsible for freeing the returned buffer. Returned buffer is + * nul terminated to make it easier to use as a C string. The nul terminator is + * not included in out_len. + */ +char *base64_encode(const void *src, size_t len, size_t *out_len) +{ + return base64_gen_encode(src, len, out_len, base64_table, BASE64_PAD); +} diff --git a/src/utils/base64.h b/src/utils/base64.h index fd2592f..9523d3d 100644 --- a/src/utils/base64.h +++ b/src/utils/base64.h @@ -10,7 +10,6 @@ #ifndef BASE64_H #define BASE64_H -unsigned char *base64_encode(const unsigned char *src, size_t len, - size_t *out_len); +char *base64_encode(const void *src, size_t len, size_t *out_len); #endif /* BASE64_H */