From 4ff77be04ac96437c87ff6058e2012830bc891a4 Mon Sep 17 00:00:00 2001 From: Heiko Reese Date: Fri, 20 Aug 2021 00:48:18 +0200 Subject: [PATCH] =?UTF-8?q?=E2=80=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Makefile | 2 +- src/genkey.c | 22 ++++-- src/libexim-encrypt-dlfunc.c | 131 +++++++++++++++++++++++------------ src/simple_exim_test.sh | 15 ++-- 4 files changed, 113 insertions(+), 57 deletions(-) diff --git a/src/Makefile b/src/Makefile index 9911154..6e01d42 100644 --- a/src/Makefile +++ b/src/Makefile @@ -1,5 +1,5 @@ CC=gcc -CFLAGS=-Wall +CFLAGS=-Wall -g LDFLAGS=-lsodium LDFLAGS_LIB=-I/usr/include/exim4 -fpic -shared -export-dynamic diff --git a/src/genkey.c b/src/genkey.c index 576b833..c169f30 100644 --- a/src/genkey.c +++ b/src/genkey.c @@ -32,6 +32,15 @@ void dump_key_as_exim_config(FILE * f, const char *name, unsigned char *key, unsigned int keylen) { + // write a comment with C variable declaration + fprintf(f, "# const unsigned char %s[%d] = { ", name, keylen); + for (int i = 0; i < keylen; i++) { + fprintf(f, "0x%02x", key[i]); + if (i < keylen - 1) { + fprintf(f, ", "); + } + } + fprintf(f, " }; const unsigned int %s_length = %d;\n", name, keylen); // encode with base64 unsigned int b64len = sodium_base64_ENCODED_LEN(keylen, sodium_base64_VARIANT_ORIGINAL); unsigned char *b64string = malloc(b64len); @@ -89,6 +98,8 @@ void create_cryptobox_keys(const char *filebase, const char *varname) unsigned char recipient_pk[crypto_box_PUBLICKEYBYTES]; unsigned char recipient_sk[crypto_box_SECRETKEYBYTES]; + crypto_box_keypair(recipient_pk, recipient_sk); + char pk_filename[4096]; char pk_varname[4096]; char sk_filename[4096]; @@ -106,11 +117,10 @@ void create_cryptobox_keys(const char *filebase, const char *varname) } -void create_secretboy_key(const char *filebase, const char *varname) { +void create_secretbox_key(const char *filebase, const char *varname) { unsigned char key[crypto_secretbox_KEYBYTES]; - while (key_contains_zero(key, crypto_secretbox_KEYBYTES)) { - crypto_secretbox_keygen(key); - } + + crypto_secretbox_keygen(key); char key_filename[4096]; char key_varname[4096]; @@ -121,7 +131,7 @@ void create_secretboy_key(const char *filebase, const char *varname) { write_key_files(key_filename, key_varname, key, crypto_secretbox_KEYBYTES); } -int main(void) +int main(int argc, char *argv[]) { if (sodium_init() < 0) { fputs("Unable to initialize libsodium", stderr); @@ -130,8 +140,6 @@ int main(void) fputs("=== Creating cryptobox key pair ===\n", stderr); create_cryptobox_keys("cryptobox_recipient", "cryptobox_recipient"); - fputs("=== Creating secretbox key ===\n", stderr); - create_secretboy_key("secretbox", "secretbox"); exit(EXIT_SUCCESS); } diff --git a/src/libexim-encrypt-dlfunc.c b/src/libexim-encrypt-dlfunc.c index 1ad607f..35a36f6 100644 --- a/src/libexim-encrypt-dlfunc.c +++ b/src/libexim-encrypt-dlfunc.c @@ -3,18 +3,20 @@ #include #include +#include +#include + /* Exim4 dlfunc API header */ #include -int b64decode(unsigned char * const input, const size_t input_len, unsigned char * output) { - unsigned int output_len = input_len / 4 * 3; - output = store_get(output_len); - sodium_memzero(output, output_len); - int b64err = sodium_base642bin(output, output_len, (const char *) input, input_len, NULL, NULL, NULL, sodium_base64_VARIANT_ORIGINAL); - if (b64err != 0) { - return -1; +char * string2hex(unsigned char * input, size_t length) { + const int growth = 3; + char * outstring = store_get(growth*length+1); + memset(outstring, 0, 3*length+1); + for (int i =0; i