Skip to content

Commit 23da4f2

Browse files
committed
Do not fail SealDiskKey if PCRs/eventlog can not be saved
For some reasons /hostfs/sys/kernel/security/tpm* might not exist on boot but that shouldn't cause tpmmgr to think that the seal failed. Signed-off-by: eriknordmark <[email protected]>
1 parent b0c01d1 commit 23da4f2

File tree

4 files changed

+18
-13
lines changed

4 files changed

+18
-13
lines changed

pkg/pillar/cmd/vaultmgr/vaultmgr.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,7 @@ func handleVaultKeyFromControllerImpl(ctxArg interface{}, key string,
418418
}
419419
// Try unlocking the vault now, in case it is not yet unlocked
420420
log.Noticef("Vault is still locked, trying to unlock")
421-
err = etpm.SealDiskKey(decryptedKey, etpm.DiskKeySealingPCRs)
421+
err = etpm.SealDiskKey(log, decryptedKey, etpm.DiskKeySealingPCRs)
422422
if err != nil {
423423
log.Errorf("Failed to Seal key in TPM %v", err)
424424
return

pkg/pillar/evetpm/tpm.go

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -518,7 +518,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
518518
if err != nil {
519519
return nil, fmt.Errorf("GetRandom failed: %w", err)
520520
}
521-
err = SealDiskKey(key, DiskKeySealingPCRs)
521+
err = SealDiskKey(log, key, DiskKeySealingPCRs)
522522
if err != nil {
523523
return nil, fmt.Errorf("sealing the fresh disk key failed: %w", err)
524524
}
@@ -545,7 +545,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
545545

546546
log.Noticef("try to convert the legacy key into a sealed key")
547547

548-
err = SealDiskKey(key, DiskKeySealingPCRs)
548+
err = SealDiskKey(log, key, DiskKeySealingPCRs)
549549
if err != nil {
550550
return nil, fmt.Errorf("sealing the legacy disk key into TPM failed: %w", err)
551551
}
@@ -566,7 +566,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
566566
}
567567

568568
// SealDiskKey seals key into TPM2.0, with provided PCRs
569-
func SealDiskKey(key []byte, pcrSel tpm2.PCRSelection) error {
569+
func SealDiskKey(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection) error {
570570
rw, err := tpm2.OpenTPM(TpmDevicePath)
571571
if err != nil {
572572
return err
@@ -644,7 +644,7 @@ func SealDiskKey(key []byte, pcrSel tpm2.PCRSelection) error {
644644

645645
// save a snapshot of current PCR values
646646
if err := saveDiskKeySealingPCRs(savedSealingPcrsFile); err != nil {
647-
return fmt.Errorf("saving snapshot of sealing PCRs failed: %w", err)
647+
log.Warnf("saving snapshot of sealing PCRs failed: %s", err)
648648
}
649649

650650
// Backup the previous pair of logs if any, so at most we have two pairs of
@@ -654,17 +654,17 @@ func SealDiskKey(key []byte, pcrSel tpm2.PCRSelection) error {
654654
// current measurement log (which is same as the content of MeasurementLogSealFail)
655655
// and lose the ability to diff and diagnose the issue.
656656
if err := backupCopiedMeasurementLogs(); err != nil {
657-
return fmt.Errorf("collecting previous snapshot of TPM event log failed: %w", err)
657+
log.Warnf("collecting previous snapshot of TPM event log failed: %s", err)
658658
}
659659

660660
// fresh start, remove old copies of measurement logs.
661661
if err := removeCopiedMeasurementLogs(); err != nil {
662-
return fmt.Errorf("removing old copies of TPM measurement log failed: %w", err)
662+
log.Warnf("removing old copies of TPM measurement log failed: %s", err)
663663
}
664664

665665
// save a copy of the current measurement log
666666
if err := copyMeasurementLog(measurementLogSealSuccess); err != nil {
667-
return fmt.Errorf("copying current TPM measurement log failed: %w", err)
667+
log.Warnf("copying current TPM measurement log failed: %s", err)
668668
}
669669

670670
return nil

pkg/pillar/evetpm/tpm_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,21 @@ import (
1515

1616
"github.com/google/go-tpm/tpm2"
1717
"github.com/google/go-tpm/tpmutil"
18+
"github.com/lf-edge/eve/pkg/pillar/base"
1819
fileutils "github.com/lf-edge/eve/pkg/pillar/utils/file"
20+
"github.com/sirupsen/logrus"
1921
)
2022

23+
var log = base.NewSourceLogObject(logrus.StandardLogger(), "test", 1234)
24+
2125
func TestSealUnseal(t *testing.T) {
2226
_, err := os.Stat(TpmDevicePath)
2327
if err != nil {
2428
t.Skip("TPM is not available, skipping the test.")
2529
}
2630

2731
dataToSeal := []byte("secret")
28-
if err := SealDiskKey(dataToSeal, DiskKeySealingPCRs); err != nil {
32+
if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil {
2933
t.Errorf("Seal operation failed with err: %v", err)
3034
return
3135
}
@@ -53,7 +57,7 @@ func TestSealUnsealMismatchReport(t *testing.T) {
5357
defer rw.Close()
5458

5559
dataToSeal := []byte("secret")
56-
if err := SealDiskKey(dataToSeal, DiskKeySealingPCRs); err != nil {
60+
if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil {
5761
t.Errorf("Seal operation failed with err: %v", err)
5862
return
5963
}
@@ -94,7 +98,7 @@ func TestSealUnsealTpmEventLogCollect(t *testing.T) {
9498

9599
// this should write the save the first event log
96100
dataToSeal := []byte("secret")
97-
if err := SealDiskKey(dataToSeal, DiskKeySealingPCRs); err != nil {
101+
if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil {
98102
t.Errorf("Seal operation failed with err: %v", err)
99103
return
100104
}
@@ -126,7 +130,7 @@ func TestSealUnsealTpmEventLogCollect(t *testing.T) {
126130
}
127131

128132
// this should trigger collecting previous tpm event logs
129-
if err := SealDiskKey(dataToSeal, DiskKeySealingPCRs); err != nil {
133+
if err := SealDiskKey(log, dataToSeal, DiskKeySealingPCRs); err != nil {
130134
t.Errorf("Seal operation failed with err: %v", err)
131135
return
132136
}

pkg/pillar/vault/handler_zfs.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,8 @@ func (h *ZFSHandler) SetupDefaultVault() error {
9797
return fmt.Errorf("error in setting up ZFS vault %s:%v", types.SealedDataset, err)
9898
}
9999
// Log the type of key used for unlocking default vault
100-
h.log.Noticef("default zfs vault unlocked")
100+
h.log.Noticef("default zfs vault unlocked using key type: %s",
101+
etpm.CompareLegacyandSealedKey().String())
101102
return nil
102103
}
103104

0 commit comments

Comments
 (0)