[PATCH 9/9] nvmet: add configfs attribute 'dhchap_keyring'
Hannes Reinecke
hare at kernel.org
Wed May 28 07:05:17 PDT 2025
The authentication code now fetches the key from the kernel keystore, so
we should be able to specify which keyring to use for looking up keys.
So add a configfs attribute 'dhchap_keyring' for the 'host' directory
to specify the keyring to use.
Signed-off-by: Hannes Reinecke <hare at kernel.org>
---
drivers/nvme/target/auth.c | 2 +-
drivers/nvme/target/configfs.c | 60 ++++++++++++++++++++++++++++++++++
drivers/nvme/target/nvmet.h | 1 +
3 files changed, 62 insertions(+), 1 deletion(-)
diff --git a/drivers/nvme/target/auth.c b/drivers/nvme/target/auth.c
index 036652de3489..090cc1dc0655 100644
--- a/drivers/nvme/target/auth.c
+++ b/drivers/nvme/target/auth.c
@@ -69,7 +69,7 @@ int nvmet_auth_set_key(struct nvmet_host *host, const char *secret,
}
len = strcspn(secret, "\n");
- key = nvme_auth_extract_key(NULL, secret, len, &generated);
+ key = nvme_auth_extract_key(host->dhchap_keyring, secret, len, &generated);
if (IS_ERR(key)) {
pr_debug("%s: invalid key specification\n", __func__);
return PTR_ERR(key);
diff --git a/drivers/nvme/target/configfs.c b/drivers/nvme/target/configfs.c
index e165905fab31..2642e3148f3f 100644
--- a/drivers/nvme/target/configfs.c
+++ b/drivers/nvme/target/configfs.c
@@ -2217,6 +2217,60 @@ static ssize_t nvmet_host_dhchap_ctrl_key_store(struct config_item *item,
CONFIGFS_ATTR(nvmet_host_, dhchap_ctrl_key);
+static ssize_t nvmet_host_dhchap_keyring_show(struct config_item *item,
+ char *page)
+{
+ struct nvmet_host *host = to_host(item);
+ struct key *keyring;
+ ssize_t ret;
+
+ down_read(&nvmet_config_sem);
+ keyring = key_get(host->dhchap_keyring);
+ if (!keyring) {
+ page[0] = '\0';
+ ret = 0;
+ } else {
+ down_read(&keyring->sem);
+ if (key_validate(keyring))
+ ret = sprintf(page, "<invalidated>\n");
+ else
+ ret = sprintf(page, "%s\n", keyring->description);
+ up_read(&keyring->sem);
+ key_put(keyring);
+ }
+ up_read(&nvmet_config_sem);
+ return ret;
+}
+
+static ssize_t nvmet_host_dhchap_keyring_store(struct config_item *item,
+ const char *page, size_t count)
+{
+ struct nvmet_host *host = to_host(item);
+ struct key *keyring;
+ char *desc;
+ size_t len;
+ int ret = 0;
+
+ len = strcspn(page, "\n");
+ if (!len)
+ return -EINVAL;
+ desc = kstrndup(page, len, GFP_KERNEL);
+ if (!desc)
+ return -ENOMEM;
+ keyring = request_key(&key_type_keyring, desc, NULL);
+ if (IS_ERR(keyring)) {
+ ret = PTR_ERR(keyring);
+ } else {
+ key_put(host->dhchap_keyring);
+ host->dhchap_keyring = keyring;
+ }
+ kfree(desc);
+
+ return ret ? -ret : count;
+}
+
+CONFIGFS_ATTR(nvmet_host_, dhchap_keyring);
+
static ssize_t nvmet_host_dhchap_hash_show(struct config_item *item,
char *page)
{
@@ -2276,6 +2330,7 @@ CONFIGFS_ATTR(nvmet_host_, dhchap_dhgroup);
static struct configfs_attribute *nvmet_host_attrs[] = {
&nvmet_host_attr_dhchap_key,
&nvmet_host_attr_dhchap_ctrl_key,
+ &nvmet_host_attr_dhchap_keyring,
&nvmet_host_attr_dhchap_hash,
&nvmet_host_attr_dhchap_dhgroup,
NULL,
@@ -2317,6 +2372,11 @@ static struct config_group *nvmet_hosts_make_group(struct config_group *group,
#ifdef CONFIG_NVME_TARGET_AUTH
/* Default to SHA256 */
host->dhchap_hash_id = NVME_AUTH_HASH_SHA256;
+ host->dhchap_keyring = key_lookup(nvme_keyring_id());
+ if (IS_ERR(host->dhchap_keyring)) {
+ kfree(host);
+ return ERR_PTR(-ENOKEY);
+ }
#endif
config_group_init_type_name(&host->group, name, &nvmet_host_type);
diff --git a/drivers/nvme/target/nvmet.h b/drivers/nvme/target/nvmet.h
index 772a3fc69162..30ec38142ef3 100644
--- a/drivers/nvme/target/nvmet.h
+++ b/drivers/nvme/target/nvmet.h
@@ -382,6 +382,7 @@ struct nvmet_host {
bool dhchap_key_generated;
struct key *dhchap_ctrl_key;
bool dhchap_ctrl_key_generated;
+ struct key *dhchap_keyring;
u8 dhchap_hash_id;
u8 dhchap_dhgroup_id;
};
--
2.35.3
More information about the Linux-nvme
mailing list