From 82f2c9c2c76e1d3691d17ee78116d1d93a123788 Mon Sep 17 00:00:00 2001 From: Tom D <40675700+twitchy-jsonp@users.noreply.github.com> Date: Mon, 31 Jan 2022 09:10:07 -0800 Subject: [PATCH] Merge pull request from GHSA-99cg-575x-774p * AKPublic.Verify: Return an error if a provided PCR of the correct digest was not included in the quote. * AKPublic.VerifyAll: Implement VerifyAll method, which can cross-check that provided PCRs were covered by quotes across PCR banks. * PCR.QuoteVerified(): Introduce getter method to expose whether a PCR value was covered during quote verification. --- attest/attest.go | 39 ++++++++- attest/attest_fuzz.go | 1 + attest/attest_simulated_tpm20_test.go | 25 ++++-- attest/eventlog.go | 23 ++++++ attest/eventlog_fuzz.go | 1 + attest/key_linux.go | 1 + attest/key_windows.go | 1 + attest/pcp_windows.go | 5 +- attest/secureboot.go | 2 +- attest/secureboot_test.go | 112 +++++++++++++------------- attest/tpm12_linux.go | 1 + attest/tpm_linux.go | 1 + attest/tpm_other.go | 1 + attest/tpm_windows.go | 3 +- 14 files changed, 147 insertions(+), 69 deletions(-) diff --git a/attest/attest.go b/attest/attest.go index 5f9ce7f3..2b75d5bd 100644 --- a/attest/attest.go +++ b/attest/attest.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "io" + "strings" "github.com/google/certificate-transparency-go/x509" "github.com/google/go-tpm/tpm" @@ -179,6 +180,16 @@ type PCR struct { Index int Digest []byte DigestAlg crypto.Hash + + // quoteVerified is true if the PCR was verified against a quote + // in a call to AKPublic.Verify or AKPublic.VerifyAll. + quoteVerified bool +} + +// QuoteVerified returns true if the value of this PCR was previously +// verified against a Quote, in a call to AKPublic.Verify or AKPublic.VerifyAll. +func (p *PCR) QuoteVerified() bool { + return p.quoteVerified } // EK is a burned-in endorcement key bound to a TPM. This optionally contains @@ -290,7 +301,12 @@ func ParseAKPublic(version TPMVersion, public []byte) (*AKPublic, error) { // Verify is used to prove authenticity of the PCR measurements. It ensures that // the quote was signed by the AK, and that its contents matches the PCR and -// nonce combination. +// nonce combination. An error is returned if a provided PCR index was not part +// of the quote. QuoteVerified() will return true on PCRs which were verified +// by a quote. +// +// Do NOT use this method if you have multiple quotes to verify: Use VerifyAll +// instead. // // The nonce is used to prevent replays of Quote and PCRs and is signed by the // quote. Some TPMs don't support nonces longer than 20 bytes, and if the @@ -307,6 +323,27 @@ func (a *AKPublic) Verify(quote Quote, pcrs []PCR, nonce []byte) error { } } +// VerifyAll uses multiple quotes to verify the authenticity of all PCR +// measurements. See documentation on Verify() for semantics. +func (a *AKPublic) VerifyAll(quotes []Quote, pcrs []PCR, nonce []byte) error { + for i, quote := range quotes { + if err := a.Verify(quote, pcrs, nonce); err != nil { + return fmt.Errorf("quote %d: %v", i, err) + } + } + + var errPCRs []string + for _, p := range pcrs { + if !p.QuoteVerified() { + errPCRs = append(errPCRs, fmt.Sprintf("%d (%s)", p.Index, p.DigestAlg)) + } + } + if len(errPCRs) > 0 { + return fmt.Errorf("some PCRs were not covered by a quote: %s", strings.Join(errPCRs, ", ")) + } + return nil +} + // HashAlg identifies a hashing Algorithm. type HashAlg uint8 diff --git a/attest/attest_fuzz.go b/attest/attest_fuzz.go index e58e70fd..1d0eb150 100644 --- a/attest/attest_fuzz.go +++ b/attest/attest_fuzz.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build gofuzz // +build gofuzz package attest diff --git a/attest/attest_simulated_tpm20_test.go b/attest/attest_simulated_tpm20_test.go index 66cfaa1a..d9c09a80 100644 --- a/attest/attest_simulated_tpm20_test.go +++ b/attest/attest_simulated_tpm20_test.go @@ -149,7 +149,7 @@ func TestParseAKPublic20(t *testing.T) { } } -func TestSimTPM20QuoteAndVerify(t *testing.T) { +func TestSimTPM20QuoteAndVerifyAll(t *testing.T) { sim, tpm := setupSimulatedTPM(t) defer sim.Close() @@ -160,9 +160,13 @@ func TestSimTPM20QuoteAndVerify(t *testing.T) { defer ak.Close(tpm) nonce := []byte{1, 2, 3, 4, 5, 6, 7, 8} - quote, err := ak.Quote(tpm, nonce, HashSHA256) + quote256, err := ak.Quote(tpm, nonce, HashSHA256) if err != nil { - t.Fatalf("ak.Quote() failed: %v", err) + t.Fatalf("ak.Quote(SHA256) failed: %v", err) + } + quote1, err := ak.Quote(tpm, nonce, HashSHA1) + if err != nil { + t.Fatalf("ak.Quote(SHA1) failed: %v", err) } // Providing both PCR banks to AKPublic.Verify() ensures we can handle @@ -180,7 +184,14 @@ func TestSimTPM20QuoteAndVerify(t *testing.T) { if err != nil { t.Fatalf("ParseAKPublic() failed: %v", err) } - if err := pub.Verify(*quote, pcrs, nonce); err != nil { + + // Ensure VerifyAll fails if a quote is missing and hence not all PCR + // banks are covered. + if err := pub.VerifyAll([]Quote{*quote256}, pcrs, nonce); err == nil { + t.Error("VerifyAll().err returned nil, expected failure") + } + + if err := pub.VerifyAll([]Quote{*quote256, *quote1}, pcrs, nonce); err != nil { t.Errorf("quote verification failed: %v", err) } } @@ -205,10 +216,8 @@ func TestSimTPM20AttestPlatform(t *testing.T) { if err != nil { t.Fatalf("ParseAKPublic() failed: %v", err) } - for i, q := range attestation.Quotes { - if err := pub.Verify(q, attestation.PCRs, nonce); err != nil { - t.Errorf("quote[%d] verification failed: %v", i, err) - } + if err := pub.VerifyAll(attestation.Quotes, attestation.PCRs, nonce); err != nil { + t.Errorf("quote verification failed: %v", err) } } diff --git a/attest/eventlog.go b/attest/eventlog.go index e2ed0322..77cc81f5 100644 --- a/attest/eventlog.go +++ b/attest/eventlog.go @@ -320,6 +320,13 @@ func (a *AKPublic) validate12Quote(quote Quote, pcrs []PCR, nonce []byte) error if att.Digest != sha1.Sum(composite) { return fmt.Errorf("PCRs passed didn't match quote: %v", err) } + + // All provided PCRs are used to construct the composite hash which + // is verified against the quote (for TPM 1.2), so if we got this far, + // all PCR values are verified. + for i := range pcrs { + pcrs[i].quoteVerified = true + } return nil } @@ -366,17 +373,33 @@ func (a *AKPublic) validate20Quote(quote Quote, pcrs []PCR, nonce []byte) error } sigHash.Reset() + quotePCRs := make(map[int]struct{}, len(att.AttestedQuoteInfo.PCRSelection.PCRs)) for _, index := range att.AttestedQuoteInfo.PCRSelection.PCRs { digest, ok := pcrByIndex[index] if !ok { return fmt.Errorf("quote was over PCR %d which wasn't provided", index) } + quotePCRs[index] = struct{}{} sigHash.Write(digest) } + for index, _ := range pcrByIndex { + if _, exists := quotePCRs[index]; !exists { + return fmt.Errorf("provided PCR %d was not included in quote", index) + } + } + if !bytes.Equal(sigHash.Sum(nil), att.AttestedQuoteInfo.PCRDigest) { return fmt.Errorf("quote digest didn't match pcrs provided") } + + // If we got this far, all included PCRs with a digest algorithm matching that + // of the quote are verified. As such, we set their quoteVerified bit. + for i, pcr := range pcrs { + if _, exists := quotePCRs[pcr.Index]; exists && pcr.DigestAlg == pcrDigestAlg { + pcrs[i].quoteVerified = true + } + } return nil } diff --git a/attest/eventlog_fuzz.go b/attest/eventlog_fuzz.go index 84c829f5..d7848518 100644 --- a/attest/eventlog_fuzz.go +++ b/attest/eventlog_fuzz.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build gofuzz // +build gofuzz package attest diff --git a/attest/key_linux.go b/attest/key_linux.go index ec5109f4..ac09e491 100644 --- a/attest/key_linux.go +++ b/attest/key_linux.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build linux && !gofuzz && cgo && tspi // +build linux,!gofuzz,cgo,tspi package attest diff --git a/attest/key_windows.go b/attest/key_windows.go index 1ef64293..9d153c71 100644 --- a/attest/key_windows.go +++ b/attest/key_windows.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build windows // +build windows package attest diff --git a/attest/pcp_windows.go b/attest/pcp_windows.go index bc8725e0..3618480d 100644 --- a/attest/pcp_windows.go +++ b/attest/pcp_windows.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build windows // +build windows package attest @@ -26,9 +27,9 @@ import ( "github.com/google/certificate-transparency-go/x509" - "golang.org/x/sys/windows" - tpmtbs "github.com/google/go-tpm/tpmutil/tbs" "github.com/google/go-tpm/tpmutil" + tpmtbs "github.com/google/go-tpm/tpmutil/tbs" + "golang.org/x/sys/windows" ) const ( diff --git a/attest/secureboot.go b/attest/secureboot.go index fe8a042d..ff04c52f 100644 --- a/attest/secureboot.go +++ b/attest/secureboot.go @@ -19,8 +19,8 @@ import ( "errors" "fmt" - "github.com/google/go-attestation/attest/internal" "github.com/google/certificate-transparency-go/x509" + "github.com/google/go-attestation/attest/internal" ) // SecurebootState describes the secure boot status of a machine, as determined diff --git a/attest/secureboot_test.go b/attest/secureboot_test.go index 21dff45c..6419531a 100644 --- a/attest/secureboot_test.go +++ b/attest/secureboot_test.go @@ -62,54 +62,54 @@ func TestSecureBootBug157(t *testing.T) { } pcrs := []PCR{ - {'\x00', []byte("Q\xc3#\xde\f\fiOF\x01\xcd\xd0+\xebX\xff\x13b\x9ft"), '\x03'}, - {'\x01', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x02', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x03', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x04', []byte("\xb7q\x00\x8d\x17<\x02+\xc1oKM\x1a\u007f\x8b\x99\xed\x88\xee\xb1"), '\x03'}, - {'\x05', []byte("\xd79j\xc6\xe8\x87\xda\"ޠ;@\x95/p\xb8\xdbҩ\x96"), '\x03'}, - {'\x06', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\a', []byte("E\xa8b\x1d4\xa5}\xf2\xb2\xe7\xf1L\x92\xb9\x9a\xc8\xde}X\x05"), '\x03'}, - {'\b', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\t', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\n', []byte("\x82\x84\x10>\x06\xd4\x01\"\xbcd\xa0䡉\x1a\xf9\xec\xd4\\\xf6"), '\x03'}, - {'\v', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\r', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x0e', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x0f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x10', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x11', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x12', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x13', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x14', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x15', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x16', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03'}, - {'\x17', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03'}, - {'\x00', []byte("\xfc\xec\xb5j\xcc08b\xb3\x0e\xb3Bę\v\xebP\xb5ૉr$I\xc2٧?7\xb0\x19\xfe"), '\x05'}, - {'\x01', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x02', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x03', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x04', []byte("\xa9)h\x80oy_\xa3D5\xd9\xf1\x18\x13hL\xa1\xe7\x05`w\xf7\x00\xbaI\xf2o\x99b\xf8m\x89"), '\x05'}, - {'\x05', []byte("̆\x18\xb7y2\xb4\xef\xda\x12\xccX\xba\xd9>\xcdѕ\x9d\xea)\xe5\xabyE%\xa6\x19\xf5\xba\xab\xee"), '\x05'}, - {'\x06', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\a', []byte("Q\xb3\x04\x88\xc9\xe6%]\x82+\xdc\x1b ٩,2\xbd\xe6\xc3\xe7\xbc\x02\xbc\xdd2\x82^\xb5\xef\x06\x9a"), '\x05'}, - {'\b', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\t', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\n', []byte("\xc3l\x9a\xb1\x10\x9b\xa0\x8a?dX!\x18\xf8G\x1a]i[\xc9#\xa0\xa2\xbd\x04]\xb1K\x97OB9"), '\x05'}, - {'\v', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\r', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x0e', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x0f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x10', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, - {'\x11', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x12', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x13', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x14', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x15', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x16', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05'}, - {'\x17', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05'}, + {'\x00', []byte("Q\xc3#\xde\f\fiOF\x01\xcd\xd0+\xebX\xff\x13b\x9ft"), '\x03', false}, + {'\x01', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x02', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x03', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x04', []byte("\xb7q\x00\x8d\x17<\x02+\xc1oKM\x1a\u007f\x8b\x99\xed\x88\xee\xb1"), '\x03', false}, + {'\x05', []byte("\xd79j\xc6\xe8\x87\xda\"ޠ;@\x95/p\xb8\xdbҩ\x96"), '\x03', false}, + {'\x06', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\a', []byte("E\xa8b\x1d4\xa5}\xf2\xb2\xe7\xf1L\x92\xb9\x9a\xc8\xde}X\x05"), '\x03', false}, + {'\b', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\t', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\n', []byte("\x82\x84\x10>\x06\xd4\x01\"\xbcd\xa0䡉\x1a\xf9\xec\xd4\\\xf6"), '\x03', false}, + {'\v', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\r', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x0e', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x0f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x10', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x11', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x12', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x13', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x14', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x15', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x16', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x03', false}, + {'\x17', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x03', false}, + {'\x00', []byte("\xfc\xec\xb5j\xcc08b\xb3\x0e\xb3Bę\v\xebP\xb5ૉr$I\xc2٧?7\xb0\x19\xfe"), '\x05', false}, + {'\x01', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x02', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x03', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x04', []byte("\xa9)h\x80oy_\xa3D5\xd9\xf1\x18\x13hL\xa1\xe7\x05`w\xf7\x00\xbaI\xf2o\x99b\xf8m\x89"), '\x05', false}, + {'\x05', []byte("̆\x18\xb7y2\xb4\xef\xda\x12\xccX\xba\xd9>\xcdѕ\x9d\xea)\xe5\xabyE%\xa6\x19\xf5\xba\xab\xee"), '\x05', false}, + {'\x06', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\a', []byte("Q\xb3\x04\x88\xc9\xe6%]\x82+\xdc\x1b ٩,2\xbd\xe6\xc3\xe7\xbc\x02\xbc\xdd2\x82^\xb5\xef\x06\x9a"), '\x05', false}, + {'\b', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\t', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\n', []byte("\xc3l\x9a\xb1\x10\x9b\xa0\x8a?dX!\x18\xf8G\x1a]i[\xc9#\xa0\xa2\xbd\x04]\xb1K\x97OB9"), '\x05', false}, + {'\v', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\r', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x0e', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x0f', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x10', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, + {'\x11', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x12', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x13', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x14', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x15', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x16', []byte("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"), '\x05', false}, + {'\x17', []byte("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"), '\x05', false}, } events, err := elr.Verify(pcrs) @@ -145,14 +145,14 @@ func TestSecureBootOptionRom(t *testing.T) { } pcrs := []PCR{ - {'\x00', b64MustDecode("AVGK7ch6DvUF0nJh74NYCefaAIY="), '\x03'}, - {'\x01', b64MustDecode("vr/0wIpmd0c6tgTO3vuC+FDN6IM="), '\x03'}, - {'\x02', b64MustDecode("NmoxoMB1No8OEIVzM+ou1uigD9M="), '\x03'}, - {'\x03', b64MustDecode("sqg7Dr8vg3Qpmlsr38MeqVWtcjY="), '\x03'}, - {'\x04', b64MustDecode("OfOIw5WekEaUcm9MAVttzq4GgKE="), '\x03'}, - {'\x05', b64MustDecode("cjoFIM9/KXhUh0K9FUFwayRGRZ4="), '\x03'}, - {'\x06', b64MustDecode("sqg7Dr8vg3Qpmlsr38MeqVWtcjY="), '\x03'}, - {'\x07', b64MustDecode("IN59+6a838ytrX4+sJnJHU2Xxa0="), '\x03'}, + {'\x00', b64MustDecode("AVGK7ch6DvUF0nJh74NYCefaAIY="), '\x03', false}, + {'\x01', b64MustDecode("vr/0wIpmd0c6tgTO3vuC+FDN6IM="), '\x03', false}, + {'\x02', b64MustDecode("NmoxoMB1No8OEIVzM+ou1uigD9M="), '\x03', false}, + {'\x03', b64MustDecode("sqg7Dr8vg3Qpmlsr38MeqVWtcjY="), '\x03', false}, + {'\x04', b64MustDecode("OfOIw5WekEaUcm9MAVttzq4GgKE="), '\x03', false}, + {'\x05', b64MustDecode("cjoFIM9/KXhUh0K9FUFwayRGRZ4="), '\x03', false}, + {'\x06', b64MustDecode("sqg7Dr8vg3Qpmlsr38MeqVWtcjY="), '\x03', false}, + {'\x07', b64MustDecode("IN59+6a838ytrX4+sJnJHU2Xxa0="), '\x03', false}, } events, err := elr.Verify(pcrs) diff --git a/attest/tpm12_linux.go b/attest/tpm12_linux.go index 40560bff..beee6624 100644 --- a/attest/tpm12_linux.go +++ b/attest/tpm12_linux.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build linux && !gofuzz && cgo && tspi // +build linux,!gofuzz,cgo,tspi package attest diff --git a/attest/tpm_linux.go b/attest/tpm_linux.go index e70f5081..6d89a300 100644 --- a/attest/tpm_linux.go +++ b/attest/tpm_linux.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build linux && !gofuzz // +build linux,!gofuzz package attest diff --git a/attest/tpm_other.go b/attest/tpm_other.go index b5bd64cc..8a8e7c13 100644 --- a/attest/tpm_other.go +++ b/attest/tpm_other.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build gofuzz || (!linux && !windows) // +build gofuzz !linux,!windows package attest diff --git a/attest/tpm_windows.go b/attest/tpm_windows.go index 5544a1d1..0203c767 100644 --- a/attest/tpm_windows.go +++ b/attest/tpm_windows.go @@ -12,6 +12,7 @@ // License for the specific language governing permissions and limitations under // the License. +//go:build windows // +build windows package attest @@ -28,9 +29,9 @@ import ( "io" "math/big" - "golang.org/x/sys/windows" tpm1 "github.com/google/go-tpm/tpm" tpmtbs "github.com/google/go-tpm/tpmutil/tbs" + "golang.org/x/sys/windows" ) var wellKnownAuth [20]byte