diff options
| author | Christian Brauner <brauner@kernel.org> | 2026-10-12 12:38:40 +0200 |
|---|---|---|
| committer | Christian Brauner <brauner@kernel.org> | 2026-10-12 23:37:42 +0200 |
| commit | 503b65da9a7e5447d91222f62399522f2f62a0fa (patch) | |
| tree | afc148be5728d2561a3680eb0060b7dfe586e3a0 /security/keys | |
| parent | 592d26f625acef962aa40d1f22f29388bc05de13 (diff) | |
| parent | bde0f0bcc5d040cc2f6f5cdd15a87635cea93f56 (diff) | |
Merge patch series "keys: Add well known IDs for fs-verity/dm-verity keys"
Andrew Halaney <andrew@amutable.com> says:
This more or less follows the bpf keyring approach, allowing userspace
to easily find the keys instead of having to parse /proc/keys.
* patches from https://patch.msgid.link/20261008-ajhalaney-dmverity-key-identifier-v2-0-008456d189cb@amutable.com:
Documentation: keys: document IDs added since KEY_SPEC_REQKEY_AUTH_KEY
keys: add KEY_SPEC_FS_VERITY_KEYRING
keys: add KEY_SPEC_DM_VERITY_KEYRING
Link: https://patch.msgid.link/20261008-ajhalaney-dmverity-key-identifier-v2-0-008456d189cb@amutable.com
Signed-off-by: Christian Brauner (Amutable) <brauner@kernel.org>
Diffstat (limited to 'security/keys')
| -rw-r--r-- | security/keys/process_keys.c | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c index 44358388e395..655c58a96fcb 100644 --- a/security/keys/process_keys.c +++ b/security/keys/process_keys.c @@ -25,6 +25,13 @@ static DEFINE_MUTEX(key_session_mutex); /* BPF keyring reachable through KEY_SPEC_BPF_KEYRING */ static struct key *bpf_keyring __ro_after_init; +/* dm-verity keyring reachable through KEY_SPEC_DM_VERITY_KEYRING */ +static struct key *dm_verity_keyring; +static DEFINE_SPINLOCK(dm_verity_keyring_lock); + +/* fs-verity keyring reachable through KEY_SPEC_FS_VERITY_KEYRING */ +static struct key *fs_verity_keyring __ro_after_init; + /* The root user's tracking struct */ struct key_user root_key_user = { .usage = REFCOUNT_INIT(3), @@ -607,6 +614,38 @@ void key_register_bpf_keyring(struct key *keyring) bpf_keyring = keyring; } +/** + * key_register_dm_verity_keyring - Publish the keyring for KEY_SPEC_DM_VERITY_KEYRING + * @keyring: The keyring to publish, or NULL to withdraw it + * + * Make @keyring reachable by userspace through the KEY_SPEC_DM_VERITY_KEYRING + * special key ID, so that provisioning it does not require scraping its + * serial out of /proc/keys first. dm-verity can be unloaded as a module + * and the keyring deregistered, as such serialize access with + * dm_verity_keyring_lock. + */ +void key_register_dm_verity_keyring(struct key *keyring) +{ + spin_lock(&dm_verity_keyring_lock); + dm_verity_keyring = keyring; + spin_unlock(&dm_verity_keyring_lock); +} +EXPORT_SYMBOL_GPL(key_register_dm_verity_keyring); + +/** + * key_register_fs_verity_keyring - Publish the keyring for KEY_SPEC_FS_VERITY_KEYRING + * @keyring: The keyring to publish + * + * Make @keyring reachable by userspace through the KEY_SPEC_FS_VERITY_KEYRING + * special key ID, so that provisioning it does not require scraping its + * serial out of /proc/keys first. Called once, from an initcall, and never + * undone. + */ +void key_register_fs_verity_keyring(struct key *keyring) +{ + fs_verity_keyring = keyring; +} + /* * Look up a key ID given us by userspace with a given permissions mask to get * the key it refers to. @@ -766,6 +805,25 @@ try_again: key_ref = make_key_ref(key, 0); break; + case KEY_SPEC_DM_VERITY_KEYRING: + spin_lock(&dm_verity_keyring_lock); + key = dm_verity_keyring; + if (key) + __key_get(key); + spin_unlock(&dm_verity_keyring_lock); + if (!key) + goto error; + key_ref = make_key_ref(key, 0); + break; + + case KEY_SPEC_FS_VERITY_KEYRING: + key = fs_verity_keyring; + if (!key) + goto error; + __key_get(key); + key_ref = make_key_ref(key, 0); + break; + default: key_ref = ERR_PTR(-EINVAL); if (id < 1) |
