commit - 3d2b313875b7f2a1206086c7d07e409da937d32d
commit + bd00d3d86c59dc67cbe2602bd83b6db9689bf1ee
blob - 94e80f5c6b2a53534886eee31af6991a53ff1264
blob + c4eb9162d179fdc0014ab184998de43f33c278b0
--- ca.c
+++ ca.c
-/* $OpenBSD: ca.c,v 1.26 2017/05/28 10:39:15 benno Exp $ */
+/* $OpenBSD: ca.c,v 1.27 2017/07/28 13:58:52 bluhm Exp $ */
/*
* Copyright (c) 2014 Reyk Floeter <reyk@openbsd.org>
env->sc_id = getpid() & 0xffff;
}
-static void
-hash_string(char *d, size_t dlen, char *hash, size_t hashlen)
+void
+hash_x509(X509 *cert, char *hash, size_t hashlen)
{
static const char hex[] = "0123456789abcdef";
- size_t off, i;
+ size_t off;
+ char digest[EVP_MAX_MD_SIZE];
+ int dlen, i;
+ if (X509_digest(cert, EVP_sha256(), digest, &dlen) != 1)
+ fatalx("%s: X509_digest failed", __func__);
+
if (hashlen < 2 * dlen + sizeof("SHA256:"))
- fatalx("%s hash buffer to small", __func__);
+ fatalx("%s: hash buffer to small", __func__);
off = strlcpy(hash, "SHA256:", hashlen);
for (i = 0; i < dlen; i++) {
- hash[off++] = hex[(d[i] >> 4) & 0x0f];
- hash[off++] = hex[d[i] & 0x0f];
+ hash[off++] = hex[(digest[i] >> 4) & 0x0f];
+ hash[off++] = hex[digest[i] & 0x0f];
}
hash[off] = 0;
}
void
ca_launch(void)
{
- char d[EVP_MAX_MD_SIZE], hash[TLS_CERT_HASH_SIZE];
+ char hash[TLS_CERT_HASH_SIZE];
BIO *in = NULL;
EVP_PKEY *pkey = NULL;
struct relay *rlay;
X509 *cert = NULL;
- int dlen;
TAILQ_FOREACH(rlay, env->sc_relays, rl_entry) {
if ((rlay->rl_conf.flags & (F_TLS|F_TLSCLIENT)) == 0)
NULL, NULL)) == NULL)
fatalx("ca_launch: cert");
- if (X509_digest(cert, EVP_sha256(), d, &dlen) != 1)
- fatalx("ca_launch: cert");
+ hash_x509(cert, hash, sizeof(hash));
- hash_string(d, dlen, hash, sizeof(hash));
-
BIO_free(in);
X509_free(cert);
purge_key(&rlay->rl_tls_cert,
NULL, NULL)) == NULL)
fatalx("ca_launch: cacert");
- if (X509_digest(cert, EVP_sha256(), d, &dlen) != 1)
- fatalx("ca_launch: cacert");
+ hash_x509(cert, hash, sizeof(hash));
- hash_string(d, dlen, hash, sizeof(hash));
-
BIO_free(in);
X509_free(cert);
purge_key(&rlay->rl_tls_cacert,
fatalx("%s: invalid relay proc", __func__);
if (IMSG_DATA_SIZE(imsg) != (sizeof(cko) + cko.cko_flen))
fatalx("%s: invalid key operation", __func__);
- if ((pkey = pkey_find(env, cko.cko_hash)) == NULL ||
- (rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- fatalx("%s: invalid relay key or id", __func__);
+ if ((pkey = pkey_find(env, cko.cko_hash)) == NULL)
+ fatalx("%s: invalid relay hash '%s'",
+ __func__, cko.cko_hash);
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
+ fatalx("%s: invalid relay key", __func__);
DPRINTF("%s:%d: key hash %s proc %d",
__func__, __LINE__, cko.cko_hash, cko.cko_proc);
blob - 5a251026e3cc2ac0d9a6ec0c8252d981d7a4c519
blob + 32bba1f0cc0ebbdeaf4c3096fa560e8305f5cb02
--- relay.c
+++ relay.c
-/* $OpenBSD: relay.c,v 1.222 2017/07/04 19:59:51 benno Exp $ */
+/* $OpenBSD: relay.c,v 1.223 2017/07/28 13:58:52 bluhm Exp $ */
/*
* Copyright (c) 2006 - 2014 Reyk Floeter <reyk@openbsd.org>
if (rlay->rl_conf.tls_cacert_len) {
log_debug("%s: loading CA certificate", __func__);
- if (!ssl_load_pkey(&rlay->rl_conf.tls_cakeyid,
+ if (!ssl_load_pkey(
rlay->rl_tls_cacert, rlay->rl_conf.tls_cacert_len,
&rlay->rl_tls_cacertx509, &rlay->rl_tls_capkey))
goto err;
/* loading certificate public key */
- if (!ssl_load_pkey(NULL,
+ if (!ssl_load_pkey(
rlay->rl_tls_cert, rlay->rl_conf.tls_cert_len,
NULL, &rlay->rl_tls_pkey))
goto err;
tls_server = relay_tls_inspect_create(rlay, cre);
else
tls_server = rlay->rl_tls_ctx;
+ if (tls_server == NULL) {
+ errstr = "no TLS server context available";
+ goto err;
+ }
if (tls_accept_socket(tls_server, &cre->tls, cre->s) == -1) {
errstr = "could not accept the TLS connection";
blob - 243a9c27bae1e273073d8cbed42aec961476ef2f
blob + 6d1ed6e1b0a3298a0f5edc0d5dc589755dce2357
--- relayd.h
+++ relayd.h
-/* $OpenBSD: relayd.h,v 1.241 2017/07/04 19:59:51 benno Exp $ */
+/* $OpenBSD: relayd.h,v 1.242 2017/07/28 13:58:52 bluhm Exp $ */
/*
* Copyright (c) 2006 - 2016 Reyk Floeter <reyk@openbsd.org>
char *ssl_load_key(struct relayd *, const char *, off_t *, char *);
uint8_t *ssl_update_certificate(const uint8_t *, size_t, EVP_PKEY *,
EVP_PKEY *, X509 *, size_t *);
-int ssl_load_pkey(void *, char *, off_t, X509 **, EVP_PKEY **);
+int ssl_load_pkey(char *, off_t, X509 **, EVP_PKEY **);
int ssl_ctx_fake_private_key(char *, off_t, const char **);
/* ca.c */
void ca(struct privsep *, struct privsep_proc *);
void ca_engine_init(struct relayd *);
+void hash_x509(X509 *cert, char *hash, size_t hashlen);
/* relayd.c */
struct host *host_find(struct relayd *, objid_t);
blob - cf576fbb359107045bbe7d2dd00e8f3d3fa42f22
blob + 623ca8ac802af59fd5273e4b71e6a546aa0520f2
--- ssl.c
+++ ssl.c
-/* $OpenBSD: ssl.c,v 1.33 2017/05/28 10:39:15 benno Exp $ */
+/* $OpenBSD: ssl.c,v 1.34 2017/07/28 13:58:52 bluhm Exp $ */
/*
* Copyright (c) 2007 - 2014 Reyk Floeter <reyk@openbsd.org>
}
int
-ssl_load_pkey(void *data, char *buf, off_t len,
- X509 **x509ptr, EVP_PKEY **pkeyptr)
+ssl_load_pkey(char *buf, off_t len, X509 **x509ptr, EVP_PKEY **pkeyptr)
{
BIO *in;
X509 *x509 = NULL;
EVP_PKEY *pkey = NULL;
RSA *rsa = NULL;
- void *exdata = NULL;
+ char *hash = NULL;
if ((in = BIO_new_mem_buf(buf, len)) == NULL) {
log_warnx("%s: BIO_new_mem_buf failed", __func__);
return (0);
}
-
if ((x509 = PEM_read_bio_X509(in, NULL,
ssl_password_cb, NULL)) == NULL) {
log_warnx("%s: PEM_read_bio_X509 failed", __func__);
goto fail;
}
-
if ((pkey = X509_get_pubkey(x509)) == NULL) {
log_warnx("%s: X509_get_pubkey failed", __func__);
goto fail;
}
-
- BIO_free(in);
-
- if (data != NULL) {
- if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL) {
- log_warnx("%s: failed to extract RSA", __func__);
- goto fail;
- }
-
- RSA_set_ex_data(rsa, 0, data);
- RSA_free(rsa); /* dereference, will be cleaned up with pkey */
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL) {
+ log_warnx("%s: failed to extract RSA", __func__);
+ goto fail;
}
+ if ((hash = malloc(TLS_CERT_HASH_SIZE)) == NULL) {
+ log_warn("%s: allocate hash failed", __func__);
+ goto fail;
+ }
+ hash_x509(x509, hash, TLS_CERT_HASH_SIZE);
+ if (RSA_set_ex_data(rsa, 0, hash) != 1) {
+ log_warnx("%s: failed to set hash as exdata", __func__);
+ goto fail;
+ }
+ RSA_free(rsa); /* dereference, will be cleaned up with pkey */
+ *pkeyptr = pkey;
if (x509ptr != NULL)
*x509ptr = x509;
else
X509_free(x509);
+ BIO_free(in);
- *pkeyptr = pkey;
-
return (1);
fail:
+ free(hash);
if (rsa != NULL)
RSA_free(rsa);
- if (in != NULL)
- BIO_free(in);
if (pkey != NULL)
EVP_PKEY_free(pkey);
if (x509 != NULL)
X509_free(x509);
- free(exdata);
+ BIO_free(in);
return (0);
}