mirror of
https://github.com/torvalds/linux.git
synced 2026-07-27 01:32:21 +02:00
KEYS: trusted: Debugging as a feature
TPM_DEBUG, and other similar flags, are a non-standard way to specify a feature in Linux kernel. Introduce CONFIG_TRUSTED_KEYS_DEBUG for trusted keys, and use it to replace these ad-hoc feature flags. Given that trusted keys debug dumps can contain sensitive data, harden the feature as follows: 1. In the Kconfig description postulate that pr_debug() statements must be used. 2. Use pr_debug() statements in TPM 1.x driver to print the protocol dump. 3. Require trusted.debug=1 on the kernel command line (default: 0) to activate dumps at runtime, even when CONFIG_TRUSTED_KEYS_DEBUG=y. Traces, when actually needed, can be easily enabled by providing trusted.dyndbg='+p' and trusted.debug=1 in the kernel command-line. Reported-by: Nayna Jain <nayna@linux.ibm.com> Closes: https://lore.kernel.org/all/7f8b8478-5cd8-4d97-bfd0-341fd5cf10f9@linux.ibm.com/ Reviewed-by: Nayna Jain <nayna@linux.ibm.com> Tested-by: Srish Srinivasan <ssrish@linux.ibm.com> Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
This commit is contained in:
parent
3a1705d180
commit
4d05e948ce
|
|
@ -7875,6 +7875,22 @@ Kernel parameters
|
|||
first trust source as a backend which is initialized
|
||||
successfully during iteration.
|
||||
|
||||
trusted.debug= [KEYS]
|
||||
Format: <bool>
|
||||
Enable trusted keys debug traces at runtime when
|
||||
CONFIG_TRUSTED_KEYS_DEBUG=y.
|
||||
|
||||
To make the traces visible after enabling the option,
|
||||
use trusted.dyndbg='+p' as needed. By convention,
|
||||
the subsystem uses pr_debug() for these traces.
|
||||
|
||||
SAFETY: The traces can leak sensitive data, so be
|
||||
cautious before enabling this. They remain inactive
|
||||
unless this parameter is set this option to a true
|
||||
value.
|
||||
|
||||
Default: false
|
||||
|
||||
trusted.rng= [KEYS]
|
||||
Format: <string>
|
||||
The RNG used to generate key material for trusted keys.
|
||||
|
|
|
|||
|
|
@ -83,18 +83,21 @@ struct trusted_key_source {
|
|||
|
||||
extern struct key_type key_type_trusted;
|
||||
|
||||
#define TRUSTED_DEBUG 0
|
||||
#ifdef CONFIG_TRUSTED_KEYS_DEBUG
|
||||
extern bool trusted_debug;
|
||||
|
||||
#if TRUSTED_DEBUG
|
||||
static inline void dump_payload(struct trusted_key_payload *p)
|
||||
{
|
||||
pr_info("key_len %d\n", p->key_len);
|
||||
print_hex_dump(KERN_INFO, "key ", DUMP_PREFIX_NONE,
|
||||
16, 1, p->key, p->key_len, 0);
|
||||
pr_info("bloblen %d\n", p->blob_len);
|
||||
print_hex_dump(KERN_INFO, "blob ", DUMP_PREFIX_NONE,
|
||||
16, 1, p->blob, p->blob_len, 0);
|
||||
pr_info("migratable %d\n", p->migratable);
|
||||
if (!trusted_debug)
|
||||
return;
|
||||
|
||||
pr_debug("key_len %d\n", p->key_len);
|
||||
print_hex_dump_debug("key ", DUMP_PREFIX_NONE,
|
||||
16, 1, p->key, p->key_len, 0);
|
||||
pr_debug("bloblen %d\n", p->blob_len);
|
||||
print_hex_dump_debug("blob ", DUMP_PREFIX_NONE,
|
||||
16, 1, p->blob, p->blob_len, 0);
|
||||
pr_debug("migratable %d\n", p->migratable);
|
||||
}
|
||||
#else
|
||||
static inline void dump_payload(struct trusted_key_payload *p)
|
||||
|
|
|
|||
|
|
@ -1,10 +1,29 @@
|
|||
config HAVE_TRUSTED_KEYS
|
||||
bool
|
||||
|
||||
config HAVE_TRUSTED_KEYS_DEBUG
|
||||
bool
|
||||
|
||||
config TRUSTED_KEYS_DEBUG
|
||||
bool "Debug trusted keys"
|
||||
depends on HAVE_TRUSTED_KEYS_DEBUG
|
||||
default n
|
||||
help
|
||||
Trusted key backends and core code that support debug traces can
|
||||
opt-in that feature here. Traces must only use debug level output, as
|
||||
sensitive data may pass by. In the kernel-command line traces can be
|
||||
enabled via trusted.dyndbg='+p'.
|
||||
|
||||
SAFETY: Debug dumps are inactive at runtime until trusted.debug is set
|
||||
to a true value on the kernel command-line. Use at your utmost
|
||||
consideration when enabling this feature on a production build. The
|
||||
general advice is not to do this.
|
||||
|
||||
config TRUSTED_KEYS_TPM
|
||||
bool "TPM-based trusted keys"
|
||||
depends on TCG_TPM >= TRUSTED_KEYS
|
||||
default y
|
||||
select HAVE_TRUSTED_KEYS_DEBUG
|
||||
select CRYPTO_HASH_INFO
|
||||
select CRYPTO_LIB_SHA1
|
||||
select CRYPTO_LIB_UTILS
|
||||
|
|
@ -23,6 +42,7 @@ config TRUSTED_KEYS_TEE
|
|||
bool "TEE-based trusted keys"
|
||||
depends on TEE >= TRUSTED_KEYS
|
||||
default y
|
||||
select HAVE_TRUSTED_KEYS_DEBUG
|
||||
select HAVE_TRUSTED_KEYS
|
||||
help
|
||||
Enable use of the Trusted Execution Environment (TEE) as trusted
|
||||
|
|
@ -33,6 +53,7 @@ config TRUSTED_KEYS_CAAM
|
|||
depends on CRYPTO_DEV_FSL_CAAM_JR >= TRUSTED_KEYS
|
||||
select CRYPTO_DEV_FSL_CAAM_BLOB_GEN
|
||||
default y
|
||||
select HAVE_TRUSTED_KEYS_DEBUG
|
||||
select HAVE_TRUSTED_KEYS
|
||||
help
|
||||
Enable use of NXP's Cryptographic Accelerator and Assurance Module
|
||||
|
|
@ -42,6 +63,7 @@ config TRUSTED_KEYS_DCP
|
|||
bool "DCP-based trusted keys"
|
||||
depends on CRYPTO_DEV_MXS_DCP >= TRUSTED_KEYS
|
||||
default y
|
||||
select HAVE_TRUSTED_KEYS_DEBUG
|
||||
select HAVE_TRUSTED_KEYS
|
||||
help
|
||||
Enable use of NXP's DCP (Data Co-Processor) as trusted key backend.
|
||||
|
|
@ -50,6 +72,7 @@ config TRUSTED_KEYS_PKWM
|
|||
bool "PKWM-based trusted keys"
|
||||
depends on PSERIES_PLPKS >= TRUSTED_KEYS
|
||||
default y
|
||||
select HAVE_TRUSTED_KEYS_DEBUG
|
||||
select HAVE_TRUSTED_KEYS
|
||||
help
|
||||
Enable use of IBM PowerVM Key Wrapping Module (PKWM) as a trusted key backend.
|
||||
|
|
|
|||
|
|
@ -28,10 +28,13 @@ static const match_table_t key_tokens = {
|
|||
{opt_err, NULL}
|
||||
};
|
||||
|
||||
#ifdef CAAM_DEBUG
|
||||
#ifdef CONFIG_TRUSTED_KEYS_DEBUG
|
||||
static inline void dump_options(const struct caam_pkey_info *pkey_info)
|
||||
{
|
||||
pr_info("key encryption algo %d\n", pkey_info->key_enc_algo);
|
||||
if (!trusted_debug)
|
||||
return;
|
||||
|
||||
pr_debug("key encryption algo %d\n", pkey_info->key_enc_algo);
|
||||
}
|
||||
#else
|
||||
static inline void dump_options(const struct caam_pkey_info *pkey_info)
|
||||
|
|
|
|||
|
|
@ -31,6 +31,12 @@ static char *trusted_rng = "default";
|
|||
module_param_named(rng, trusted_rng, charp, 0);
|
||||
MODULE_PARM_DESC(rng, "Select trusted key RNG");
|
||||
|
||||
#ifdef CONFIG_TRUSTED_KEYS_DEBUG
|
||||
bool trusted_debug;
|
||||
module_param_named(debug, trusted_debug, bool, 0);
|
||||
MODULE_PARM_DESC(debug, "Enable trusted keys debug traces (default: 0)");
|
||||
#endif
|
||||
|
||||
static char *trusted_key_source;
|
||||
module_param_named(source, trusted_key_source, charp, 0);
|
||||
MODULE_PARM_DESC(source, "Select trusted keys source (tpm, tee, caam, dcp or pkwm)");
|
||||
|
|
|
|||
|
|
@ -46,38 +46,44 @@ enum {
|
|||
SRK_keytype = 4
|
||||
};
|
||||
|
||||
#define TPM_DEBUG 0
|
||||
|
||||
#if TPM_DEBUG
|
||||
#ifdef CONFIG_TRUSTED_KEYS_DEBUG
|
||||
static inline void dump_options(struct trusted_key_options *o)
|
||||
{
|
||||
pr_info("sealing key type %d\n", o->keytype);
|
||||
pr_info("sealing key handle %0X\n", o->keyhandle);
|
||||
pr_info("pcrlock %d\n", o->pcrlock);
|
||||
pr_info("pcrinfo %d\n", o->pcrinfo_len);
|
||||
print_hex_dump(KERN_INFO, "pcrinfo ", DUMP_PREFIX_NONE,
|
||||
16, 1, o->pcrinfo, o->pcrinfo_len, 0);
|
||||
if (!trusted_debug)
|
||||
return;
|
||||
|
||||
pr_debug("sealing key type %d\n", o->keytype);
|
||||
pr_debug("sealing key handle %0X\n", o->keyhandle);
|
||||
pr_debug("pcrlock %d\n", o->pcrlock);
|
||||
pr_debug("pcrinfo %d\n", o->pcrinfo_len);
|
||||
print_hex_dump_debug("pcrinfo ", DUMP_PREFIX_NONE,
|
||||
16, 1, o->pcrinfo, o->pcrinfo_len, 0);
|
||||
}
|
||||
|
||||
static inline void dump_sess(struct osapsess *s)
|
||||
{
|
||||
print_hex_dump(KERN_INFO, "trusted-key: handle ", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->handle, 4, 0);
|
||||
pr_info("secret:\n");
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->secret, SHA1_DIGEST_SIZE, 0);
|
||||
pr_info("trusted-key: enonce:\n");
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->enonce, SHA1_DIGEST_SIZE, 0);
|
||||
if (!trusted_debug)
|
||||
return;
|
||||
|
||||
print_hex_dump_debug("trusted-key: handle ", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->handle, 4, 0);
|
||||
pr_debug("secret:\n");
|
||||
print_hex_dump_debug("", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->secret, SHA1_DIGEST_SIZE, 0);
|
||||
pr_debug("trusted-key: enonce:\n");
|
||||
print_hex_dump_debug("", DUMP_PREFIX_NONE,
|
||||
16, 1, &s->enonce, SHA1_DIGEST_SIZE, 0);
|
||||
}
|
||||
|
||||
static inline void dump_tpm_buf(unsigned char *buf)
|
||||
{
|
||||
int len;
|
||||
|
||||
pr_info("\ntpm buffer\n");
|
||||
if (!trusted_debug)
|
||||
return;
|
||||
pr_debug("\ntpm buffer\n");
|
||||
len = LOAD32(buf, TPM_SIZE_OFFSET);
|
||||
print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1, buf, len, 0);
|
||||
print_hex_dump_debug("", DUMP_PREFIX_NONE, 16, 1, buf, len, 0);
|
||||
}
|
||||
#else
|
||||
static inline void dump_options(struct trusted_key_options *o)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user