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  }