cio

a simple irc client
Download | Log | Files | Refs | README | LICENSE

commit bf956991e6e86000ab257922390f5ccd74b105cf
parent 4bfb9d8a59bbb4e10db58e6847b01e6b7ec9ba19
Author: Andrew Kloet <andrew@kloet.net>
Date:   Fri,  1 May 2026 14:01:04 -0400

use openssl b64 encode

Diffstat:
Mcio.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: