[Skiboot] [PATCH 02/19] hdata/spira: add ibm, secureboot node in P9
Oliver
oohall at gmail.com
Tue Nov 21 15:24:09 AEDT 2017
On Sun, Nov 12, 2017 at 4:28 AM, Claudio Carvalho
<cclaudio at linux.vnet.ibm.com> wrote:
> In P9, skiboot builds the device tree from the HDAT. These are the
> "ibm,secureboot" node changes compared to P8:
>
> - The Container-Verification-Code (CVC), a.k.a. ROM code, is no longer
> stored in a secure ROM with static address. In P9, it is stored in a
> hostboot reserved memory and each service provided also has a version,
> not only an offset.
>
> - The hash-algo property is not provided via HDAT, instead it provides
> the hw-key-hash-size, which is indeed the information required by the
> CVC to verify containers.
>
> Although the CVC location has changed and the hash-algo is not provided
> in the HDAT, the "ibm,secureboot" compatible property doesn't need to be
> bumped to "ibm,secureboot-v2" in P9. For now we can initialize the CVC
> early during the HDAT parsing and emulate the hash-algo from the
> hw-key-hash-size. The "ibm,secureboot" node update can be postponed,
> even because currently only skiboot consumes it.
>
> This parses the iplparams_sysparams HDAT structure and creates the
> "ibm,secureboot" in P9.
>
> Signed-off-by: Claudio Carvalho <cclaudio at linux.vnet.ibm.com>
> ---
> hdata/spira.c | 39 +++++++++++++++++++++++++++++++++++++++
> hdata/spira.h | 14 ++++++++------
> 2 files changed, 47 insertions(+), 6 deletions(-)
>
> diff --git a/hdata/spira.c b/hdata/spira.c
> index 936fadc..33926ed 100644
> --- a/hdata/spira.c
> +++ b/hdata/spira.c
> @@ -933,6 +933,42 @@ static void add_nmmu(void)
> }
> }
>
> +static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams)
> +{
> + struct dt_node *node;
> + u16 sys_sec_setting;
> + u16 hw_key_hash_size;
> +
> + node = dt_new(dt_root, "ibm,secureboot");
> + assert(node);
> +
> + dt_add_property_string(node, "compatible", "ibm,secureboot-v1");
> +
> + sys_sec_setting = be16_to_cpu(sysparams->sys_sec_setting);
> + if (sys_sec_setting & SEC_CONTAINER_SIG_CHECKING)
> + dt_add_property(node, "secure-enabled", NULL, 0);
> + if (sys_sec_setting & SEC_HASHES_EXTENDED_TO_TPM)
> + dt_add_property(node, "trusted-enabled", NULL, 0);
> +
> + hw_key_hash_size = be16_to_cpu(sysparams->hw_key_hash_size);
> +
> + /*
> + * FIXME: replace hash-algo by the hw-key-hash-size property when
> + * compatible is bumped to ibm,secureboot-v2
> + */
> + if (hw_key_hash_size == 64) {
> + dt_add_property_string(node, "hash-algo", "sha512");
> + dt_add_property(node, "hw-key-hash", sysparams->hw_key_hash,
> + hw_key_hash_size);
> + } else {
> + prlog(PR_ERR, "TPMREL: hw_key_hash_size=%d not supported\n",
> + hw_key_hash_size);
Hmm... If we're booting in secure mode and can't support it then
booting anyway might not be the best idea. See what stewart thinks.
> + }
> +
> + if (be16_to_cpu(sysparams->sys_attributes) & SYS_ATTR_MULTIPLE_TPM)
> + prlog(PR_WARNING, "Multiple TPM set, but not supported\n");
What does the multiple TPM bit being set actually mean? And in the
case where we have multiple TPMs which one do we use?
> +}
> +
> static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
> {
> const struct iplparams_sysparams *p;
> @@ -1019,6 +1055,9 @@ static void add_iplparams_sys_params(const void *iplp, struct dt_node *node)
> sys_attributes = be32_to_cpu(p->sys_attributes);
> if (sys_attributes & SYS_ATTR_RISK_LEVEL)
> dt_add_property(node, "elevated-risk-level", NULL, 0);
> +
> + if (version >= 0x60)
> + dt_init_secureboot_node(p);
> }
>
> static void add_iplparams_ipl_params(const void *iplp, struct dt_node *node)
> diff --git a/hdata/spira.h b/hdata/spira.h
> index 190afad..a9f1313 100644
> --- a/hdata/spira.h
> +++ b/hdata/spira.h
> @@ -355,6 +355,7 @@ struct iplparams_sysparams {
> __be32 abc_bus_speed;
> __be32 wxyz_bus_speed;
> __be32 sys_eco_mode;
> +#define SYS_ATTR_MULTIPLE_TPM PPC_BIT32(0)
> #define SYS_ATTR_RISK_LEVEL PPC_BIT32(3)
> __be32 sys_attributes;
> __be32 mem_scrubbing;
> @@ -369,12 +370,13 @@ struct iplparams_sysparams {
> uint8_t split_core_mode; /* >= 0x5c */
> uint8_t reserved[3];
> uint8_t sys_vendor[64]; /* >= 0x5f */
> - /* >= 0x60 */
> - __be16 sys_sec_setting;
> - __be16 tpm_config_bit;
> - __be16 tpm_drawer;
> - __be16 reserved2;
> - uint8_t hw_key_hash[64];
> +#define SEC_CONTAINER_SIG_CHECKING PPC_BIT16(0)
> +#define SEC_HASHES_EXTENDED_TO_TPM PPC_BIT16(1)
> + __be16 sys_sec_setting; /* >= 0x60 */
> + __be16 tpm_config_bit; /* >= 0x60 */
> + __be16 tpm_drawer; /* >= 0x60 */
> + __be16 hw_key_hash_size; /* >= 0x60 */
> + uint8_t hw_key_hash[64]; /* >= 0x60 */
> uint8_t sys_family_str[64]; /* vendor,name */
> uint8_t sys_type_str[64]; /* vendor,type */
> } __packed;
> --
> 2.7.4
>
Quibbles aside,
Reviewed-by: Oliver O'Halloran <oohall at gmail.com>
More information about the Skiboot
mailing list