From 93f16738c5053a63635c7856c7759b1a402c2791 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Lo=C3=AFc=20Gomez?= <bip@kyoshiro.org>
Date: Sat, 19 Mar 2022 00:13:51 +0100
Subject: [PATCH 2/3] Be as close as possible to base64 lib, and use new
 function to reduce changes.

* use new base64_encode_no_lf() function having no line returns
* fix irc_server_sasl_authenticate(): add missing free(raw_str)
---
 .gitignore               |  2 ++
 AUTHORS                  |  4 +++-
 src/irc.c                |  3 ++-
 src/utils/base64.c       | 35 +++++++++++++++++------------------
 src/utils/base64.h       |  4 ++--
 src/utils/includes.h     |  4 ++++
 src/utils/os.h           |  3 +++
 src/utils/utils/common.h |  3 +++
 8 files changed, 36 insertions(+), 22 deletions(-)
 create mode 100644 src/utils/includes.h
 create mode 100644 src/utils/os.h
 create mode 100644 src/utils/utils/common.h

diff --git a/.gitignore b/.gitignore
index d3e7dbe..6d36a06 100644
--- a/.gitignore
+++ b/.gitignore
@@ -58,6 +58,8 @@ src/lex.c
 
 # Binaries
 src/*.o
+src/utils/*.o
+src/utils/*/*.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/irc.c b/src/irc.c
index dc57c7d..2cf1075 100644
--- a/src/irc.c
+++ b/src/irc.c
@@ -2174,7 +2174,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);
 
diff --git a/src/utils/base64.c b/src/utils/base64.c
index 982be3e..95f3141 100644
--- a/src/utils/base64.c
+++ b/src/utils/base64.c
@@ -1,32 +1,28 @@
 /*
  * Base64 encoding/decoding (RFC1341)
  * 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 "includes.h"
 #include <stdint.h>
-#include <stdlib.h>
-#include <string.h>
+
+#include "utils/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,9 @@ 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/utils/base64.h b/src/utils/base64.h
index 9523d3d..b35846e 100644
--- a/src/utils/base64.h
+++ b/src/utils/base64.h
@@ -1,7 +1,6 @@
 /*
  * Base64 encoding/decoding (RFC1341)
  * Copyright (c) 2005, Jouni Malinen <j@w1.fi>
- * 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,7 @@
 #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/utils/includes.h b/src/utils/includes.h
new file mode 100644
index 0000000..14cc8f4
--- /dev/null
+++ b/src/utils/includes.h
@@ -0,0 +1,4 @@
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
diff --git a/src/utils/os.h b/src/utils/os.h
new file mode 100644
index 0000000..a741159
--- /dev/null
+++ b/src/utils/os.h
@@ -0,0 +1,3 @@
+#ifndef os_malloc
+#define os_malloc(s) malloc((s))
+#endif
diff --git a/src/utils/utils/common.h b/src/utils/utils/common.h
new file mode 100644
index 0000000..6398d3b
--- /dev/null
+++ b/src/utils/utils/common.h
@@ -0,0 +1,3 @@
+#ifndef BIT
+#define BIT(x) (int)(1U << (x))
+#endif
-- 
2.30.2

