Add wipe op to the subtype and implement it for public_key. Used by CONFIG_CRASH_WIPE_SECRETS. Signed-off-by: Jan Sebastian Götte --- crypto/asymmetric_keys/asymmetric_type.c | 11 +++++++++++ crypto/asymmetric_keys/public_key.c | 15 +++++++++++++++ include/keys/asymmetric-subtype.h | 5 +++++ 3 files changed, 31 insertions(+) diff --git a/crypto/asymmetric_keys/asymmetric_type.c b/crypto/asymmetric_keys/asymmetric_type.c index 16a7ae16593c..a0a68ebd0746 100644 --- a/crypto/asymmetric_keys/asymmetric_type.c +++ b/crypto/asymmetric_keys/asymmetric_type.c @@ -481,6 +481,16 @@ static void asymmetric_key_destroy(struct key *key) asymmetric_key_free_kids(kids); } +/* wipe the key without freeing. used by CONFIG_CRASH_WIPE_SECRETS. */ +static void asymmetric_key_wipe(struct key *key) +{ + struct asymmetric_key_subtype *subtype = asymmetric_key_subtype(key); + + if (subtype && subtype->wipe) + subtype->wipe(key->payload.data[asym_crypto], + key->payload.data[asym_auth]); +} + static struct key_restriction *asymmetric_restriction_alloc( key_restrict_link_func_t check, struct key *key) @@ -612,6 +622,7 @@ struct key_type key_type_asymmetric = { .match_preparse = asymmetric_key_match_preparse, .match_free = asymmetric_key_match_free, .destroy = asymmetric_key_destroy, + .wipe = asymmetric_key_wipe, .describe = asymmetric_key_describe, .lookup_restriction = asymmetric_lookup_restriction, .asym_query = query_asymmetric_key, diff --git a/crypto/asymmetric_keys/public_key.c b/crypto/asymmetric_keys/public_key.c index 09a0b83d5d77..9931d56337e5 100644 --- a/crypto/asymmetric_keys/public_key.c +++ b/crypto/asymmetric_keys/public_key.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -58,6 +59,19 @@ static void public_key_destroy(void *payload0, void *payload3) public_key_signature_free(payload3); } +/* wipe the key without freeing. used by CONFIG_CRASH_WIPE_SECRETS. */ +static void public_key_wipe(void *payload0, void *payload3) +{ + struct public_key *key = payload0; + + if (key) { + if (key->key) + crash_wipe_memzero(key->key, key->keylen); + if (key->params) + crash_wipe_memzero(key->params, key->paramlen); + } +} + /* * Given a public_key, and an encoding and hash_algo to be used for signing * and/or verification with that key, determine the name of the corresponding @@ -464,6 +478,7 @@ struct asymmetric_key_subtype public_key_subtype = { .name_len = sizeof("public_key") - 1, .describe = public_key_describe, .destroy = public_key_destroy, + .wipe = public_key_wipe, .query = software_key_query, .eds_op = software_key_eds_op, .verify_signature = public_key_verify_signature_2, diff --git a/include/keys/asymmetric-subtype.h b/include/keys/asymmetric-subtype.h index d55171f640a0..17c74070c101 100644 --- a/include/keys/asymmetric-subtype.h +++ b/include/keys/asymmetric-subtype.h @@ -32,6 +32,11 @@ struct asymmetric_key_subtype { /* Destroy a key of this subtype */ void (*destroy)(void *payload_crypto, void *payload_auth); + /* Wipe a key of this subtype without freeing it (optional). Used by + * CONFIG_CRASH_WIPE_SECRETS from the panic path. + */ + void (*wipe)(void *payload_crypto, void *payload_auth); + int (*query)(const struct kernel_pkey_params *params, struct kernel_pkey_query *info); -- 2.53.0