All of lore.kernel.org
 help / color / mirror / Atom feed
From: Dave Jiang <dave.jiang@intel.com>
To: dan.j.williams@intel.com
Cc: dhowells@redhat.com, alison.schofield@intel.com,
	keyrings@vger.kernel.org, keescook@chromium.org,
	linux-nvdimm@lists.01.org
Subject: [PATCH 02/11] libnvdimm: create keyring to store security keys
Date: Mon, 02 Jul 2018 16:39:18 -0700	[thread overview]
Message-ID: <153057475818.38125.11899134233158940470.stgit@djiang5-desk3.ch.intel.com> (raw)
In-Reply-To: <153057423804.38125.15912575101400055843.stgit@djiang5-desk3.ch.intel.com>

Prepping the libnvdimm to support security management by adding a keyring
in order to provide passphrase management through the kernel key management
APIs.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/nvdimm/dimm.c     |   90 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/libnvdimm.h |    5 +++
 2 files changed, 95 insertions(+)

diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c
index 6c8fb7590838..ee0c68efa82a 100644
--- a/drivers/nvdimm/dimm.c
+++ b/drivers/nvdimm/dimm.c
@@ -18,9 +18,46 @@
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/nd.h>
+#include <linux/cred.h>
+#include <keys/user-type.h>
+#include <linux/key-type.h>
+#include <linux/keyctl.h>
 #include "label.h"
 #include "nd.h"
 
+const struct cred *nvdimm_cred;
+static int nvdimm_key_instantiate(struct key *key,
+		struct key_preparsed_payload *prep);
+static void nvdimm_key_destroy(struct key *key);
+
+struct key_type nvdimm_key_type = {
+	.name = "nvdimm",
+	.instantiate = nvdimm_key_instantiate,
+	.destroy = nvdimm_key_destroy,
+	.describe = user_describe,
+	.def_datalen = NVDIMM_DEFAULT_PASSPHRASE_LEN * 2,
+};
+
+static int nvdimm_key_instantiate(struct key *key,
+		struct key_preparsed_payload *prep)
+{
+	char *payload;
+
+	payload = kzalloc(nvdimm_key_type.def_datalen, GFP_KERNEL);
+	if (!payload)
+		return -ENOMEM;
+
+	key->datalen = min(nvdimm_key_type.def_datalen, prep->datalen);
+	memcpy(payload, prep->data, key->datalen);
+	key->payload.data[0] = payload;
+	return 0;
+}
+
+static void nvdimm_key_destroy(struct key *key)
+{
+	kfree(key->payload.data[0]);
+}
+
 static int nvdimm_probe(struct device *dev)
 {
 	struct nvdimm_drvdata *ndd;
@@ -129,13 +166,66 @@ static struct nd_device_driver nvdimm_driver = {
 	.type = ND_DRIVER_DIMM,
 };
 
+static int nvdimm_register_keyring(void)
+{
+	struct cred *cred;
+	struct key *keyring;
+	int rc;
+
+	rc = register_key_type(&nvdimm_key_type);
+	if (rc < 0)
+		return rc;
+
+	cred = prepare_kernel_cred(NULL);
+	if (!cred) {
+		rc = -ENOMEM;
+		goto failed_cred;
+	}
+
+	keyring = keyring_alloc(".nvdimm",
+			GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, cred,
+			(KEY_POS_ALL & ~KEY_POS_SETATTR) |
+			(KEY_USR_ALL & ~KEY_USR_SETATTR),
+			KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+	if (IS_ERR(keyring)) {
+		rc = PTR_ERR(keyring);
+		goto failed_keyring;
+	}
+
+	set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
+	cred->thread_keyring = keyring;
+	cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
+	nvdimm_cred = cred;
+	return 0;
+
+ failed_cred:
+	unregister_key_type(&nvdimm_key_type);
+ failed_keyring:
+	put_cred(cred);
+	return rc;
+}
+
+static void nvdimm_unregister_keyring(void)
+{
+	key_revoke(nvdimm_cred->thread_keyring);
+	unregister_key_type(&nvdimm_key_type);
+	put_cred(nvdimm_cred);
+}
+
 int __init nvdimm_init(void)
 {
+	int rc;
+
+	rc = nvdimm_register_keyring();
+	if (rc < 0)
+		return rc;
+
 	return nd_driver_register(&nvdimm_driver);
 }
 
 void nvdimm_exit(void)
 {
+	nvdimm_unregister_keyring();
 	driver_unregister(&nvdimm_driver.drv);
 }
 
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index 472171af7f60..a250ff2a30df 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -155,6 +155,11 @@ static inline struct nd_blk_region_desc *to_blk_region_desc(
 
 }
 
+extern struct key_type nvdimm_key_type;
+
+#define NVDIMM_DEFAULT_PASSPHRASE_LEN		32
+#define NVDIMM_DEFAULT_DESC_LEN			32
+
 void badrange_init(struct badrange *badrange);
 int badrange_add(struct badrange *badrange, u64 addr, u64 length);
 void badrange_forget(struct badrange *badrange, phys_addr_t start,

_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm

WARNING: multiple messages have this Message-ID (diff)
From: Dave Jiang <dave.jiang@intel.com>
To: dan.j.williams@intel.com
Cc: dhowells@redhat.com, alison.schofield@intel.com,
	keyrings@vger.kernel.org, keescook@chromium.org,
	linux-nvdimm@lists.01.org
Subject: [PATCH 02/11] libnvdimm: create keyring to store security keys
Date: Mon, 02 Jul 2018 23:39:18 +0000	[thread overview]
Message-ID: <153057475818.38125.11899134233158940470.stgit@djiang5-desk3.ch.intel.com> (raw)
In-Reply-To: <153057423804.38125.15912575101400055843.stgit@djiang5-desk3.ch.intel.com>

Prepping the libnvdimm to support security management by adding a keyring
in order to provide passphrase management through the kernel key management
APIs.

Signed-off-by: Dave Jiang <dave.jiang@intel.com>
---
 drivers/nvdimm/dimm.c     |   90 +++++++++++++++++++++++++++++++++++++++++++++
 include/linux/libnvdimm.h |    5 +++
 2 files changed, 95 insertions(+)

diff --git a/drivers/nvdimm/dimm.c b/drivers/nvdimm/dimm.c
index 6c8fb7590838..ee0c68efa82a 100644
--- a/drivers/nvdimm/dimm.c
+++ b/drivers/nvdimm/dimm.c
@@ -18,9 +18,46 @@
 #include <linux/slab.h>
 #include <linux/mm.h>
 #include <linux/nd.h>
+#include <linux/cred.h>
+#include <keys/user-type.h>
+#include <linux/key-type.h>
+#include <linux/keyctl.h>
 #include "label.h"
 #include "nd.h"
 
+const struct cred *nvdimm_cred;
+static int nvdimm_key_instantiate(struct key *key,
+		struct key_preparsed_payload *prep);
+static void nvdimm_key_destroy(struct key *key);
+
+struct key_type nvdimm_key_type = {
+	.name = "nvdimm",
+	.instantiate = nvdimm_key_instantiate,
+	.destroy = nvdimm_key_destroy,
+	.describe = user_describe,
+	.def_datalen = NVDIMM_DEFAULT_PASSPHRASE_LEN * 2,
+};
+
+static int nvdimm_key_instantiate(struct key *key,
+		struct key_preparsed_payload *prep)
+{
+	char *payload;
+
+	payload = kzalloc(nvdimm_key_type.def_datalen, GFP_KERNEL);
+	if (!payload)
+		return -ENOMEM;
+
+	key->datalen = min(nvdimm_key_type.def_datalen, prep->datalen);
+	memcpy(payload, prep->data, key->datalen);
+	key->payload.data[0] = payload;
+	return 0;
+}
+
+static void nvdimm_key_destroy(struct key *key)
+{
+	kfree(key->payload.data[0]);
+}
+
 static int nvdimm_probe(struct device *dev)
 {
 	struct nvdimm_drvdata *ndd;
@@ -129,13 +166,66 @@ static struct nd_device_driver nvdimm_driver = {
 	.type = ND_DRIVER_DIMM,
 };
 
+static int nvdimm_register_keyring(void)
+{
+	struct cred *cred;
+	struct key *keyring;
+	int rc;
+
+	rc = register_key_type(&nvdimm_key_type);
+	if (rc < 0)
+		return rc;
+
+	cred = prepare_kernel_cred(NULL);
+	if (!cred) {
+		rc = -ENOMEM;
+		goto failed_cred;
+	}
+
+	keyring = keyring_alloc(".nvdimm",
+			GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, cred,
+			(KEY_POS_ALL & ~KEY_POS_SETATTR) |
+			(KEY_USR_ALL & ~KEY_USR_SETATTR),
+			KEY_ALLOC_NOT_IN_QUOTA, NULL, NULL);
+	if (IS_ERR(keyring)) {
+		rc = PTR_ERR(keyring);
+		goto failed_keyring;
+	}
+
+	set_bit(KEY_FLAG_ROOT_CAN_CLEAR, &keyring->flags);
+	cred->thread_keyring = keyring;
+	cred->jit_keyring = KEY_REQKEY_DEFL_THREAD_KEYRING;
+	nvdimm_cred = cred;
+	return 0;
+
+ failed_cred:
+	unregister_key_type(&nvdimm_key_type);
+ failed_keyring:
+	put_cred(cred);
+	return rc;
+}
+
+static void nvdimm_unregister_keyring(void)
+{
+	key_revoke(nvdimm_cred->thread_keyring);
+	unregister_key_type(&nvdimm_key_type);
+	put_cred(nvdimm_cred);
+}
+
 int __init nvdimm_init(void)
 {
+	int rc;
+
+	rc = nvdimm_register_keyring();
+	if (rc < 0)
+		return rc;
+
 	return nd_driver_register(&nvdimm_driver);
 }
 
 void nvdimm_exit(void)
 {
+	nvdimm_unregister_keyring();
 	driver_unregister(&nvdimm_driver.drv);
 }
 
diff --git a/include/linux/libnvdimm.h b/include/linux/libnvdimm.h
index 472171af7f60..a250ff2a30df 100644
--- a/include/linux/libnvdimm.h
+++ b/include/linux/libnvdimm.h
@@ -155,6 +155,11 @@ static inline struct nd_blk_region_desc *to_blk_region_desc(
 
 }
 
+extern struct key_type nvdimm_key_type;
+
+#define NVDIMM_DEFAULT_PASSPHRASE_LEN		32
+#define NVDIMM_DEFAULT_DESC_LEN			32
+
 void badrange_init(struct badrange *badrange);
 int badrange_add(struct badrange *badrange, u64 addr, u64 length);
 void badrange_forget(struct badrange *badrange, phys_addr_t start,


  parent reply	other threads:[~2018-07-02 23:39 UTC|newest]

Thread overview: 46+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-07-02 23:39 [PATCH 00/11] Adding security support for nvdimm Dave Jiang
2018-07-02 23:39 ` Dave Jiang
2018-07-02 23:39 ` [PATCH 01/11] nfit: adding support for Intel DSM 1.7 commands Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-02 23:49   ` Dan Williams
2018-07-02 23:49     ` Dan Williams
2018-07-02 23:39 ` Dave Jiang [this message]
2018-07-02 23:39   ` [PATCH 02/11] libnvdimm: create keyring to store security keys Dave Jiang
2018-07-03 22:16   ` Dan Williams
2018-07-03 22:16     ` Dan Williams
2018-07-02 23:39 ` [PATCH 03/11] nfit/libnvdimm: store dimm id as a member to struct nvdimm Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-03  1:04   ` Dan Williams
2018-07-03  1:04     ` Dan Williams
2018-07-02 23:39 ` [PATCH 04/11] nfit/libnvdimm: add unlock of nvdimm support for Intel DIMMs Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-03  1:45   ` Elliott, Robert (Persistent Memory)
2018-07-03  1:45     ` Elliott, Robert (Persistent Memory)
2018-07-03  3:46     ` Dan Williams
2018-07-03  3:46       ` Dan Williams
2018-07-03  4:58       ` Elliott, Robert (Persistent Memory)
2018-07-03  4:58         ` Elliott, Robert (Persistent Memory)
2018-07-03  5:03         ` Dan Williams
2018-07-03  5:03           ` Dan Williams
2018-07-03 18:00       ` James Morris
2018-07-03 18:00         ` James Morris
2018-07-03 19:21         ` Dan Williams
2018-07-03 19:21           ` Dan Williams
2018-07-03  3:48   ` Dan Williams
2018-07-03  3:48     ` Dan Williams
2018-07-02 23:39 ` [PATCH 05/11] nfit/libnvdimm: add set passphrase support for Intel nvdimms Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-03 22:48   ` Dan Williams
2018-07-03 22:48     ` Dan Williams
2018-07-02 23:39 ` [PATCH 06/11] nfit/libnvdimm: add disable passphrase support to Intel nvdimm Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-02 23:39 ` [PATCH 07/11] nfit/libnvdimm: add freeze security " Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-02 23:39 ` [PATCH 08/11] nfit/libnvdimm: add support for issue secure erase DSM " Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-02 23:39 ` [PATCH 09/11] nfit_test: adding context to dimm_dev for nfit_test Dave Jiang
2018-07-02 23:39   ` Dave Jiang
2018-07-02 23:40 ` [PATCH 10/11] nfit_test: adding test support for Intel nvdimm security DSMs Dave Jiang
2018-07-02 23:40   ` Dave Jiang
2018-07-02 23:40 ` [PATCH 11/11] libnvdimm: adding documentation for nvdimm security support Dave Jiang
2018-07-02 23:40   ` Dave Jiang

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=153057475818.38125.11899134233158940470.stgit@djiang5-desk3.ch.intel.com \
    --to=dave.jiang@intel.com \
    --cc=alison.schofield@intel.com \
    --cc=dan.j.williams@intel.com \
    --cc=dhowells@redhat.com \
    --cc=keescook@chromium.org \
    --cc=keyrings@vger.kernel.org \
    --cc=linux-nvdimm@lists.01.org \
    /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.