mirror of https://github.com/wolfSSL/wolfBoot.git
8.2 KiB
8.2 KiB
TPM Integration Guide
This guide describes wolfBoot's integration with Trusted Platform Module (TPM) for enhanced security features.
Features Overview
- Root of Trust (RoT) using TPM
- Cryptographic operation offloading
- Measured boot support
- Secure sealing/unsealing of secrets
- PCR-based policy enforcement
Configuration Options
Core TPM Support
Option | Macro | Description |
---|---|---|
WOLFTPM=1 |
WOLFBOOT_TPM |
Enable TPM integration |
Cryptographic Features
Option | Macro | Description |
---|---|---|
WOLFBOOT_TPM_VERIFY=1 |
WOLFBOOT_TPM_VERIFY |
Offload RSA2048/ECC256/384 to TPM |
WOLFBOOT_TPM_KEYSTORE=1 |
WOLFBOOT_TPM_KEYSTORE |
Enable TPM-based root of trust |
Storage Configuration
Option | Macro | Description |
---|---|---|
WOLFBOOT_TPM_KEYSTORE_NV_BASE=0x |
Same | NV index (0x1400000-0x17FFFFF) |
WOLFBOOT_TPM_KEYSTORE_AUTH=secret |
Same | NV access password |
WOLFBOOT_TPM_SEAL_NV_BASE=0x01400300 |
Same | Sealed blob storage location |
WOLFBOOT_TPM_SEAL_AUTH=secret |
Same | Sealing/unsealing password |
Measured Boot
Option | Macro | Description |
---|---|---|
MEASURED_BOOT=1 |
WOLFBOOT_MEASURED_BOOT |
Enable PCR measurements |
MEASURED_PCR_A=16 |
WOLFBOOT_MEASURED_PCR_A=16 |
PCR index selection |
WOLFBOOT_TPM_SEAL=1 |
WOLFBOOT_TPM_SEAL |
Enable PCR-based sealing |
For detailed measured boot information, see measured_boot.md
Feature Details
Root of Trust (RoT)
Implements secure boot chain using TPM-based key verification.
Implementation:
- Uses locked platform NV handle
- Stores public key hash
- Requires authentication for tampering prevention
- Authentication encrypted during transit
Example: See wolfTPM RoT Example
Cryptographic Offloading
Delegates cryptographic operations to TPM hardware.
Supported Operations:
- RSA2048 verification
- ECC256/384 verification
Notes:
- Reduces code size
- Improves performance
- Requires
WOLFBOOT_TPM_VERIFY
- Use
SIGN=RSA2048ENC
for ASN.1 encoding
Measured Boot
Tracks boot process integrity using PCR measurements.
Features:
- Hashes wolfBoot image
- Extends PCR with hash
- Verifiable boot attestation
- API:
wolfBoot_tpm2_extend
Secret Management
Sealing/Unsealing API
// Seal data with policy and authentication
int wolfBoot_seal_auth(
const uint8_t* pubkey_hint, // Public key reference
const uint8_t* policy, // Policy data
uint16_t policySz, // Policy size
int index, // NV index
const uint8_t* secret, // Data to seal
int secret_sz, // Data size
const byte* auth, // Authentication
int authSz // Auth size
);
// Unseal previously sealed data
int wolfBoot_unseal_auth(
const uint8_t* pubkey_hint, // Public key reference
const uint8_t* policy, // Policy data
uint16_t policySz, // Policy size
int index, // NV index
uint8_t* secret, // Buffer for unsealed data
int* secret_sz, // Buffer size
const byte* auth, // Authentication
int authSz // Auth size
);
Storage Location:
- Default:
0x01400300 + index
- Configurable via
WOLFBOOT_TPM_SEAL_NV_BASE
For implementation examples, see wolfTPM Sealing Example
NOTE: The TPM's RSA verify requires ASN.1 encoding, so use SIGN=RSA2048ENC
Testing Guide
Simulator Testing
Setup and Configuration
# 1. Copy TPM simulator config
cp config/examples/sim-tpm-seal.config .config
# 2. Build required tools
make keytools
make tpmtools
# 3. Create test files
echo aaa > aaa.bin
echo bbb > bbb.bin
# 4. Configure PCR values
./tools/tpm/pcr_extend 0 aaa.bin
./tools/tpm/pcr_extend 1 bbb.bin
# 5. Create policy (PCR 1 then 0)
./tools/tpm/policy_create -pcr=1 -pcr=0 -out=policy.bin
# 6. Setup Root of Trust (optional)
./tools/tpm/rot -write [-auth=TestAuth]
# 7. Build with policy
make clean
make POLICY_FILE=policy.bin \
[WOLFBOOT_TPM_KEYSTORE_AUTH=TestAuth] \
[WOLFBOOT_TPM_SEAL_AUTH=SealAuth]
Testing Sequence
# First Run - Initial Secret Creation
./wolfboot.elf get_version
Expected Output:
Mfg IBM (0), Vendor SW TPM, Fw 8228.293 (0x120000)...
Unlocking disk...
Error 395 reading blob... (First run expected error)
Creating new secret (32 bytes)
7801a7fb716371c975a9a1bca6159a223bc7dba6adb2acf82781421062e498a5
Wrote 242 bytes to NV index 0x1400300
TPM Root of Trust valid (id 0)
Subsequent Runs:
./wolfboot.elf get_version
Expected Output:
Unlocking disk...
Read 242 bytes from NV index 0x1400300
Secret 32 bytes
7801a7fb716371c975a9a1bca6159a223bc7dba6adb2acf82781421062e498a5
TPM Root of Trust valid (id 0)
### Hardware Testing
#### Policy Generation Process
1. Build Tools and Setup
```bash
make tpmtools
./tools/tpm/rot -write
./tools/tpm/pcr_reset 16
- Generate Initial Policy
./wolfboot.elf get_version
Expected Output:
Policy header not found!
Generating policy based on active PCR's!
Getting active PCR's (0-16)
PCR 16 (counter 20)
8f7ac1d5a5eac58a2305ca459f27c35705a9212c0fb2a9088b1df761f3d5f842
Found 1 active PCR's (mask 0x00010000)
PCR Digest:
f84085631f85333ad0338b06c82f16888b7923abaccffb881d5416e389be256c
PCR Policy:
0000010034ba061436aba2e9a167a1ee46af4a9578a8c6b9f71fdece21607a0cb40468ec
Policy Creation Methods
- Direct Method
# Convert hex policy to binary
echo "0000010034ba061436aba2e9a167a1ee46af4a9578a8c6b9f71fdece21607a0cb40468ec" | \
xxd -r -p > policy.bin
- Using Policy Creation Tool
# Method A: Specify PCR Index
./tools/tpm/policy_create \
-pcr=16 \
-pcrdigest=f84085631f85333ad0338b06c82f16888b7923abaccffb881d5416e389be256c \
-out=policy.bin
# Method B: Specify PCR Mask
./tools/tpm/policy_create \
-pcrmask=0x00010000 \
-pcrdigest=f84085631f85333ad0338b06c82f16888b7923abaccffb881d5416e389be256c \
-out=policy.bin
Tool Output:
Policy Create Tool
PCR Index(s) (SHA256): 16 (mask 0x00010000)
PCR Digest (32 bytes):
f84085631f85333ad0338b06c82f16888b7923abaccffb881d5416e389be256c
PCR Policy (36 bytes):
0000010034ba061436aba2e9a167a1ee46af4a9578a8c6b9f71fdece21607a0cb40468ec
Wrote 36 bytes to policy.bin
Policy Signing
Two methods are available for signing the policy:
- Simple Build Method
make POLICY_FILE=policy.bin
- Manual Signing Tools Both tools below sign policy digest without TPM access:
tools/tpm/policy_sign
tools/keytools/sign
Using Policy Sign Tool
./tools/tpm/policy_sign \
-pcr=0 \
-pcrdigest=eca4e8eda468b8667244ae972b8240d3244ea72341b2bf2383e79c66643bbecc
Output Details:
Sign PCR Policy Tool
Signing Algorithm: ECC256
PCR Index(s): 0
Key: wolfboot_signing_private_key.der
Digests:
1. PCR Digest (32 bytes):
eca4e8eda468b8667244ae972b8240d3244ea72341b2bf2383e79c66643bbecc
2. Policy Digest (32 bytes):
2d401eb05f45ba2b15c35f628b5896cc7de9745bb6e722363e2dbee804e0500f
3. Policy Digest w/Ref (32 bytes):
749b3139ece21449a7828f11ee05303b0473ff1a26cf41d6f9ff28b24c717f02
Output:
PCR Mask (0x1) + Signature (68 bytes total):
01000000
5b5f875b3f7ce78b5935abe4fc5a4d8a6e87c4b4ac0836fbab909e232b6d7ca2
3ecfc6be723b695b951ba2886d3c7b83ab2f8cc0e96d766bc84276eaf3f213ee
File: policy.bin.sig (68 bytes written)
Using Signing Key Tool
./tools/keytools/sign \
--ecc256 \
--policy policy.bin \
test-app/image.elf \
wolfboot_signing_private_key.der 1
Process Details:
wolfBoot KeyTools v1100000
Configuration:
- Update Type: Firmware
- Input: test-app/image.elf
- Cipher: ECC256
- Hash: SHA256
- Key: wolfboot_signing_private_key.der
- Output: test-app/image_v1_signed.bin
- Partition: 1
- Header Size: 256 bytes (runtime calculated)
Steps:
1. Calculate SHA256 digest
2. Sign digest
3. Process policy file
4. Sign policy digest
5. Save policy signature
6. Generate final image