github.com/linuxboot/fiano@v1.2.0/pkg/intel/metadata/fit/ent_key_manifest_record.go (about) 1 // Copyright 2017-2021 the LinuxBoot 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 fit 6 7 import ( 8 "bytes" 9 "errors" 10 "fmt" 11 "io" 12 13 "github.com/linuxboot/fiano/pkg/intel/metadata/bg/bgkey" 14 "github.com/linuxboot/fiano/pkg/intel/metadata/cbnt/cbntkey" 15 "github.com/linuxboot/fiano/pkg/intel/metadata/common/bgheader" 16 ) 17 18 // EntryKeyManifestRecord represents a FIT entry of type "Key Manifest Record" (0x0B) 19 type EntryKeyManifestRecord struct{ EntryBase } 20 21 var _ EntryCustomGetDataSegmentSizer = (*EntryKeyManifestRecord)(nil) 22 23 func (entry *EntryKeyManifestRecord) CustomGetDataSegmentSize(firmware io.ReadSeeker) (uint64, error) { 24 return uint64(entry.Headers.Size.Uint32()), nil 25 } 26 27 var _ EntryCustomRecalculateHeaderser = (*EntryKeyManifestRecord)(nil) 28 29 // CustomRecalculateHeaders recalculates metadata to be consistent with data. 30 // For example, it fixes checksum, data size, entry type and so on. 31 func (entry *EntryKeyManifestRecord) CustomRecalculateHeaders() error { 32 mostCommonRecalculateHeadersOfEntry(entry) 33 34 entry.Headers.Size.SetUint32(uint32(len(entry.DataSegmentBytes))) 35 return nil 36 } 37 38 // Reader creates io.ReadSeeker from EntryKeyManifestRecord 39 func (entry *EntryKeyManifestRecord) Reader() *bytes.Reader { 40 return bytes.NewReader(entry.DataSegmentBytes) 41 } 42 43 // ParseData creates EntryKeyManifestRecord from EntryKeyManifest 44 func (entry *EntryKeyManifestRecord) ParseData() (*bgkey.Manifest, *cbntkey.Manifest, error) { 45 r := bytes.NewReader(entry.DataSegmentBytes) 46 version, err := bgheader.DetectBGV(r) 47 if err != nil { 48 return nil, nil, err 49 } 50 switch version { 51 case bgheader.Version10: 52 manifest := bgkey.NewManifest() 53 _, err = manifest.ReadFrom(r) 54 if err != nil && !errors.Is(err, io.EOF) { 55 return nil, nil, err 56 } 57 return manifest, nil, nil 58 case bgheader.Version20: 59 manifest := cbntkey.NewManifest() 60 _, err = manifest.ReadFrom(r) 61 if err != nil && !errors.Is(err, io.EOF) { 62 return nil, nil, err 63 } 64 return nil, manifest, nil 65 default: 66 return nil, nil, fmt.Errorf("failed to parse KeyManifest, err: %v", err) 67 } 68 } 69 70 // ParseKeyManifest returns a key manifest if it was able to 71 // parse one. 72 func (table Table) ParseKeyManifest(firmware []byte) (*bgkey.Manifest, *cbntkey.Manifest, error) { 73 hdr := table.First(EntryTypeKeyManifestRecord) 74 if hdr == nil { 75 return nil, nil, ErrNotFound{} 76 } 77 78 return hdr.GetEntry(firmware).(*EntryKeyManifestRecord).ParseData() 79 }