diff --git a/.gitignore b/.gitignore index d3e7dbe..422eef8 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,7 @@ src/lex.c # Binaries src/*.o +src/b64/*.o src/*.a src/bip src/bipmkpw diff --git a/AUTHORS b/AUTHORS index affc47e..6fd819b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -10,4 +10,6 @@ Thanks to our marketting and management team: ack|, ato, blackmore, lafouine, Gaston & gromit Crypto shamelessly stolen from Christophe 'sexy' Devine. -Credits to Jouni Malinen for base64 library (http://web.mit.edu/freebsd/head/contrib/wpa/src/utils/) + +Credits to Jouni Malinen for base64 library: +Source: http://w1.fi/cgit/hostap/commit/src/utils/base64.c diff --git a/src/Makefile.am b/src/Makefile.am index 57b8992..fabd767 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -19,7 +19,7 @@ libbip_a_SOURCES = \ path_util.c path_util.h \ tuple.h \ util.c util.h \ - utils/base64.c utils/base64.h + b64/base64.c b64/base64.h libbip_a_CFLAGS = ${OPENSSL_CFLAGS} $(AM_CFLAGS) diff --git a/src/b64/base64.c b/src/b64/base64.c new file mode 100644 index 0000000..3419e3f --- /dev/null +++ b/src/b64/base64.c @@ -0,0 +1,102 @@ +/* + * Base64 encoding/decoding (RFC1341) + * Copyright (c) 2005-2019, Jouni Malinen + * + * This software may be distributed under the terms of the BSD license. + * See README for more details. + */ + +#include "includes.h" +#include + +#include "common.h" +#include "os.h" +#include "base64.h" + +static const char base64_table[65] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + +#define BASE64_PAD BIT(0) +#define BASE64_LF BIT(1) + + +static char * base64_gen_encode(const unsigned char *src, size_t len, + size_t *out_len, const char *table, int add_pad) +{ + 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 */ + if (add_pad & BASE64_LF) + olen += olen / 72; /* line feeds */ + olen++; /* nul termination */ + if (olen < len) + return NULL; /* integer overflow */ + out = os_malloc(olen); + if (out == NULL) + return NULL; + + end = src + len; + in = src; + pos = out; + line_len = 0; + while (end - in >= 3) { + *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; + if ((add_pad & BASE64_LF) && line_len >= 72) { + *pos++ = '\n'; + line_len = 0; + } + } + + if (end - in) { + *pos++ = table[(in[0] >> 2) & 0x3f]; + if (end - in == 1) { + *pos++ = table[((in[0] & 0x03) << 4) & 0x3f]; + if (add_pad & BASE64_PAD) + *pos++ = '='; + } else { + *pos++ = table[(((in[0] & 0x03) << 4) | + (in[1] >> 4)) & 0x3f]; + *pos++ = table[((in[1] & 0x0f) << 2) & 0x3f]; + } + if (add_pad & BASE64_PAD) + *pos++ = '='; + line_len += 4; + } + + 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 + * @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_no_lf(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/b64/base64.h similarity index 67% rename from src/utils/base64.h rename to src/b64/base64.h index fd2592f..b3c0454 100644 --- a/src/utils/base64.h +++ b/src/b64/base64.h @@ -1,7 +1,6 @@ /* * Base64 encoding/decoding (RFC1341) * Copyright (c) 2005, Jouni Malinen - * Copyright (c) 2022 Loïc Gomez * * This software may be distributed under the terms of the BSD license. * See README for more details. @@ -10,7 +9,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_no_lf(const void *src, size_t len, size_t *out_len); #endif /* BASE64_H */ diff --git a/src/b64/base64.lastsync b/src/b64/base64.lastsync new file mode 100644 index 0000000..4e926be --- /dev/null +++ b/src/b64/base64.lastsync @@ -0,0 +1,7 @@ +Last sync for base64 lib: +- by: Kyoshiro on 2024-02-19 +- url: http://w1.fi/cgit/hostap/commit/src/utils/base64.c +- commit-id: c7e6dbdad8ee043a9d7f856502196dbeb65cb4ac +- commit-date: Mon Jun 15 20:18:12 2020 +0300 +- base64.h: d545b2931ca2206a265226049d90882a527236f0 +- base64.c: 0d121c1989cac9349949b2cd3611f49a1ef2820f diff --git a/src/b64/common.h b/src/b64/common.h new file mode 100644 index 0000000..6398d3b --- /dev/null +++ b/src/b64/common.h @@ -0,0 +1,3 @@ +#ifndef BIT +#define BIT(x) (int)(1U << (x)) +#endif diff --git a/src/b64/includes.h b/src/b64/includes.h new file mode 100644 index 0000000..14cc8f4 --- /dev/null +++ b/src/b64/includes.h @@ -0,0 +1,4 @@ +#include +#include +#include +#include diff --git a/src/b64/os.h b/src/b64/os.h new file mode 100644 index 0000000..a741159 --- /dev/null +++ b/src/b64/os.h @@ -0,0 +1,3 @@ +#ifndef os_malloc +#define os_malloc(s) malloc((s)) +#endif diff --git a/src/irc.c b/src/irc.c index 63a602d..b7efa6d 100644 --- a/src/irc.c +++ b/src/irc.c @@ -22,7 +22,7 @@ #include "log.h" #include "connection.h" #include "md5.h" -#include "utils/base64.h" +#include "b64/base64.h" // TODO resolve assuming signed overflow does not occur when changing X +- C1 // cmp C2 to X cmp C2 -+ C1 @@ -2182,15 +2182,16 @@ 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'; memcpy(raw_str + u_len + 1, sasl_username, u_len); raw_str[u_len * 2 + 1] = '\0'; memcpy(raw_str + u_len * 2 + 2, sasl_password, p_len); - enc_str = base64_encode(raw_str, raw_len, &enc_len); + enc_str = base64_encode_no_lf(raw_str, raw_len, &enc_len); + free(raw_str); mylog(LOG_DEBUG, "[%s] Base64 encoded SASL auth token (len %d): %s", LINK(ircs)->name, enc_len, enc_str); diff --git a/src/utils/base64.c b/src/utils/base64.c deleted file mode 100644 index f901294..0000000 --- a/src/utils/base64.c +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Base64 encoding/decoding (RFC1341) - * Copyright (c) 2005-2011, Jouni Malinen - * Copyright (c) 2022 Loïc Gomez - * - * This software may be distributed under the terms of the BSD license. - * See README for more details. - */ - -#include -#include -#include -#include "base64.h" - -static const unsigned 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) -{ - unsigned char *out, *pos; - const unsigned char *end, *in; - size_t olen; - int line_len; - - olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ - olen += olen / 72; /* line feeds */ - olen++; /* nul termination */ - if (olen < len) - return NULL; /* integer overflow */ - out = malloc(olen); - if (out == NULL) - return NULL; - - end = src + len; - in = src; - 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]; - in += 3; - line_len += 4; - /* - * BIP change: remove line returns. - if (line_len >= 72) { - *pos++ = '\n'; - line_len = 0; - } - */ - } - - if (end - in) { - *pos++ = base64_table[in[0] >> 2]; - if (end - in == 1) { - *pos++ = base64_table[(in[0] & 0x03) << 4]; - *pos++ = '='; - } else { - *pos++ = base64_table[((in[0] & 0x03) << 4) - | (in[1] >> 4)]; - *pos++ = base64_table[(in[1] & 0x0f) << 2]; - } - *pos++ = '='; - line_len += 4; - } - - /* - * BIP change: remove line returns. - if (line_len) - *pos++ = '\n'; - */ - - *pos = '\0'; - if (out_len) - *out_len = (size_t)(pos - out); - return out; -}