Wipe the payload of "user" and "logon" keys, and of the key types reusing
the user-type ops: s390 cert_store, NVMe TLS PSK, NFS idmap and PKCS#7.

Used by CONFIG_CRASH_WIPE_SECRETS.

Signed-off-by: Jan Sebastian Götte <[email protected]>
---
 crypto/asymmetric_keys/pkcs7_key_type.c |  1 +
 drivers/nvme/common/keyring.c           |  1 +
 fs/nfs/nfs4idmap.c                      |  2 ++
 include/keys/user-type.h                |  1 +
 security/keys/user_defined.c            | 15 +++++++++++++++
 5 files changed, 20 insertions(+)

diff --git a/crypto/asymmetric_keys/pkcs7_key_type.c 
b/crypto/asymmetric_keys/pkcs7_key_type.c
index b930d3bbf1af..663a246742f7 100644
--- a/crypto/asymmetric_keys/pkcs7_key_type.c
+++ b/crypto/asymmetric_keys/pkcs7_key_type.c
@@ -74,6 +74,7 @@ static struct key_type key_type_pkcs7 = {
        .instantiate            = generic_key_instantiate,
        .revoke                 = user_revoke,
        .destroy                = user_destroy,
+       .wipe                   = user_wipe,
        .describe               = user_describe,
        .read                   = user_read,
 };
diff --git a/drivers/nvme/common/keyring.c b/drivers/nvme/common/keyring.c
index 32d16c53133b..33303f035fb1 100644
--- a/drivers/nvme/common/keyring.c
+++ b/drivers/nvme/common/keyring.c
@@ -84,6 +84,7 @@ static struct key_type nvme_tls_psk_key_type = {
        .instantiate    = generic_key_instantiate,
        .revoke         = user_revoke,
        .destroy        = user_destroy,
+       .wipe           = user_wipe,
        .describe       = nvme_tls_psk_describe,
        .read           = user_read,
 };
diff --git a/fs/nfs/nfs4idmap.c b/fs/nfs/nfs4idmap.c
index bc397110d977..26f579ae2c73 100644
--- a/fs/nfs/nfs4idmap.c
+++ b/fs/nfs/nfs4idmap.c
@@ -190,6 +190,7 @@ static struct key_type key_type_id_resolver = {
        .instantiate    = generic_key_instantiate,
        .revoke         = user_revoke,
        .destroy        = user_destroy,
+       .wipe           = user_wipe,
        .describe       = user_describe,
        .read           = user_read,
 };
@@ -412,6 +413,7 @@ static struct key_type key_type_id_resolver_legacy = {
        .instantiate    = generic_key_instantiate,
        .revoke         = user_revoke,
        .destroy        = user_destroy,
+       .wipe           = user_wipe,
        .describe       = user_describe,
        .read           = user_read,
        .request_key    = nfs_idmap_legacy_upcall,
diff --git a/include/keys/user-type.h b/include/keys/user-type.h
index 386c31432789..685fa054b0ac 100644
--- a/include/keys/user-type.h
+++ b/include/keys/user-type.h
@@ -40,6 +40,7 @@ extern void user_free_preparse(struct key_preparsed_payload 
*prep);
 extern int user_update(struct key *key, struct key_preparsed_payload *prep);
 extern void user_revoke(struct key *key);
 extern void user_destroy(struct key *key);
+extern void user_wipe(struct key *key);
 extern void user_describe(const struct key *user, struct seq_file *m);
 extern long user_read(const struct key *key, char *buffer, size_t buflen);
 
diff --git a/security/keys/user_defined.c b/security/keys/user_defined.c
index 6f88b507f927..f4897c19c2dd 100644
--- a/security/keys/user_defined.c
+++ b/security/keys/user_defined.c
@@ -6,6 +6,7 @@
  */
 
 #include <linux/export.h>
+#include <linux/crash_core.h>
 #include <linux/init.h>
 #include <linux/slab.h>
 #include <linux/seq_file.h>
@@ -28,6 +29,7 @@ struct key_type key_type_user = {
        .update                 = user_update,
        .revoke                 = user_revoke,
        .destroy                = user_destroy,
+       .wipe                   = user_wipe,
        .describe               = user_describe,
        .read                   = user_read,
 };
@@ -48,6 +50,7 @@ struct key_type key_type_logon = {
        .update                 = user_update,
        .revoke                 = user_revoke,
        .destroy                = user_destroy,
+       .wipe                   = user_wipe,
        .describe               = user_describe,
        .vet_description        = logon_vet_description,
 };
@@ -152,6 +155,18 @@ void user_destroy(struct key *key)
 
 EXPORT_SYMBOL_GPL(user_destroy);
 
+void user_wipe(struct key *key)
+{
+       struct user_key_payload *upayload = key->payload.data[0];
+
+       if (upayload)
+               crash_wipe_memzero(upayload->data, upayload->datalen);
+       key->payload.data[1] = NULL;
+       key->payload.data[2] = NULL;
+       key->payload.data[3] = NULL;
+}
+EXPORT_SYMBOL_GPL(user_wipe);
+
 /*
  * describe the user key
  */

-- 
2.53.0


Reply via email to