Skip to content

Commit 394f627

Browse files
author
Matthew Garrett
committed
Add an initial implementation of parsing event types
Raw events aren't enormously helpful. Add an initial implementation of some of the basic event types - this is largely a scratch proposal so we can figure out API design.
1 parent b60a7cc commit 394f627

File tree

1 file changed

+281
-0
lines changed

1 file changed

+281
-0
lines changed

attest/eventlog_events.go

+281
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,281 @@
1+
// Copyright 2019 Google Inc.
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4+
// use this file except in compliance with the License. You may obtain a copy of
5+
// the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11+
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12+
// License for the specific language governing permissions and limitations under
13+
// the License.
14+
15+
package attest
16+
17+
import (
18+
"bytes"
19+
"encoding/binary"
20+
"errors"
21+
"unicode/utf16"
22+
"unicode/utf8"
23+
)
24+
25+
const (
26+
// BIOS Events (TCG PC Client Specific Implementation Specification for Conventional BIOS 1.21)
27+
prebootCert EventType = 0x00000000
28+
postCode EventType = 0x00000001
29+
unused EventType = 0x00000002
30+
noAction EventType = 0x00000003
31+
separator EventType = 0x00000004
32+
action EventType = 0x00000005
33+
eventTag EventType = 0x00000006
34+
sCRTMContents EventType = 0x00000007
35+
sCRTMVersion EventType = 0x00000008
36+
cpuMicrocode EventType = 0x00000009
37+
platformConfigFlags EventType = 0x0000000A
38+
tableOfDevices EventType = 0x0000000B
39+
compactHash EventType = 0x0000000C
40+
ipl EventType = 0x0000000D
41+
iplPartitionData EventType = 0x0000000E
42+
nonhostCode EventType = 0x0000000F
43+
nonhostConfig EventType = 0x00000010
44+
nonhostInfo EventType = 0x00000011
45+
omitBootDeviceEvents EventType = 0x00000012
46+
47+
// EFI Events (TCG EFI Platform Specification Version 1.22)
48+
efiEventBase EventType = 0x80000000
49+
efiVariableDriverConfig EventType = 0x80000001
50+
efiVariableBoot EventType = 0x80000002
51+
efiBootServicesApplication EventType = 0x80000003
52+
efiBootServicesDriver EventType = 0x80000004
53+
efiRuntimeServicesDriver EventType = 0x80000005
54+
efiGPTEvent EventType = 0x80000006
55+
efiAction EventType = 0x80000007
56+
efiPlatformFirmwareBlob EventType = 0x80000008
57+
efiHandoffTables EventType = 0x80000009
58+
efiHCRTMEvent EventType = 0x80000010
59+
efiVariableAuthority EventType = 0x800000e0
60+
)
61+
62+
type eventID uint32
63+
64+
const (
65+
smbios eventID = 0x00
66+
bisCertificate eventID = 0x01
67+
postBIOSROM eventID = 0x02
68+
escdeventID eventID = 0x03
69+
cmos eventID = 0x04
70+
nvram eventID = 0x05
71+
optionROMExecute eventID = 0x06
72+
optionROMConfiguration eventID = 0x07
73+
)
74+
75+
type TPMEvent interface {
76+
eventType() EventType
77+
base() rawEvent
78+
}
79+
80+
type stringEvent struct {
81+
rawEvent
82+
Message string
83+
}
84+
85+
type PrebootCertEvent struct {
86+
rawEvent
87+
}
88+
89+
type PostEvent struct {
90+
stringEvent
91+
}
92+
93+
type NoActionEvent struct {
94+
rawEvent
95+
}
96+
97+
type SeparatorEvent struct {
98+
rawEvent
99+
}
100+
101+
type ActionEvent struct {
102+
stringEvent
103+
}
104+
105+
type EventTagEvent struct {
106+
rawEvent
107+
EventID eventID
108+
EventData []byte
109+
}
110+
111+
type CRTMContentEvent struct {
112+
stringEvent
113+
}
114+
115+
type CRTMEvent struct {
116+
stringEvent
117+
}
118+
119+
type MicrocodeEvent struct {
120+
stringEvent
121+
}
122+
123+
type PlatformConfigFlagsEvent struct {
124+
rawEvent
125+
}
126+
127+
type TableOfDevicesEvent struct {
128+
rawEvent
129+
}
130+
131+
type CompactHashEvent struct {
132+
rawEvent
133+
}
134+
135+
type IPLEvent struct {
136+
stringEvent
137+
}
138+
139+
type IPLPartitionEvent struct {
140+
rawEvent
141+
}
142+
143+
type NonHostCodeEvent struct {
144+
rawEvent
145+
}
146+
147+
type NonHostConfigEvent struct {
148+
rawEvent
149+
}
150+
151+
type NonHostInfoEvent struct {
152+
rawEvent
153+
}
154+
155+
type OmitBootDeviceEventsEvent struct {
156+
stringEvent
157+
}
158+
159+
func (event rawEvent) base() rawEvent {
160+
return event
161+
}
162+
163+
func (event rawEvent) eventType() EventType {
164+
return event.typ
165+
}
166+
167+
func parseStringData(b []byte) (string, error) {
168+
var buf []uint16
169+
for i := 0; i < len(b); i += 2 {
170+
if b[i+1] != 0x00 {
171+
buf = nil
172+
break
173+
}
174+
buf = append(buf, binary.LittleEndian.Uint16(b[i:]))
175+
}
176+
177+
if buf != nil {
178+
return string(utf16.Decode(buf)), nil
179+
}
180+
181+
if !utf8.Valid(b) {
182+
return "", errors.New("invalid UTF-8 string")
183+
}
184+
185+
return string(b), nil
186+
}
187+
188+
func ParseEvents(events *EventLog) ([]TPMEvent, error) {
189+
var parsedEvents []TPMEvent
190+
191+
for _, event := range events.rawEvents {
192+
buf := bytes.NewBuffer(event.data)
193+
switch event.typ {
194+
case prebootCert: // 0x00
195+
var parsedEvent PrebootCertEvent
196+
parsedEvent.rawEvent = event
197+
parsedEvents = append(parsedEvents, parsedEvent)
198+
case postCode: // 0x01
199+
var parsedEvent PostEvent
200+
parsedEvent.rawEvent = event
201+
parsedEvent.Message, _ = parseStringData(event.data)
202+
parsedEvents = append(parsedEvents, parsedEvent)
203+
case noAction: // 0x03
204+
var parsedEvent NoActionEvent
205+
parsedEvent.rawEvent = event
206+
parsedEvents = append(parsedEvents, parsedEvent)
207+
case separator: // 0x04
208+
var parsedEvent SeparatorEvent
209+
parsedEvent.rawEvent = event
210+
parsedEvents = append(parsedEvents, parsedEvent)
211+
case action: // 0x05
212+
var parsedEvent ActionEvent
213+
parsedEvent.rawEvent = event
214+
parsedEvent.Message, _ = parseStringData(event.data)
215+
parsedEvents = append(parsedEvents, parsedEvent)
216+
case eventTag: // 0x06
217+
var parsedEvent EventTagEvent
218+
parsedEvent.rawEvent = event
219+
if err := binary.Read(buf, binary.LittleEndian, &parsedEvent.EventID); err != nil {
220+
continue
221+
}
222+
parsedEvent.EventData = event.data[4:]
223+
parsedEvents = append(parsedEvents, parsedEvent)
224+
case sCRTMContents: // 0x07
225+
var parsedEvent CRTMContentEvent
226+
parsedEvent.rawEvent = event
227+
parsedEvent.Message, _ = parseStringData(event.data)
228+
parsedEvents = append(parsedEvents, parsedEvent)
229+
case sCRTMVersion: // 0x08
230+
var parsedEvent CRTMEvent
231+
parsedEvent.rawEvent = event
232+
parsedEvent.Message, _ = parseStringData(event.data)
233+
parsedEvents = append(parsedEvents, parsedEvent)
234+
case cpuMicrocode: // 0x09
235+
var parsedEvent MicrocodeEvent
236+
parsedEvent.rawEvent = event
237+
parsedEvent.Message, _ = parseStringData(event.data)
238+
parsedEvents = append(parsedEvents, parsedEvent)
239+
case platformConfigFlags: // 0x0a
240+
var parsedEvent PlatformConfigFlagsEvent
241+
parsedEvent.rawEvent = event
242+
parsedEvents = append(parsedEvents, parsedEvent)
243+
case tableOfDevices: // 0x0b
244+
var parsedEvent TableOfDevicesEvent
245+
parsedEvent.rawEvent = event
246+
parsedEvents = append(parsedEvents, parsedEvent)
247+
case compactHash: // 0x0c
248+
var parsedEvent CompactHashEvent
249+
parsedEvent.rawEvent = event
250+
parsedEvents = append(parsedEvents, parsedEvent)
251+
case ipl: // 0x0d
252+
var parsedEvent IPLEvent
253+
parsedEvent.rawEvent = event
254+
parsedEvent.Message, _ = parseStringData(event.data)
255+
parsedEvents = append(parsedEvents, parsedEvent)
256+
case iplPartitionData: // 0x0e
257+
var parsedEvent IPLPartitionEvent
258+
parsedEvent.rawEvent = event
259+
parsedEvents = append(parsedEvents, parsedEvent)
260+
case nonhostCode: // 0x0f
261+
var parsedEvent NonHostCodeEvent
262+
parsedEvent.rawEvent = event
263+
parsedEvents = append(parsedEvents, parsedEvent)
264+
case nonhostConfig: // 0x10
265+
var parsedEvent NonHostConfigEvent
266+
parsedEvent.rawEvent = event
267+
parsedEvents = append(parsedEvents, parsedEvent)
268+
case nonhostInfo: // 0x11
269+
var parsedEvent NonHostInfoEvent
270+
parsedEvent.rawEvent = event
271+
parsedEvents = append(parsedEvents, parsedEvent)
272+
case omitBootDeviceEvents: // 0x0f
273+
var parsedEvent OmitBootDeviceEventsEvent
274+
parsedEvent.rawEvent = event
275+
parsedEvent.Message, _ = parseStringData(event.data)
276+
parsedEvents = append(parsedEvents, parsedEvent)
277+
}
278+
}
279+
280+
return parsedEvents, nil
281+
}

0 commit comments

Comments
 (0)