From baad5b6b936cc4ee66b5ac230aacee858921a947 Mon Sep 17 00:00:00 2001
From: Pierre-Louis Bonicoli <pierre-louis.bonicoli@libregerbil.fr>
Date: Fri, 18 Mar 2022 05:08:39 +0100
Subject: [PATCH] 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 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 <j@w1.fi>
+ * Copyright (c) 2005-2019, Jouni Malinen <j@w1.fi>
  * 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 <stddef.h>
+#include <stdint.h>
 #include <stdlib.h>
 #include <string.h>
 #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.35.1

