From a29ae31525cbdd420aea28105f73b962db9ef635 Mon Sep 17 00:00:00 2001 From: cel Date: Mon, 25 May 2020 19:17:54 -0400 Subject: [PATCH] Use libsodium base64 --- Makefile | 2 +- base64.c | 118 ------------------------------------------------------- base64.h | 6 --- sbotc.c | 19 ++++++--- 4 files changed, 14 insertions(+), 131 deletions(-) delete mode 100644 base64.c delete mode 100644 base64.h diff --git a/Makefile b/Makefile index 3a26f42..af1a2e2 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ endif all: $(BIN) -$(BIN): $(BIN).c base64.c jsmn.c +$(BIN): $(BIN).c jsmn.c install: all @mkdir -vp $(DESTDIR)$(BINDIR) $(DESTDIR)$(MANDIR)/man1 diff --git a/base64.c b/base64.c deleted file mode 100644 index 1ee0395..0000000 --- a/base64.c +++ /dev/null @@ -1,118 +0,0 @@ -/* - - This code is public domain software. - -*/ - -#include "base64.h" - -#include -#include -#include - - -// single base64 character conversion -// -static int POS(char c) -{ - if (c>='A' && c<='Z') return c - 'A'; - if (c>='a' && c<='z') return c - 'a' + 26; - if (c>='0' && c<='9') return c - '0' + 52; - if (c == '+') return 62; - if (c == '/') return 63; - if (c == '=') return -1; - return -2; -} - -// base64 decoding -// -// s: base64 string -// str_len size of the base64 string -// data: output buffer for decoded data -// data_len expected size of decoded data -// return: 0 on success, -1 on failure -// -int base64_decode(const char* s, size_t str_len, void *data, size_t data_len) -{ - const char *p, *str_end; - unsigned char *q, *end; - int n[4] = { 0, 0, 0, 0 }; - - if (str_len % 4) { errno = EBADMSG; return -1; } - q = (unsigned char*) data; - end = q + data_len; - str_end = s + str_len; - - for (p = s; p < str_end; ) { - n[0] = POS(*p++); - n[1] = POS(*p++); - n[2] = POS(*p++); - n[3] = POS(*p++); - - if (n[0] == -2 || n[1] == -2 || n[2] == -2 || n[3] == -2) - { errno = EBADMSG; return -1; } - - if (n[0] == -1 || n[1] == -1) - { errno = EBADMSG; return -1; } - - if (n[2] == -1 && n[3] != -1) - { errno = EBADMSG; return -1; } - - if (q >= end) { errno = EMSGSIZE; return -1; } - q[0] = (n[0] << 2) + (n[1] >> 4); - if (n[2] != -1) { - if (q+1 >= end) { errno = EMSGSIZE; return -1; } - q[1] = ((n[1] & 15) << 4) + (n[2] >> 2); - } - if (n[3] != -1) { - if (q+2 >= end) { errno = EMSGSIZE; return -1; } - q[2] = ((n[2] & 3) << 6) + n[3]; - } - q += 3; - } - - return 0; -} - -int base64_encode(const void* buf, size_t size, char *str, size_t out_size) { - static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - char* p = str; - const unsigned char* q = (const unsigned char*) buf; - size_t i = 0; - - if ((size+3)*4/3 + 1 > out_size) { - errno = EMSGSIZE; - return -1; - } - - while (i < size) { - int c = q[i++]; - c *= 256; - if (i < size) - c += q[i]; - i++; - - c *= 256; - if (i < size) - c += q[i]; - i++; - - *p++ = base64[(c & 0x00fc0000) >> 18]; - *p++ = base64[(c & 0x0003f000) >> 12]; - - if (i > size + 1) - *p++ = '='; - else - *p++ = base64[(c & 0x00000fc0) >> 6]; - - if (i > size) - *p++ = '='; - else - *p++ = base64[c & 0x0000003f]; - } - - *p = 0; - - return 0; -} diff --git a/base64.h b/base64.h deleted file mode 100644 index 8ca4652..0000000 --- a/base64.h +++ /dev/null @@ -1,6 +0,0 @@ -#pragma once - -#include - -int base64_encode(const void* buf, size_t size, char *str, size_t out_size); -int base64_decode(const char *s, size_t str_len, void *data, size_t data_len); diff --git a/sbotc.c b/sbotc.c index 4e88681..657ca31 100644 --- a/sbotc.c +++ b/sbotc.c @@ -32,7 +32,6 @@ #include -#include "base64.h" #include "jsmn.h" #define BOXS_MAXLEN 4096 @@ -386,7 +385,10 @@ static int pubkey_decode(const char *key_str, unsigned char key[32]) { size_t len = strlen(key_str); if (len == 52 && strcmp(key_str+44, ".ed25519") == 0) {} else if (len != 44) { errno = EMSGSIZE; return -1; } - return base64_decode(key_str, 44, key, 32); + return sodium_base642bin( + (unsigned char *const)key, 32, + (const char *const)key_str, 44, + NULL, NULL, NULL, sodium_base64_VARIANT_ORIGINAL); } static int seckey_decode(const char *key_str, unsigned char key[64]) { @@ -395,7 +397,10 @@ static int seckey_decode(const char *key_str, unsigned char key[64]) { if (*key_str == '@') key_str++; size_t len = strlen(key_str); if (len > 8 && memcmp(key_str + len - 8, ".ed25519", 8) == 0) len -= 8; - return base64_decode(key_str, len, key, 64); + return sodium_base642bin( + (unsigned char *const)key, 64, + (const char *const)key_str, len, + NULL, NULL, NULL, sodium_base64_VARIANT_ORIGINAL); } static jsmntok_t *json_lookup(const char *buf, jsmntok_t *tok, const char *prop, size_t prop_len) { @@ -509,7 +514,10 @@ static void read_private_key(const char *dir, unsigned char pk[64]) { if (key_len > 8 && memcmp(pk_b64 + key_len - 8, ".ed25519", 8) == 0) key_len -= 8; - rc = base64_decode(pk_b64, key_len, pk, 64); + rc = sodium_base642bin( + (unsigned char *const)pk, 64, + (const char *const)pk_b64, key_len, + NULL, NULL, NULL, sodium_base64_VARIANT_ORIGINAL); if (rc < 0) err(1, "unable to decode private key"); } @@ -908,8 +916,7 @@ static int muxrpc_write_blob_add(struct boxs *bs, int infd, int outfd, int req_i rc = crypto_hash_sha256_final(&hash_state, hash); if (rc < 0) errx(1, "hash finalize failed"); - rc = base64_encode(hash, 32, id+1, sizeof(id)-1); - if (rc < 0) err(1, "encoding hash failed"); + (void)sodium_bin2base64(id+1, sizeof(id)-1, hash, 32, sodium_base64_VARIANT_ORIGINAL); strcpy(id + 45, ".sha256\n"); rc = write_all(outfd, id, sizeof(id)-1); if (rc < 0) err(1, "writing hash failed");