Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions pkg/tpm/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -160,17 +160,18 @@ const HCRTM string = "HCRTM"
type FirmwareType string

// TXT TPM1.2 log container signature
const Txt12EvtLogSignature "TXT Event Container\0"
const Txt12EvtLogSignature = "TXT Event Container\000"

// TXT TPM1.2 log versions
const (
Txt12EvtLog_Cntnr_Major_Ver 1
Txt12EvtLog_Cntnr_Minor_Ver 0
Txt12EvtLog_Evt_Major_Ver 1
Txt12EvtLog_Evt_Minor_Ver 0
Txt12EvtLog_Cntnr_Major_Ver = 1
Txt12EvtLog_Cntnr_Minor_Ver = 0
Txt12EvtLog_Evt_Major_Ver = 1
Txt12EvtLog_Evt_Minor_Ver = 0
)

type Txt12EvtType uint32

const (
Txt12EvTypeBase = iota + 0x400
Txt12EvTypePcrMapping
Expand All @@ -188,6 +189,7 @@ const (
)

type Txt20EvtType uint32

const (
Txt20EvTypeBase = iota + 0x400
Txt20EvTypePcrMapping
Expand Down
172 changes: 93 additions & 79 deletions pkg/tpm/intel_txt_log.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
package tpm

import (
"encoding/binary"
"io"
"log"
"os"
)

func (e Txt12EvtType) String() string {
switch e {
case Txt12EvTypeBase:
Expand Down Expand Up @@ -27,141 +34,148 @@ func (e Txt12EvtType) String() string {
case Txt12EvTypeLcpHash:
return "EVTYPE_LCP_HASH"
}
return ""
}

func (e Txt20EvtType) String() string {
case Txt20EvTypeBase
switch e {
case Txt20EvTypeBase:
return "EVTYPE_BASE"
case Txt20EvTypePcrMapping
case Txt20EvTypePcrMapping:
return "EVTYPE_PCRMAPPING"
case Txt20EvTypeHashStart
case Txt20EvTypeHashStart:
return "EVTYPE_HASH_START"
case Txt20EvTypeCombinedHash
case Txt20EvTypeCombinedHash:
return "EVTYPE_COMBINED_HASH"
case Txt20EvTypeMleHash
case Txt20EvTypeMleHash:
return "EVTYPE_MLE_HASH"
case Txt20EvTypeBiosAcRegData
case Txt20EvTypeBiosAcRegData:
return "EVTYPE_BIOSAC_REG_DATA"
case Txt20EvTypeCpuScrtmStat
case Txt20EvTypeCpuScrtmStat:
return "EVTYPE_CPU_SCRTM_STAT"
case Txt20EvTypeLcpControlHash
case Txt20EvTypeLcpControlHash:
return "EVTYPE_LCP_CONTROL_HASH"
case Txt20EvTypeElementsHash
case Txt20EvTypeElementsHash:
return "EVTYPE_ELEMENTS_HASH"
case Txt20EvTypeStmHash
case Txt20EvTypeStmHash:
return "EVTYPE_STM_HASH"
case Txt20EvTypeOsSinitDataCapHash
case Txt20EvTypeOsSinitDataCapHash:
return "EVTYPE_OSSINITDATA_CAP_HASH"
case Txt20EvTypeSinitPubKeyHash
case Txt20EvTypeSinitPubKeyHash:
return "EVTYPE_SINIT_PUBKEY_HASH"
case Txt20EvTypeLcpHash
case Txt20EvTypeLcpHash:
return "EVTYPE_LCP_HASH"
case Txt20EvTypeLcpDetailsHash
case Txt20EvTypeLcpDetailsHash:
return "EVTYPE_LCP_DETAILS_HASH"
case Txt20EvTypeLcpAuthoritiesHash
case Txt20EvTypeLcpAuthoritiesHash:
return "EVTYPE_LCP_AUTHORITIES_HASH"
case Txt20EvTypeNvInfoHash
case Txt20EvTypeNvInfoHash:
return "EVTYPE_NV_INFO_HASH"
case Txt20EvTypeColdBootBiosHash
case Txt20EvTypeColdBootBiosHash:
return "EVTYPE_COLD_BOOT_BIOS_HASH"
case Txt20EvTypeKmHash
case Txt20EvTypeKmHash:
return "EVTYPE_KM_HASH"
case Txt20EvTypeBpmHash
case Txt20EvTypeBpmHash:
return "EVTYPE_BPM_HASH"
case Txt20EvTypeKmInfoHash
case Txt20EvTypeKmInfoHash:
return "EVTYPE_KM_INFO_HASH"
case Txt20EvTypeBpmInfoHash
case Txt20EvTypeBpmInfoHash:
return "EVTYPE_BPM_INFO_HASH"
case Txt20EvTypeBootPolHash
case Txt20EvTypeBootPolHash:
return "EVTYPE_BOOT_POL_HASH"
case Txt20EvTypeCapValue
case Txt20EvTypeCapValue:
return "EVTYPE_CAP_VALUE"
}
return ""
}


func readTxt12Log(path string) (*PCRLog, error) {
var pcrLog PCRLog
var container TxtEventLogContainer
var container TxtEventLogContainer

file, err := os.Open(oath)
defer file.Close()

// TxtEventLogContainer
if err := binary.Read(file, binary.LittleEndian, &container.Signature); err == io.EOF {
break
} else if err != nil {
file, err := os.Open(path)
if err != nil {
log.Println(err)
return nil, err
}
defer file.Close()

// skip reserve
file.Seek(12, 1)
for {
// TxtEventLogContainer
if err := binary.Read(file, binary.LittleEndian, &container.Signature); err == io.EOF {
break
} else if err != nil {
return nil, err
}

if err := binary.Read(file, binary.LittleEndian, &container.ContainerVerMajor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.ContainerVerMinor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventVerMajor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventVerMinor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.Size); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventOffset); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.NextEventOffset); err == io.EOF {
break
} else if err != nil {
return nil, err
}
// skip reserve
file.Seek(12, 1)

if err := binary.Read(file, binary.LittleEndian, &container.ContainerVerMajor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.ContainerVerMinor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventVerMajor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventVerMinor); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.Size); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.PcrEventsOffset); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, binary.LittleEndian, &container.NextEventOffset); err == io.EOF {
break
} else if err != nil {
return nil, err
}

// seek to first PCR event
file.Seek(container.PcrEventOffset, 0)
// seek to first PCR event
file.Seek(int64(container.PcrEventsOffset), 0)

var pcrDigest PCRDigestInfo
var pcrEvent TcgPcrEvent
for {
if err := binary.Read(file, endianess, &pcrEvent.pcrIndex); err == io.EOF {
var pcrDigest PCRDigestInfo
var pcrEvent TcgPcrEvent

if err := binary.Read(file, binary.LittleEndian, &pcrEvent.pcrIndex); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, endianess, &pcrEvent.eventType); err == io.EOF {
if err := binary.Read(file, binary.LittleEndian, &pcrEvent.eventType); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, endianess, &pcrEvent.digest); err == io.EOF {
if err := binary.Read(file, binary.LittleEndian, &pcrEvent.digest); err == io.EOF {
break
} else if err != nil {
return nil, err
}
if err := binary.Read(file, endianess, &pcrEvent.eventSize); err == io.EOF {
if err := binary.Read(file, binary.LittleEndian, &pcrEvent.eventSize); err == io.EOF {
break
} else if err != nil {
return nil, err
}

pcrEvent.event = make([]byte, pcrEvent.eventSize)
if err := binary.Read(file, endianess, &pcrEvent.event); err == io.EOF {
if err := binary.Read(file, binary.LittleEndian, &pcrEvent.event); err == io.EOF {
break
} else if err != nil {
return nil, err
Expand Down
32 changes: 16 additions & 16 deletions pkg/tpm/structures.go
Original file line number Diff line number Diff line change
Expand Up @@ -164,38 +164,38 @@ type PCRLog struct {

// TxtEventLogContainer is log header for TPM1.2 TXT log
type TxtEventLogContainer struct {
Signature [20]uint8
Reserved [12]uint8
Signature [20]uint8
Reserved [12]uint8
ContainerVerMajor uint8
ContainerVerMinor uint8
PcrEventVerMajor uint8
PcrEventVerMinor uint8
Size uint32
PcrEventsOffset uint32
NextEventOffset uint32
PcrEventVerMajor uint8
PcrEventVerMinor uint8
Size uint32
PcrEventsOffset uint32
NextEventOffset uint32
//PcrEvents []byte
}

// TxtHeapEventLogDescr is TPM2 TXT log header before TrEE/UEFI format adoption
type TxtHeapEventLogDescr struct {
Alg uint16
Reserved uint16
PhysAddr uint64
Size uint32
Alg uint16
Reserved uint16
PhysAddr uint64
Size uint32
PcrEventsOffset uint32
NextEventOffset uint32
}

// TxtHeapEventLogPtrElt2 is the Heap Element for TPM2 before TrEE/UEFI format adoption
type TxtHeapEventLogPtrElt2 struct {
Count uint32
EventLogDescr []HeapEventLogDescr
Count uint32
EventLogDescr []TxtHeapEventLogDescr
}

// TxtHeapEventLogPtrElt21 is the Heap Element for TPM2 conforming to TrEE/UEFI format
type TxtHeapEventLogPtrElt21 struct {
PhysicalAddress uint64
PhysicalAddress uint64
AllocatedEventContainerSize uint32
FirstRecordOffset uint32
NextRecordOffset uint32
FirstRecordOffset uint32
NextRecordOffset uint32
}
6 changes: 4 additions & 2 deletions pkg/tpmtool/cryptsetup.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package tpmtool
import (
"crypto/rand"
"encoding/hex"
"log"
// "log"
"os"
"os/exec"
"os/user"
// "os/user"
"path"
"path/filepath"
"syscall"
Expand All @@ -30,6 +30,7 @@ var (
TmpfsFsOptions string
)

/*
func init() {
processUser, err := user.Current()
if err != nil {
Expand All @@ -38,6 +39,7 @@ func init() {

TmpfsFsOptions = path.Join("rw,size=1M,nr_inodes=5k,noexec,nodev,nosuid,uid=", processUser.Uid, ",gid=", processUser.Gid, ",mode=1700")
}
*/

// MountKeystore mounts the tmpfs key store
func MountKeystore() (string, error) {
Expand Down
Loading