TLS-PSK now taken out of secure vault, but LUKS passphrases not

LUKS passphrases still broken, they're copied over into the secure vault
but then not used (i.e., the zeroed-out originals are read).
This commit is contained in:
Johannes Bauer 2019-10-25 18:02:51 +02:00
parent dce9c1b323
commit f01ec97d6b
3 changed files with 35 additions and 2 deletions

View File

@ -249,6 +249,7 @@ static bool broadcast_for_keyserver(struct keyclient_t *keyclient) {
memcpy(query.magic, UDP_MESSAGE_MAGIC, sizeof(query.magic)); memcpy(query.magic, UDP_MESSAGE_MAGIC, sizeof(query.magic));
memcpy(query.host_uuid, keyclient->keydb->hosts[0].host_uuid, 16); memcpy(query.host_uuid, keyclient->keydb->hosts[0].host_uuid, 16);
while (true) { while (true) {
log_msg(LLVL_TRACE, "Broadcasting search for luksrku keyserver");
send_udp_broadcast_message(sd, keyclient->opts->port, &query, sizeof(query)); send_udp_broadcast_message(sd, keyclient->opts->port, &query, sizeof(query));
struct sockaddr_in src = { struct sockaddr_in src = {

7
log.c
View File

@ -29,6 +29,7 @@
#include <openssl/err.h> #include <openssl/err.h>
#include "log.h" #include "log.h"
#include "util.h"
static enum loglvl_t current_loglvl = LOGLEVEL_DEFAULT; static enum loglvl_t current_loglvl = LOGLEVEL_DEFAULT;
static const char *loglvl_names[] = { static const char *loglvl_names[] = {
@ -88,8 +89,12 @@ void log_libc(enum loglvl_t level, const char *msg, ...) {
} }
static int log_openssl_error_callback(const char *msg, size_t len, void *vlvlptr) { static int log_openssl_error_callback(const char *msg, size_t len, void *vlvlptr) {
char msgcopy[strlen(msg) + 1];
strcpy(msgcopy, msg);
truncate_crlf(msgcopy);
enum loglvl_t* levelptr = (enum loglvl_t*)vlvlptr; enum loglvl_t* levelptr = (enum loglvl_t*)vlvlptr;
log_msg(*levelptr, msg); log_msg(*levelptr, msgcopy);
return 0; return 0;
} }

View File

@ -49,9 +49,11 @@
#include "signals.h" #include "signals.h"
#include "udp.h" #include "udp.h"
#include "blacklist.h" #include "blacklist.h"
#include "vaulted_keydb.h"
struct keyserver_t { struct keyserver_t {
struct keydb_t* keydb; struct keydb_t* keydb;
struct vaulted_keydb_t *vaulted_keydb;
struct generic_tls_ctx_t gctx; struct generic_tls_ctx_t gctx;
const struct pgmopts_server_t *opts; const struct pgmopts_server_t *opts;
int tcp_sd, udp_sd; int tcp_sd, udp_sd;
@ -60,6 +62,7 @@ struct keyserver_t {
struct client_thread_ctx_t { struct client_thread_ctx_t {
struct generic_tls_ctx_t *gctx; struct generic_tls_ctx_t *gctx;
const struct keydb_t *keydb; const struct keydb_t *keydb;
struct vaulted_keydb_t *vaulted_keydb;
const struct host_entry_t *host; const struct host_entry_t *host;
int fd; int fd;
}; };
@ -128,7 +131,15 @@ static int psk_server_callback(SSL *ssl, const unsigned char *identity, size_t i
return 0; return 0;
} }
return openssl_tls13_psk_establish_session(ssl, ctx->host->tls_psk, PSK_SIZE_BYTES, EVP_sha256(), sessptr); uint8_t psk[PSK_SIZE_BYTES];
if (!vaulted_keydb_get_tls_psk(ctx->vaulted_keydb, psk, ctx->host)) {
log_msg(LLVL_WARNING, "Cannot establish server connection without TLS-PSK.");
return 0;
}
int result = openssl_tls13_psk_establish_session(ssl, psk, PSK_SIZE_BYTES, EVP_sha256(), sessptr);
OPENSSL_cleanse(psk, PSK_SIZE_BYTES);
return result;
} }
static void client_handler_thread(void *vctx) { static void client_handler_thread(void *vctx) {
@ -140,6 +151,7 @@ static void client_handler_thread(void *vctx) {
SSL_set_app_data(ssl, client); SSL_set_app_data(ssl, client);
if (SSL_accept(ssl) <= 0) { if (SSL_accept(ssl) <= 0) {
log_openssl(LLVL_WARNING, "Could not establish TLS connection to connecting client.");
ERR_print_errors_fp(stderr); ERR_print_errors_fp(stderr);
} else { } else {
if (client->host) { if (client->host) {
@ -224,6 +236,20 @@ bool keyserver_start(const struct pgmopts_server_t *opts) {
break; break;
} }
if (keyserver.keydb->host_count == 0) {
log_msg(LLVL_FATAL, "No host entries in key database: %s", opts->filename);
success = false;
break;
}
/* Then convert it into a vaulted key database */
keyserver.vaulted_keydb = vaulted_keydb_new(keyserver.keydb);
if (!keyserver.vaulted_keydb) {
log_msg(LLVL_FATAL, "Failed to create vaulted key database.");
success = false;
break;
}
if (!create_generic_tls_context(&keyserver.gctx, true)) { if (!create_generic_tls_context(&keyserver.gctx, true)) {
log_msg(LLVL_FATAL, "Failed to create OpenSSL server context."); log_msg(LLVL_FATAL, "Failed to create OpenSSL server context.");
success = false; success = false;
@ -273,6 +299,7 @@ bool keyserver_start(const struct pgmopts_server_t *opts) {
struct client_thread_ctx_t client_ctx = { struct client_thread_ctx_t client_ctx = {
.gctx = &keyserver.gctx, .gctx = &keyserver.gctx,
.keydb = keyserver.keydb, .keydb = keyserver.keydb,
.vaulted_keydb = keyserver.vaulted_keydb,
.fd = client, .fd = client,
}; };
if (!pthread_create_detached_thread(client_handler_thread, &client_ctx, sizeof(client_ctx))) { if (!pthread_create_detached_thread(client_handler_thread, &client_ctx, sizeof(client_ctx))) {