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  }