| // SPDX-License-Identifier: GPL-2.0+ | |
| /* | |
| * Copyright (C) 2019 Microsoft Corporation | |
| * | |
| * Author: Lakshmi Ramasubramanian (nramas@linux.microsoft.com) | |
| * | |
| * File: ima_asymmetric_keys.c | |
| * Defines an IMA hook to measure asymmetric keys on key | |
| * create or update. | |
| */ | |
| #include <keys/asymmetric-type.h> | |
| #include <linux/user_namespace.h> | |
| #include <linux/ima.h> | |
| #include "ima.h" | |
| /** | |
| * ima_post_key_create_or_update - measure asymmetric keys | |
| * @keyring: keyring to which the key is linked to | |
| * @key: created or updated key | |
| * @payload: The data used to instantiate or update the key. | |
| * @payload_len: The length of @payload. | |
| * @flags: key flags | |
| * @create: flag indicating whether the key was created or updated | |
| * | |
| * Keys can only be measured, not appraised. | |
| * The payload data used to instantiate or update the key is measured. | |
| */ | |
| void ima_post_key_create_or_update(struct key *keyring, struct key *key, | |
| const void *payload, size_t payload_len, | |
| unsigned long flags, bool create) | |
| { | |
| bool queued = false; | |
| /* Only asymmetric keys are handled by this hook. */ | |
| if (key->type != &key_type_asymmetric) | |
| return; | |
| if (!payload || (payload_len == 0)) | |
| return; | |
| if (ima_should_queue_key()) | |
| queued = ima_queue_key(keyring, payload, payload_len); | |
| if (queued) | |
| return; | |
| /* | |
| * keyring->description points to the name of the keyring | |
| * (such as ".builtin_trusted_keys", ".ima", etc.) to | |
| * which the given key is linked to. | |
| * | |
| * The name of the keyring is passed in the "eventname" | |
| * parameter to process_buffer_measurement() and is set | |
| * in the "eventname" field in ima_event_data for | |
| * the key measurement IMA event. | |
| * | |
| * The name of the keyring is also passed in the "keyring" | |
| * parameter to process_buffer_measurement() to check | |
| * if the IMA policy is configured to measure a key linked | |
| * to the given keyring. | |
| */ | |
| process_buffer_measurement(&nop_mnt_idmap, NULL, payload, payload_len, | |
| keyring->description, KEY_CHECK, 0, | |
| keyring->description, false, NULL, 0); | |
| } |