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,
next prev 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: linkBe 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.