Use libsodium base64

main
cel 5 years ago
parent 52ec6488b4
commit a29ae31525

@ -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

@ -1,118 +0,0 @@
/*
This code is public domain software.
*/
#include "base64.h"
#include <stdlib.h>
#include <string.h>
#include <errno.h>
// 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;
}

@ -1,6 +0,0 @@
#pragma once
#include <stddef.h>
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);

@ -32,7 +32,6 @@
#include <sodium.h>
#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");

Loading…
Cancel
Save