github.com/xyproto/u-root@v6.0.1-0.20200302025726-5528e0c77a3c+incompatible/cmds/core/sluinit/uinit.go (about) 1 // Copyright 2019 the u-root Authors. All rights reserved 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package main 6 7 import ( 8 "flag" 9 "log" 10 "os" 11 12 slaunch "github.com/u-root/u-root/pkg/securelaunch" 13 "github.com/u-root/u-root/pkg/securelaunch/policy" 14 "github.com/u-root/u-root/pkg/securelaunch/tpm" 15 ) 16 17 var ( 18 slDebug = flag.Bool("d", false, "enable debug logs") 19 ) 20 21 func checkDebugFlag() { 22 /* 23 * check if uroot.uinitargs=-d is set in kernel cmdline. 24 * if set, slaunch.Debug is set to log.Printf. 25 */ 26 flag.Parse() 27 28 if flag.NArg() > 1 { 29 log.Fatal("Incorrect number of arguments") 30 } 31 32 if *slDebug { 33 slaunch.Debug = log.Printf 34 slaunch.Debug("debug flag is set. Logging Enabled.") 35 } 36 } 37 38 /* 39 * main parses platform policy file, and based on the inputs, 40 * performs measurements and then launches a target kernel. 41 * 42 * steps followed by sluinit: 43 * 1. if debug flag is set, enable logging. 44 * 2. gets the TPM handle 45 * 3. Gets secure launch policy file entered by user. 46 * 4. calls collectors to collect measurements(hashes) a.k.a evidence. 47 */ 48 func main() { 49 checkDebugFlag() 50 51 slaunch.Debug("********Step 1: init completed. starting main ********") 52 tpmDev, err := tpm.GetHandle() 53 if err != nil { 54 log.Printf("tpm.getHandle failed. err=%v", err) 55 os.Exit(1) 56 } 57 defer tpmDev.Close() 58 59 slaunch.Debug("********Step 2: locate and parse SL Policy ********") 60 p, err := policy.Get() 61 if err != nil { 62 log.Printf("failed to get policy err=%v", err) 63 os.Exit(1) 64 } 65 slaunch.Debug("policy file successfully parsed") 66 67 slaunch.Debug("********Step 3: Collecting Evidence ********") 68 for _, c := range p.Collectors { 69 slaunch.Debug("Input Collector: %v", c) 70 if e := c.Collect(tpmDev); e != nil { 71 log.Printf("Collector %v failed, err = %v", c, e) 72 } 73 } 74 slaunch.Debug("Collectors completed") 75 76 slaunch.Debug("********Step 4: Write eventlog to /boot partition*********") 77 if e := p.EventLog.Persist(); e != nil { 78 log.Printf("EventLog.Persist() failed err=%v", e) 79 os.Exit(1) 80 } 81 82 slaunch.Debug("********Step 5: Launcher called ********") 83 err = p.Launcher.Boot(tpmDev) 84 log.Printf("Boot failed. err=%s", err) 85 }