* [PATCH v5 0/4] generic and PowerPC SED Opal keystore
@ 2023-05-05 19:43 gjoyce
2023-05-05 19:43 ` [PATCH 1/4] block:sed-opal: " gjoyce
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: gjoyce @ 2023-05-05 19:43 UTC (permalink / raw)
To: linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, gjoyce, linux-efi, keyrings, me, elliott, andonnel
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Generic functions have been defined for accessing SED Opal keys.
The generic functions are defined as weak so that they may be superseded
by keystore specific versions.
PowerPC/pseries versions of these functions provide read/write access
to SED Opal keys in the PLPKS keystore.
The SED block driver has been modified to read the SED Opal
keystore to populate a key in the SED Opal keyring. Changes to the
SED Opal key will be written to the SED Opal keystore.
Patch 3 "keystore access for SED Opal keys" is dependent on:
https://lore.kernel.org/keyrings/20220818143045.680972-4-gjoyce@linux.vnet.ibm.com/T/#u
Changelog
v5: - updated to reflect changes in PLPKS API
v4:
- scope reduced to cover just SED Opal keys
- base SED Opal keystore is now in SED block driver
- removed use of enum to indicate type
- refactored common code into common function that read and
write use
- removed cast to void
- added use of SED Opal keystore functions to SED block driver
v3:
- No code changes, but per reviewer requests, adding additional
mailing lists(keyring, EFI) for wider review.
v2:
- Include feedback from Gregory Joyce, Eric Richter and
Murilo Opsfelder Araujo.
- Include suggestions from Michael Ellerman.
- Moved a dependency from generic SED code to this patchset.
This patchset now builds of its own.
Greg Joyce (4):
block:sed-opal: SED Opal keystore
powerpc/pseries: PLPKS SED Opal keystore support
block: sed-opal: keystore access for SED Opal keys
powerpc/pseries: update SED for PLPKS api changes
arch/powerpc/platforms/pseries/Kconfig | 6 +
arch/powerpc/platforms/pseries/Makefile | 1 +
.../powerpc/platforms/pseries/plpks_sed_ops.c | 114 ++++++++++++++++++
block/Kconfig | 1 +
block/Makefile | 2 +-
block/sed-opal-key.c | 24 ++++
block/sed-opal.c | 18 ++-
include/linux/sed-opal-key.h | 15 +++
8 files changed, 178 insertions(+), 3 deletions(-)
create mode 100644 arch/powerpc/platforms/pseries/plpks_sed_ops.c
create mode 100644 block/sed-opal-key.c
create mode 100644 include/linux/sed-opal-key.h
base-commit: 6a8f57ae2eb07ab39a6f0ccad60c760743051026
--
gjoyce@linux.vnet.ibm.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/4] block:sed-opal: SED Opal keystore
2023-05-05 19:43 [PATCH v5 0/4] generic and PowerPC SED Opal keystore gjoyce
@ 2023-05-05 19:43 ` gjoyce
2023-05-10 22:50 ` Jarkko Sakkinen
2023-05-05 19:44 ` [PATCH 2/4] powerpc/pseries: PLPKS SED Opal keystore support gjoyce
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: gjoyce @ 2023-05-05 19:43 UTC (permalink / raw)
To: linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, gjoyce, linux-efi, keyrings, me, elliott, andonnel
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Add read and write functions that allow SED Opal keys to stored
in a permanent keystore.
Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Reviewed-by: Jonathan Derrick <jonathan.derrick@linux.dev>
---
block/Makefile | 2 +-
block/sed-opal-key.c | 24 ++++++++++++++++++++++++
include/linux/sed-opal-key.h | 15 +++++++++++++++
3 files changed, 40 insertions(+), 1 deletion(-)
create mode 100644 block/sed-opal-key.c
create mode 100644 include/linux/sed-opal-key.h
diff --git a/block/Makefile b/block/Makefile
index 4e01bb71ad6e..464a9f209552 100644
--- a/block/Makefile
+++ b/block/Makefile
@@ -35,7 +35,7 @@ obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o
obj-$(CONFIG_BLK_WBT) += blk-wbt.o
obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-debugfs.o
obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
-obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o
+obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o sed-opal-key.o
obj-$(CONFIG_BLK_PM) += blk-pm.o
obj-$(CONFIG_BLK_INLINE_ENCRYPTION) += blk-crypto.o blk-crypto-profile.o \
blk-crypto-sysfs.o
diff --git a/block/sed-opal-key.c b/block/sed-opal-key.c
new file mode 100644
index 000000000000..16f380164c44
--- /dev/null
+++ b/block/sed-opal-key.c
@@ -0,0 +1,24 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * SED key operations.
+ *
+ * Copyright (C) 2022 IBM Corporation
+ *
+ * These are the accessor functions (read/write) for SED Opal
+ * keys. Specific keystores can provide overrides.
+ *
+ */
+
+#include <linux/kernel.h>
+#include <linux/errno.h>
+#include <linux/sed-opal-key.h>
+
+int __weak sed_read_key(char *keyname, char *key, u_int *keylen)
+{
+ return -EOPNOTSUPP;
+}
+
+int __weak sed_write_key(char *keyname, char *key, u_int keylen)
+{
+ return -EOPNOTSUPP;
+}
diff --git a/include/linux/sed-opal-key.h b/include/linux/sed-opal-key.h
new file mode 100644
index 000000000000..c9b1447986d8
--- /dev/null
+++ b/include/linux/sed-opal-key.h
@@ -0,0 +1,15 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * SED key operations.
+ *
+ * Copyright (C) 2022 IBM Corporation
+ *
+ * These are the accessor functions (read/write) for SED Opal
+ * keys. Specific keystores can provide overrides.
+ *
+ */
+
+#include <linux/kernel.h>
+
+int sed_read_key(char *keyname, char *key, u_int *keylen);
+int sed_write_key(char *keyname, char *key, u_int keylen);
--
gjoyce@linux.vnet.ibm.com
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/4] powerpc/pseries: PLPKS SED Opal keystore support
2023-05-05 19:43 [PATCH v5 0/4] generic and PowerPC SED Opal keystore gjoyce
2023-05-05 19:43 ` [PATCH 1/4] block:sed-opal: " gjoyce
@ 2023-05-05 19:44 ` gjoyce
2023-05-05 19:44 ` [PATCH 3/4] block: sed-opal: keystore access for SED Opal keys gjoyce
2023-05-05 19:44 ` [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes gjoyce
3 siblings, 0 replies; 9+ messages in thread
From: gjoyce @ 2023-05-05 19:44 UTC (permalink / raw)
To: linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, gjoyce, linux-efi, keyrings, me, elliott, andonnel
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Define operations for SED Opal to read/write keys
from POWER LPAR Platform KeyStore(PLPKS). This allows
non-volatile storage of SED Opal keys.
Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Reviewed-by: Jonathan Derrick <jonathan.derrick@linux.dev>
---
arch/powerpc/platforms/pseries/Makefile | 1 +
.../powerpc/platforms/pseries/plpks_sed_ops.c | 126 ++++++++++++++++++
2 files changed, 127 insertions(+)
create mode 100644 arch/powerpc/platforms/pseries/plpks_sed_ops.c
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 53c3b91af2f7..4242aed0d5d3 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -29,6 +29,7 @@ obj-$(CONFIG_PPC_SVM) += svm.o
obj-$(CONFIG_FA_DUMP) += rtas-fadump.o
obj-$(CONFIG_PSERIES_PLPKS) += plpks.o
obj-$(CONFIG_PPC_SECURE_BOOT) += plpks-secvar.o
+obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks-sed.o
obj-$(CONFIG_SUSPEND) += suspend.o
obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
diff --git a/arch/powerpc/platforms/pseries/plpks_sed_ops.c b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
new file mode 100644
index 000000000000..086934b319a9
--- /dev/null
+++ b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
@@ -0,0 +1,126 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * POWER Platform specific code for non-volatile SED key access
+ * Copyright (C) 2022 IBM Corporation
+ *
+ * Define operations for SED Opal to read/write keys
+ * from POWER LPAR Platform KeyStore(PLPKS).
+ *
+ * Self Encrypting Drives(SED) key storage using PLPKS
+ */
+
+#include <linux/kernel.h>
+#include <linux/slab.h>
+#include <linux/string.h>
+#include <linux/ioctl.h>
+#include <linux/sed-opal-key.h>
+#include "plpks.h"
+
+/*
+ * structure that contains all SED data
+ */
+struct plpks_sed_object_data {
+ u_char version;
+ u_char pad1[7];
+ u_long authority;
+ u_long range;
+ u_int key_len;
+ u_char key[32];
+};
+
+#define PLPKS_PLATVAR_POLICY WORLDREADABLE
+#define PLPKS_PLATVAR_OS_COMMON 4
+
+#define PLPKS_SED_OBJECT_DATA_V0 0
+#define PLPKS_SED_MANGLED_LABEL "/default/pri"
+#define PLPKS_SED_COMPONENT "sed-opal"
+#define PLPKS_SED_KEY "opal-boot-pin"
+
+/*
+ * authority is admin1 and range is global
+ */
+#define PLPKS_SED_AUTHORITY 0x0000000900010001
+#define PLPKS_SED_RANGE 0x0000080200000001
+
+void plpks_init_var(struct plpks_var *var, char *keyname)
+{
+ var->name = keyname;
+ var->namelen = strlen(keyname);
+ if (strcmp(PLPKS_SED_KEY, keyname) == 0) {
+ var->name = PLPKS_SED_MANGLED_LABEL;
+ var->namelen = strlen(keyname);
+ }
+ var->policy = PLPKS_PLATVAR_POLICY;
+ var->os = PLPKS_PLATVAR_OS_COMMON;
+ var->data = NULL;
+ var->datalen = 0;
+ var->component = PLPKS_SED_COMPONENT;
+}
+
+/*
+ * Read the SED Opal key from PLPKS given the label
+ */
+int sed_read_key(char *keyname, char *key, u_int *keylen)
+{
+ struct plpks_var var;
+ struct plpks_sed_object_data data;
+ u_int offset;
+ int ret;
+ u_int len;
+
+ plpks_init_var(&var, keyname);
+ var.data = &data;
+ var.datalen = sizeof(data);
+
+ ret = plpks_read_os_var(&var);
+ if (ret != 0)
+ return ret;
+
+ offset = offsetof(struct plpks_sed_object_data, key);
+ if (offset > var.datalen) {
+ return -EINVAL;
+ }
+
+ len = min(be32_to_cpu(data.key_len), *keylen);
+
+ memcpy(key, data.key, len);
+ kfree(var.data);
+
+ key[len] = '\0';
+ *keylen = len;
+
+ return 0;
+}
+
+/*
+ * Write the SED Opal key to PLPKS given the label
+ */
+int sed_write_key(char *keyname, char *key, u_int keylen)
+{
+ struct plpks_var var;
+ struct plpks_sed_object_data data;
+ struct plpks_var_name vname;
+
+ plpks_init_var(&var, keyname);
+
+ var.datalen = sizeof(struct plpks_sed_object_data);
+ var.data = (u8 *)&data;
+
+ /* initialize SED object */
+ data.version = PLPKS_SED_OBJECT_DATA_V0;
+ data.authority = cpu_to_be64(PLPKS_SED_AUTHORITY);
+ data.range = cpu_to_be64(PLPKS_SED_RANGE);
+ memset(&data.pad1, '\0', sizeof(data.pad1));
+ data.key_len = cpu_to_be32(keylen);
+ memcpy(data.key, (char *)key, keylen);
+
+ /*
+ * Key update requires remove first. The return value
+ * is ignored since it's okay if the key doesn't exist.
+ */
+ vname.namelen = var.namelen;
+ vname.name = var.name;
+ plpks_remove_var(var.component, var.os, vname);
+
+ return plpks_write_var(var);
+}
--
gjoyce@linux.vnet.ibm.com
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/4] block: sed-opal: keystore access for SED Opal keys
2023-05-05 19:43 [PATCH v5 0/4] generic and PowerPC SED Opal keystore gjoyce
2023-05-05 19:43 ` [PATCH 1/4] block:sed-opal: " gjoyce
2023-05-05 19:44 ` [PATCH 2/4] powerpc/pseries: PLPKS SED Opal keystore support gjoyce
@ 2023-05-05 19:44 ` gjoyce
2023-05-05 19:44 ` [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes gjoyce
3 siblings, 0 replies; 9+ messages in thread
From: gjoyce @ 2023-05-05 19:44 UTC (permalink / raw)
To: linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, gjoyce, linux-efi, keyrings, me, elliott, andonnel
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Allow for permanent SED authentication keys by
reading/writing to the SED Opal non-volatile keystore.
Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Reviewed-by: Jonathan Derrick <jonathan.derrick@linux.dev>
---
block/sed-opal.c | 18 ++++++++++++++++--
1 file changed, 16 insertions(+), 2 deletions(-)
diff --git a/block/sed-opal.c b/block/sed-opal.c
index 7f5f235a9048..1e8cfa00b609 100644
--- a/block/sed-opal.c
+++ b/block/sed-opal.c
@@ -18,6 +18,7 @@
#include <linux/uaccess.h>
#include <uapi/linux/sed-opal.h>
#include <linux/sed-opal.h>
+#include <linux/sed-opal-key.h>
#include <linux/string.h>
#include <linux/kdev_t.h>
#include <linux/key.h>
@@ -2803,7 +2804,13 @@ static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
if (ret)
return ret;
- /* update keyring with new password */
+ /* update keyring and key store with new password */
+ ret = sed_write_key(OPAL_AUTH_KEY,
+ opal_pw->new_user_pw.opal_key.key,
+ opal_pw->new_user_pw.opal_key.key_len);
+ if (ret != -EOPNOTSUPP)
+ pr_warn("error updating SED key: %d\n", ret);
+
ret = update_sed_opal_key(OPAL_AUTH_KEY,
opal_pw->new_user_pw.opal_key.key,
opal_pw->new_user_pw.opal_key.key_len);
@@ -3050,6 +3057,8 @@ EXPORT_SYMBOL_GPL(sed_ioctl);
static int __init sed_opal_init(void)
{
struct key *kr;
+ char init_sed_key[OPAL_KEY_MAX];
+ int keylen = OPAL_KEY_MAX - 1;
kr = keyring_alloc(".sed_opal",
GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
@@ -3062,6 +3071,11 @@ static int __init sed_opal_init(void)
sed_opal_keyring = kr;
- return 0;
+ if (sed_read_key(OPAL_AUTH_KEY, init_sed_key, &keylen) < 0) {
+ memset(init_sed_key, '\0', sizeof(init_sed_key));
+ keylen = OPAL_KEY_MAX - 1;
+ }
+
+ return update_sed_opal_key(OPAL_AUTH_KEY, init_sed_key, keylen);
}
late_initcall(sed_opal_init);
--
gjoyce@linux.vnet.ibm.com
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes
2023-05-05 19:43 [PATCH v5 0/4] generic and PowerPC SED Opal keystore gjoyce
` (2 preceding siblings ...)
2023-05-05 19:44 ` [PATCH 3/4] block: sed-opal: keystore access for SED Opal keys gjoyce
@ 2023-05-05 19:44 ` gjoyce
2023-05-15 5:52 ` Andrew Donnellan
3 siblings, 1 reply; 9+ messages in thread
From: gjoyce @ 2023-05-05 19:44 UTC (permalink / raw)
To: linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, gjoyce, linux-efi, keyrings, me, elliott, andonnel
From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
Changes to the PLPKS API require minor updates to the SED Opal
PLPKS keystore code.
Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
---
arch/powerpc/platforms/pseries/Kconfig | 6 +++++
arch/powerpc/platforms/pseries/Makefile | 2 +-
.../powerpc/platforms/pseries/plpks_sed_ops.c | 22 +++++--------------
block/Kconfig | 1 +
4 files changed, 13 insertions(+), 18 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
index 21b22bf16ce6..c2f8a29e7b9b 100644
--- a/arch/powerpc/platforms/pseries/Kconfig
+++ b/arch/powerpc/platforms/pseries/Kconfig
@@ -163,6 +163,12 @@ config PSERIES_PLPKS
# This option is selected by in-kernel consumers that require
# access to the PKS.
+config PSERIES_PLPKS_SED
+ depends on PPC_PSERIES
+ bool
+ # This option is selected by in-kernel consumers that require
+ # access to the SED PKS keystore.
+
config PAPR_SCM
depends on PPC_PSERIES && MEMORY_HOTPLUG && LIBNVDIMM
tristate "Support for the PAPR Storage Class Memory interface"
diff --git a/arch/powerpc/platforms/pseries/Makefile b/arch/powerpc/platforms/pseries/Makefile
index 4242aed0d5d3..1476c5e4433c 100644
--- a/arch/powerpc/platforms/pseries/Makefile
+++ b/arch/powerpc/platforms/pseries/Makefile
@@ -29,7 +29,7 @@ obj-$(CONFIG_PPC_SVM) += svm.o
obj-$(CONFIG_FA_DUMP) += rtas-fadump.o
obj-$(CONFIG_PSERIES_PLPKS) += plpks.o
obj-$(CONFIG_PPC_SECURE_BOOT) += plpks-secvar.o
-obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks-sed.o
+obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks_sed_ops.o
obj-$(CONFIG_SUSPEND) += suspend.o
obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
diff --git a/arch/powerpc/platforms/pseries/plpks_sed_ops.c b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
index 086934b319a9..c1d08075e850 100644
--- a/arch/powerpc/platforms/pseries/plpks_sed_ops.c
+++ b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
@@ -14,7 +14,7 @@
#include <linux/string.h>
#include <linux/ioctl.h>
#include <linux/sed-opal-key.h>
-#include "plpks.h"
+#include <asm/plpks.h>
/*
* structure that contains all SED data
@@ -28,9 +28,6 @@ struct plpks_sed_object_data {
u_char key[32];
};
-#define PLPKS_PLATVAR_POLICY WORLDREADABLE
-#define PLPKS_PLATVAR_OS_COMMON 4
-
#define PLPKS_SED_OBJECT_DATA_V0 0
#define PLPKS_SED_MANGLED_LABEL "/default/pri"
#define PLPKS_SED_COMPONENT "sed-opal"
@@ -50,8 +47,8 @@ void plpks_init_var(struct plpks_var *var, char *keyname)
var->name = PLPKS_SED_MANGLED_LABEL;
var->namelen = strlen(keyname);
}
- var->policy = PLPKS_PLATVAR_POLICY;
- var->os = PLPKS_PLATVAR_OS_COMMON;
+ var->policy = PLPKS_WORLDREADABLE;
+ var->os = PLPKS_VAR_COMMON;
var->data = NULL;
var->datalen = 0;
var->component = PLPKS_SED_COMPONENT;
@@ -64,28 +61,19 @@ int sed_read_key(char *keyname, char *key, u_int *keylen)
{
struct plpks_var var;
struct plpks_sed_object_data data;
- u_int offset;
int ret;
u_int len;
plpks_init_var(&var, keyname);
- var.data = &data;
+ var.data = (u8 *)&data;
var.datalen = sizeof(data);
ret = plpks_read_os_var(&var);
if (ret != 0)
return ret;
- offset = offsetof(struct plpks_sed_object_data, key);
- if (offset > var.datalen) {
- return -EINVAL;
- }
-
- len = min(be32_to_cpu(data.key_len), *keylen);
-
+ len = min_t(u16, be32_to_cpu(data.key_len), var.datalen);
memcpy(key, data.key, len);
- kfree(var.data);
-
key[len] = '\0';
*keylen = len;
diff --git a/block/Kconfig b/block/Kconfig
index 76b23114fdeb..75d4db34df5a 100644
--- a/block/Kconfig
+++ b/block/Kconfig
@@ -182,6 +182,7 @@ config BLK_SED_OPAL
bool "Logic for interfacing with Opal enabled SEDs"
depends on KEYS
select PSERIES_PLPKS if PPC_PSERIES
+ select PSERIES_PLPKS_SED if PPC_PSERIES
help
Builds Logic for interfacing with Opal enabled controllers.
Enabling this option enables users to setup/unlock/lock
--
gjoyce@linux.vnet.ibm.com
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/4] block:sed-opal: SED Opal keystore
2023-05-05 19:43 ` [PATCH 1/4] block:sed-opal: " gjoyce
@ 2023-05-10 22:50 ` Jarkko Sakkinen
2023-06-01 14:29 ` Greg Joyce
0 siblings, 1 reply; 9+ messages in thread
From: Jarkko Sakkinen @ 2023-05-10 22:50 UTC (permalink / raw)
To: gjoyce, linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, linux-efi, keyrings, me, elliott, andonnel
On Fri May 5, 2023 at 10:43 PM EEST, wrote:
> From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
>
> Add read and write functions that allow SED Opal keys to stored
> in a permanent keystore.
Please be more verbose starting from "Self-Encrypting Drive (SED)",
instead of just "SED", and take time to explain what these keys are.
>
> Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> Reviewed-by: Jonathan Derrick <jonathan.derrick@linux.dev>
> ---
> block/Makefile | 2 +-
> block/sed-opal-key.c | 24 ++++++++++++++++++++++++
> include/linux/sed-opal-key.h | 15 +++++++++++++++
> 3 files changed, 40 insertions(+), 1 deletion(-)
> create mode 100644 block/sed-opal-key.c
> create mode 100644 include/linux/sed-opal-key.h
>
> diff --git a/block/Makefile b/block/Makefile
> index 4e01bb71ad6e..464a9f209552 100644
> --- a/block/Makefile
> +++ b/block/Makefile
> @@ -35,7 +35,7 @@ obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o
> obj-$(CONFIG_BLK_WBT) += blk-wbt.o
> obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-debugfs.o
> obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
> -obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o
> +obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o sed-opal-key.o
> obj-$(CONFIG_BLK_PM) += blk-pm.o
> obj-$(CONFIG_BLK_INLINE_ENCRYPTION) += blk-crypto.o blk-crypto-profile.o \
> blk-crypto-sysfs.o
> diff --git a/block/sed-opal-key.c b/block/sed-opal-key.c
> new file mode 100644
> index 000000000000..16f380164c44
> --- /dev/null
> +++ b/block/sed-opal-key.c
> @@ -0,0 +1,24 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * SED key operations.
> + *
> + * Copyright (C) 2022 IBM Corporation
> + *
> + * These are the accessor functions (read/write) for SED Opal
> + * keys. Specific keystores can provide overrides.
> + *
> + */
> +
> +#include <linux/kernel.h>
> +#include <linux/errno.h>
> +#include <linux/sed-opal-key.h>
> +
> +int __weak sed_read_key(char *keyname, char *key, u_int *keylen)
> +{
> + return -EOPNOTSUPP;
> +}
> +
> +int __weak sed_write_key(char *keyname, char *key, u_int keylen)
> +{
> + return -EOPNOTSUPP;
> +}
> diff --git a/include/linux/sed-opal-key.h b/include/linux/sed-opal-key.h
> new file mode 100644
> index 000000000000..c9b1447986d8
> --- /dev/null
> +++ b/include/linux/sed-opal-key.h
> @@ -0,0 +1,15 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/*
> + * SED key operations.
> + *
> + * Copyright (C) 2022 IBM Corporation
> + *
> + * These are the accessor functions (read/write) for SED Opal
> + * keys. Specific keystores can provide overrides.
> + *
> + */
> +
> +#include <linux/kernel.h>
> +
> +int sed_read_key(char *keyname, char *key, u_int *keylen);
> +int sed_write_key(char *keyname, char *key, u_int keylen);
> --
> gjoyce@linux.vnet.ibm.com
BR, Jarkko
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes
2023-05-05 19:44 ` [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes gjoyce
@ 2023-05-15 5:52 ` Andrew Donnellan
2023-06-01 14:27 ` Greg Joyce
0 siblings, 1 reply; 9+ messages in thread
From: Andrew Donnellan @ 2023-05-15 5:52 UTC (permalink / raw)
To: gjoyce, linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, linux-efi, keyrings, me, elliott, nayna
On Fri, 2023-05-05 at 14:44 -0500, gjoyce@linux.vnet.ibm.com wrote:
> From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
>
> Changes to the PLPKS API require minor updates to the SED Opal
> PLPKS keystore code.
>
> Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
[+ Nayna]
This patch will need to be squashed with patch 2.
> ---
> arch/powerpc/platforms/pseries/Kconfig | 6 +++++
> arch/powerpc/platforms/pseries/Makefile | 2 +-
> .../powerpc/platforms/pseries/plpks_sed_ops.c | 22 +++++------------
> --
> block/Kconfig | 1 +
> 4 files changed, 13 insertions(+), 18 deletions(-)
>
> diff --git a/arch/powerpc/platforms/pseries/Kconfig
> b/arch/powerpc/platforms/pseries/Kconfig
> index 21b22bf16ce6..c2f8a29e7b9b 100644
> --- a/arch/powerpc/platforms/pseries/Kconfig
> +++ b/arch/powerpc/platforms/pseries/Kconfig
> @@ -163,6 +163,12 @@ config PSERIES_PLPKS
> # This option is selected by in-kernel consumers that require
> # access to the PKS.
>
> +config PSERIES_PLPKS_SED
> + depends on PPC_PSERIES
> + bool
> + # This option is selected by in-kernel consumers that require
> + # access to the SED PKS keystore.
> +
> config PAPR_SCM
> depends on PPC_PSERIES && MEMORY_HOTPLUG && LIBNVDIMM
> tristate "Support for the PAPR Storage Class Memory
> interface"
> diff --git a/arch/powerpc/platforms/pseries/Makefile
> b/arch/powerpc/platforms/pseries/Makefile
> index 4242aed0d5d3..1476c5e4433c 100644
> --- a/arch/powerpc/platforms/pseries/Makefile
> +++ b/arch/powerpc/platforms/pseries/Makefile
> @@ -29,7 +29,7 @@ obj-$(CONFIG_PPC_SVM) += svm.o
> obj-$(CONFIG_FA_DUMP) += rtas-fadump.o
> obj-$(CONFIG_PSERIES_PLPKS) += plpks.o
> obj-$(CONFIG_PPC_SECURE_BOOT) += plpks-secvar.o
> -obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks-sed.o
> +obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks_sed_ops.o
I think you could just use obj-$(CONFIG_BLK_SED_OPAL) and then there
wouldn't be a need to introduce a new option? Unless there's going to
be a second consumer.
> obj-$(CONFIG_SUSPEND) += suspend.o
> obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
>
> diff --git a/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> index 086934b319a9..c1d08075e850 100644
> --- a/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> +++ b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> @@ -14,7 +14,7 @@
> #include <linux/string.h>
> #include <linux/ioctl.h>
> #include <linux/sed-opal-key.h>
> -#include "plpks.h"
> +#include <asm/plpks.h>
>
> /*
> * structure that contains all SED data
> @@ -28,9 +28,6 @@ struct plpks_sed_object_data {
> u_char key[32];
> };
>
> -#define PLPKS_PLATVAR_POLICY WORLDREADABLE
> -#define PLPKS_PLATVAR_OS_COMMON 4
> -
> #define PLPKS_SED_OBJECT_DATA_V0 0
> #define PLPKS_SED_MANGLED_LABEL "/default/pri"
> #define PLPKS_SED_COMPONENT "sed-opal"
> @@ -50,8 +47,8 @@ void plpks_init_var(struct plpks_var *var, char
> *keyname)
> var->name = PLPKS_SED_MANGLED_LABEL;
> var->namelen = strlen(keyname);
> }
> - var->policy = PLPKS_PLATVAR_POLICY;
> - var->os = PLPKS_PLATVAR_OS_COMMON;
> + var->policy = PLPKS_WORLDREADABLE;
> + var->os = PLPKS_VAR_COMMON;
> var->data = NULL;
> var->datalen = 0;
> var->component = PLPKS_SED_COMPONENT;
> @@ -64,28 +61,19 @@ int sed_read_key(char *keyname, char *key, u_int
> *keylen)
> {
> struct plpks_var var;
> struct plpks_sed_object_data data;
> - u_int offset;
> int ret;
> u_int len;
>
> plpks_init_var(&var, keyname);
> - var.data = &data;
> + var.data = (u8 *)&data;
> var.datalen = sizeof(data);
>
> ret = plpks_read_os_var(&var);
> if (ret != 0)
> return ret;
>
> - offset = offsetof(struct plpks_sed_object_data, key);
> - if (offset > var.datalen) {
> - return -EINVAL;
> - }
> -
> - len = min(be32_to_cpu(data.key_len), *keylen);
> -
> + len = min_t(u16, be32_to_cpu(data.key_len), var.datalen);
> memcpy(key, data.key, len);
> - kfree(var.data);
> -
> key[len] = '\0';
> *keylen = len;
>
> diff --git a/block/Kconfig b/block/Kconfig
> index 76b23114fdeb..75d4db34df5a 100644
> --- a/block/Kconfig
> +++ b/block/Kconfig
> @@ -182,6 +182,7 @@ config BLK_SED_OPAL
> bool "Logic for interfacing with Opal enabled SEDs"
> depends on KEYS
> select PSERIES_PLPKS if PPC_PSERIES
> + select PSERIES_PLPKS_SED if PPC_PSERIES
> help
> Builds Logic for interfacing with Opal enabled controllers.
> Enabling this option enables users to setup/unlock/lock
--
Andrew Donnellan OzLabs, ADL Canberra
ajd@linux.ibm.com IBM Australia Limited
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes
2023-05-15 5:52 ` Andrew Donnellan
@ 2023-06-01 14:27 ` Greg Joyce
0 siblings, 0 replies; 9+ messages in thread
From: Greg Joyce @ 2023-06-01 14:27 UTC (permalink / raw)
To: Andrew Donnellan, linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, linux-efi, keyrings, me, elliott, nayna
On Mon, 2023-05-15 at 15:52 +1000, Andrew Donnellan wrote:
> On Fri, 2023-05-05 at 14:44 -0500, gjoyce@linux.vnet.ibm.com wrote:
> > From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> >
> > Changes to the PLPKS API require minor updates to the SED Opal
> > PLPKS keystore code.
> >
> > Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
>
> [+ Nayna]
>
> This patch will need to be squashed with patch 2.
Thanks. I've squashed the patches and will resend shortly.
>
> > ---
> > arch/powerpc/platforms/pseries/Kconfig | 6 +++++
> > arch/powerpc/platforms/pseries/Makefile | 2 +-
> > .../powerpc/platforms/pseries/plpks_sed_ops.c | 22 +++++--------
> > ----
> > --
> > block/Kconfig | 1 +
> > 4 files changed, 13 insertions(+), 18 deletions(-)
> >
> > diff --git a/arch/powerpc/platforms/pseries/Kconfig
> > b/arch/powerpc/platforms/pseries/Kconfig
> > index 21b22bf16ce6..c2f8a29e7b9b 100644
> > --- a/arch/powerpc/platforms/pseries/Kconfig
> > +++ b/arch/powerpc/platforms/pseries/Kconfig
> > @@ -163,6 +163,12 @@ config PSERIES_PLPKS
> > # This option is selected by in-kernel consumers that
> > require
> > # access to the PKS.
> >
> > +config PSERIES_PLPKS_SED
> > + depends on PPC_PSERIES
> > + bool
> > + # This option is selected by in-kernel consumers that
> > require
> > + # access to the SED PKS keystore.
> > +
> > config PAPR_SCM
> > depends on PPC_PSERIES && MEMORY_HOTPLUG && LIBNVDIMM
> > tristate "Support for the PAPR Storage Class Memory
> > interface"
> > diff --git a/arch/powerpc/platforms/pseries/Makefile
> > b/arch/powerpc/platforms/pseries/Makefile
> > index 4242aed0d5d3..1476c5e4433c 100644
> > --- a/arch/powerpc/platforms/pseries/Makefile
> > +++ b/arch/powerpc/platforms/pseries/Makefile
> > @@ -29,7 +29,7 @@ obj-$(CONFIG_PPC_SVM) += svm.o
> > obj-$(CONFIG_FA_DUMP) += rtas-fadump.o
> > obj-$(CONFIG_PSERIES_PLPKS) += plpks.o
> > obj-$(CONFIG_PPC_SECURE_BOOT) += plpks-secvar.o
> > -obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks-sed.o
> > +obj-$(CONFIG_PSERIES_PLPKS_SED) += plpks_sed_ops.o
>
> I think you could just use obj-$(CONFIG_BLK_SED_OPAL) and then there
> wouldn't be a need to introduce a new option? Unless there's going to
> be a second consumer.
I was following the model of CONFIG_PPC_SECURE_BOOT. That gives a
littler finer control and flexibilty for using SED and PLPKS. This also
confines use of CONFIG_BLK_SED_OPAL to the base SED OPAL code.
>
> > obj-$(CONFIG_SUSPEND) += suspend.o
> > obj-$(CONFIG_PPC_VAS) += vas.o vas-sysfs.o
> >
> > diff --git a/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> > b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> > index 086934b319a9..c1d08075e850 100644
> > --- a/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> > +++ b/arch/powerpc/platforms/pseries/plpks_sed_ops.c
> > @@ -14,7 +14,7 @@
> > #include <linux/string.h>
> > #include <linux/ioctl.h>
> > #include <linux/sed-opal-key.h>
> > -#include "plpks.h"
> > +#include <asm/plpks.h>
> >
> > /*
> > * structure that contains all SED data
> > @@ -28,9 +28,6 @@ struct plpks_sed_object_data {
> > u_char key[32];
> > };
> >
> > -#define PLPKS_PLATVAR_POLICY WORLDREADABLE
> > -#define PLPKS_PLATVAR_OS_COMMON 4
> > -
> > #define PLPKS_SED_OBJECT_DATA_V0 0
> > #define PLPKS_SED_MANGLED_LABEL "/default/pri"
> > #define PLPKS_SED_COMPONENT "sed-opal"
> > @@ -50,8 +47,8 @@ void plpks_init_var(struct plpks_var *var, char
> > *keyname)
> > var->name = PLPKS_SED_MANGLED_LABEL;
> > var->namelen = strlen(keyname);
> > }
> > - var->policy = PLPKS_PLATVAR_POLICY;
> > - var->os = PLPKS_PLATVAR_OS_COMMON;
> > + var->policy = PLPKS_WORLDREADABLE;
> > + var->os = PLPKS_VAR_COMMON;
> > var->data = NULL;
> > var->datalen = 0;
> > var->component = PLPKS_SED_COMPONENT;
> > @@ -64,28 +61,19 @@ int sed_read_key(char *keyname, char *key,
> > u_int
> > *keylen)
> > {
> > struct plpks_var var;
> > struct plpks_sed_object_data data;
> > - u_int offset;
> > int ret;
> > u_int len;
> >
> > plpks_init_var(&var, keyname);
> > - var.data = &data;
> > + var.data = (u8 *)&data;
> > var.datalen = sizeof(data);
> >
> > ret = plpks_read_os_var(&var);
> > if (ret != 0)
> > return ret;
> >
> > - offset = offsetof(struct plpks_sed_object_data, key);
> > - if (offset > var.datalen) {
> > - return -EINVAL;
> > - }
> > -
> > - len = min(be32_to_cpu(data.key_len), *keylen);
> > -
> > + len = min_t(u16, be32_to_cpu(data.key_len), var.datalen);
> > memcpy(key, data.key, len);
> > - kfree(var.data);
> > -
> > key[len] = '\0';
> > *keylen = len;
> >
> > diff --git a/block/Kconfig b/block/Kconfig
> > index 76b23114fdeb..75d4db34df5a 100644
> > --- a/block/Kconfig
> > +++ b/block/Kconfig
> > @@ -182,6 +182,7 @@ config BLK_SED_OPAL
> > bool "Logic for interfacing with Opal enabled SEDs"
> > depends on KEYS
> > select PSERIES_PLPKS if PPC_PSERIES
> > + select PSERIES_PLPKS_SED if PPC_PSERIES
> > help
> > Builds Logic for interfacing with Opal enabled controllers.
> > Enabling this option enables users to setup/unlock/lock
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/4] block:sed-opal: SED Opal keystore
2023-05-10 22:50 ` Jarkko Sakkinen
@ 2023-06-01 14:29 ` Greg Joyce
0 siblings, 0 replies; 9+ messages in thread
From: Greg Joyce @ 2023-06-01 14:29 UTC (permalink / raw)
To: Jarkko Sakkinen, linux-block
Cc: linuxppc-dev, jonathan.derrick, brking, msuchanek, mpe, axboe,
akpm, linux-efi, keyrings, me, elliott, andonnel
On Thu, 2023-05-11 at 01:50 +0300, Jarkko Sakkinen wrote:
> On Fri May 5, 2023 at 10:43 PM EEST, wrote:
> > From: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> >
> > Add read and write functions that allow SED Opal keys to stored
> > in a permanent keystore.
>
> Please be more verbose starting from "Self-Encrypting Drive (SED)",
> instead of just "SED", and take time to explain what these keys are.
A further elaboration of SED and the keys will be in the next patchset.
>
> > Signed-off-by: Greg Joyce <gjoyce@linux.vnet.ibm.com>
> > Reviewed-by: Jonathan Derrick <jonathan.derrick@linux.dev>
> > ---
> > block/Makefile | 2 +-
> > block/sed-opal-key.c | 24 ++++++++++++++++++++++++
> > include/linux/sed-opal-key.h | 15 +++++++++++++++
> > 3 files changed, 40 insertions(+), 1 deletion(-)
> > create mode 100644 block/sed-opal-key.c
> > create mode 100644 include/linux/sed-opal-key.h
> >
> > diff --git a/block/Makefile b/block/Makefile
> > index 4e01bb71ad6e..464a9f209552 100644
> > --- a/block/Makefile
> > +++ b/block/Makefile
> > @@ -35,7 +35,7 @@ obj-$(CONFIG_BLK_DEV_ZONED) += blk-zoned.o
> > obj-$(CONFIG_BLK_WBT) += blk-wbt.o
> > obj-$(CONFIG_BLK_DEBUG_FS) += blk-mq-debugfs.o
> > obj-$(CONFIG_BLK_DEBUG_FS_ZONED)+= blk-mq-debugfs-zoned.o
> > -obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o
> > +obj-$(CONFIG_BLK_SED_OPAL) += sed-opal.o sed-opal-key.o
> > obj-$(CONFIG_BLK_PM) += blk-pm.o
> > obj-$(CONFIG_BLK_INLINE_ENCRYPTION) += blk-crypto.o blk-
> > crypto-profile.o \
> > blk-crypto-sysfs.o
> > diff --git a/block/sed-opal-key.c b/block/sed-opal-key.c
> > new file mode 100644
> > index 000000000000..16f380164c44
> > --- /dev/null
> > +++ b/block/sed-opal-key.c
> > @@ -0,0 +1,24 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +/*
> > + * SED key operations.
> > + *
> > + * Copyright (C) 2022 IBM Corporation
> > + *
> > + * These are the accessor functions (read/write) for SED Opal
> > + * keys. Specific keystores can provide overrides.
> > + *
> > + */
> > +
> > +#include <linux/kernel.h>
> > +#include <linux/errno.h>
> > +#include <linux/sed-opal-key.h>
> > +
> > +int __weak sed_read_key(char *keyname, char *key, u_int *keylen)
> > +{
> > + return -EOPNOTSUPP;
> > +}
> > +
> > +int __weak sed_write_key(char *keyname, char *key, u_int keylen)
> > +{
> > + return -EOPNOTSUPP;
> > +}
> > diff --git a/include/linux/sed-opal-key.h b/include/linux/sed-opal-
> > key.h
> > new file mode 100644
> > index 000000000000..c9b1447986d8
> > --- /dev/null
> > +++ b/include/linux/sed-opal-key.h
> > @@ -0,0 +1,15 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/*
> > + * SED key operations.
> > + *
> > + * Copyright (C) 2022 IBM Corporation
> > + *
> > + * These are the accessor functions (read/write) for SED Opal
> > + * keys. Specific keystores can provide overrides.
> > + *
> > + */
> > +
> > +#include <linux/kernel.h>
> > +
> > +int sed_read_key(char *keyname, char *key, u_int *keylen);
> > +int sed_write_key(char *keyname, char *key, u_int keylen);
> > --
> > gjoyce@linux.vnet.ibm.com
>
> BR, Jarkko
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-06-01 14:30 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-05 19:43 [PATCH v5 0/4] generic and PowerPC SED Opal keystore gjoyce
2023-05-05 19:43 ` [PATCH 1/4] block:sed-opal: " gjoyce
2023-05-10 22:50 ` Jarkko Sakkinen
2023-06-01 14:29 ` Greg Joyce
2023-05-05 19:44 ` [PATCH 2/4] powerpc/pseries: PLPKS SED Opal keystore support gjoyce
2023-05-05 19:44 ` [PATCH 3/4] block: sed-opal: keystore access for SED Opal keys gjoyce
2023-05-05 19:44 ` [PATCH 4/4] powerpc/pseries: update SED for PLPKS api changes gjoyce
2023-05-15 5:52 ` Andrew Donnellan
2023-06-01 14:27 ` Greg Joyce
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).