github.com/linuxboot/fiano@v1.2.0/pkg/intel/metadata/fit/ent_startup_ac_module_entry_test.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 "encoding/binary" 10 "math/rand" 11 "testing" 12 13 "github.com/stretchr/testify/require" 14 ) 15 16 func randBytes(size uint) []byte { 17 rand.Seed(0) 18 b := make([]byte, int(size)) 19 rand.Read(b) 20 return b 21 } 22 23 func TestEntrySACM_ParseData(t *testing.T) { 24 sizeOffset := EntrySACMDataCommon{}.SizeBinaryOffset() 25 sizeEndOffset := sizeOffset + uint(binary.Size(EntrySACMDataCommon{}.Size)) 26 27 versionOffset := EntrySACMDataCommon{}.HeaderVersionBinaryOffset() 28 versionEndOffset := versionOffset + uint(binary.Size(EntrySACMDataCommon{}.HeaderVersion)) 29 30 keySizeOffset := EntrySACMDataCommon{}.KeySizeBinaryOffset() 31 keySizeEndOffset := keySizeOffset + uint(binary.Size(EntrySACMDataCommon{}.KeySize)) 32 33 entry := EntrySACM{ 34 EntryBase: EntryBase{ 35 DataSegmentBytes: randBytes(65536), 36 HeadersErrors: nil, 37 }, 38 } 39 40 testPositive := func(t *testing.T, headersSize int) { 41 data, err := entry.ParseData() 42 require.NoError(t, err) 43 44 _ = data.GetRSAPubKey() 45 require.Zero(t, len(data.UserArea)) 46 require.Zero(t, len(entry.DataSegmentBytes)-headersSize) 47 require.NotZero(t, data.GetKeySize()) 48 49 var buf bytes.Buffer 50 _, err = data.WriteTo(&buf) 51 require.NoError(t, err) 52 53 dataCopy, err := ParseSACMData(&buf) 54 require.NoError(t, err) 55 56 require.Equal(t, data, dataCopy) 57 } 58 59 t.Run("SACMv0", func(t *testing.T) { 60 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[versionOffset:versionEndOffset], uint32(ACHeaderVersion0)) 61 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[sizeOffset:sizeEndOffset], uint32(entrySACMData0Size)>>2) 62 dataSize, err := EntrySACMParseSize(entry.DataSegmentBytes[:65536]) 63 require.NoError(t, err) 64 entry.DataSegmentBytes = entry.DataSegmentBytes[:dataSize] 65 t.Run("positive", func(t *testing.T) { 66 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[keySizeOffset:keySizeEndOffset], 256>>2) 67 testPositive(t, int(entrySACMData0Size)) 68 }) 69 }) 70 71 t.Run("SACMv3", func(t *testing.T) { 72 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[versionOffset:versionEndOffset], uint32(ACHeaderVersion3)) 73 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[sizeOffset:sizeEndOffset], uint32(entrySACMData3Size)>>2) 74 dataSize, err := EntrySACMParseSize(entry.DataSegmentBytes[:65536]) 75 require.NoError(t, err) 76 entry.DataSegmentBytes = entry.DataSegmentBytes[:dataSize] 77 t.Run("positive", func(t *testing.T) { 78 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[keySizeOffset:keySizeEndOffset], 384>>2) 79 testPositive(t, int(entrySACMData3Size)) 80 }) 81 t.Run("negative_keySize", func(t *testing.T) { 82 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[keySizeOffset:keySizeEndOffset], 256>>2) 83 84 _, err := entry.ParseData() 85 require.Error(t, err) 86 }) 87 }) 88 89 t.Run("SACM_invalidVersion", func(t *testing.T) { 90 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[versionOffset:versionEndOffset], 0x12345678) 91 binary.LittleEndian.PutUint32(entry.DataSegmentBytes[sizeOffset:sizeEndOffset], uint32(entrySACMData0Size)>>2) 92 dataSize, err := EntrySACMParseSize(entry.DataSegmentBytes[:65536]) 93 require.NoError(t, err) 94 entry.DataSegmentBytes = entry.DataSegmentBytes[:dataSize] 95 96 _, err = entry.ParseData() 97 require.Error(t, err) 98 }) 99 }