Skip to content

Commit 7c1612a

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 78e6d65 commit 7c1612a

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
@@ -521,7 +521,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
521521
if err != nil {
522522
return nil, fmt.Errorf("GetRandom failed: %w", err)
523523
}
524-
err = SealDiskKey(key, DiskKeySealingPCRs)
524+
err = SealDiskKey(log, key, DiskKeySealingPCRs)
525525
if err != nil {
526526
return nil, fmt.Errorf("sealing the fresh disk key failed: %w", err)
527527
}
@@ -548,7 +548,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
548548

549549
log.Noticef("try to convert the legacy key into a sealed key")
550550

551-
err = SealDiskKey(key, DiskKeySealingPCRs)
551+
err = SealDiskKey(log, key, DiskKeySealingPCRs)
552552
if err != nil {
553553
return nil, fmt.Errorf("sealing the legacy disk key into TPM failed: %w", err)
554554
}
@@ -569,7 +569,7 @@ func FetchSealedVaultKey(log *base.LogObject) ([]byte, error) {
569569
}
570570

571571
// SealDiskKey seals key into TPM2.0, with provided PCRs
572-
func SealDiskKey(key []byte, pcrSel tpm2.PCRSelection) error {
572+
func SealDiskKey(log *base.LogObject, key []byte, pcrSel tpm2.PCRSelection) error {
573573
rw, err := tpm2.OpenTPM(TpmDevicePath)
574574
if err != nil {
575575
return err
@@ -647,7 +647,7 @@ func SealDiskKey(key []byte, pcrSel tpm2.PCRSelection) error {
647647

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

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

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

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

673673
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
@@ -98,7 +98,8 @@ func (h *ZFSHandler) SetupDefaultVault() error {
9898
return fmt.Errorf("error in setting up ZFS vault %s:%v", types.SealedDataset, err)
9999
}
100100
// Log the type of key used for unlocking default vault
101-
h.log.Noticef("default zfs vault unlocked")
101+
h.log.Noticef("default zfs vault unlocked using key type: %s",
102+
etpm.CompareLegacyandSealedKey().String())
102103
return nil
103104
}
104105

0 commit comments

Comments
 (0)