carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1//go:build linux
2
3package release
4
5import (
6 "golang.org/x/sys/unix"
7 "os"
8 "path/filepath"
9 "testing"
10
11 "github.com/carlosframework/platform/internal/rootstate"
12)
13
14func TestPlan14P3GenerationLegacyPinBootBoundary(t *testing.T) {
15 path := filepath.Join(t.TempDir(), "app")
16 if err := os.WriteFile(path, []byte("app"), 0600); err != nil {
17 t.Fatal(err)
18 }
19 f, err := os.Open(path)
20 if err != nil {
21 t.Fatal(err)
22 }
23 defer f.Close()
24 id, err := rootstate.Identity(f)
25 if err != nil {
26 t.Fatal(err)
27 }
28 current, err := rootstate.ObjectIdentity(f)
29 if err != nil {
30 t.Fatal(err)
31 }
32 if err := generationFileIdentity(path, id, rootstate.FileIdentity{}, current.Boot); err != nil {
33 t.Fatal(err)
34 }
35 for _, boot := range []string{"", "old-boot"} {
36 if err := generationFileIdentity(path, id, rootstate.FileIdentity{}, boot); err == nil {
37 t.Fatal("legacy identity accepted across boot")
38 }
39 }
40}
41
42func TestPlan14GenerationPinsPrivateMount(t *testing.T) {
43 const path = "/usr/bin/true"
44 for _, p := range []string{"/", "/usr", "/usr/bin", path} {
45 var st unix.Stat_t
46 if err := unix.Lstat(p, &st); err != nil {
47 t.Fatal(err)
48 }
49 if st.Uid != 0 {
50 t.Skipf("root-owned fixture unavailable: %s uid=%d", p, st.Uid)
51 }
52 }
53 f, err := rootstate.OpenAuthorityFile(path)
54 if os.IsNotExist(err) {
55 t.Skip("system executable unavailable")
56 }
57 if err != nil {
58 t.Fatal(err)
59 }
60 defer f.Close()
61 id, err := rootstate.Identity(f)
62 if err != nil {
63 t.Fatal(err)
64 }
65 proof, err := rootstate.PersistentIdentity(f)
66 if err != nil {
67 t.Fatal(err)
68 }
69 proof.MountRoot, proof.MountPoint = "/usr/bin", "/usr/bin"
70 if err = generationFileIdentity(path, id, proof, proof.Boot); err != nil {
71 t.Fatal("private mount proof refused by pins", err)
72 }
73 proof.MountRoot = "/substituted"
74 if err = generationFileIdentity(path, id, proof, proof.Boot); err == nil {
75 t.Fatal("substituted source accepted")
76 }
77}
78