From 8c3e51c5596a46bf92c6375b5e788369c578053a Mon Sep 17 00:00:00 2001 From: Pierre-Louis Bonicoli Date: Fri, 18 Mar 2022 05:08:39 +0100 Subject: [PATCH 1/3] update base64 files: resync from the src project The allocated buffer size was slightly overestimated due to unused line feeds taken in account. I kept the differences with the original project as small as possible in order to make the next synchronization easy. --- src/irc.c | 4 +- src/utils/base64.c | 92 ++++++++++++++++++++++++++-------------------- src/utils/base64.h | 3 +- 3 files changed, 55 insertions(+), 44 deletions(-) diff --git a/src/irc.c b/src/irc.c index 63a602d..e31e9af 100644 --- a/src/irc.c +++ b/src/irc.c @@ -2182,8 +2182,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 */ -- 2.39.2 From 662bc9baf124e3dad156b493a5331aef9e2a54d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gomez?= Date: Mon, 19 Feb 2024 15:14:16 +0900 Subject: [PATCH 2/3] Move utils/base64 to b64 dedicated directory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Loïc Gomez --- .gitignore | 1 + src/Makefile.am | 2 +- src/{utils => b64}/base64.c | 0 src/{utils => b64}/base64.h | 0 src/irc.c | 2 +- 5 files changed, 3 insertions(+), 2 deletions(-) rename src/{utils => b64}/base64.c (100%) rename src/{utils => b64}/base64.h (100%) 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/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/utils/base64.c b/src/b64/base64.c similarity index 100% rename from src/utils/base64.c rename to src/b64/base64.c diff --git a/src/utils/base64.h b/src/b64/base64.h similarity index 100% rename from src/utils/base64.h rename to src/b64/base64.h diff --git a/src/irc.c b/src/irc.c index e31e9af..82ed6d1 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 -- 2.39.2 From f1214dbfb5fd35574e00b824d5c9482776ded621 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Gomez?= Date: Mon, 19 Feb 2024 15:19:13 +0900 Subject: [PATCH 3/3] Update base64 lib to latest version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * be as close as possible to the original code (except for extra src/b64/utils sub-directory) * use new base64_encode_no_lf() function with no line returns * fix irc_server_sasl_authenticate(): add missing free(raw_str) * add a lastsync status file in src/b64 for tracking Signed-off-by: Loïc Gomez --- AUTHORS | 4 +++- src/b64/base64.c | 33 +++++++++++++++------------------ src/b64/base64.h | 3 +-- src/b64/base64.lastsync | 7 +++++++ src/b64/common.h | 3 +++ src/b64/includes.h | 4 ++++ src/b64/os.h | 3 +++ src/irc.c | 3 ++- 8 files changed, 38 insertions(+), 22 deletions(-) create mode 100644 src/b64/base64.lastsync create mode 100644 src/b64/common.h create mode 100644 src/b64/includes.h create mode 100644 src/b64/os.h 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/b64/base64.c b/src/b64/base64.c index 982be3e..3419e3f 100644 --- a/src/b64/base64.c +++ b/src/b64/base64.c @@ -1,32 +1,28 @@ /* * Base64 encoding/decoding (RFC1341) * 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 "includes.h" #include -#include -#include + +#include "common.h" +#include "os.h" #include "base64.h" static const char base64_table[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; -#define BASE64_PAD 1 -#define BASE64_LF 2 +#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) +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; @@ -38,10 +34,10 @@ static char *base64_gen_encode(const unsigned char *src, size_t len, olen = len * 4 / 3 + 4; /* 3-byte blocks to 4-byte */ if (add_pad & BASE64_LF) olen += olen / 72; /* line feeds */ - olen++; /* nul termination */ + olen++; /* nul termination */ if (olen < len) return NULL; /* integer overflow */ - out = malloc(olen); + out = os_malloc(olen); if (out == NULL) return NULL; @@ -69,8 +65,8 @@ static char *base64_gen_encode(const unsigned char *src, size_t len, if (add_pad & BASE64_PAD) *pos++ = '='; } else { - *pos++ = table[(((in[0] & 0x03) << 4) | (in[1] >> 4)) - & 0x3f]; + *pos++ = table[(((in[0] & 0x03) << 4) | + (in[1] >> 4)) & 0x3f]; *pos++ = table[((in[1] & 0x0f) << 2) & 0x3f]; } if (add_pad & BASE64_PAD) @@ -87,8 +83,9 @@ static char *base64_gen_encode(const unsigned char *src, size_t len, return out; } + /** - * base64_encode - Base64 encode without line feeds + * 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 @@ -99,7 +96,7 @@ static char *base64_gen_encode(const unsigned char *src, size_t len, * 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) +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/b64/base64.h b/src/b64/base64.h index 9523d3d..b3c0454 100644 --- a/src/b64/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,6 +9,6 @@ #ifndef BASE64_H #define BASE64_H -char *base64_encode(const void *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 82ed6d1..b7efa6d 100644 --- a/src/irc.c +++ b/src/irc.c @@ -2190,7 +2190,8 @@ static int irc_server_sasl_authenticate(struct link_server *ircs) 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); -- 2.39.2