From 1afe39ca3e1d872b097c24c5da29be1e7df9fd80 Mon Sep 17 00:00:00 2001 From: Steven Portley Date: Tue, 23 Dec 2025 17:22:48 -0800 Subject: [PATCH] Update the formatting for OT get version This makes the formatting slightly more intuitive and displays which boot stage used which boot slot. Example output: primary bl0 slot: A ROM_EXT Slot A: 0.116, sv=0 measurement=[0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] ROM_EXT Slot B: 0.116, sv=0 measurement=[0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] App Slot A: 0.2025121910, sv=0 measurement=[0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] App Slot B: 0.2025121910, sv=0 measurement=[0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] [0x00000000] Booted out of: App=slot B, ROMEXT=slot A Currently running: 0.2025121910/0.116 --- examples/htool.c | 39 +----------------------------------- protocol/opentitan_version.c | 38 ++++++++++++++++++++++++++++++----- protocol/opentitan_version.h | 5 +++-- 3 files changed, 37 insertions(+), 45 deletions(-) diff --git a/examples/htool.c b/examples/htool.c index 6d2ba45..ea56488 100644 --- a/examples/htool.c +++ b/examples/htool.c @@ -800,44 +800,7 @@ static int command_opentitan_version(const struct htool_invocation* inv) { return rv; } - printf("OpenTitan Version:\n"); - printf("Current Boot Slot: %s\n", bootslot_str(output.primary_bl0_slot)); - printf("Boot Slot A: rom_ext version %d.%d\n", output.rom_ext.slots[0].major, - output.rom_ext.slots[0].minor); - printf("Boot Slot A: rom_ext security version %d\n", output.rom_ext.slots[0].security_version); - printf("Boot Slot B: rom_ext version %d.%d\n", output.rom_ext.slots[1].major, - output.rom_ext.slots[1].minor); - printf("Boot Slot B: rom_ext security version %d\n", output.rom_ext.slots[1].security_version); - - printf("Boot Slot A: rom_ext measurements\n"); - for(int i = 0; i < OPENTITAN_VERSION_HASH_SIZE; i++) { - printf("[0x%08x] ", output.rom_ext.slots[0].measurement[i]); - } - printf("\n"); - printf("Boot Slot B: rom_ext measurements\n"); - for(int i = 0; i < OPENTITAN_VERSION_HASH_SIZE; i++) { - printf("[0x%08x] ", output.rom_ext.slots[1].measurement[i]); - } - printf("\n"); - - printf("Boot Slot A: APP version %d.%d\n", output.app.slots[0].major, - output.app.slots[0].minor); - printf("Boot Slot A: APP security version %d\n", output.app.slots[0].security_version); - printf("Boot Slot B: APP version %d.%d\n", output.app.slots[1].major, - output.app.slots[1].minor); - printf("Boot Slot B: APP security version %d\n", output.app.slots[1].security_version); - - printf("Boot Slot A: APP measurements\n"); - for(int i = 0; i < OPENTITAN_VERSION_HASH_SIZE; i++) { - printf("[0x%08x] ", output.app.slots[0].measurement[i]); - } - printf("\n"); - printf("Boot Slot B: APP measurements\n"); - for(int i = 0; i < OPENTITAN_VERSION_HASH_SIZE; i++) { - printf("[0x%08x] ", output.app.slots[1].measurement[i]); - } - printf("\n"); - + libhoth_print_ot_version_resp(&output); return 0; } diff --git a/protocol/opentitan_version.c b/protocol/opentitan_version.c index d953edb..c1b674d 100644 --- a/protocol/opentitan_version.c +++ b/protocol/opentitan_version.c @@ -78,17 +78,45 @@ bool libhoth_ot_version_eq(const struct opentitan_image_version * a, } -char * bootslot_str(enum opentitan_boot_slot input) { +void libhoth_print_ot_version(const char* prefix, const struct opentitan_image_version* ver) { + printf("%s: %d.%d, sv=%d\n", prefix, ver->major, ver->minor, ver->security_version); + printf(" measurement="); + for(int i = 0; i < OPENTITAN_VERSION_HASH_SIZE; i++) { + printf("[0x%08x] ", ver->measurement[i]); + } + printf("\n"); +} +void libhoth_print_ot_version_resp(const struct opentitan_get_version_resp* ver) { + printf("primary bl0 slot: %s\n", bootslot_str(ver->primary_bl0_slot)); + libhoth_print_ot_version("ROM_EXT Slot A", &ver->rom_ext.slots[0]); + libhoth_print_ot_version("ROM_EXT Slot B", &ver->rom_ext.slots[1]); + libhoth_print_ot_version("App Slot A", &ver->app.slots[0]); + libhoth_print_ot_version("App Slot B", &ver->app.slots[1]); + + const struct opentitan_image_version* curr_romext = + (ver->rom_ext.booted_slot == kOpentitanBootSlotA) ? &ver->rom_ext.slots[0] : &ver->rom_ext.slots[1]; + const struct opentitan_image_version* curr_app = + (ver->app.booted_slot == kOpentitanBootSlotA) ? &ver->app.slots[0] : &ver->app.slots[1]; + + printf("Booted out of: App=slot %s, ROMEXT=slot %s\n", + bootslot_str(ver->app.booted_slot), + bootslot_str(ver->rom_ext.booted_slot)); + printf("Currently running: %d.%d/%d.%d\n", + curr_app->major, curr_app->minor, + curr_romext->major, curr_romext->minor); +} + +const char * bootslot_str(enum opentitan_boot_slot input) { // Primary BL0 slot values are hardcoded in pie_rot // Boot slotA: 0x5f5f4141 // Boot slotB: 0x42425f5f) if (input == kOpentitanBootSlotA) { - return "Boot slot A"; + return "A"; } else if (input == kOpentitanBootSlotB) { - return "Boot slot B"; + return "B"; } else { - return "Unknown boot slot"; + return "Unknown"; } } @@ -105,4 +133,4 @@ int bootslot_int(enum opentitan_boot_slot input) { return 0x0; } -} \ No newline at end of file +} diff --git a/protocol/opentitan_version.h b/protocol/opentitan_version.h index f7fe4d0..d36cacc 100644 --- a/protocol/opentitan_version.h +++ b/protocol/opentitan_version.h @@ -106,8 +106,9 @@ int libhoth_extract_ot_bundle(const uint8_t* image, bool libhoth_ot_version_eq(const struct opentitan_image_version * a, const struct opentitan_image_version * b); -char *bootslot_str(enum opentitan_boot_slot input); - +void libhoth_print_ot_version(const char* prefix, const struct opentitan_image_version* ver); +void libhoth_print_ot_version_resp(const struct opentitan_get_version_resp* ver); +const char *bootslot_str(enum opentitan_boot_slot input); int bootslot_int(enum opentitan_boot_slot input); #ifdef __cplusplus