Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Print part of TCG log when we could not unseal #218

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 52 additions & 0 deletions crypt.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,17 @@ import (
"encoding/binary"
"errors"
"fmt"
"io"
"os"
"strconv"
"text/tabwriter"

"github.com/snapcore/snapd/asserts"

"golang.org/x/xerrors"

"github.com/canonical/go-tpm2"
"github.com/canonical/tcglog-parser"
"github.com/snapcore/secboot/internal/keyring"
"github.com/snapcore/secboot/internal/luks2"
"github.com/snapcore/secboot/internal/luksview"
Expand Down Expand Up @@ -387,6 +391,52 @@ func (e *activateVolumeWithKeyDataError) Error() string {
return s.String()
}

func printEvent(w io.Writer, event *tcglog.Event, hashAlg tpm2.HashAlgorithmId) {
pcrsOfInterest := []tcglog.PCRIndex{4, 7, 12}
print := false
for _, p := range pcrsOfInterest {
if event.PCRIndex == p {
print = true
break
}
}
if !print {
return
}
fmt.Fprintf(w, "%d\t%x\t%s\t%s\n", event.PCRIndex, event.Digests[hashAlg], event.EventType, tcglog.EventDetailsStringer(event, false))
}

func printTCGLog() {
const logPath = "/sys/kernel/security/tpm0/binary_bios_measurements"
f, err := os.Open(logPath)
if err != nil {
fmt.Printf("error opening TCG log: %v\n", err)
return
}
defer f.Close()

logOpts := tcglog.LogOptions{
EnableGrub: true,
EnableSystemdEFIStub: true,
SystemdEFIStubPCR: 8,
}

log, err := tcglog.ReadLog(f, &logOpts)
if err != nil {
fmt.Printf("cannot read TCG log: %v\n", err)
return
}

fmt.Printf("TCG log events:\n")
tabWrt := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintf(tabWrt, "PCR\tDIGEST\tTYPE\n")
for _, event := range log.Events {
printEvent(tabWrt, event, tpm2.HashAlgorithmSHA256)
}

tabWrt.Flush()
}

// ErrRecoveryKeyUsed is returned from ActivateVolumeWithKeyData and
// ActivateVolumeWithMultipleKeyData if the volume could not be activated with
// any platform protected keys but activation with the recovery key was
Expand Down Expand Up @@ -445,6 +495,8 @@ func ActivateVolumeWithMultipleKeyData(volumeName, sourceDevicePath string, keys
case success:
return nil
default: // failed - try recovery key
// TCG log might give us a hint on what failed
printTCGLog()
if rErr := activateWithRecoveryKey(volumeName, sourceDevicePath, authRequestor, options.RecoveryKeyTries, options.KeyringPrefix); rErr != nil {
// failed with recovery key - return errors
var kdErrs []error
Expand Down