summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbeck <>2017-04-05 03:13:53 +0000
committerbeck <>2017-04-05 03:13:53 +0000
commit9b1685fcc9e7e4061dec174430e3e4a4d525dbe4 (patch)
treeff8e0ddc9e52cbb810c54bc2d58bc7b56babddf9 /src
parent6261bdad2c3ea049a46268fd950d6f984fed9294 (diff)
downloadopenbsd-9b1685fcc9e7e4061dec174430e3e4a4d525dbe4.tar.gz
openbsd-9b1685fcc9e7e4061dec174430e3e4a4d525dbe4.tar.bz2
openbsd-9b1685fcc9e7e4061dec174430e3e4a4d525dbe4.zip
Internal changes to allow for relayd engine privsep. sends the hash of the
public key as an identifier to RSA, and adds an function for relayd to use to disable private key checking when doing engine privsep. ok jsing@
Diffstat (limited to 'src')
-rw-r--r--src/lib/libtls/Symbols.list1
-rw-r--r--src/lib/libtls/tls.c67
-rw-r--r--src/lib/libtls/tls_config.c9
-rw-r--r--src/lib/libtls/tls_conninfo.c32
-rw-r--r--src/lib/libtls/tls_internal.h7
5 files changed, 87 insertions, 29 deletions
diff --git a/src/lib/libtls/Symbols.list b/src/lib/libtls/Symbols.list
index eb704ecbd2..98465dde27 100644
--- a/src/lib/libtls/Symbols.list
+++ b/src/lib/libtls/Symbols.list
@@ -40,6 +40,7 @@ tls_config_set_protocols
40tls_config_set_session_id 40tls_config_set_session_id
41tls_config_set_session_lifetime 41tls_config_set_session_lifetime
42tls_config_set_verify_depth 42tls_config_set_verify_depth
43tls_config_skip_private_key_check
43tls_config_verify 44tls_config_verify
44tls_config_verify_client 45tls_config_verify_client
45tls_config_verify_client_optional 46tls_config_verify_client_optional
diff --git a/src/lib/libtls/tls.c b/src/lib/libtls/tls.c
index 9b03c2b6f0..419554818c 100644
--- a/src/lib/libtls/tls.c
+++ b/src/lib/libtls/tls.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls.c,v 1.59 2017/01/26 12:56:37 jsing Exp $ */ 1/* $OpenBSD: tls.c,v 1.60 2017/04/05 03:13:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -252,6 +252,55 @@ tls_configure(struct tls *ctx, struct tls_config *config)
252} 252}
253 253
254int 254int
255tls_cert_hash(X509 *cert, char **hash)
256{
257 char d[EVP_MAX_MD_SIZE], *dhex = NULL;
258 int dlen, rv = -1;
259
260 *hash = NULL;
261 if (X509_digest(cert, EVP_sha256(), d, &dlen) != 1)
262 goto err;
263
264 if (tls_hex_string(d, dlen, &dhex, NULL) != 0)
265 goto err;
266
267 if (asprintf(hash, "SHA256:%s", dhex) == -1) {
268 *hash = NULL;
269 goto err;
270 }
271
272 rv = 0;
273 err:
274 free(dhex);
275
276 return (rv);
277}
278
279static int
280tls_keypair_cert_hash(struct tls_keypair *keypair, char **hash)
281{
282 BIO *membio = NULL;
283 X509 *cert = NULL;
284 int rv = -1;
285
286 *hash = NULL;
287
288 if ((membio = BIO_new_mem_buf(keypair->cert_mem, keypair->cert_len))
289 == NULL)
290 goto err;
291
292 if ((cert = PEM_read_bio_X509_AUX(membio, NULL, NULL, NULL)) == NULL)
293 goto err;
294
295 rv = tls_cert_hash(cert, hash);
296 err:
297 BIO_free(membio);
298
299 return (rv);
300}
301
302
303int
255tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx, 304tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
256 struct tls_keypair *keypair, int required) 305 struct tls_keypair *keypair, int required)
257{ 306{
@@ -275,8 +324,11 @@ tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
275 tls_set_errorx(ctx, "failed to load certificate"); 324 tls_set_errorx(ctx, "failed to load certificate");
276 goto err; 325 goto err;
277 } 326 }
327 if (tls_keypair_cert_hash(keypair, &keypair->cert_hash) == -1)
328 goto err;
278 cert = NULL; 329 cert = NULL;
279 } 330 }
331
280 if (keypair->key_mem != NULL) { 332 if (keypair->key_mem != NULL) {
281 if (keypair->key_len > INT_MAX) { 333 if (keypair->key_len > INT_MAX) {
282 tls_set_errorx(ctx, "key too long"); 334 tls_set_errorx(ctx, "key too long");
@@ -293,6 +345,16 @@ tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
293 tls_set_errorx(ctx, "failed to read private key"); 345 tls_set_errorx(ctx, "failed to read private key");
294 goto err; 346 goto err;
295 } 347 }
348
349 if (keypair->cert_hash != NULL) {
350 RSA *rsa;
351 /* XXX only RSA for now for relayd privsep */
352 if ((rsa = EVP_PKEY_get1_RSA(pkey)) != NULL) {
353 RSA_set_ex_data(rsa, 0, keypair->cert_hash);
354 RSA_free(rsa);
355 }
356 }
357
296 if (SSL_CTX_use_PrivateKey(ssl_ctx, pkey) != 1) { 358 if (SSL_CTX_use_PrivateKey(ssl_ctx, pkey) != 1) {
297 tls_set_errorx(ctx, "failed to load private key"); 359 tls_set_errorx(ctx, "failed to load private key");
298 goto err; 360 goto err;
@@ -303,7 +365,8 @@ tls_configure_ssl_keypair(struct tls *ctx, SSL_CTX *ssl_ctx,
303 pkey = NULL; 365 pkey = NULL;
304 } 366 }
305 367
306 if (SSL_CTX_check_private_key(ssl_ctx) != 1) { 368 if (!ctx->config->skip_private_key_check &&
369 SSL_CTX_check_private_key(ssl_ctx) != 1) {
307 tls_set_errorx(ctx, "private/public key mismatch"); 370 tls_set_errorx(ctx, "private/public key mismatch");
308 goto err; 371 goto err;
309 } 372 }
diff --git a/src/lib/libtls/tls_config.c b/src/lib/libtls/tls_config.c
index 87c2166f9e..f5e0bf55e4 100644
--- a/src/lib/libtls/tls_config.c
+++ b/src/lib/libtls/tls_config.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_config.c,v 1.36 2017/01/31 16:18:57 beck Exp $ */ 1/* $OpenBSD: tls_config.c,v 1.37 2017/04/05 03:13:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -135,6 +135,7 @@ tls_keypair_free(struct tls_keypair *keypair)
135 free(keypair->cert_mem); 135 free(keypair->cert_mem);
136 free(keypair->key_mem); 136 free(keypair->key_mem);
137 free(keypair->ocsp_staple); 137 free(keypair->ocsp_staple);
138 free(keypair->cert_hash);
138 139
139 free(keypair); 140 free(keypair);
140} 141}
@@ -761,6 +762,12 @@ tls_config_verify_client_optional(struct tls_config *config)
761 config->verify_client = 2; 762 config->verify_client = 2;
762} 763}
763 764
765void
766tls_config_skip_private_key_check(struct tls_config *config)
767{
768 config->skip_private_key_check = 1;
769}
770
764int 771int
765tls_config_set_ocsp_staple_file(struct tls_config *config, const char *staple_file) 772tls_config_set_ocsp_staple_file(struct tls_config *config, const char *staple_file)
766{ 773{
diff --git a/src/lib/libtls/tls_conninfo.c b/src/lib/libtls/tls_conninfo.c
index 5cdd0f77c8..c4d23c308b 100644
--- a/src/lib/libtls/tls_conninfo.c
+++ b/src/lib/libtls/tls_conninfo.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_conninfo.c,v 1.13 2017/01/09 15:31:20 jsing Exp $ */ 1/* $OpenBSD: tls_conninfo.c,v 1.14 2017/04/05 03:13:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2015 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2015 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2015 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2015 Bob Beck <beck@openbsd.org>
@@ -23,7 +23,7 @@
23#include <tls.h> 23#include <tls.h>
24#include "tls_internal.h" 24#include "tls_internal.h"
25 25
26static int 26int
27tls_hex_string(const unsigned char *in, size_t inlen, char **out, 27tls_hex_string(const unsigned char *in, size_t inlen, char **out,
28 size_t *outlen) 28 size_t *outlen)
29{ 29{
@@ -56,35 +56,16 @@ tls_hex_string(const unsigned char *in, size_t inlen, char **out,
56static int 56static int
57tls_get_peer_cert_hash(struct tls *ctx, char **hash) 57tls_get_peer_cert_hash(struct tls *ctx, char **hash)
58{ 58{
59 char d[EVP_MAX_MD_SIZE], *dhex = NULL;
60 int dlen, rv = -1;
61
62 *hash = NULL; 59 *hash = NULL;
63 if (ctx->ssl_peer_cert == NULL) 60 if (ctx->ssl_peer_cert == NULL)
64 return (0); 61 return (0);
65 62
66 if (X509_digest(ctx->ssl_peer_cert, EVP_sha256(), d, &dlen) != 1) { 63 if (tls_cert_hash(ctx->ssl_peer_cert, hash) == -1) {
67 tls_set_errorx(ctx, "digest failed"); 64 tls_set_errorx(ctx, "unable to compute peer certificate hash - out of memory");
68 goto err;
69 }
70
71 if (tls_hex_string(d, dlen, &dhex, NULL) != 0) {
72 tls_set_errorx(ctx, "digest hex string failed");
73 goto err;
74 }
75
76 if (asprintf(hash, "SHA256:%s", dhex) == -1) {
77 tls_set_errorx(ctx, "out of memory");
78 *hash = NULL; 65 *hash = NULL;
79 goto err; 66 return -1;
80 } 67 }
81 68 return 0;
82 rv = 0;
83
84err:
85 free(dhex);
86
87 return (rv);
88} 69}
89 70
90static int 71static int
@@ -294,3 +275,4 @@ tls_conn_version(struct tls *ctx)
294 return (NULL); 275 return (NULL);
295 return (ctx->conninfo->version); 276 return (ctx->conninfo->version);
296} 277}
278
diff --git a/src/lib/libtls/tls_internal.h b/src/lib/libtls/tls_internal.h
index fbb139c84a..b1d53c8fa3 100644
--- a/src/lib/libtls/tls_internal.h
+++ b/src/lib/libtls/tls_internal.h
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls_internal.h,v 1.53 2017/01/29 17:52:11 beck Exp $ */ 1/* $OpenBSD: tls_internal.h,v 1.54 2017/04/05 03:13:53 beck Exp $ */
2/* 2/*
3 * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org> 3 * Copyright (c) 2014 Jeremie Courreges-Anglas <jca@openbsd.org>
4 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org> 4 * Copyright (c) 2014 Joel Sing <jsing@openbsd.org>
@@ -53,6 +53,7 @@ struct tls_keypair {
53 size_t key_len; 53 size_t key_len;
54 char *ocsp_staple; 54 char *ocsp_staple;
55 size_t ocsp_staple_len; 55 size_t ocsp_staple_len;
56 char *cert_hash;
56}; 57};
57 58
58#define TLS_MIN_SESSION_TIMEOUT (4) 59#define TLS_MIN_SESSION_TIMEOUT (4)
@@ -96,6 +97,7 @@ struct tls_config {
96 int verify_depth; 97 int verify_depth;
97 int verify_name; 98 int verify_name;
98 int verify_time; 99 int verify_time;
100 int skip_private_key_check;
99}; 101};
100 102
101struct tls_conninfo { 103struct tls_conninfo {
@@ -232,6 +234,9 @@ int tls_ocsp_verify_cb(SSL *ssl, void *arg);
232int tls_ocsp_stapling_cb(SSL *ssl, void *arg); 234int tls_ocsp_stapling_cb(SSL *ssl, void *arg);
233void tls_ocsp_free(struct tls_ocsp *ctx); 235void tls_ocsp_free(struct tls_ocsp *ctx);
234struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx); 236struct tls_ocsp *tls_ocsp_setup_from_peer(struct tls *ctx);
237int tls_hex_string(const unsigned char *_in, size_t _inlen, char **_out,
238 size_t *_outlen);
239int tls_cert_hash(X509 *_cert, char **_hash);
235 240
236__END_HIDDEN_DECLS 241__END_HIDDEN_DECLS
237 242