* [PATCH v1 0/2] s390/uv: Provide Host-key-hashes in sysfs
@ 2024-09-30 13:20 Steffen Eiden
2024-09-30 13:20 ` [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation Steffen Eiden
2024-09-30 13:20 ` [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs Steffen Eiden
0 siblings, 2 replies; 5+ messages in thread
From: Steffen Eiden @ 2024-09-30 13:20 UTC (permalink / raw)
To: linux-kernel, linux-s390
Cc: Ingo Franzki, Harald Freudenberger, Christoph Schlameuss,
Janosch Frank, Claudio Imbrenda
List the installed host keys in the sysfs if the machine supports the
Query Ultravisor Keys UVC.
As of now, two types of host keys are available:
The used/primary host key, and the backup hostkey both hastes are
available in a sysfs file.
For forwards compatibility an `all` file is also available that displays
the whole payload (15*32 bytes) and therefore future key hashes.
Steffen Eiden (2):
s390/uv: Refactor uv-sysfs creation
s390/uv: Provide host-key hashes in sysfs
arch/s390/include/asm/uv.h | 16 ++++++
arch/s390/kernel/uv.c | 108 +++++++++++++++++++++++++++++++++----
2 files changed, 114 insertions(+), 10 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation
2024-09-30 13:20 [PATCH v1 0/2] s390/uv: Provide Host-key-hashes in sysfs Steffen Eiden
@ 2024-09-30 13:20 ` Steffen Eiden
2024-10-01 11:43 ` Janosch Frank
2024-09-30 13:20 ` [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs Steffen Eiden
1 sibling, 1 reply; 5+ messages in thread
From: Steffen Eiden @ 2024-09-30 13:20 UTC (permalink / raw)
To: linux-kernel, linux-s390
Cc: Ingo Franzki, Harald Freudenberger, Christoph Schlameuss,
Janosch Frank, Claudio Imbrenda
Streamline the sysfs generation to make it more extensible.
Add a function to create a sysfs entry in the uv-sysfs dir.
Use this function for the query directory.
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
arch/s390/kernel/uv.c | 35 ++++++++++++++++++++++++-----------
1 file changed, 24 insertions(+), 11 deletions(-)
diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index 36db065c7cf7..d703ecc9aea5 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -752,7 +752,26 @@ static const struct attribute *uv_prot_virt_attrs[] = {
static struct kset *uv_query_kset;
static struct kobject *uv_kobj;
-static int __init uv_info_init(void)
+static int __init uv_sysfs_dir_init(const struct attribute_group *grp,
+ struct kset **uv_dir_kset, const char *name)
+{
+ struct kset *kset;
+ int rc = -ENOMEM;
+
+ kset = kset_create_and_add(name, NULL, uv_kobj);
+ if (!kset)
+ return -ENOMEM;
+ *uv_dir_kset = kset;
+
+ rc = sysfs_create_group(&kset->kobj, grp);
+ if (!rc)
+ return 0;
+
+ kset_unregister(kset);
+ return rc;
+}
+
+static int __init uv_sysfs_init(void)
{
int rc = -ENOMEM;
@@ -767,17 +786,11 @@ static int __init uv_info_init(void)
if (rc)
goto out_kobj;
- uv_query_kset = kset_create_and_add("query", NULL, uv_kobj);
- if (!uv_query_kset) {
- rc = -ENOMEM;
+ rc = uv_sysfs_dir_init(&uv_query_attr_group, &uv_query_kset, "query");
+ if (rc)
goto out_ind_files;
- }
-
- rc = sysfs_create_group(&uv_query_kset->kobj, &uv_query_attr_group);
- if (!rc)
- return 0;
+ return 0;
- kset_unregister(uv_query_kset);
out_ind_files:
sysfs_remove_files(uv_kobj, uv_prot_virt_attrs);
out_kobj:
@@ -785,4 +798,4 @@ static int __init uv_info_init(void)
kobject_put(uv_kobj);
return rc;
}
-device_initcall(uv_info_init);
+device_initcall(uv_sysfs_init);
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs
2024-09-30 13:20 [PATCH v1 0/2] s390/uv: Provide Host-key-hashes in sysfs Steffen Eiden
2024-09-30 13:20 ` [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation Steffen Eiden
@ 2024-09-30 13:20 ` Steffen Eiden
2024-10-01 11:41 ` Janosch Frank
1 sibling, 1 reply; 5+ messages in thread
From: Steffen Eiden @ 2024-09-30 13:20 UTC (permalink / raw)
To: linux-kernel, linux-s390
Cc: Ingo Franzki, Harald Freudenberger, Christoph Schlameuss,
Janosch Frank, Claudio Imbrenda
Utilize the new Query Ultravisor Keys to give user space the information
which host-keys are installed on the system.
Create a new sysfs directory 'firmware/uv/keys' that contains the hash
of the host-key and the backup host-key of that system. Additionally,
the file 'all' contains the response from the UVC possibly containing
more key-hashes than currently known.
Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
---
arch/s390/include/asm/uv.h | 16 ++++++++
arch/s390/kernel/uv.c | 75 ++++++++++++++++++++++++++++++++++++++
2 files changed, 91 insertions(+)
diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
index 153d93468b77..7eda73073cdd 100644
--- a/arch/s390/include/asm/uv.h
+++ b/arch/s390/include/asm/uv.h
@@ -31,6 +31,7 @@
#define UVC_RC_NEED_DESTROY 0x8000
#define UVC_CMD_QUI 0x0001
+#define UVC_CMD_QUK 0x0002
#define UVC_CMD_INIT_UV 0x000f
#define UVC_CMD_CREATE_SEC_CONF 0x0100
#define UVC_CMD_DESTROY_SEC_CONF 0x0101
@@ -94,6 +95,7 @@ enum uv_cmds_inst {
BIT_UVC_CMD_ADD_SECRET = 29,
BIT_UVC_CMD_LIST_SECRETS = 30,
BIT_UVC_CMD_LOCK_SECRETS = 31,
+ BIT_UVC_CMD_QUERY_KEYS = 34,
};
enum uv_feat_ind {
@@ -145,6 +147,20 @@ struct uv_cb_qui {
u8 reserved112[0x120 - 0x112]; /* 0x0112 */
} __packed __aligned(8);
+struct uv_key_hash {
+ u64 dword[4];
+} __packed __aligned(8);
+
+#define UVC_QUERY_KEYS_IDX_HK 0
+#define UVC_QUERY_KEYS_IDX_BACK_HK 1
+
+/* Query Ultravisor Keys */
+struct uv_cb_query_keys {
+ struct uv_cb_header header; /* 0x0000 */
+ u64 reserved08[3]; /* 0x0008 */
+ struct uv_key_hash keys[15]; /* 0x0020 */
+} __packed __aligned(8);
+
/* Initialize Ultravisor */
struct uv_cb_init {
struct uv_cb_header header;
diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
index d703ecc9aea5..5496bceba275 100644
--- a/arch/s390/kernel/uv.c
+++ b/arch/s390/kernel/uv.c
@@ -721,10 +721,79 @@ static struct attribute *uv_query_attrs[] = {
NULL,
};
+static inline struct uv_cb_query_keys uv_query_keys(void)
+{
+ struct uv_cb_query_keys uvcb = {
+ .header.cmd = UVC_CMD_QUK,
+ .header.len = sizeof(uvcb)
+ };
+
+ if (!test_bit_inv(BIT_UVC_CMD_QUERY_KEYS, uv_info.inst_calls_list))
+ return uvcb;
+
+ uv_call(0, (uint64_t)&uvcb);
+ return uvcb;
+}
+
+static inline ssize_t emit_hash(struct uv_key_hash *hash, char *buf, int at)
+{
+ return sysfs_emit_at(buf, at, "%016llx%016llx%016llx%016llx\n",
+ hash->dword[0], hash->dword[1], hash->dword[2], hash->dword[3]);
+}
+
+static ssize_t uv_keys_host_key(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ struct uv_cb_query_keys uvcb = uv_query_keys();
+
+ return emit_hash(&uvcb.keys[UVC_QUERY_KEYS_IDX_HK], buf, 0);
+}
+
+static struct kobj_attribute uv_keys_host_key_attr =
+ __ATTR(host_key, 0444, uv_keys_host_key, NULL);
+
+static ssize_t uv_keys_backup_host_key(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ struct uv_cb_query_keys uvcb = uv_query_keys();
+
+ return emit_hash(&uvcb.keys[UVC_QUERY_KEYS_IDX_BACK_HK], buf, 0);
+}
+
+static struct kobj_attribute uv_keys_backup_host_key_attr =
+ __ATTR(backup_host_key, 0444, uv_keys_backup_host_key, NULL);
+
+static ssize_t uv_keys_all(struct kobject *kobj,
+ struct kobj_attribute *attr, char *buf)
+{
+ struct uv_cb_query_keys uvcb = uv_query_keys();
+ ssize_t len = 0;
+ int i;
+
+ for (i = 0; i < ARRAY_SIZE(uvcb.keys); i++)
+ len += emit_hash(uvcb.keys + i, buf, len);
+
+ return len;
+}
+
+static struct kobj_attribute uv_keys_all_attr =
+ __ATTR(all, 0444, uv_keys_all, NULL);
+
static struct attribute_group uv_query_attr_group = {
.attrs = uv_query_attrs,
};
+static struct attribute *uv_keys_attrs[] = {
+ &uv_keys_host_key_attr.attr,
+ &uv_keys_backup_host_key_attr.attr,
+ &uv_keys_all_attr.attr,
+ NULL,
+};
+
+static struct attribute_group uv_keys_attr_group = {
+ .attrs = uv_keys_attrs,
+};
+
static ssize_t uv_is_prot_virt_guest(struct kobject *kobj,
struct kobj_attribute *attr, char *buf)
{
@@ -750,6 +819,7 @@ static const struct attribute *uv_prot_virt_attrs[] = {
};
static struct kset *uv_query_kset;
+static struct kset *uv_keys_kset;
static struct kobject *uv_kobj;
static int __init uv_sysfs_dir_init(const struct attribute_group *grp,
@@ -789,6 +859,11 @@ static int __init uv_sysfs_init(void)
rc = uv_sysfs_dir_init(&uv_query_attr_group, &uv_query_kset, "query");
if (rc)
goto out_ind_files;
+
+ // Get installed key hashes if available, ignore any errors
+ if (test_bit_inv(BIT_UVC_CMD_QUERY_KEYS, uv_info.inst_calls_list))
+ uv_sysfs_dir_init(&uv_keys_attr_group, &uv_keys_kset, "keys");
+
return 0;
out_ind_files:
--
2.43.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs
2024-09-30 13:20 ` [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs Steffen Eiden
@ 2024-10-01 11:41 ` Janosch Frank
0 siblings, 0 replies; 5+ messages in thread
From: Janosch Frank @ 2024-10-01 11:41 UTC (permalink / raw)
To: Steffen Eiden, linux-kernel, linux-s390
Cc: Ingo Franzki, Harald Freudenberger, Christoph Schlameuss,
Claudio Imbrenda
On 9/30/24 3:20 PM, Steffen Eiden wrote:
> Utilize the new Query Ultravisor Keys to give user space the information
> which host-keys are installed on the system.
>
> Create a new sysfs directory 'firmware/uv/keys' that contains the hash
> of the host-key and the backup host-key of that system. Additionally,
> the file 'all' contains the response from the UVC possibly containing
> more key-hashes than currently known.
>
> Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
> ---
> arch/s390/include/asm/uv.h | 16 ++++++++
> arch/s390/kernel/uv.c | 75 ++++++++++++++++++++++++++++++++++++++
> 2 files changed, 91 insertions(+)
>
> diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
> index 153d93468b77..7eda73073cdd 100644
> --- a/arch/s390/include/asm/uv.h
> +++ b/arch/s390/include/asm/uv.h
> @@ -31,6 +31,7 @@
> #define UVC_RC_NEED_DESTROY 0x8000
>
> #define UVC_CMD_QUI 0x0001
> +#define UVC_CMD_QUK 0x0002
Should've used the long form here as well.
> #define UVC_CMD_INIT_UV 0x000f
> #define UVC_CMD_CREATE_SEC_CONF 0x0100
> #define UVC_CMD_DESTROY_SEC_CONF 0x0101
> @@ -94,6 +95,7 @@ enum uv_cmds_inst {
> BIT_UVC_CMD_ADD_SECRET = 29,
> BIT_UVC_CMD_LIST_SECRETS = 30,
> BIT_UVC_CMD_LOCK_SECRETS = 31,
> + BIT_UVC_CMD_QUERY_KEYS = 34,
> };
>
[...]
> static int __init uv_sysfs_dir_init(const struct attribute_group *grp,
> @@ -789,6 +859,11 @@ static int __init uv_sysfs_init(void)
> rc = uv_sysfs_dir_init(&uv_query_attr_group, &uv_query_kset, "query");
> if (rc)
> goto out_ind_files;
> +
> + // Get installed key hashes if available, ignore any errors
Please use:
/* */
> + if (test_bit_inv(BIT_UVC_CMD_QUERY_KEYS, uv_info.inst_calls_list))
> + uv_sysfs_dir_init(&uv_keys_attr_group, &uv_keys_kset, "keys");
> +
> return 0;
>
> out_ind_files:
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation
2024-09-30 13:20 ` [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation Steffen Eiden
@ 2024-10-01 11:43 ` Janosch Frank
0 siblings, 0 replies; 5+ messages in thread
From: Janosch Frank @ 2024-10-01 11:43 UTC (permalink / raw)
To: Steffen Eiden, linux-kernel, linux-s390
Cc: Ingo Franzki, Harald Freudenberger, Christoph Schlameuss,
Claudio Imbrenda
On 9/30/24 3:20 PM, Steffen Eiden wrote:
> Streamline the sysfs generation to make it more extensible.
> Add a function to create a sysfs entry in the uv-sysfs dir.
> Use this function for the query directory.
>
> Reviewed-by: Christoph Schlameuss <schlameuss@linux.ibm.com>
> Signed-off-by: Steffen Eiden <seiden@linux.ibm.com>
Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
> @@ -767,17 +786,11 @@ static int __init uv_info_init(void)
> if (rc)
> goto out_kobj;
>
> - uv_query_kset = kset_create_and_add("query", NULL, uv_kobj);
> - if (!uv_query_kset) {
> - rc = -ENOMEM;
> + rc = uv_sysfs_dir_init(&uv_query_attr_group, &uv_query_kset, "query");
> + if (rc)
> goto out_ind_files;
> - }
> -
> - rc = sysfs_create_group(&uv_query_kset->kobj, &uv_query_attr_group);
> - if (!rc)
> - return 0;
> + return 0;
Could've left a \n before the return so it doesn't look weird if only
this patch is applied. But that's not important.
>
> - kset_unregister(uv_query_kset);
> out_ind_files:
> sysfs_remove_files(uv_kobj, uv_prot_virt_attrs);
> out_kobj:
> @@ -785,4 +798,4 @@ static int __init uv_info_init(void)
> kobject_put(uv_kobj);
> return rc;
> }
> -device_initcall(uv_info_init);
> +device_initcall(uv_sysfs_init);
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-10-01 11:44 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-09-30 13:20 [PATCH v1 0/2] s390/uv: Provide Host-key-hashes in sysfs Steffen Eiden
2024-09-30 13:20 ` [PATCH v1 1/2] s390/uv: Refactor uv-sysfs creation Steffen Eiden
2024-10-01 11:43 ` Janosch Frank
2024-09-30 13:20 ` [PATCH v1 2/2] s390/uv: Provide host-key hashes in sysfs Steffen Eiden
2024-10-01 11:41 ` Janosch Frank
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox