Skip to content

Commit

Permalink
many: move resealing backend from boot to fdestate's backend
Browse files Browse the repository at this point in the history
We also make the FDE state manager install the the backend function to
be associated with the state.
  • Loading branch information
valentindavid authored and pedronis committed Jul 26, 2024
1 parent f57be06 commit 225786c
Show file tree
Hide file tree
Showing 12 changed files with 304 additions and 236 deletions.
21 changes: 13 additions & 8 deletions boot/assets_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"github.com/snapcore/snapd/dirs"
"github.com/snapcore/snapd/gadget"
"github.com/snapcore/snapd/logger"
fdeBackend "github.com/snapcore/snapd/overlord/fdestate/backend"
"github.com/snapcore/snapd/secboot"
"github.com/snapcore/snapd/secboot/keys"
"github.com/snapcore/snapd/seed"
Expand All @@ -52,10 +53,14 @@ var _ = Suite(&assetsSuite{})

func (s *assetsSuite) SetUpTest(c *C) {
s.baseBootenvSuite.SetUpTest(c)

restore := boot.MockResealKeyForBootChains(fdeBackend.ResealKeyForBootChains)
s.AddCleanup(restore)

c.Assert(os.MkdirAll(boot.InitramfsUbuntuBootDir, 0755), IsNil)
c.Assert(os.MkdirAll(boot.InitramfsUbuntuSeedDir, 0755), IsNil)

restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error { return nil })
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error { return nil })
s.AddCleanup(restore)

s.AddCleanup(archtest.MockArchitecture("amd64"))
Expand Down Expand Up @@ -780,7 +785,7 @@ func (s *assetsSuite) testUpdateObserverUpdateMockedWithReseal(c *C, seedRole st

// everything is set up, trigger a reseal
resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -885,7 +890,7 @@ func (s *assetsSuite) TestUpdateObserverUpdateExistingAssetMocked(c *C) {

// everything is set up, trigger reseal
resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -1641,7 +1646,7 @@ func (s *assetsSuite) TestUpdateObserverCanceledSimpleAfterBackupMocked(c *C) {
"shim": []string{shimHash},
})
resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -1801,7 +1806,7 @@ func (s *assetsSuite) TestUpdateObserverCanceledNoActionsMocked(c *C) {
obs, _ := s.uc20UpdateObserverEncryptedSystemMockedBootloader(c)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -2560,7 +2565,7 @@ func (s *assetsSuite) TestUpdateObserverReseal(c *C) {
runKernelBf,
}

restore = boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -2697,7 +2702,7 @@ func (s *assetsSuite) TestUpdateObserverCanceledReseal(c *C) {
}

resealCalls := 0
restore = boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
c.Assert(params.ModelParams, HasLen, 1)
mp := params.ModelParams[0]
Expand Down Expand Up @@ -2808,7 +2813,7 @@ func (s *assetsSuite) TestUpdateObserverUpdateMockedNonEncryption(c *C) {

// make sure that no reseal is triggered
resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down
54 changes: 32 additions & 22 deletions boot/boot_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import (
"github.com/snapcore/snapd/bootloader/bootloadertest"
"github.com/snapcore/snapd/dirs"
"github.com/snapcore/snapd/osutil/kcmdline"
fdeBackend "github.com/snapcore/snapd/overlord/fdestate/backend"
"github.com/snapcore/snapd/release"
"github.com/snapcore/snapd/secboot"
"github.com/snapcore/snapd/seed"
Expand Down Expand Up @@ -137,6 +138,9 @@ type baseBootenv20Suite struct {
func (s *baseBootenv20Suite) SetUpTest(c *C) {
s.baseBootenvSuite.SetUpTest(c)

restore := boot.MockResealKeyForBootChains(fdeBackend.ResealKeyForBootChains)
s.AddCleanup(restore)

var err error
s.kern1, err = snap.ParsePlaceInfoFromSnapFileName("pc-kernel_1.snap")
c.Assert(err, IsNil)
Expand Down Expand Up @@ -1118,7 +1122,7 @@ func (s *bootenv20Suite) TestCoreParticipant20SetNextNewKernelSnapWithReseal(c *
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -1238,7 +1242,7 @@ func (s *bootenv20Suite) TestCoreParticipant20SetNextNewUnassertedKernelSnapWith
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -1356,7 +1360,7 @@ func (s *bootenv20Suite) TestCoreParticipant20SetNextSameKernelSnapNoReseal(c *C
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("unexpected call")
})
Expand Down Expand Up @@ -1476,7 +1480,7 @@ func (s *bootenv20Suite) TestCoreParticipant20SetNextSameUnassertedKernelSnapNoR
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("unexpected call")
})
Expand Down Expand Up @@ -1840,7 +1844,7 @@ func (s *bootenv20Suite) TestCoreParticipant20SetNextNewBaseSnapNoReseal(c *C) {
model := coreDev.Model()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -2230,7 +2234,7 @@ func (s *bootenv20Suite) TestMarkBootSuccessful20KernelUpdateWithReseal(c *C) {
c.Assert(err, IsNil)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -2459,7 +2463,7 @@ func (s *bootenv20Suite) TestMarkBootSuccessful20BootAssetsUpdateHappy(c *C) {
c.Assert(coreDev.HasModeenv(), Equals, true)

resealCalls := 0
restore = boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -2599,7 +2603,7 @@ func (s *bootenv20Suite) TestMarkBootSuccessful20BootAssetsStableStateHappy(c *C
c.Assert(coreDev.HasModeenv(), Equals, true)

resealCalls := 0
restore = boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -2764,7 +2768,7 @@ func (s *bootenv20Suite) TestMarkBootSuccessful20BootUnassertedKernelAssetsStabl
c.Assert(coreDev.HasModeenv(), Equals, true)

resealCalls := 0
restore = boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -3405,6 +3409,9 @@ var _ = Suite(&bootConfigSuite{})
func (s *bootConfigSuite) SetUpTest(c *C) {
s.baseBootenvSuite.SetUpTest(c)

restore := boot.MockResealKeyForBootChains(fdeBackend.ResealKeyForBootChains)
s.AddCleanup(restore)

s.bootloader = bootloadertest.Mock("trusted", c.MkDir()).WithTrustedAssets()
s.bootloader.StaticCommandLine = "this is mocked panic=-1"
s.bootloader.CandidateStaticCommandLine = "mocked candidate panic=-1"
Expand Down Expand Up @@ -3437,7 +3444,7 @@ func (s *bootConfigSuite) TestBootConfigUpdateHappyNoKeysNoReseal(c *C) {
c.Assert(m.WriteTo(""), IsNil)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -3489,7 +3496,7 @@ func (s *bootConfigSuite) testBootConfigUpdateHappyWithReseal(c *C, cmdlineAppen
newCmdline := strutil.JoinNonEmpty([]string{
"snapd_recovery_mode=run mocked candidate panic=-1", cmdlineAppend}, " ")
resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
c.Assert(params, NotNil)
c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -3542,7 +3549,7 @@ func (s *bootConfigSuite) testBootConfigUpdateHappyNoChange(c *C, cmdlineAppend
c.Assert(m.WriteTo(""), IsNil)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down Expand Up @@ -3707,7 +3714,7 @@ volumes:
c.Assert(m.WriteTo(""), IsNil)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
c.Assert(params, NotNil)
c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -3767,7 +3774,7 @@ volumes:
// reseal does not happen, because the gadget overrides the static
// command line which is part of boot config, thus there's no resulting
// change in the command lines tracked in modeenv and no need to reseal
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("unexpected call")
})
Expand Down Expand Up @@ -3804,6 +3811,9 @@ var _ = Suite(&bootKernelCommandLineSuite{})
func (s *bootKernelCommandLineSuite) SetUpTest(c *C) {
s.baseBootenvSuite.SetUpTest(c)

restore := boot.MockResealKeyForBootChains(fdeBackend.ResealKeyForBootChains)
s.AddCleanup(restore)

data := []byte("foobar")
// SHA3-384
dataHash := "0fa8abfbdaf924ad307b74dd2ed183b9a4a398891a2f6bac8fd2db7041b77f068580f9c6c66f699b496c2da1cbcc7ed8"
Expand Down Expand Up @@ -3859,7 +3869,7 @@ func (s *bootKernelCommandLineSuite) SetUpTest(c *C) {

s.resealCommandLines = nil
s.resealCalls = 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore = fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
s.resealCalls++
c.Assert(params, NotNil)
c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -4131,7 +4141,7 @@ volumes:
c.Assert(s.modeenvWithEncryption.WriteTo(""), IsNil)

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("reseal fails")
})
Expand Down Expand Up @@ -4275,7 +4285,7 @@ func (s *bootKernelCommandLineSuite) TestCommandLineUpdateUC20OverSpuriousReboot
s.stampSealedKeys(c, dirs.GlobalRootDir)

resealPanic := false
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
s.resealCalls++
c.Logf("reseal call %v", s.resealCalls)
c.Assert(params, NotNil)
Expand Down Expand Up @@ -4856,7 +4866,7 @@ func (s *bootenv20Suite) TestCoreParticipant20UndoKernelSnapInstallNewWithReseal
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -4970,7 +4980,7 @@ func (s *bootenv20Suite) TestCoreParticipant20UndoUnassertedKernelSnapInstallNew
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++

c.Assert(params.ModelParams, HasLen, 1)
Expand Down Expand Up @@ -5082,7 +5092,7 @@ func (s *bootenv20Suite) TestCoreParticipant20UndoKernelSnapInstallSameNoReseal(
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("unexpected call to mocked secbootResealKeys")
})
Expand Down Expand Up @@ -5202,7 +5212,7 @@ func (s *bootenv20Suite) TestCoreParticipant20UndoUnassertedKernelSnapInstallSam
defer r()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return fmt.Errorf("unexpected call")
})
Expand Down Expand Up @@ -5380,7 +5390,7 @@ func (s *bootenv20Suite) TestCoreParticipant20UndoBaseSnapInstallNewNoReseal(c *
model := coreDev.Model()

resealCalls := 0
restore := boot.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
restore := fdeBackend.MockSecbootResealKeys(func(params *secboot.ResealKeysParams) error {
resealCalls++
return nil
})
Expand Down
14 changes: 7 additions & 7 deletions boot/bootchain.go
Original file line number Diff line number Diff line change
Expand Up @@ -182,12 +182,12 @@ func (b byBootChainOrder) Less(i, j int) bool {
return false
}

type predictableBootChains []bootChain
type PredictableBootChains []bootChain

// hasUnrevisionedKernels returns true if any of the chains have an
// unrevisioned kernel. Revisions will not be set for unasserted
// kernels.
func (pbc predictableBootChains) hasUnrevisionedKernels() bool {
func (pbc PredictableBootChains) hasUnrevisionedKernels() bool {
for i := range pbc {
if pbc[i].KernelRevision == "" {
return true
Expand All @@ -196,7 +196,7 @@ func (pbc predictableBootChains) hasUnrevisionedKernels() bool {
return false
}

func toPredictableBootChains(chains []bootChain) predictableBootChains {
func ToPredictableBootChains(chains []bootChain) PredictableBootChains {
if chains == nil {
return nil
}
Expand All @@ -221,7 +221,7 @@ const (
// are clearly different it returns bootChainDifferent.
// If it would return bootChainEquivalent but the chains contain
// unrevisioned kernels it will return bootChainUnrevisioned.
func predictableBootChainsEqualForReseal(pb1, pb2 predictableBootChains) bootChainEquivalence {
func predictableBootChainsEqualForReseal(pb1, pb2 PredictableBootChains) bootChainEquivalence {
pb1JSON, err := json.Marshal(pb1)
if err != nil {
return bootChainDifferent
Expand Down Expand Up @@ -308,10 +308,10 @@ func bootAssetsToLoadChains(assets []bootAsset, kernelBootFile bootloader.BootFi
// other information
type predictableBootChainsWrapperForStorage struct {
ResealCount int `json:"reseal-count"`
BootChains predictableBootChains `json:"boot-chains"`
BootChains PredictableBootChains `json:"boot-chains"`
}

func readBootChains(path string) (pbc predictableBootChains, resealCount int, err error) {
func readBootChains(path string) (pbc PredictableBootChains, resealCount int, err error) {
inf, err := os.Open(path)
if err != nil {
if os.IsNotExist(err) {
Expand All @@ -327,7 +327,7 @@ func readBootChains(path string) (pbc predictableBootChains, resealCount int, er
return wrapped.BootChains, wrapped.ResealCount, nil
}

func writeBootChains(pbc predictableBootChains, path string, resealCount int) error {
func WriteBootChains(pbc PredictableBootChains, path string, resealCount int) error {
if err := os.MkdirAll(filepath.Dir(path), 0755); err != nil {
return fmt.Errorf("cannot create device fde state directory: %v", err)
}
Expand Down
Loading

0 comments on commit 225786c

Please sign in to comment.