@@ -18,6 +18,7 @@ import (
1818 "bytes"
1919 "errors"
2020 "fmt"
21+ "slices"
2122 "testing"
2223
2324 "golang.org/x/crypto/cryptobyte"
@@ -33,7 +34,7 @@ func (e *MTCLogEntry) unmarshal(data []byte) error {
3334 return errors .New ("malformed extension list length" )
3435 }
3536
36- e . Extensions = nil
37+ var extensions [] MTCLogEntryExtension
3738 for ! extListStr .Empty () {
3839 var ext MTCLogEntryExtension
3940 if ! extListStr .ReadUint16 ((* uint16 )(& ext .Type )) {
@@ -44,55 +45,55 @@ func (e *MTCLogEntry) unmarshal(data []byte) error {
4445 return fmt .Errorf ("failed to read extension length" )
4546 }
4647 ext .Data = append ([]byte (nil ), extDataStr ... )
47- if n := len (e . Extensions ); n > 0 {
48- if ext .Type < e . Extensions [n - 1 ].Type {
49- return fmt .Errorf ("mtc: entry extensions out of order (type %d after %d)" , ext .Type , e . Extensions [n - 1 ].Type )
48+ if n := len (extensions ); n > 0 {
49+ if ext .Type < extensions [n - 1 ].Type {
50+ return fmt .Errorf ("mtc: entry extensions out of order (type %d after %d)" , ext .Type , extensions [n - 1 ].Type )
5051 }
51- if ext .Type == e . Extensions [n - 1 ].Type {
52+ if ext .Type == extensions [n - 1 ].Type {
5253 return fmt .Errorf ("mtc: duplicate entry extension type %d" , ext .Type )
5354 }
5455 }
55- e . Extensions = append (e . Extensions , ext )
56+ extensions = append (extensions , ext )
5657 }
5758
58- if ! s .ReadUint16 ((* uint16 )(& e .Type )) {
59+ var entryType EntryType
60+ if ! s .ReadUint16 ((* uint16 )(& entryType )) {
5961 return errors .New ("missing entry type" )
6062 }
6163
62- if e . Type != MTCLogEntryTypeNull && e . Type != MTCLogEntryTypeTBSCert {
63- return fmt .Errorf ("unknown or unsupported log entry type %d" , e . Type )
64+ if entryType != MTCLogEntryTypeNull && entryType != MTCLogEntryTypeTBSCert {
65+ return fmt .Errorf ("unknown or unsupported log entry type %d" , entryType )
6466 }
6567
66- if e . Type == MTCLogEntryTypeNull && ! s .Empty () {
68+ if entryType == MTCLogEntryTypeNull && ! s .Empty () {
6769 return fmt .Errorf ("null entry must have empty data" )
6870 }
6971
70- e .EntryData = append ([]byte (nil ), s ... )
72+ * e = MTCLogEntry {
73+ extensions : extensions ,
74+ entryType : entryType ,
75+ entryData : slices .Clone (s ),
76+ }
7177 return nil
7278}
7379
7480func TestMTCLogEntry_RoundTrip (t * testing.T ) {
7581 tests := []struct {
7682 name string
77- entry MTCLogEntry
83+ entry * MTCLogEntry
7884 }{
7985 {
80- name : "null entry no extensions" ,
81- entry : MTCLogEntry {
82- Type : MTCLogEntryTypeNull ,
83- },
86+ name : "null entry no extensions" ,
87+ entry : New (nil ),
8488 },
8589 {
8690 name : "tbs cert entry with sorted extensions" ,
87- entry : MTCLogEntry {
88- Type : MTCLogEntryTypeTBSCert ,
89- EntryData : []byte ("fake-der-octets" ),
90- Extensions : []MTCLogEntryExtension {
91- {Type : 1 , Data : []byte ("ext-1-data" )},
92- {Type : 5 , Data : []byte ("ext-5-data" )},
93- {Type : 10 , Data : []byte ("" )},
94- },
95- },
91+ entry : New (
92+ []byte ("fake-der-octets" ),
93+ MTCLogEntryExtension {Type : 1 , Data : []byte ("ext-1-data" )},
94+ MTCLogEntryExtension {Type : 5 , Data : []byte ("ext-5-data" )},
95+ MTCLogEntryExtension {Type : 10 , Data : []byte ("" )},
96+ ),
9697 },
9798 }
9899
@@ -108,78 +109,71 @@ func TestMTCLogEntry_RoundTrip(t *testing.T) {
108109 t .Fatalf ("unmarshal() unexpected error: %v" , err )
109110 }
110111
111- if got .Type != tc .entry .Type {
112- t .Errorf ("Type = %d, want %d" , got .Type , tc .entry .Type )
112+ if got .Type () != tc .entry .Type () {
113+ t .Errorf ("Type() = %d, want %d" , got .Type () , tc .entry .Type () )
113114 }
114- if ! bytes .Equal (got .EntryData , tc .entry .EntryData ) {
115- t .Errorf ("EntryData = %x, want %x" , got .EntryData , tc .entry .EntryData )
115+ if ! bytes .Equal (got .EntryData () , tc .entry .EntryData () ) {
116+ t .Errorf ("EntryData() = %x, want %x" , got .EntryData () , tc .entry .EntryData () )
116117 }
117118
118- if len (got .Extensions ) != len (tc .entry .Extensions ) {
119- t .Fatalf ("len(Extensions) = %d, want %d" , len (got .Extensions ), len (tc .entry .Extensions ))
119+ gotExts := got .Extensions ()
120+ wantExts := tc .entry .Extensions ()
121+ if len (gotExts ) != len (wantExts ) {
122+ t .Fatalf ("len(Extensions) = %d, want %d" , len (gotExts ), len (wantExts ))
120123 }
121- for i := range got . Extensions {
122- if got . Extensions [i ].Type != tc . entry . Extensions [i ].Type || ! bytes .Equal (got . Extensions [i ].Data , tc . entry . Extensions [i ].Data ) {
123- t .Errorf ("Extension[%d] = %+v, want %+v" , i , got . Extensions [i ], tc . entry . Extensions [i ])
124+ for i := range gotExts {
125+ if gotExts [i ].Type != wantExts [i ].Type || ! bytes .Equal (gotExts [i ].Data , wantExts [i ].Data ) {
126+ t .Errorf ("Extension[%d] = %+v, want %+v" , i , gotExts [i ], wantExts [i ])
124127 }
125128 }
126129 })
127130 }
128131}
129132
130133func TestMTCLogEntry_MarshalErrors (t * testing.T ) {
134+ nullWithData := New ([]byte ("unexpected-data" ))
135+ nullWithData .entryType = MTCLogEntryTypeNull
136+
131137 tests := []struct {
132138 name string
133- entry MTCLogEntry
139+ entry * MTCLogEntry
134140 wantErr bool
135141 }{
136142 {
137- name : "trailing data on null entry" ,
138- entry : MTCLogEntry {
139- Type : MTCLogEntryTypeNull ,
140- EntryData : []byte ("unexpected-data" ),
141- },
143+ name : "trailing data on null entry" ,
144+ entry : nullWithData ,
142145 wantErr : true ,
143146 },
144147 {
145148 name : "duplicate extensions with same data" ,
146- entry : MTCLogEntry {
147- Type : MTCLogEntryTypeTBSCert ,
148- Extensions : []MTCLogEntryExtension {
149- {Type : 2 , Data : []byte ("data-a" )},
150- {Type : 2 , Data : []byte ("data-a" )},
151- },
152- },
149+ entry : New (
150+ []byte ("fake-der" ),
151+ MTCLogEntryExtension {Type : 2 , Data : []byte ("data-a" )},
152+ MTCLogEntryExtension {Type : 2 , Data : []byte ("data-a" )},
153+ ),
153154 wantErr : true ,
154155 },
155156 {
156157 name : "duplicate extensions with different data" ,
157- entry : MTCLogEntry {
158- Type : MTCLogEntryTypeTBSCert ,
159- Extensions : []MTCLogEntryExtension {
160- {Type : 2 , Data : []byte ("data-a" )},
161- {Type : 2 , Data : []byte ("data-b" )},
162- },
163- },
158+ entry : New (
159+ []byte ("fake-der" ),
160+ MTCLogEntryExtension {Type : 2 , Data : []byte ("data-a" )},
161+ MTCLogEntryExtension {Type : 2 , Data : []byte ("data-b" )},
162+ ),
164163 wantErr : true ,
165164 },
166165 {
167166 name : "unsorted extensions" ,
168- entry : MTCLogEntry {
169- Type : MTCLogEntryTypeTBSCert ,
170- Extensions : []MTCLogEntryExtension {
171- {Type : 5 , Data : []byte ("data-5" )},
172- {Type : 1 , Data : []byte ("data-1" )},
173- },
174- },
167+ entry : New (
168+ []byte ("fake-der" ),
169+ MTCLogEntryExtension {Type : 5 , Data : []byte ("data-5" )},
170+ MTCLogEntryExtension {Type : 1 , Data : []byte ("data-1" )},
171+ ),
175172 wantErr : true ,
176173 },
177174 {
178- name : "entry size exceeds tile limit" ,
179- entry : MTCLogEntry {
180- Type : MTCLogEntryTypeTBSCert ,
181- EntryData : make ([]byte , MaxMTCLogEntrySize ),
182- },
175+ name : "entry size exceeds tile limit" ,
176+ entry : New (make ([]byte , MaxMTCLogEntrySize )),
183177 wantErr : true ,
184178 },
185179 }
@@ -210,7 +204,7 @@ func TestMTCLogEntry_UnmarshalErrors(t *testing.T) {
210204 {
211205 name : "trailing data on null entry" ,
212206 mutate : func (b []byte ) []byte {
213- e := MTCLogEntry { Type : MTCLogEntryTypeNull }
207+ e := New ( nil )
214208 data , _ := e .Marshal ()
215209 return append (data , 0x00 )
216210 },
0 commit comments