mirror of https://github.com/wolfSSL/wolfBoot.git
fsp: tpm: support policy stored in the flash
parent
bf426fb2b4
commit
2c4df2866b
|
@ -8,6 +8,7 @@ FSP_M_ORIGIN = @FSP_M_BASE@; /* default base:size 0xfffdd000:0x22000 [0xfffdd000
|
||||||
FSP_S_ORIGIN = @FSP_S_BASE@; /* default base:size 0xfffc8000:0x15000 [0xfffdd000:0xfffdd000] */
|
FSP_S_ORIGIN = @FSP_S_BASE@; /* default base:size 0xfffc8000:0x15000 [0xfffdd000:0xfffdd000] */
|
||||||
WOLFBOOT_ORIGIN = @WOLFBOOT_ORIGIN@;
|
WOLFBOOT_ORIGIN = @WOLFBOOT_ORIGIN@;
|
||||||
DATA_MEM_START = 0x800000; /* 8 MB */
|
DATA_MEM_START = 0x800000; /* 8 MB */
|
||||||
|
MAX_POLICY_SIZE = 512;
|
||||||
|
|
||||||
OUTPUT_FORMAT(elf32-i386)
|
OUTPUT_FORMAT(elf32-i386)
|
||||||
|
|
||||||
|
@ -19,21 +20,41 @@ MEMORY
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
|
.wolfboot FLASH_START :
|
||||||
|
{
|
||||||
|
_wolfboot_flash_start = .;
|
||||||
|
KEEP(*(.sig_wolfboot_raw*))
|
||||||
|
*(.wolfboot)
|
||||||
|
_wolfboot_flash_end = .;
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
.policy :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_policy_size_u32 = .;
|
||||||
|
. += 4;
|
||||||
|
_start_policy = .;
|
||||||
|
. += MAX_POLICY_SIZE;
|
||||||
|
_end_policy = .;
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
|
.keystore KEYSTORE_START :
|
||||||
|
{
|
||||||
|
_start_keystore = .;
|
||||||
|
*(.keystore*)
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
.jmpto32 BOOTLOADER_JUMP32_START :
|
.jmpto32 BOOTLOADER_JUMP32_START :
|
||||||
{
|
{
|
||||||
_off_boot = ABSOLUTE(.) & 0xffff;
|
_off_boot = ABSOLUTE(.) & 0xffff;
|
||||||
KEEP(*(.jmpto32))
|
KEEP(*(.jmpto32))
|
||||||
} > FLASH
|
} > FLASH
|
||||||
|
|
||||||
.reset_vector RESETVECTOR_START :
|
.reset_vector RESETVECTOR_START :
|
||||||
{
|
{
|
||||||
KEEP(*(.reset_vector))
|
KEEP(*(.reset_vector))
|
||||||
} > FLASH
|
} > FLASH
|
||||||
|
|
||||||
.keystore KEYSTORE_START :
|
|
||||||
{
|
|
||||||
*(.keystore*)
|
|
||||||
} > FLASH
|
|
||||||
|
|
||||||
.bootloader WOLFBOOT_ORIGIN :
|
.bootloader WOLFBOOT_ORIGIN :
|
||||||
{
|
{
|
||||||
KEEP(*(.boot*))
|
KEEP(*(.boot*))
|
||||||
|
@ -65,14 +86,6 @@ SECTIONS
|
||||||
_end = .;
|
_end = .;
|
||||||
} > RAM
|
} > RAM
|
||||||
|
|
||||||
.wolfboot FLASH_START :
|
|
||||||
{
|
|
||||||
_wolfboot_flash_start = .;
|
|
||||||
KEEP(*(.sig_wolfboot_raw*))
|
|
||||||
*(.wolfboot)
|
|
||||||
_wolfboot_flash_end = .;
|
|
||||||
}
|
|
||||||
|
|
||||||
.fsp_t FSP_T_ORIGIN :
|
.fsp_t FSP_T_ORIGIN :
|
||||||
AT(FSP_T_ORIGIN)
|
AT(FSP_T_ORIGIN)
|
||||||
{
|
{
|
||||||
|
@ -95,7 +108,4 @@ SECTIONS
|
||||||
*(.fsp_m)
|
*(.fsp_m)
|
||||||
_end_fsp_m = .;
|
_end_fsp_m = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ FIT_TABLE_PTR = 0xffffffc0;
|
||||||
RESETVECTOR_START = 0xffffffec;
|
RESETVECTOR_START = 0xffffffec;
|
||||||
DATA_MEM_START = 0x800000; /* 8 MB */
|
DATA_MEM_START = 0x800000; /* 8 MB */
|
||||||
KEYSTORE_START = 0xffffe000;
|
KEYSTORE_START = 0xffffe000;
|
||||||
|
MAX_POLICY_SIZE = 512;
|
||||||
|
|
||||||
OUTPUT_FORMAT(elf32-i386)
|
OUTPUT_FORMAT(elf32-i386)
|
||||||
|
|
||||||
|
@ -31,6 +32,16 @@ SECTIONS
|
||||||
_wolfboot_flash_end = .;
|
_wolfboot_flash_end = .;
|
||||||
} > FLASH
|
} > FLASH
|
||||||
|
|
||||||
|
.policy :
|
||||||
|
{
|
||||||
|
. = ALIGN(4);
|
||||||
|
_policy_size_u32 = .;
|
||||||
|
. += 4;
|
||||||
|
_start_policy = .;
|
||||||
|
. += MAX_POLICY_SIZE;
|
||||||
|
_end_policy = .;
|
||||||
|
} > FLASH
|
||||||
|
|
||||||
.fsps_upd FSP_S_UPD_DATA_BASE :
|
.fsps_upd FSP_S_UPD_DATA_BASE :
|
||||||
{
|
{
|
||||||
KEEP(./fsp_tgl_s_upd.o(.fsps_upd))
|
KEEP(./fsp_tgl_s_upd.o(.fsps_upd))
|
||||||
|
|
|
@ -28,10 +28,18 @@ struct stage2_parameter {
|
||||||
uint32_t hobList;
|
uint32_t hobList;
|
||||||
uint32_t page_table;
|
uint32_t page_table;
|
||||||
uint32_t tolum;
|
uint32_t tolum;
|
||||||
|
#ifdef WOLFBOOT_TPM_SEAL
|
||||||
|
uint32_t tpm_policy;
|
||||||
|
uint16_t tpm_policy_size;
|
||||||
#endif
|
#endif
|
||||||
};
|
#endif
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
/* implemented in src/boot_x86_fsp_payload.c */
|
/* implemented in src/boot_x86_fsp_payload.c */
|
||||||
struct stage2_parameter *stage2_get_parameters();
|
struct stage2_parameter *stage2_get_parameters();
|
||||||
|
|
||||||
|
#if defined(WOLFBOOT_TPM_SEAL)
|
||||||
|
int stage2_get_tpm_policy(const uint8_t **policy, uint16_t *policy_size);
|
||||||
|
#endif /* defined(WOLFBOOT_TPM_SEAL) */
|
||||||
|
|
||||||
#endif /* STAGE1_H */
|
#endif /* STAGE1_H */
|
||||||
|
|
|
@ -105,6 +105,9 @@ extern uint8_t _wolfboot_flash_end[];
|
||||||
extern uint8_t wb_end_bss[], wb_start_bss[];
|
extern uint8_t wb_end_bss[], wb_start_bss[];
|
||||||
extern uint8_t _stored_data[], _start_data[], _end_data[];
|
extern uint8_t _stored_data[], _start_data[], _end_data[];
|
||||||
extern uint8_t _start_bss[], _end_bss[];
|
extern uint8_t _start_bss[], _end_bss[];
|
||||||
|
extern const uint8_t _start_policy[], _end_policy[];
|
||||||
|
extern const uint32_t _policy_size_u32[];
|
||||||
|
extern const uint8_t _start_keystore[];
|
||||||
|
|
||||||
/* wolfboot symbols */
|
/* wolfboot symbols */
|
||||||
extern int main(void);
|
extern int main(void);
|
||||||
|
@ -560,6 +563,16 @@ void start(uint32_t stack_base, uint32_t stack_top, uint64_t timestamp,
|
||||||
|
|
||||||
stage2_params->tolum = top_address;
|
stage2_params->tolum = top_address;
|
||||||
|
|
||||||
|
#ifdef WOLFBOOT_TPM_SEAL
|
||||||
|
stage2_params->tpm_policy = (uint32_t)_start_policy;
|
||||||
|
|
||||||
|
stage2_params->tpm_policy_size = *_policy_size_u32;
|
||||||
|
if (stage2_params->tpm_policy_size > _end_policy - _start_policy)
|
||||||
|
stage2_params->tpm_policy_size = 0;
|
||||||
|
wolfBoot_printf("setting policy @%x (%d bytes)\r\n",
|
||||||
|
(uint32_t)(uintptr_t)stage2_params->tpm_policy,
|
||||||
|
stage2_params->tpm_policy_size);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* change_stack_and_invoke() never returns.
|
/* change_stack_and_invoke() never returns.
|
||||||
*
|
*
|
||||||
|
|
|
@ -90,6 +90,21 @@ struct stage2_parameter *stage2_get_parameters()
|
||||||
return &_stage2_params;
|
return &_stage2_params;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(WOLFBOOT_TPM_SEAL)
|
||||||
|
int stage2_get_tpm_policy(const uint8_t **policy, uint16_t *policy_sz)
|
||||||
|
{
|
||||||
|
#if defined(WOLFBOOT_FSP) && !defined(BUILD_LOADER_STAGE1)
|
||||||
|
struct stage2_parameter *p;
|
||||||
|
p = stage2_get_parameters();
|
||||||
|
*policy = (const uint8_t*)(uintptr_t)p->tpm_policy;
|
||||||
|
*policy_sz = p->tpm_policy_size;
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
#error "wolfBoot_get_tpm_policy is not implemented"
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
#endif /* WOLFBOOT_TPM_SEAL */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Perform the boot process for the given application.
|
* @brief Perform the boot process for the given application.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# variable IMAGE_FILE should be wolfboot_stage1.bin if not defined
|
||||||
|
IMAGE_FILE=${IMAGE_FILE:-"wolfboot_stage1.bin"}
|
||||||
|
|
||||||
|
# take POLICY_FILE FROM ARGUMENT 1
|
||||||
|
POLICY_FILE="$1"
|
||||||
|
POLICY_SZ=$(wc -c < "$POLICY_FILE")
|
||||||
|
|
||||||
|
# grep stage1/loader_stage1.map for the address of the symbol _start_policy and save in the variable POLICY_START
|
||||||
|
POLICY_START=$(grep "_start_policy" stage1/loader_stage1.map | awk '{print $1}')
|
||||||
|
POLICY_SIZE_SYMBOL=$(grep "_policy_size_u32" stage1/loader_stage1.map | awk '{print $1}')
|
||||||
|
|
||||||
|
# calculate offsets as length in bytes of IMAGE_FILE - (4GB - offset)
|
||||||
|
IMAGE_LENGTH=$(wc -c < "$IMAGE_FILE")
|
||||||
|
POLICY_OFF=$((IMAGE_LENGTH - (4 * 1024 * 1024 * 1024 - POLICY_START)))
|
||||||
|
POLICY_SZ_OFF=$((IMAGE_LENGTH - (4 * 1024 * 1024 * 1024 - POLICY_SIZE_SYMBOL)))
|
||||||
|
|
||||||
|
printf "%08x" $POLICY_SZ | \
|
||||||
|
rev | \
|
||||||
|
xxd -r -p | \
|
||||||
|
dd conv=notrunc bs=1 seek="$POLICY_SZ_OFF" of="$IMAGE_FILE" bs=1
|
||||||
|
|
||||||
|
# overwrite the content of IMAGE_FILE at offset POLICY_OFF with the content of POLICY_FILE
|
||||||
|
dd if="$POLICY_FILE" of="$IMAGE_FILE" bs=1 seek="$POLICY_OFF" conv=notrunc
|
Loading…
Reference in New Issue