From 7c8464c4b0103434c6380318a33c5f6405a4e8ff Mon Sep 17 00:00:00 2001 From: Yogesh Deshpande Date: Tue, 11 Feb 2025 11:43:46 +0000 Subject: [PATCH] Changed NewElement methods to return error instead of nil Signed-off-by: Yogesh Deshpande --- comid/tdx-profile/example_pce_refval_test.go | 18 ++++++++++++++---- comid/tdx-profile/example_qe_refval_test.go | 8 ++++++-- comid/tdx-profile/example_seam_refval_test.go | 10 ++++++++-- comid/tdx-profile/teeadvisoryids.go | 10 +++++----- comid/tdx-profile/teeadvisoryids_test.go | 14 ++++++++------ comid/tdx-profile/teeattributes.go | 6 +++--- comid/tdx-profile/teeattributes_test.go | 9 +++++---- comid/tdx-profile/teeinstanceid.go | 12 ++++++------ comid/tdx-profile/teeinstanceid_test.go | 8 ++++---- comid/tdx-profile/teeisvproid.go | 12 ++++++------ comid/tdx-profile/teeisvproid_test.go | 8 ++++---- comid/tdx-profile/teemiscselect.go | 6 +++--- comid/tdx-profile/teemiscselect_test.go | 9 +++++---- comid/tdx-profile/teepceid.go | 6 +++--- comid/tdx-profile/teepceid_test.go | 16 +++++++++------- comid/tdx-profile/teetcbcompsvn.go | 11 +++++++---- comid/tdx-profile/teetcbstatus.go | 10 +++++----- comid/tdx-profile/teetcbstatus_test.go | 19 +++++++++++-------- 18 files changed, 112 insertions(+), 80 deletions(-) diff --git a/comid/tdx-profile/example_pce_refval_test.go b/comid/tdx-profile/example_pce_refval_test.go index 65da370..38cbec9 100644 --- a/comid/tdx-profile/example_pce_refval_test.go +++ b/comid/tdx-profile/example_pce_refval_test.go @@ -308,19 +308,29 @@ func Example_encode_tdx_pce_refval_with_profile() { } func setTDXPCEMvalExtension(val *comid.Mval) error { - instanceID := NewTeeInstanceID(TestUIntInstance) - err := val.Extensions.Set("instanceid", instanceID) + instanceID, err := NewTeeInstanceID(TestUIntInstance) + if err != nil { + return fmt.Errorf("unable to get teeinstanceID %w", err) + } + err = val.Extensions.Set("instanceid", instanceID) if err != nil { return fmt.Errorf("unable to set teeinstanceID %w", err) } - p := NewTeePCEID(TestPCEID) + p, err := NewTeePCEID(TestPCEID) + if err != nil { + return fmt.Errorf("unable to get NewTeepceID %w", err) + } err = val.Extensions.Set("pceid", p) if err != nil { return fmt.Errorf("unable to set teepceID %w", err) } - c := NewTeeTcbCompSVN(TestCompSVN) + c, err := NewTeeTcbCompSVN(TestCompSVN) + if err != nil { + return fmt.Errorf("failed to get TeeTcbCompSVN %w", err) + } + err = val.Extensions.Set("tcbcompsvn", c) if err != nil { return fmt.Errorf("unable to set teetcbcompsvn: %w", err) diff --git a/comid/tdx-profile/example_qe_refval_test.go b/comid/tdx-profile/example_qe_refval_test.go index 456766b..6823db6 100644 --- a/comid/tdx-profile/example_qe_refval_test.go +++ b/comid/tdx-profile/example_qe_refval_test.go @@ -224,8 +224,12 @@ func setTDXQEMvalExtensions(val *comid.Mval) error { teeMiscSel := TeeMiscSelect([]byte{0xC0, 0x00, 0xFB, 0xFF, 0x00, 0x00}) // Taken from irim-qe-ref.diag // Taken below from irim-qe-ref.diag r := 1 - isvProdID := NewTeeISVProdID(r) - err := val.Extensions.Set("isvprodid", isvProdID) + isvProdID, err := NewTeeISVProdID(r) + if err != nil { + return fmt.Errorf("unable to get isvprodid %w", err) + } + + err = val.Extensions.Set("isvprodid", isvProdID) if err != nil { return fmt.Errorf("unable to set isvprodid %w", err) } diff --git a/comid/tdx-profile/example_seam_refval_test.go b/comid/tdx-profile/example_seam_refval_test.go index 66b5705..1b63681 100644 --- a/comid/tdx-profile/example_seam_refval_test.go +++ b/comid/tdx-profile/example_seam_refval_test.go @@ -223,7 +223,10 @@ func setTDXSeamMvalExtensions(val *comid.Mval) error { return fmt.Errorf("unable to set tcbDate %w", err) } r := []byte{0x01, 0x01} - isvProdID := NewTeeISVProdID(r) + isvProdID, err := NewTeeISVProdID(r) + if err != nil { + return fmt.Errorf("unable to get isvprodid %w", err) + } err = val.Extensions.Set("isvprodid", isvProdID) if err != nil { return fmt.Errorf("unable to set isvprodid %w", err) @@ -239,7 +242,10 @@ func setTDXSeamMvalExtensions(val *comid.Mval) error { return fmt.Errorf("unable to set tcbevalnum %w", err) } - teeAttr := NewTeeAttributes(TestTeeAttributes) + teeAttr, err := NewTeeAttributes(TestTeeAttributes) + if err != nil { + fmt.Errorf("unable to get teeAttributes %w", err) + } err = val.Extensions.Set("attributes", teeAttr) if err != nil { return fmt.Errorf("unable to set attributes %w", err) diff --git a/comid/tdx-profile/teeadvisoryids.go b/comid/tdx-profile/teeadvisoryids.go index 675c6ec..f897878 100644 --- a/comid/tdx-profile/teeadvisoryids.go +++ b/comid/tdx-profile/teeadvisoryids.go @@ -12,21 +12,21 @@ type TeeAdvisoryIDs setType // supplied interface array and returns a pointer to // the AdvisoryIDs. In this version only // Advisory IDs of string type are supported -func NewTeeAvisoryIDs(val []any) *TeeAdvisoryIDs { +func NewTeeAvisoryIDs(val []any) (*TeeAdvisoryIDs, error) { var adv TeeAdvisoryIDs if len(val) == 0 { - return nil + return nil, fmt.Errorf("zero len TeeAdvisoryIDs") } - for _, v := range val { + for i, v := range val { switch t := v.(type) { case string: adv = append(adv, t) default: - return nil + return nil, fmt.Errorf("invalid type: %T for AdvisoryIDs at index: %d", t, i) } } - return &adv + return &adv, nil } // AddTeeAdvisoryIDs add supplied AvisoryIDs to existing AdvisoryIDs diff --git a/comid/tdx-profile/teeadvisoryids_test.go b/comid/tdx-profile/teeadvisoryids_test.go index ebf5be2..0178598 100644 --- a/comid/tdx-profile/teeadvisoryids_test.go +++ b/comid/tdx-profile/teeadvisoryids_test.go @@ -20,17 +20,18 @@ func initAdvisoryIDs() []any { func TestAdvisoryIDs_NewTeeAvisoryIDs_OK(t *testing.T) { a := initAdvisoryIDs() - adv := NewTeeAvisoryIDs(a) - require.NotNil(t, adv) + _, err := NewTeeAvisoryIDs(a) + require.Nil(t, err) } func TestAdvisoryIDs_NewTeeAvisoryIDs_NOK(t *testing.T) { + expectedErr := "invalid type: int for AdvisoryIDs at index: 0" a := make([]any, len(TestAdvisoryIDs)) for i := range TestAdvisoryIDs { a[i] = i } - adv := NewTeeAvisoryIDs(a) - require.Nil(t, adv) + _, err := NewTeeAvisoryIDs(a) + assert.EqualError(t, err, expectedErr) } func TestAdvisoryIDs_AddAdvisoryIDs_OK(t *testing.T) { @@ -53,8 +54,9 @@ func TestAdvisoryIDs_AddAdvisoryIDs_NOK(t *testing.T) { func TestAdvisoryIDs_Valid_OK(t *testing.T) { a := initAdvisoryIDs() - adv := NewTeeAvisoryIDs(a) - err := adv.Valid() + adv, err := NewTeeAvisoryIDs(a) + require.NoError(t, err) + err = adv.Valid() require.NoError(t, err) } diff --git a/comid/tdx-profile/teeattributes.go b/comid/tdx-profile/teeattributes.go index 314bfc6..64cdd0f 100644 --- a/comid/tdx-profile/teeattributes.go +++ b/comid/tdx-profile/teeattributes.go @@ -8,12 +8,12 @@ import "fmt" type TeeAttributes maskType -func NewTeeAttributes(val []byte) *TeeAttributes { +func NewTeeAttributes(val []byte) (*TeeAttributes, error) { if val == nil { - return nil + return nil, fmt.Errorf("nil TeeAttributes") } teeAttributes := TeeAttributes(val) - return &teeAttributes + return &teeAttributes, nil } func (o TeeAttributes) Valid() error { diff --git a/comid/tdx-profile/teeattributes_test.go b/comid/tdx-profile/teeattributes_test.go index 2419b20..c5734f2 100644 --- a/comid/tdx-profile/teeattributes_test.go +++ b/comid/tdx-profile/teeattributes_test.go @@ -11,13 +11,14 @@ import ( ) func TestNewTeeAttributes_NewTeeAttributes_OK(t *testing.T) { - tA := NewTeeAttributes(TestTeeAttributes) - require.NotNil(t, tA) + _, err := NewTeeAttributes(TestTeeAttributes) + require.Nil(t, err) } func TestNewTeeAttributes_NewTeeAttributes_NOK(t *testing.T) { - tA := NewTeeAttributes(nil) - require.Nil(t, tA) + expectedErr := "nil TeeAttributes" + _, err := NewTeeAttributes(nil) + assert.EqualError(t, err, expectedErr) } func TestNewTeeAttributes_Valid_OK(t *testing.T) { diff --git a/comid/tdx-profile/teeinstanceid.go b/comid/tdx-profile/teeinstanceid.go index 6c02245..b1c59f6 100644 --- a/comid/tdx-profile/teeinstanceid.go +++ b/comid/tdx-profile/teeinstanceid.go @@ -20,19 +20,19 @@ type TeeInstanceID struct { // NewTeeInstanceID creates a new InstanceID from the // supplied interface. The supported types are positive integers and // byte array -func NewTeeInstanceID(val interface{}) *TeeInstanceID { +func NewTeeInstanceID(val interface{}) (*TeeInstanceID, error) { switch t := val.(type) { case uint, uint64: - return &TeeInstanceID{val: t} + return &TeeInstanceID{val: t}, nil case []byte: - return &TeeInstanceID{val: t} + return &TeeInstanceID{val: t}, nil case int: if t < 0 { - return nil + return nil, fmt.Errorf("unsupported negative %d TeeInstanceID", t) } - return &TeeInstanceID{val: t} + return &TeeInstanceID{val: t}, nil default: - return nil + return nil, fmt.Errorf("unsupported TeeInstanceID type: %T", t) } } diff --git a/comid/tdx-profile/teeinstanceid_test.go b/comid/tdx-profile/teeinstanceid_test.go index 5abc654..8e97608 100644 --- a/comid/tdx-profile/teeinstanceid_test.go +++ b/comid/tdx-profile/teeinstanceid_test.go @@ -32,8 +32,8 @@ func TestTeeInstanceID_NewTeeInstanceID_OK(t *testing.T) { } for _, tv := range tvs { - inst := NewTeeInstanceID(tv.input) - require.NotNil(t, inst) + _, err := NewTeeInstanceID(tv.input) + require.Nil(t, err) } } @@ -99,8 +99,8 @@ func TestTeeInstanceID_Valid_NOK(t *testing.T) { } func TestTeeInstanceID_MarshalCBOR_Bytes(t *testing.T) { - inst := NewTeeInstanceID(TestByteInstance) - require.NotNil(t, inst) + inst, err := NewTeeInstanceID(TestByteInstance) + require.Nil(t, err) expected := comid.MustHexDecode(t, "43454647") actual, err := inst.MarshalCBOR() fmt.Printf("CBOR: %x\n", actual) diff --git a/comid/tdx-profile/teeisvproid.go b/comid/tdx-profile/teeisvproid.go index 0bd5482..ea9b96e 100644 --- a/comid/tdx-profile/teeisvproid.go +++ b/comid/tdx-profile/teeisvproid.go @@ -20,19 +20,19 @@ type TeeISVProdID struct { // NewTeeISVProdID creates a new TeeISVProdID from the // supplied interface and return a pointer to TeeISVProdID // Supported values are positive integers and byte array -func NewTeeISVProdID(val interface{}) *TeeISVProdID { +func NewTeeISVProdID(val interface{}) (*TeeISVProdID, error) { switch t := val.(type) { case uint, uint64: - return &TeeISVProdID{val: t} + return &TeeISVProdID{val: t}, nil case []byte: - return &TeeISVProdID{val: t} + return &TeeISVProdID{val: t}, nil case int: if t < 0 { - return nil + return nil, fmt.Errorf("negative integer %d for TeeISVProdID", t) } - return &TeeISVProdID{val: t} + return &TeeISVProdID{val: t}, nil default: - return nil + return nil, fmt.Errorf("unsupported TeeISVProdID type: %T", t) } } diff --git a/comid/tdx-profile/teeisvproid_test.go b/comid/tdx-profile/teeisvproid_test.go index 19d7691..110b686 100644 --- a/comid/tdx-profile/teeisvproid_test.go +++ b/comid/tdx-profile/teeisvproid_test.go @@ -32,8 +32,8 @@ func TestISVProdID_NewISVProdID_OK(t *testing.T) { } for _, tv := range tvs { - id := NewTeeISVProdID(tv.input) - require.NotNil(t, id) + _, err := NewTeeISVProdID(tv.input) + require.Nil(t, err) } } @@ -102,8 +102,8 @@ func TestIsvProdID_Valid_NOK(t *testing.T) { } func TestIsvProdID_MarshalCBOR_Bytes(t *testing.T) { - id := NewTeeISVProdID(TestBytesISVProdID) - require.NotNil(t, id) + id, err := NewTeeISVProdID(TestBytesISVProdID) + require.Nil(t, err) expected := comid.MustHexDecode(t, "43010203") actual, err := id.MarshalCBOR() fmt.Printf("CBOR: %x\n", actual) diff --git a/comid/tdx-profile/teemiscselect.go b/comid/tdx-profile/teemiscselect.go index 38e72ab..bfc20ef 100644 --- a/comid/tdx-profile/teemiscselect.go +++ b/comid/tdx-profile/teemiscselect.go @@ -7,13 +7,13 @@ import "fmt" type TeeMiscSelect maskType -func NewTeeMiscSelect(val []byte) *TeeMiscSelect { +func NewTeeMiscSelect(val []byte) (*TeeMiscSelect, error) { var miscSelect TeeMiscSelect if val == nil { - return nil + return nil, fmt.Errorf("nil value for TeeMiscSelect") } miscSelect = TeeMiscSelect(val) - return &miscSelect + return &miscSelect, nil } func (o TeeMiscSelect) Valid() error { diff --git a/comid/tdx-profile/teemiscselect_test.go b/comid/tdx-profile/teemiscselect_test.go index e3d741d..2a796d8 100644 --- a/comid/tdx-profile/teemiscselect_test.go +++ b/comid/tdx-profile/teemiscselect_test.go @@ -11,13 +11,14 @@ import ( ) func TestTeeMiscSelect_NewTeeMiscSelect_OK(t *testing.T) { - tA := NewTeeMiscSelect(TestTeeMiscSelect) - require.NotNil(t, tA) + _, err := NewTeeMiscSelect(TestTeeMiscSelect) + require.Nil(t, err) } func TestTeeMiscSelect_NewTeeMiscSelect_NOK(t *testing.T) { - tA := NewTeeMiscSelect(nil) - require.Nil(t, tA) + expectedErr := "nil value for TeeMiscSelect" + _, err := NewTeeMiscSelect(nil) + assert.EqualError(t, err, expectedErr) } func TestNewTeeMiscSelect_Valid_OK(t *testing.T) { diff --git a/comid/tdx-profile/teepceid.go b/comid/tdx-profile/teepceid.go index fb18e2f..7c9e29b 100644 --- a/comid/tdx-profile/teepceid.go +++ b/comid/tdx-profile/teepceid.go @@ -9,13 +9,13 @@ import ( type TeePCEID string -func NewTeePCEID(val string) *TeePCEID { +func NewTeePCEID(val string) (*TeePCEID, error) { var pceID TeePCEID if val == "" { - return nil + return nil, fmt.Errorf("null string for TeePCEID") } pceID = TeePCEID(val) - return &pceID + return &pceID, nil } func (o TeePCEID) Valid() error { diff --git a/comid/tdx-profile/teepceid_test.go b/comid/tdx-profile/teepceid_test.go index 4f63e31..927ab42 100644 --- a/comid/tdx-profile/teepceid_test.go +++ b/comid/tdx-profile/teepceid_test.go @@ -11,19 +11,21 @@ import ( ) func TestPCEID_NewTeePCEID_OK(t *testing.T) { - pceID := NewTeePCEID(TestPCEID) - require.NotNil(t, pceID) + _, err := NewTeePCEID(TestPCEID) + require.NoError(t, err) } func TestPCEID_NewTeePCEID_NOK(t *testing.T) { - pceID := NewTeePCEID("") - require.Nil(t, pceID) + expectedErr := "null string for TeePCEID" + _, err := NewTeePCEID("") + assert.EqualError(t, err, expectedErr) } func TestPCEID_Valid_OK(t *testing.T) { - pceID := NewTeePCEID(TestPCEID) - err := pceID.Valid() - require.Nil(t, err) + pceID, err := NewTeePCEID(TestPCEID) + require.NoError(t, err) + err = pceID.Valid() + require.NoError(t, err) } func TestPCEID_Valid_NOK(t *testing.T) { diff --git a/comid/tdx-profile/teetcbcompsvn.go b/comid/tdx-profile/teetcbcompsvn.go index 57abd0c..1659b21 100644 --- a/comid/tdx-profile/teetcbcompsvn.go +++ b/comid/tdx-profile/teetcbcompsvn.go @@ -9,15 +9,18 @@ const MaxSVNCount = 16 type TeeTcbCompSvn [MaxSVNCount]TeeSVN -func NewTeeTcbCompSVN(val []uint) *TeeTcbCompSvn { - if len(val) > MaxSVNCount || len(val) == 0 { - return nil +func NewTeeTcbCompSVN(val []uint) (*TeeTcbCompSvn, error) { + if len(val) > MaxSVNCount { + return nil, fmt.Errorf("invalid length %d for TeeTcbCompSVN", len(val)) + } else if len(val) == 0 { + return nil, fmt.Errorf("no value supplied for TeeTcbCompSVN") } + TeeTcbCompSVN := make([]TeeSVN, MaxSVNCount) for i, value := range val { TeeTcbCompSVN[i] = TeeSVN(value) } - return (*TeeTcbCompSvn)(TeeTcbCompSVN) + return (*TeeTcbCompSvn)(TeeTcbCompSVN), nil } // nolint:gocritic diff --git a/comid/tdx-profile/teetcbstatus.go b/comid/tdx-profile/teetcbstatus.go index 9b8f07a..4a65c81 100644 --- a/comid/tdx-profile/teetcbstatus.go +++ b/comid/tdx-profile/teetcbstatus.go @@ -8,21 +8,21 @@ import "fmt" type TeeTcbStatus setType -func NewTeeTcbStatus(val []any) *TeeTcbStatus { +func NewTeeTcbStatus(val []any) (*TeeTcbStatus, error) { var ts TeeTcbStatus if len(val) == 0 { - return nil + return nil, fmt.Errorf("nil value argument") } - for _, v := range val { + for i, v := range val { switch t := v.(type) { case string: ts = append(ts, t) default: - return nil + return nil, fmt.Errorf("invalid type: %T for tcb status at index: %d", t, i) } } - return &ts + return &ts, nil } func (o *TeeTcbStatus) AddTeeTcbStatus(val []any) error { diff --git a/comid/tdx-profile/teetcbstatus_test.go b/comid/tdx-profile/teetcbstatus_test.go index 4509764..15dc398 100644 --- a/comid/tdx-profile/teetcbstatus_test.go +++ b/comid/tdx-profile/teetcbstatus_test.go @@ -20,8 +20,8 @@ func initTcbStatus() []any { func TestTcbStatus_NewTeeTcbStatus_OK(t *testing.T) { s := initTcbStatus() - status := NewTeeTcbStatus(s) - require.NotNil(t, status) + _, err := NewTeeTcbStatus(s) + require.NoError(t, err) } func TestTcbStatus_NewTeeTcbStatus_NOK(t *testing.T) { @@ -29,11 +29,13 @@ func TestTcbStatus_NewTeeTcbStatus_NOK(t *testing.T) { for i := range TestTCBStatus { s[i] = i } - status := NewTeeTcbStatus(s) - require.Nil(t, status) + expectedErr := "invalid type: int for tcb status at index: 0" + _, err := NewTeeTcbStatus(s) + assert.EqualError(t, err, expectedErr) var m []any - status = NewTeeTcbStatus(m) - require.Nil(t, status) + expectedErr = "nil value argument" + _, err = NewTeeTcbStatus(m) + assert.EqualError(t, err, expectedErr) } func TestTcbStatus_AddTcbStatus_OK(t *testing.T) { @@ -56,8 +58,9 @@ func TestTcbStatus_AddTcbStatus_NOK(t *testing.T) { func TestTcbStatus_Valid_OK(t *testing.T) { s := initTcbStatus() - status := NewTeeTcbStatus(s) - err := status.Valid() + status, err := NewTeeTcbStatus(s) + require.Nil(t, err) + err = status.Valid() require.Nil(t, err) }