@@ -45,6 +45,11 @@ type partition struct {
4545Arch archType
4646}
4747
48+ // MarshalBinary encodes p into binary format.
49+ func (p partition ) MarshalBinary () ([]byte , error ) {
50+ return binaryMarshaler {p }.MarshalBinary ()
51+ }
52+
4853// signature represents the SIF signature data object descriptor.
4954type signature struct {
5055Hashtype hashType
@@ -62,6 +67,26 @@ type sbom struct {
6267Format SBOMFormat
6368}
6469
70+ // The binaryMarshaler type is an adapter that allows a type suitable for use with the
71+ // encoding/binary package to be used as an encoding.BinaryMarshaler.
72+ type binaryMarshaler struct { any }
73+
74+ // MarshalBinary encodes m into binary format.
75+ func (m binaryMarshaler ) MarshalBinary () ([]byte , error ) {
76+ var b bytes.Buffer
77+ err := binary .Write (& b , binary .LittleEndian , m .any )
78+ return b .Bytes (), err
79+ }
80+
81+ // The binaryUnmarshaler type is an adapter that allows a type suitable for use with the
82+ // encoding/binary package to be used as an encoding.BinaryUnmarshaler.
83+ type binaryUnmarshaler struct { any }
84+
85+ // UnmarshalBinary decodes b into u.
86+ func (u binaryUnmarshaler ) UnmarshalBinary (b []byte ) error {
87+ return binary .Read (bytes .NewReader (b ), binary .LittleEndian , u .any )
88+ }
89+
6590var errNameTooLarge = errors .New ("name value too large" )
6691
6792// setName encodes name into the name field of d.
@@ -79,27 +104,15 @@ func (d *rawDescriptor) setName(name string) error {
79104
80105var errExtraTooLarge = errors .New ("extra value too large" )
81106
82- // setExtra encodes v into the extra field of d. If the encoding.BinaryMarshaler interface is
83- // implemented by v, it is used for marshaling. Otherwise, binary.Write() is used.
84- func (d * rawDescriptor ) setExtra (v any ) error {
85- if v == nil {
107+ // setExtra marshals metadata from md into the "extra" field of d.
108+ func (d * rawDescriptor ) setExtra (md encoding.BinaryMarshaler ) error {
109+ if md == nil {
86110return nil
87111}
88112
89- var extra []byte
90-
91- if m , ok := v .(encoding.BinaryMarshaler ); ok {
92- b , err := m .MarshalBinary ()
93- if err != nil {
94- return err
95- }
96- extra = b
97- } else {
98- b := new (bytes.Buffer )
99- if err := binary .Write (b , binary .LittleEndian , v ); err != nil {
100- return err
101- }
102- extra = b .Bytes ()
113+ extra , err := md .MarshalBinary ()
114+ if err != nil {
115+ return err
103116}
104117
105118if len (extra ) > len (d .Extra ) {
@@ -113,13 +126,9 @@ func (d *rawDescriptor) setExtra(v any) error {
113126return nil
114127}
115128
116- // getExtra decodes the extra fields of d into v. If the encoding.BinaryUnmarshaler interface is
117- // implemented by v, it is used for unmarshaling. Otherwise, binary.Read() is used.
118- func (d * rawDescriptor ) getExtra (v any ) error {
119- if u , ok := v .(encoding.BinaryUnmarshaler ); ok {
120- return u .UnmarshalBinary (d .Extra [:])
121- }
122- return binary .Read (bytes .NewReader (d .Extra [:]), binary .LittleEndian , v )
129+ // getExtra unmarshals metadata from the "extra" field of d into md.
130+ func (d * rawDescriptor ) getExtra (md encoding.BinaryUnmarshaler ) error {
131+ return md .UnmarshalBinary (d .Extra [:])
123132}
124133
125134// getPartitionMetadata gets metadata for a partition data object.
@@ -130,7 +139,7 @@ func (d rawDescriptor) getPartitionMetadata() (FSType, PartType, string, error)
130139
131140var p partition
132141
133- if err := d .getExtra (& p ); err != nil {
142+ if err := d .getExtra (binaryUnmarshaler { & p } ); err != nil {
134143return 0 , 0 , "" , err
135144}
136145
@@ -189,10 +198,9 @@ func (d Descriptor) ModifiedAt() time.Time { return time.Unix(d.raw.ModifiedAt,
189198// Name returns the name of the data object.
190199func (d Descriptor ) Name () string { return strings .TrimRight (string (d .raw .Name [:]), "\000 " ) }
191200
192- // GetMetadata reads metadata from d into v. If the encoding.BinaryUnmarshaler interface is
193- // implemented by v, it is used for unmarshaling. Otherwise, binary.Read() is used.
194- func (d Descriptor ) GetMetadata (v any ) error {
195- if err := d .raw .getExtra (v ); err != nil {
201+ // GetMetadata unmarshals metadata from the "extra" field of d into md.
202+ func (d Descriptor ) GetMetadata (md encoding.BinaryUnmarshaler ) error {
203+ if err := d .raw .getExtra (md ); err != nil {
196204return fmt .Errorf ("%w" , err )
197205}
198206return nil
@@ -238,7 +246,7 @@ func (d Descriptor) SignatureMetadata() (ht crypto.Hash, fp []byte, err error) {
238246
239247var s signature
240248
241- if err := d .raw .getExtra (& s ); err != nil {
249+ if err := d .raw .getExtra (binaryUnmarshaler { & s } ); err != nil {
242250return ht , fp , fmt .Errorf ("%w" , err )
243251}
244252
@@ -265,7 +273,7 @@ func (d Descriptor) CryptoMessageMetadata() (FormatType, MessageType, error) {
265273
266274var m cryptoMessage
267275
268- if err := d .raw .getExtra (& m ); err != nil {
276+ if err := d .raw .getExtra (binaryUnmarshaler { & m } ); err != nil {
269277return 0 , 0 , fmt .Errorf ("%w" , err )
270278}
271279
@@ -280,7 +288,7 @@ func (d Descriptor) SBOMMetadata() (SBOMFormat, error) {
280288
281289var s sbom
282290
283- if err := d .raw .getExtra (& s ); err != nil {
291+ if err := d .raw .getExtra (binaryUnmarshaler { & s } ); err != nil {
284292return 0 , fmt .Errorf ("%w" , err )
285293}
286294
0 commit comments