From: Hannes Reinecke <hare@suse.de>
To: Christoph Hellwig <hch@lst.de>
Cc: Sagi Grimberg <sagi@grimberg.me>, Keith Busch <kbusch@kernel.org>,
linux-nvme@lists.infradead.org, Hannes Reinecke <hare@suse.de>
Subject: [PATCH 10/14] nvme-fabrics: parse options 'keyring' and 'tls_key'
Date: Thu, 3 Aug 2023 12:50:58 +0200 [thread overview]
Message-ID: <20230803105102.30949-11-hare@suse.de> (raw)
In-Reply-To: <20230803105102.30949-1-hare@suse.de>
Parse the fabrics options 'keyring' and 'tls_key' and store the
referenced keys in the options structure.
Signed-off-by: Hannes Reinecke <hare@suse.de>
---
drivers/nvme/host/fabrics.c | 69 ++++++++++++++++++++++++++++++++++++-
drivers/nvme/host/fabrics.h | 6 ++++
drivers/nvme/host/tcp.c | 11 ++++--
3 files changed, 82 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
index ddad482c3537..6bdcd505a477 100644
--- a/drivers/nvme/host/fabrics.c
+++ b/drivers/nvme/host/fabrics.c
@@ -643,6 +643,10 @@ static const match_table_t opt_tokens = {
{ NVMF_OPT_NR_WRITE_QUEUES, "nr_write_queues=%d" },
{ NVMF_OPT_NR_POLL_QUEUES, "nr_poll_queues=%d" },
{ NVMF_OPT_TOS, "tos=%d" },
+#ifdef CONFIG_NVME_TCP_TLS
+ { NVMF_OPT_KEYRING, "keyring=%d" },
+ { NVMF_OPT_TLS_KEY, "tls_key=%d" },
+#endif
{ NVMF_OPT_FAIL_FAST_TMO, "fast_io_fail_tmo=%d" },
{ NVMF_OPT_DISCOVERY, "discovery" },
{ NVMF_OPT_DHCHAP_SECRET, "dhchap_secret=%s" },
@@ -660,9 +664,10 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
char *options, *o, *p;
int token, ret = 0;
size_t nqnlen = 0;
- int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO;
+ int ctrl_loss_tmo = NVMF_DEF_CTRL_LOSS_TMO, key_id;
uuid_t hostid;
char hostnqn[NVMF_NQN_SIZE];
+ struct key *key = NULL;
/* Set defaults */
opts->queue_size = NVMF_DEF_QUEUE_SIZE;
@@ -928,6 +933,66 @@ static int nvmf_parse_options(struct nvmf_ctrl_options *opts,
}
opts->tos = token;
break;
+ case NVMF_OPT_KEYRING:
+ if (!IS_ENABLED(CONFIG_NVME_TCP_TLS)) {
+ pr_err("TLS is not supported\n");
+ ret = -EINVAL;
+ goto out;
+ }
+ if (match_int(args, &key_id)) {
+ ret = -EINVAL;
+ goto out;
+ }
+ if (key_id < 0) {
+ pr_err("Invalid keyring id %d\n", key_id);
+ ret = -EINVAL;
+ goto out;
+ }
+ if (!key_id) {
+ pr_debug("Using default keyring\n");
+ key_put(opts->keyring);
+ opts->keyring = NULL;
+ break;
+ }
+ key = key_lookup(key_id);
+ if (!key) {
+ pr_err("Keyring id %08x not found\n", key_id);
+ ret = -ENOKEY;
+ goto out;
+ }
+ key_put(opts->keyring);
+ opts->keyring = key;
+ break;
+ case NVMF_OPT_TLS_KEY:
+ if (!IS_ENABLED(CONFIG_NVME_TCP_TLS)) {
+ pr_err("TLS is not supported\n");
+ ret = -EINVAL;
+ goto out;
+ }
+ if (match_int(args, &key_id)) {
+ ret = -EINVAL;
+ goto out;
+ }
+ if (key_id < 0) {
+ pr_err("Invalid key id %d\n", key_id);
+ ret = -EINVAL;
+ goto out;
+ }
+ if (!key_id) {
+ pr_debug("Using 'best' PSK\n");
+ key_put(opts->tls_key);
+ opts->tls_key = NULL;
+ break;
+ }
+ key = key_lookup(key_id);
+ if (!key) {
+ pr_err("Key id %08x not found\n", key_id);
+ ret = -ENOKEY;
+ goto out;
+ }
+ key_put(opts->tls_key);
+ opts->tls_key = key;
+ break;
case NVMF_OPT_DISCOVERY:
opts->discovery_nqn = true;
break;
@@ -1168,6 +1233,8 @@ static int nvmf_check_allowed_opts(struct nvmf_ctrl_options *opts,
void nvmf_free_options(struct nvmf_ctrl_options *opts)
{
nvmf_host_put(opts->host);
+ key_put(opts->keyring);
+ key_put(opts->tls_key);
kfree(opts->transport);
kfree(opts->traddr);
kfree(opts->trsvcid);
diff --git a/drivers/nvme/host/fabrics.h b/drivers/nvme/host/fabrics.h
index dac17c3fee26..fbaee5a7be19 100644
--- a/drivers/nvme/host/fabrics.h
+++ b/drivers/nvme/host/fabrics.h
@@ -71,6 +71,8 @@ enum {
NVMF_OPT_DHCHAP_SECRET = 1 << 23,
NVMF_OPT_DHCHAP_CTRL_SECRET = 1 << 24,
NVMF_OPT_TLS = 1 << 25,
+ NVMF_OPT_KEYRING = 1 << 26,
+ NVMF_OPT_TLS_KEY = 1 << 27,
};
/**
@@ -103,6 +105,8 @@ enum {
* @dhchap_secret: DH-HMAC-CHAP secret
* @dhchap_ctrl_secret: DH-HMAC-CHAP controller secret for bi-directional
* authentication
+ * @keyring: Keyring to use for key lookups
+ * @tls_key: TLS key for encrypted connections (TCP)
* @tls: Start TLS encrypted connections (TCP)
* @disable_sqflow: disable controller sq flow control
* @hdr_digest: generate/verify header digest (TCP)
@@ -130,6 +134,8 @@ struct nvmf_ctrl_options {
struct nvmf_host *host;
char *dhchap_secret;
char *dhchap_ctrl_secret;
+ struct key *keyring;
+ struct key *tls_key;
bool tls;
bool disable_sqflow;
bool hdr_digest;
diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
index 4d0e3de39c26..cc6a672b8d3f 100644
--- a/drivers/nvme/host/tcp.c
+++ b/drivers/nvme/host/tcp.c
@@ -1584,6 +1584,8 @@ static int nvme_tcp_start_tls(struct nvme_ctrl *nctrl,
dev_dbg(nctrl->device, "queue %d: start TLS with key %x\n",
qid, pskid);
+ if (nctrl->opts->keyring)
+ keyring = key_serial(nctrl->opts->keyring);
memset(&args, 0, sizeof(args));
args.ta_sock = queue->sock;
args.ta_done = nvme_tcp_tls_done;
@@ -1899,9 +1901,12 @@ static int nvme_tcp_alloc_admin_queue(struct nvme_ctrl *ctrl)
key_serial_t psk_id = 0;
if (ctrl->opts->tls) {
- psk_id = nvme_tls_psk_default(NULL,
- ctrl->opts->host->nqn,
- ctrl->opts->subsysnqn);
+ if (ctrl->opts->tls_key)
+ psk_id = key_serial(ctrl->opts->tls_key);
+ else
+ psk_id = nvme_tls_psk_default(ctrl->opts->keyring,
+ ctrl->opts->host->nqn,
+ ctrl->opts->subsysnqn);
if (!psk_id) {
dev_err(ctrl->device, "no valid PSK found\n");
ret = -ENOKEY;
--
2.35.3
next prev parent reply other threads:[~2023-08-03 10:53 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-03 10:50 [PATCHv5 00/14] nvme: In-kernel TLS support for TCP Hannes Reinecke
2023-08-03 10:50 ` [PATCH 01/14] nvme-keyring: register '.nvme' keyring Hannes Reinecke
2023-08-07 7:09 ` Sagi Grimberg
2023-08-03 10:50 ` [PATCH 02/14] nvme-keyring: define a 'psk' keytype Hannes Reinecke
2023-08-07 7:11 ` Sagi Grimberg
2023-08-03 10:50 ` [PATCH 03/14] nvme: add TCP TSAS definitions Hannes Reinecke
2023-08-03 10:50 ` [PATCH 04/14] nvme-tcp: add definitions for TLS cipher suites Hannes Reinecke
2023-08-03 10:50 ` [PATCH 05/14] nvme-keyring: implement nvme_tls_psk_default() Hannes Reinecke
2023-08-07 7:13 ` Sagi Grimberg
2023-08-03 10:50 ` [PATCH 06/14] security/keys: export key_lookup() Hannes Reinecke
2023-08-07 7:13 ` Sagi Grimberg
2023-08-03 10:50 ` [PATCH 07/14] nvme/tcp: allocate socket file Hannes Reinecke
2023-08-07 7:15 ` Sagi Grimberg
2023-08-07 7:23 ` Hannes Reinecke
2023-08-03 10:50 ` [PATCH 08/14] nvme-tcp: enable TLS handshake upcall Hannes Reinecke
2023-08-07 8:20 ` Sagi Grimberg
2023-08-07 8:32 ` Hannes Reinecke
2023-08-03 10:50 ` [PATCH 09/14] nvme-tcp: control message handling for recvmsg() Hannes Reinecke
2023-08-07 8:22 ` Sagi Grimberg
2023-08-08 6:39 ` Hannes Reinecke
2023-08-08 8:41 ` Sagi Grimberg
2023-08-08 8:51 ` Hannes Reinecke
2023-08-08 9:05 ` Sagi Grimberg
2023-08-08 10:57 ` Pawel Baldysiak
[not found] ` <20230808105403.3949653-1-pawel.baldysiak@dell.com>
2023-08-08 11:45 ` Sagi Grimberg
2023-08-08 11:56 ` Hannes Reinecke
2023-08-03 10:50 ` Hannes Reinecke [this message]
2023-08-07 8:23 ` [PATCH 10/14] nvme-fabrics: parse options 'keyring' and 'tls_key' Sagi Grimberg
2023-08-07 8:34 ` Hannes Reinecke
2023-08-03 10:50 ` [PATCH 11/14] nvmet: make TCP sectype settable via configfs Hannes Reinecke
2023-08-07 8:25 ` Sagi Grimberg
2023-08-03 10:51 ` [PATCH 12/14] nvmet-tcp: allocate socket file Hannes Reinecke
2023-08-07 8:27 ` Sagi Grimberg
2023-08-07 8:49 ` Hannes Reinecke
2023-08-07 8:53 ` Sagi Grimberg
2023-08-07 9:17 ` Hannes Reinecke
2023-08-07 10:42 ` Sagi Grimberg
2023-08-08 6:08 ` Hannes Reinecke
2023-08-08 8:44 ` Sagi Grimberg
2023-08-03 10:51 ` [PATCH 13/14] nvmet-tcp: enable TLS handshake upcall Hannes Reinecke
2023-08-07 8:51 ` Sagi Grimberg
2023-08-07 9:15 ` Hannes Reinecke
2023-08-07 11:49 ` Sagi Grimberg
2023-08-08 6:16 ` Hannes Reinecke
2023-08-03 10:51 ` [PATCH 14/14] nvmet-tcp: control messages for recvmsg() Hannes Reinecke
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230803105102.30949-11-hare@suse.de \
--to=hare@suse.de \
--cc=hch@lst.de \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=sagi@grimberg.me \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.