@@ -23,8 +23,8 @@ type sessionState struct {
2323 vers uint16
2424 cipherSuite uint16
2525 masterSecret []byte // opaque master_secret<1..2^16-1>;
26- // struct { opaque certificate<1..2^32-1> } Certificate ;
27- certificates [][]byte // Certificate certificate_list<0 ..2^16 -1>;
26+ // uint16 num_certificates ;
27+ certificates [][]byte // opaque certificate<1 ..2^32 -1>;
2828
2929 // usedOldKey is true if the ticket from which this session came from
3030 // was encrypted with an older key and thus should be refreshed.
@@ -38,35 +38,33 @@ func (m *sessionState) marshal() []byte {
3838 b .AddUint16LengthPrefixed (func (b * cryptobyte.Builder ) {
3939 b .AddBytes (m .masterSecret )
4040 })
41- b .AddUint16LengthPrefixed (func (b * cryptobyte.Builder ) {
42- for _ , cert := range m .certificates {
43- b .AddUint32LengthPrefixed (func (b * cryptobyte.Builder ) {
44- b .AddBytes (cert )
45- })
46- }
47- })
41+ b .AddUint16 (uint16 (len (m .certificates )))
42+ for _ , cert := range m .certificates {
43+ b .AddUint32LengthPrefixed (func (b * cryptobyte.Builder ) {
44+ b .AddBytes (cert )
45+ })
46+ }
4847 return b .BytesOrPanic ()
4948}
5049
5150func (m * sessionState ) unmarshal (data []byte ) bool {
5251 * m = sessionState {usedOldKey : m .usedOldKey }
5352 s := cryptobyte .String (data )
53+ var numCerts uint16
5454 if ok := s .ReadUint16 (& m .vers ) &&
5555 m .vers != VersionTLS13 &&
5656 s .ReadUint16 (& m .cipherSuite ) &&
5757 readUint16LengthPrefixed (& s , & m .masterSecret ) &&
58- len (m .masterSecret ) != 0 ; ! ok {
58+ len (m .masterSecret ) != 0 &&
59+ s .ReadUint16 (& numCerts ); ! ok {
5960 return false
6061 }
61- var certList cryptobyte.String
62- if ! s .ReadUint16LengthPrefixed (& certList ) {
63- return false
64- }
65- for ! certList .Empty () {
62+
63+ for i := 0 ; i < int (numCerts ); i ++ {
6664 var certLen uint32
67- certList .ReadUint32 (& certLen )
65+ s .ReadUint32 (& certLen )
6866 var cert []byte
69- if certLen == 0 || ! certList .ReadBytes (& cert , int (certLen )) {
67+ if certLen == 0 || ! s .ReadBytes (& cert , int (certLen )) {
7068 return false
7169 }
7270 m .certificates = append (m .certificates , cert )
0 commit comments