commit bf956991e6e86000ab257922390f5ccd74b105cf
parent 4bfb9d8a59bbb4e10db58e6847b01e6b7ec9ba19
Author: Andrew Kloet <andrew@kloet.net>
Date: Fri, 1 May 2026 14:01:04 -0400
use openssl b64 encode
Diffstat:
| M | cio.c | | | 30 | ++++++------------------------ |
1 file changed, 6 insertions(+), 24 deletions(-)
diff --git a/cio.c b/cio.c
@@ -38,6 +38,7 @@
#include <unistd.h>
#include <curses.h>
+#include <openssl/evp.h>
#include <openssl/ssl.h>
#include <openssl/x509v3.h>
@@ -152,29 +153,6 @@ empty(const char *str) {
return (str == NULL || str[0] == '\0');
}
-static char *
-b64_enc(const unsigned char *in, size_t len)
-{
- static char out[BufSz];
- const char *t =
- "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
- char *p = out;
- size_t i;
-
- for (i = 0; i < len; i += 3) {
- unsigned int b0 = in[i];
- unsigned int b1 = (i + 1 < len) ? in[i + 1] : 0;
- unsigned int b2 = (i + 2 < len) ? in[i + 2] : 0;
- unsigned int v = (b0 << 16) | (b1 << 8) | b2;
- *p++ = t[(v >> 18) & 0x3F];
- *p++ = t[(v >> 12) & 0x3F];
- *p++ = (i + 1 < len) ? t[(v >> 6) & 0x3F] : '=';
- *p++ = (i + 2 < len) ? t[v & 0x3F] : '=';
- }
- *p = '\0';
- return out;
-}
-
static void
sndf(const char *fmt, ...)
{
@@ -559,13 +537,17 @@ scmd(char *usr, char *cmd, int argc, char **argv)
sndf("AUTHENTICATE +");
} else if (!empty(usr) && !empty(key)) {
unsigned char raw[512];
+ char b64[((sizeof(raw) + 2) / 3) * 4 + 1];
size_t ulen = strlen(usr);
size_t klen = strlen(key);
+ size_t rlen = ulen + klen + 2;
+ if (rlen > sizeof(raw)) break;
raw[0] = '\0';
memcpy(raw + 1, usr, ulen);
raw[1 + ulen] = '\0';
memcpy(raw + 2 + ulen, key, klen);
- sndf("AUTHENTICATE %s", b64_enc(raw, ulen + klen + 2));
+ EVP_EncodeBlock((unsigned char *)b64, raw, rlen);
+ sndf("AUTHENTICATE %s", b64);
}
break;
case SASL_OK: