diff --git a/pkg/tpm/constants.go b/pkg/tpm/constants.go index ad577ce..eac5706 100644 --- a/pkg/tpm/constants.go +++ b/pkg/tpm/constants.go @@ -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 @@ -188,6 +189,7 @@ const ( ) type Txt20EvtType uint32 + const ( Txt20EvTypeBase = iota + 0x400 Txt20EvTypePcrMapping diff --git a/pkg/tpm/intel_txt_log.go b/pkg/tpm/intel_txt_log.go index c8fa1a8..a6ba080 100644 --- a/pkg/tpm/intel_txt_log.go +++ b/pkg/tpm/intel_txt_log.go @@ -1,5 +1,12 @@ package tpm +import ( + "encoding/binary" + "io" + "log" + "os" +) + func (e Txt12EvtType) String() string { switch e { case Txt12EvTypeBase: @@ -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 diff --git a/pkg/tpm/structures.go b/pkg/tpm/structures.go index 85e08a2..bc88895 100644 --- a/pkg/tpm/structures.go +++ b/pkg/tpm/structures.go @@ -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 } diff --git a/pkg/tpmtool/cryptsetup.go b/pkg/tpmtool/cryptsetup.go index fd8a9c3..613d51a 100644 --- a/pkg/tpmtool/cryptsetup.go +++ b/pkg/tpmtool/cryptsetup.go @@ -3,10 +3,10 @@ package tpmtool import ( "crypto/rand" "encoding/hex" - "log" + // "log" "os" "os/exec" - "os/user" + // "os/user" "path" "path/filepath" "syscall" @@ -30,6 +30,7 @@ var ( TmpfsFsOptions string ) +/* func init() { processUser, err := user.Current() if err != nil { @@ -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) { diff --git a/pkg/tpmtool/tpm_state.go b/pkg/tpmtool/tpm_state.go index 4593f00..ce01779 100644 --- a/pkg/tpmtool/tpm_state.go +++ b/pkg/tpmtool/tpm_state.go @@ -1,8 +1,6 @@ package tpmtool import ( - "fmt" - "github.com/systemboot/tpmtool/pkg/tpm" ) @@ -10,26 +8,28 @@ type Pcr struct { // PCR index index uint8 // Current Hash - hash PCRDigestInfo + hash PCRDigestInfo // Event Log - log PCRLog + log tpm.PCRLog } type PcrBank struct { - algId - pcrs [TPMMaxPCRListSize]Pcr + // algId + pcrs [tpm.TPMMaxPCRListSize]Pcr } type TpmState struct { } -// +// func (p *Pcr) Calculate() (PCRDigestInfo, error) { + info := PCRDigestInfo{} + return info, nil } // PCRDigestValue is the hash and algorithm type PCRDigestValue struct { - DigestAlg IAlgHash + DigestAlg tpm.IAlgHash Digest []byte } @@ -40,20 +40,25 @@ type PCRDigestInfo struct { PcrEventData string Digests []PCRDigestValue } -func (p *Pcr) Verify() error { - calculated, err := p.Calculate() - if err != nil { - return err - } - for _, d := range p.hash.Digests { - matched := false - for _, c := range calculated.Digests { - +func (p *Pcr) Verify() error { + // calculated, err := p.Calculate() + //if err != nil { + // return err + //} + return nil + //for _, d := range p.hash.Digests { + // matched := false + // for _, c := range calculated.Digests { + // } + // } + return nil } -func (p *Pcr) FindEvent(evType uint32, evData []byte) (*PCRDigestInfo , error) { +func (p *Pcr) FindEvent(evType uint32, evData []byte) (*PCRDigestInfo, error) { + return nil, nil } func (p *Pcr) ReplaceEvent(evType uint32, evData []byte, ev *PCRDigestInfo) error { + return nil }