go-attestation/attest/eventlog_workarounds.go

87 lines
2.3 KiB
Go

// Copyright 2020 Google Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
package attest
type elWorkaround struct {
id string
affectedPCR int
apply func(e *EventLog) error
}
// inject3 appends two new events into the event log.
func inject3(e *EventLog, pcr int, data1, data2, data3 string) error {
if err := inject(e, pcr, data1); err != nil {
return err
}
if err := inject(e, pcr, data2); err != nil {
return err
}
return inject(e, pcr, data3)
}
// inject2 appends two new events into the event log.
func inject2(e *EventLog, pcr int, data1, data2 string) error {
if err := inject(e, pcr, data1); err != nil {
return err
}
return inject(e, pcr, data2)
}
// inject appends a new event into the event log.
func inject(e *EventLog, pcr int, data string) error {
evt := rawEvent{
data: []byte(data),
index: pcr,
sequence: e.rawEvents[len(e.rawEvents)-1].sequence + 1,
}
for _, alg := range e.Algs {
h := alg.cryptoHash().New()
h.Write([]byte(data))
evt.digests = append(evt.digests, h.Sum(nil))
}
e.rawEvents = append(e.rawEvents, evt)
return nil
}
const (
ebsInvocation = "Exit Boot Services Invocation"
ebsSuccess = "Exit Boot Services Returned with Success"
ebsFailure = "Exit Boot Services Returned with Failure"
)
var eventlogWorkarounds = []elWorkaround{
{
id: "EBS Invocation + Success",
affectedPCR: 5,
apply: func(e *EventLog) error {
return inject2(e, 5, ebsInvocation, ebsSuccess)
},
},
{
id: "EBS Invocation + Failure",
affectedPCR: 5,
apply: func(e *EventLog) error {
return inject2(e, 5, ebsInvocation, ebsFailure)
},
},
{
id: "EBS Invocation + Failure + Success",
affectedPCR: 5,
apply: func(e *EventLog) error {
return inject3(e, 5, ebsInvocation, ebsFailure, ebsSuccess)
},
},
}