aboutsummaryrefslogtreecommitdiff
path: root/src/supplemental/tls
diff options
context:
space:
mode:
authorGarrett D'Amore <garrett@damore.org>2024-11-09 15:24:43 -0800
committerGarrett D'Amore <garrett@damore.org>2024-11-09 16:27:45 -0800
commit0058b766b91f08b34dcef3c7bb55b216099f3f66 (patch)
tree5ac1fa105d707018cdfa9f5244da5837a8c31601 /src/supplemental/tls
parent150d80c2c62ce3693dbbd0256c16337879c7d825 (diff)
downloadnng-0058b766b91f08b34dcef3c7bb55b216099f3f66.tar.gz
nng-0058b766b91f08b34dcef3c7bb55b216099f3f66.tar.bz2
nng-0058b766b91f08b34dcef3c7bb55b216099f3f66.zip
TLS configuration changed to use discret _set_tls and _get_tls functions.
This is simpler, and more reliable than using socket options.
Diffstat (limited to 'src/supplemental/tls')
-rw-r--r--src/supplemental/tls/tls_common.c129
-rw-r--r--src/supplemental/tls/tls_test.c18
2 files changed, 41 insertions, 106 deletions
diff --git a/src/supplemental/tls/tls_common.c b/src/supplemental/tls/tls_common.c
index 139460f5..49d1a292 100644
--- a/src/supplemental/tls/tls_common.c
+++ b/src/supplemental/tls/tls_common.c
@@ -191,16 +191,10 @@ tls_dialer_dial(void *arg, nng_aio *aio)
}
static int
-tls_dialer_set_config(void *arg, const void *buf, size_t sz, nni_type t)
+tls_dialer_set_tls(void *arg, nng_tls_config *cfg)
{
- int rv;
- nng_tls_config *cfg;
tls_dialer *d = arg;
nng_tls_config *old;
-
- if ((rv = nni_copyin_ptr((void **) &cfg, buf, sz, t)) != 0) {
- return (rv);
- }
if (cfg == NULL) {
return (NNG_EINVAL);
}
@@ -216,44 +210,21 @@ tls_dialer_set_config(void *arg, const void *buf, size_t sz, nni_type t)
}
static int
-tls_dialer_get_config(void *arg, void *buf, size_t *szp, nni_type t)
+tls_dialer_get_tls(void *arg, nng_tls_config **cfg)
{
- tls_dialer *d = arg;
- nng_tls_config *cfg;
- int rv;
+ tls_dialer *d = arg;
nni_mtx_lock(&d->lk);
- if ((cfg = d->cfg) != NULL) {
- nng_tls_config_hold(cfg);
- }
- if ((rv = nni_copyout_ptr(cfg, buf, szp, t)) != 0) {
- nng_tls_config_free(cfg);
- }
+ *cfg = d->cfg;
nni_mtx_unlock(&d->lk);
- return (rv);
+ return (0);
}
-static const nni_option tls_dialer_opts[] = {
- {
- .o_name = NNG_OPT_TLS_CONFIG,
- .o_get = tls_dialer_get_config,
- .o_set = tls_dialer_set_config,
- },
- {
- .o_name = NULL,
- },
-};
-
static int
tls_dialer_get(void *arg, const char *name, void *buf, size_t *szp, nni_type t)
{
tls_dialer *d = arg;
- int rv;
- rv = nni_stream_dialer_get(d->d, name, buf, szp, t);
- if (rv == NNG_ENOTSUP) {
- rv = nni_getopt(tls_dialer_opts, name, d, buf, szp, t);
- }
- return (rv);
+ return (nni_stream_dialer_get(d->d, name, buf, szp, t));
}
static int
@@ -261,13 +232,8 @@ tls_dialer_set(
void *arg, const char *name, const void *buf, size_t sz, nni_type t)
{
tls_dialer *d = arg;
- int rv;
- rv = nni_stream_dialer_set(d->d, name, buf, sz, t);
- if (rv == NNG_ENOTSUP) {
- rv = nni_setopt(tls_dialer_opts, name, d, buf, sz, t);
- }
- return (rv);
+ return (nni_stream_dialer_set(d->d, name, buf, sz, t));
}
int
@@ -305,12 +271,15 @@ nni_tls_dialer_alloc(nng_stream_dialer **dp, const nng_url *url)
// Set the expected outbound hostname
nng_tls_config_server_name(d->cfg, url->u_hostname);
- d->ops.sd_close = tls_dialer_close;
- d->ops.sd_free = tls_dialer_free;
- d->ops.sd_dial = tls_dialer_dial;
- d->ops.sd_get = tls_dialer_get;
- d->ops.sd_set = tls_dialer_set;
- *dp = (void *) d;
+ d->ops.sd_close = tls_dialer_close;
+ d->ops.sd_free = tls_dialer_free;
+ d->ops.sd_dial = tls_dialer_dial;
+ d->ops.sd_get = tls_dialer_get;
+ d->ops.sd_set = tls_dialer_set;
+ d->ops.sd_get_tls = tls_dialer_get_tls;
+ d->ops.sd_set_tls = tls_dialer_set_tls;
+
+ *dp = (void *) d;
return (rv);
}
@@ -373,20 +342,13 @@ tls_listener_accept(void *arg, nng_aio *aio)
}
static int
-tls_listener_set_config(void *arg, const void *buf, size_t sz, nni_type t)
+tls_listener_set_tls(void *arg, nng_tls_config *cfg)
{
- int rv;
- nng_tls_config *cfg;
tls_listener *l = arg;
nng_tls_config *old;
-
- if ((rv = nni_copyin_ptr((void **) &cfg, buf, sz, t)) != 0) {
- return (rv);
- }
if (cfg == NULL) {
return (NNG_EINVAL);
}
-
nng_tls_config_hold(cfg);
nni_mtx_lock(&l->lk);
@@ -395,64 +357,35 @@ tls_listener_set_config(void *arg, const void *buf, size_t sz, nni_type t)
nni_mtx_unlock(&l->lk);
nng_tls_config_free(old);
-
return (0);
}
static int
-tls_listener_get_config(void *arg, void *buf, size_t *szp, nni_type t)
+tls_listener_get_tls(void *arg, nng_tls_config **cfg)
{
- tls_listener *l = arg;
- nng_tls_config *cfg;
- int rv;
+ tls_listener *l = arg;
nni_mtx_lock(&l->lk);
- if ((cfg = l->cfg) != NULL) {
- nng_tls_config_hold(cfg);
- }
- if ((rv = nni_copyout_ptr(cfg, buf, szp, t)) != 0) {
- nng_tls_config_free(cfg);
- }
+ *cfg = l->cfg;
nni_mtx_unlock(&l->lk);
- return (rv);
+ return (0);
}
-static const nni_option tls_listener_opts[] = {
- {
- .o_name = NNG_OPT_TLS_CONFIG,
- .o_get = tls_listener_get_config,
- .o_set = tls_listener_set_config,
- },
- {
- .o_name = NULL,
- },
-};
-
static int
tls_listener_get(
void *arg, const char *name, void *buf, size_t *szp, nni_type t)
{
- int rv;
tls_listener *l = arg;
- rv = nni_stream_listener_get(l->l, name, buf, szp, t);
- if (rv == NNG_ENOTSUP) {
- rv = nni_getopt(tls_listener_opts, name, l, buf, szp, t);
- }
- return (rv);
+ return (nni_stream_listener_get(l->l, name, buf, szp, t));
}
static int
tls_listener_set(
void *arg, const char *name, const void *buf, size_t sz, nni_type t)
{
- int rv;
tls_listener *l = arg;
- rv = nni_stream_listener_set(l->l, name, buf, sz, t);
- if (rv == NNG_ENOTSUP) {
- rv = nni_setopt(tls_listener_opts, name, l, buf, sz, t);
- }
- return (rv);
+ return (nni_stream_listener_set(l->l, name, buf, sz, t));
}
int
@@ -487,13 +420,15 @@ nni_tls_listener_alloc(nng_stream_listener **lp, const nng_url *url)
NNI_FREE_STRUCT(l);
return (rv);
}
- l->ops.sl_free = tls_listener_free;
- l->ops.sl_close = tls_listener_close;
- l->ops.sl_accept = tls_listener_accept;
- l->ops.sl_listen = tls_listener_listen;
- l->ops.sl_get = tls_listener_get;
- l->ops.sl_set = tls_listener_set;
- *lp = (void *) l;
+ l->ops.sl_free = tls_listener_free;
+ l->ops.sl_close = tls_listener_close;
+ l->ops.sl_accept = tls_listener_accept;
+ l->ops.sl_listen = tls_listener_listen;
+ l->ops.sl_get = tls_listener_get;
+ l->ops.sl_set = tls_listener_set;
+ l->ops.sl_get_tls = tls_listener_get_tls;
+ l->ops.sl_set_tls = tls_listener_set_tls;
+ *lp = (void *) l;
return (0);
}
diff --git a/src/supplemental/tls/tls_test.c b/src/supplemental/tls/tls_test.c
index 3d0c16a0..9317890d 100644
--- a/src/supplemental/tls/tls_test.c
+++ b/src/supplemental/tls/tls_test.c
@@ -106,7 +106,7 @@ test_tls_large_message(void)
NUTS_PASS(nng_tls_config_alloc(&c1, NNG_TLS_MODE_SERVER));
NUTS_PASS(nng_tls_config_own_cert(
c1, nuts_server_crt, nuts_server_key, NULL));
- NUTS_PASS(nng_stream_listener_set_ptr(l, NNG_OPT_TLS_CONFIG, c1));
+ NUTS_PASS(nng_stream_listener_set_tls(l, c1));
NUTS_PASS(nng_stream_listener_listen(l));
NUTS_PASS(
nng_stream_listener_get_int(l, NNG_OPT_TCP_BOUND_PORT, &port));
@@ -119,7 +119,7 @@ test_tls_large_message(void)
NUTS_PASS(nng_tls_config_ca_chain(c2, nuts_server_crt, NULL));
NUTS_PASS(nng_tls_config_server_name(c2, "localhost"));
- NUTS_PASS(nng_stream_dialer_set_ptr(d, NNG_OPT_TLS_CONFIG, c2));
+ NUTS_PASS(nng_stream_dialer_set_tls(d, c2));
nng_stream_listener_accept(l, aio1);
nng_stream_dialer_dial(d, aio2);
@@ -211,7 +211,7 @@ test_tls_psk(void)
NUTS_PASS(nng_stream_listener_alloc(&l, "tls+tcp://127.0.0.1:0"));
NUTS_PASS(nng_tls_config_alloc(&c1, NNG_TLS_MODE_SERVER));
NUTS_PASS(nng_tls_config_psk(c1, "identity", key, sizeof(key)));
- NUTS_PASS(nng_stream_listener_set_ptr(l, NNG_OPT_TLS_CONFIG, c1));
+ NUTS_PASS(nng_stream_listener_set_tls(l, c1));
NUTS_PASS(nng_stream_listener_listen(l));
NUTS_PASS(
nng_stream_listener_get_int(l, NNG_OPT_TCP_BOUND_PORT, &port));
@@ -223,7 +223,7 @@ test_tls_psk(void)
NUTS_PASS(nng_tls_config_alloc(&c2, NNG_TLS_MODE_CLIENT));
NUTS_PASS(nng_tls_config_psk(c2, "identity", key, sizeof(key)));
- NUTS_PASS(nng_stream_dialer_set_ptr(d, NNG_OPT_TLS_CONFIG, c2));
+ NUTS_PASS(nng_stream_dialer_set_tls(d, c2));
nng_stream_listener_accept(l, aio1);
nng_stream_dialer_dial(d, aio2);
@@ -301,7 +301,7 @@ test_tls_psk_server_identities(void)
nng_tls_config_psk(c1, "identity2", key + 4, sizeof(key) - 4));
NUTS_PASS(nng_tls_config_psk(c1, identity, key + 4, sizeof(key) - 4));
NUTS_PASS(nng_tls_config_psk(c1, identity, key, sizeof(key)));
- NUTS_PASS(nng_stream_listener_set_ptr(l, NNG_OPT_TLS_CONFIG, c1));
+ NUTS_PASS(nng_stream_listener_set_tls(l, c1));
NUTS_PASS(nng_stream_listener_listen(l));
NUTS_PASS(
nng_stream_listener_get_int(l, NNG_OPT_TCP_BOUND_PORT, &port));
@@ -313,7 +313,7 @@ test_tls_psk_server_identities(void)
NUTS_PASS(nng_tls_config_alloc(&c2, NNG_TLS_MODE_CLIENT));
NUTS_PASS(nng_tls_config_psk(c2, identity, key, sizeof(key)));
- NUTS_PASS(nng_stream_dialer_set_ptr(d, NNG_OPT_TLS_CONFIG, c2));
+ NUTS_PASS(nng_stream_dialer_set_tls(d, c2));
nng_stream_listener_accept(l, aio1);
nng_stream_dialer_dial(d, aio2);
@@ -387,7 +387,7 @@ test_tls_psk_bad_identity(void)
NUTS_PASS(nng_tls_config_alloc(&c1, NNG_TLS_MODE_SERVER));
// Replace the identity .. first write one value, then we change it
NUTS_PASS(nng_tls_config_psk(c1, "identity1", key, sizeof(key)));
- NUTS_PASS(nng_stream_listener_set_ptr(l, NNG_OPT_TLS_CONFIG, c1));
+ NUTS_PASS(nng_stream_listener_set_tls(l, c1));
NUTS_PASS(nng_stream_listener_listen(l));
NUTS_PASS(
nng_stream_listener_get_int(l, NNG_OPT_TCP_BOUND_PORT, &port));
@@ -400,7 +400,7 @@ test_tls_psk_bad_identity(void)
NUTS_PASS(nng_tls_config_psk(c2, "identity2", key, sizeof(key)));
NUTS_PASS(nng_tls_config_server_name(c2, "localhost"));
- NUTS_PASS(nng_stream_dialer_set_ptr(d, NNG_OPT_TLS_CONFIG, c2));
+ NUTS_PASS(nng_stream_dialer_set_tls(d, c2));
nng_stream_listener_accept(l, aio1);
nng_stream_dialer_dial(d, aio2);
@@ -463,7 +463,7 @@ test_tls_psk_config_busy(void)
NUTS_PASS(nng_stream_listener_alloc(&l, "tls+tcp://127.0.0.1:0"));
NUTS_PASS(nng_tls_config_alloc(&c1, NNG_TLS_MODE_SERVER));
NUTS_PASS(nng_tls_config_psk(c1, "identity", key, sizeof(key)));
- NUTS_PASS(nng_stream_listener_set_ptr(l, NNG_OPT_TLS_CONFIG, c1));
+ NUTS_PASS(nng_stream_listener_set_tls(l, c1));
nng_stream_listener_accept(l, aio);
nng_msleep(100);
NUTS_FAIL(