From 134fe3a0b1b36d6859f643db7ae65f96e01a836c Mon Sep 17 00:00:00 2001 From: vbalain Date: Wed, 25 Feb 2026 09:27:13 +0000 Subject: [PATCH 1/3] Add test case for COS 125 with secure boot and multiple boot attempts. The test verifies that the event log can be parsed and replayed correctly against a predefined set of expected PCR values. --- extract/extract_test.go | 47 ++++++++++++++++-- testdata/eventlog_data.go | 2 + .../tpm/cos-125-intel-tdx-secure-boot.bin | Bin 0 -> 34196 bytes 3 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 testdata/eventlogs/tpm/cos-125-intel-tdx-secure-boot.bin diff --git a/extract/extract_test.go b/extract/extract_test.go index 266331b..c28197a 100644 --- a/extract/extract_test.go +++ b/extract/extract_test.go @@ -334,8 +334,9 @@ func TestExtractFirmwareLogStateTPM(t *testing.T) { for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { eventGetters := map[string]func(*testing.T) (crypto.Hash, []tcg.Event){ - "singleBoot": getTPMELEvents, - "multipleBoot": getTPMELEventsWithMultipleBootAttempts, + "singleBoot": getTPMELEvents, + "ubuntuMultipleBoot": getTPMELEventsUbuntuWithMultipleBootAttempts, + "cosSecureMultipleBoot": getTPMELEventsCosWithSecureBootAndMultipleBootAttempts, } for name, getEvents := range eventGetters { t.Run(name, func(t *testing.T) { @@ -603,7 +604,7 @@ func getTPMELEvents(t *testing.T) (crypto.Hash, []tcg.Event) { return cryptoHash, events } -func getTPMELEventsWithMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Event) { +func getTPMELEventsUbuntuWithMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Event) { log := testdata.Ubuntu2404IntelTdxEventLog bank := testutil.MakePCRBank(pb.HashAlgo_SHA384, map[uint32][]byte{ 0: decodeHex("592b3f42ec556a9c093f201124cc7313fdaa4ce40ae1602e14d51f18fbfc480d6a1e196d1c52ad919328410272dc7222"), @@ -643,6 +644,46 @@ func getTPMELEventsWithMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Ev return cryptoHash, events } +func getTPMELEventsCosWithSecureBootAndMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Event) { + log := testdata.Cos125IntelTdxSecureBootEventLog + bank := testutil.MakePCRBank(pb.HashAlgo_SHA384, map[uint32][]byte{ + 0: decodeHex("592b3f42ec556a9c093f201124cc7313fdaa4ce40ae1602e14d51f18fbfc480d6a1e196d1c52ad919328410272dc7222"), + 1: decodeHex("d67b943903a0ac6244e491604f4d4c2090031142847e914add418b058b032aa636a7eb559669b1879b8459963ab63c24"), + 2: decodeHex("c286e5791d56d735f1e159bc77c5c0fb04e27a4cb697e74974b98c9db246ac7effc466ab20f42bcd974d2c5e3f1ce7c3"), + 3: decodeHex("518923b0f955d08da077c96aaba522b9decede61c599cea6c41889cfbea4ae4d50529d96fe4d1afdafb65e7f95bf23c4"), + 4: decodeHex("404e1dfa6118533162df83b88e9e183272d139e8cb306f103251030aa444ba005e2b9c8cdb90c275f707dd29e21d0085"), + 5: decodeHex("c50b529497c7f441ea47305587d6ce83e2e31f7b4fab6c13dc0b0c3c900e1d0caf0768321100927862df142bf0465ee4"), + 6: decodeHex("518923b0f955d08da077c96aaba522b9decede61c599cea6c41889cfbea4ae4d50529d96fe4d1afdafb65e7f95bf23c4"), + 7: decodeHex("6e64b25bab4f2382466f419dae07a4dbdbaaa3ce56c16bb740516c8bc05cb6c3dbc161016739be4e542a7265c4bd1d70"), + 8: decodeHex("08052cde78f6561f52a4c37286edac23fa6915e211881770a5ebbbc5fc22411a4805829b9ca4741e0715edbb58aec4e5"), + 9: decodeHex("596ecbc8e6077dd980848c6f2ebcc7876321c9228eef86939fc61733d02d988e25a3a06d280f36c8d9c026ba2d6175d7"), + 10: decodeHex("8dfb3a115f861a7ef67e9670d47fe970f1029be7ca67b90cb851bc3358311ea3fd376b763b40b3a53df7785f75f1a8cb"), + 11: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + 12: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + 13: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + 14: decodeHex("7dd22d0be1dc4debfbfc5900589ea0940c6276d92edb6fed8625b6ec1f9be341c253d877229c00925c826761760cb355"), + 15: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + 16: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + 17: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 18: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 19: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 20: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 21: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 22: decodeHex("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"), + 23: decodeHex("000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"), + }) + cryptoHash, err := bank.CryptoHash() + if err != nil { + t.Fatal(err) + } + events, err := tcg.ParseAndReplay(log, bank.MRs(), tcg.ParseOpts{}) + if err != nil { + t.Fatal(err) + + } + return cryptoHash, events +} + func decodeHex(hexStr string) []byte { bytes, err := hex.DecodeString(hexStr) if err != nil { diff --git a/testdata/eventlog_data.go b/testdata/eventlog_data.go index 6726180..0e37565 100644 --- a/testdata/eventlog_data.go +++ b/testdata/eventlog_data.go @@ -47,6 +47,8 @@ var ( GdcHost []byte //go:embed eventlogs/tpm/ubuntu-2404-intel-tdx.bin Ubuntu2404IntelTdxEventLog []byte + //go:embed eventlogs/tpm/cos-125-intel-tdx-secure-boot.bin + Cos125IntelTdxSecureBootEventLog []byte ) // Kernel command lines from event logs. diff --git a/testdata/eventlogs/tpm/cos-125-intel-tdx-secure-boot.bin b/testdata/eventlogs/tpm/cos-125-intel-tdx-secure-boot.bin new file mode 100644 index 0000000000000000000000000000000000000000..b00354044a33943032ef82a0d03fcd375757be81 GIT binary patch literal 34196 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 Jpg>){{~x-j>M;NS literal 0 HcmV?d00001 From cf376a8cc7c48736702771f5698c8089cf18143b Mon Sep 17 00:00:00 2001 From: vbalain Date: Tue, 3 Mar 2026 10:18:09 +0000 Subject: [PATCH 2/3] Relax parsing strictness for scenario where a separator event could occur with any calling efi app event. --- extract/extract.go | 3 --- extract/extract_test.go | 20 -------------------- 2 files changed, 23 deletions(-) diff --git a/extract/extract.go b/extract/extract.go index 45c6aef..87f6a1d 100644 --- a/extract/extract.go +++ b/extract/extract.go @@ -432,9 +432,6 @@ func EfiState(hash crypto.Hash, events []tcg.Event, registerCfg registerConfig, return nil, err } if isSeparator { - if !seenCallingEfiApp { - return nil, fmt.Errorf("found separator event in %s%d before CallingEFIApp event", registerCfg.Name, index) - } if seenSeparator4 { return nil, fmt.Errorf("found duplicate Separator event in %s%d", registerCfg.Name, registerCfg.EFIAppIdx) } diff --git a/extract/extract_test.go b/extract/extract_test.go index c28197a..5753dd3 100644 --- a/extract/extract_test.go +++ b/extract/extract_test.go @@ -542,26 +542,6 @@ func TestEfiState(t *testing.T) { AllowEFIAppBeforeCallingEvent: false, }, }, - { - name: "failed with valid boot attempt before Separator event in CCEL logs", - events: func() (crypto.Hash, []tcg.Event) { - hash, evts := crypto.SHA384, getCCELEvents(t) - var failedEvts []tcg.Event - for _, e := range evts { - if bytes.Equal(e.RawData(), []byte(tcg.CallingEFIApplication)) { - continue - } - failedEvts = append(failedEvts, e) - } - return hash, failedEvts - }, - registserConfig: RTMRRegisterConfig, - wantPass: false, - wantEfiState: nil, - opts: Opts{ - AllowEFIAppBeforeCallingEvent: true, - }, - }, } for _, tc := range tests { t.Run(tc.name, func(t *testing.T) { From 3b6657efe480b345c2b0994072a8b7d672da235e Mon Sep 17 00:00:00 2001 From: vbalain Date: Thu, 5 Mar 2026 05:10:04 +0000 Subject: [PATCH 3/3] Address review comments --- extract/extract_test.go | 4 ++-- testdata/eventlog_data.go | 4 ++-- tpmeventlog/replay_test.go | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/extract/extract_test.go b/extract/extract_test.go index 5753dd3..a4baa7d 100644 --- a/extract/extract_test.go +++ b/extract/extract_test.go @@ -585,7 +585,7 @@ func getTPMELEvents(t *testing.T) (crypto.Hash, []tcg.Event) { } func getTPMELEventsUbuntuWithMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Event) { - log := testdata.Ubuntu2404IntelTdxEventLog + log := testdata.Ubuntu2404IntelTdxA4HighGpu8GEventLog bank := testutil.MakePCRBank(pb.HashAlgo_SHA384, map[uint32][]byte{ 0: decodeHex("592b3f42ec556a9c093f201124cc7313fdaa4ce40ae1602e14d51f18fbfc480d6a1e196d1c52ad919328410272dc7222"), 1: decodeHex("ba1ac69c213175dc72db1493bd5bdfa4799028fe5d5c2bb41ddccc6affa50ba01f189d4639a77afbedd6dd6aff1af3b4"), @@ -625,7 +625,7 @@ func getTPMELEventsUbuntuWithMultipleBootAttempts(t *testing.T) (crypto.Hash, [] } func getTPMELEventsCosWithSecureBootAndMultipleBootAttempts(t *testing.T) (crypto.Hash, []tcg.Event) { - log := testdata.Cos125IntelTdxSecureBootEventLog + log := testdata.Cos125IntelTdxSecureBootA4HighGpu8GEventLog bank := testutil.MakePCRBank(pb.HashAlgo_SHA384, map[uint32][]byte{ 0: decodeHex("592b3f42ec556a9c093f201124cc7313fdaa4ce40ae1602e14d51f18fbfc480d6a1e196d1c52ad919328410272dc7222"), 1: decodeHex("d67b943903a0ac6244e491604f4d4c2090031142847e914add418b058b032aa636a7eb559669b1879b8459963ab63c24"), diff --git a/testdata/eventlog_data.go b/testdata/eventlog_data.go index 0e37565..fd8ce92 100644 --- a/testdata/eventlog_data.go +++ b/testdata/eventlog_data.go @@ -46,9 +46,9 @@ var ( //go:embed eventlogs/tpm/gdc-host.bin GdcHost []byte //go:embed eventlogs/tpm/ubuntu-2404-intel-tdx.bin - Ubuntu2404IntelTdxEventLog []byte + Ubuntu2404IntelTdxA4HighGpu8GEventLog []byte //go:embed eventlogs/tpm/cos-125-intel-tdx-secure-boot.bin - Cos125IntelTdxSecureBootEventLog []byte + Cos125IntelTdxSecureBootA4HighGpu8GEventLog []byte ) // Kernel command lines from event logs. diff --git a/tpmeventlog/replay_test.go b/tpmeventlog/replay_test.go index 3fee08d..b241aad 100644 --- a/tpmeventlog/replay_test.go +++ b/tpmeventlog/replay_test.go @@ -596,7 +596,7 @@ func TestParseEventLogs(t *testing.T) { {Ubuntu2104NoSecureBootGCE, "Ubuntu2104NoSecureBootGCE", extract.Opts{Loader: extract.GRUB}, []string{sbatErrorStr}}, {Ubuntu2404AmdSevSnp, "Ubuntu2404AmdSevSnp", extract.Opts{Loader: extract.GRUB}, nil}, // This event log has a SecureBoot variable length of 0. - {ArchLinuxWorkstation, "ArchLinuxWorkstation", extract.Opts{Loader: extract.UnsupportedLoader, AllowEFIAppBeforeCallingEvent: true, AllowEmptySBVar: true}, []string{"found separator event in PCR4 before CallingEFIApp event"}}, + {ArchLinuxWorkstation, "ArchLinuxWorkstation", extract.Opts{Loader: extract.UnsupportedLoader, AllowEFIAppBeforeCallingEvent: true, AllowEmptySBVar: true}, nil}, {COS85AmdSev, "COS85AmdSev", extract.Opts{Loader: extract.GRUB}, nil}, {COS93AmdSev, "COS93AmdSev", extract.Opts{Loader: extract.GRUB}, nil}, {COS101AmdSev, "COS101AmdSev", extract.Opts{Loader: extract.GRUB}, nil},