SBL Build and Sign

SBL build process uses a signing interface. This signing method can access required keys from any accessible location based on an id. A sample implementation of signing service is provided by SingleSign.py and is invoked during SBL build process. Customers may use different signing infrastructure including use of secure signing servers, etc. and the SingleSign.py can be updated/replaced with customer’s signing infrastructure.

Key Management

Cryptographic keys used for signing SBL binaries should be securely managed. A leak of private key would allow a hacker to install/push compromised SBL or rootkits on platforms. Here is a link to link to NIST whitepaper which provides BKM’s for Code signing and secure key management.

Below is a list of Security keys and their function in securing SBL.

Key Name Owner Usage Comment
OEM Key Platform Owner To sign BootGuard Key Manifest.  
BPM Key Firmware Owner To sign BootGuard Boot Policy Manifest.  
ConfigData Key Firmware Owner To sign Config Data blob. Use CfgDataTool.py
Master Key Firmware Owner To sign SBL Key Manifest.  
Container Def Key Firmware Owner To sign container header. Use GenContainer.py to package various components
Container Component Key Container Owner To sign container components, such as, UEFI Payload,PSE fw etc  
OS Key OS Owner Hash of it’s public key is stored in SBL Key Manifest. Use GenContainer.py to package a OS binary.
Firmware Update Capsule Key Firmware Owner To sign capsule images. Use GenCapsuleFirmware.py

KEY ID and configurations

A unique key id would be associated for each private key corresponding to a component to be signed.

Table below depicts key id’s defined for components and their associated test keys for various key types used for signing components.

KEY ID KEY Usage
KEY_ID_MASTER_RSA2048 MasterTestKey_Priv_RSA2048.pem Signing external key hash store
KEY_ID_MASTER_RSA3072 MasterTestKey_Priv_RSA3072.pem Signing external key hash store
KEY_ID_CFGDATA_RSA2048 ConfigTestKey_Priv_RSA2048.pem Signing CfgData
KEY_ID_CFGDATA_RSA3072 ConfigTestKey_Priv_RSA3072.pem Signing CfgData
KEY_ID_FIRMWAREUPDATE_RSA2048 FirmwareUpdateTestKey_Priv_RSA2048.pem Signing firmware capsule update
KEY_ID_FIRMWAREUPDATE_RSA3072 FirmwareUpdateTestKey_Priv_RSA3072.pem Signing firmware capsule update
KEY_ID_CONTAINER_RSA2048 ContainerTestKey_Priv_RSA2048.pem Signing Container header
KEY_ID_CONTAINER_RSA3072 ContainerTestKey_Priv_RSA3072.pem Signing Container header
KEY_ID_CONTAINER_COMP_RSA2048 ContainerCompTestKey_Priv_RSA2048.pem Signing Container component
KEY_ID_CONTAINER_COMP_RSA3072 ContainerCompTestKey_Priv_RSA3072.pem Signing Container componentm
KEY_ID_OS1_PUBLIC_RSA2048 OS1_TestKey_Pub_RSA3072.pem Public key used to sign Linux OS image
KEY_ID_OS1_PUBLIC_RSA3072 OS1_TestKey_Pub_RSA3072.pem Public key used to sign Linux OS image

One could use either key id or complete path to signing keys while configuring in build scripts.

Note

Signing tools support either KEY_ID corresponding to a component or complete path to private key.

Keys Generation

Keys required for SBL can be generated using GenerateKeys.py available at BootloaderCorePkg/Tools/. The key generation process is a one time process for specific project. Use same set of keys for signing and verification operations for a specific project when generating firmware capsule update image, cfgdata stitch, Container image and others. Verification operations would fail incase different keys are used which causes security violations.

Usage of GenerateKeys.py tool see SBL Keys Generation

Build Environment Configuration for Key ID usage

Key directory to be used can be specified using an environment variable.

Set env variable “SBL_KEY_DIR” to keys directory generated using GenerateKeys.py or similar methods. This env variable need to be to set before running SBL build command. Also, set environment variable before executing tools in standalone mode as Capsule firmware update, container operations, cfgdata stitching and others when KEY ID are used.

For environment setting see Build SBL

Note

Use respective component keys from SblKey directory while performing standalone operations as Capsule firmware update, container operations, cfgdata stitching.