Skip to content

Commit cb14bd8

Browse files
committed
crypto/tls: fix sessionState marshaling
Change-Id: I2910f322256c521dd03b1dc23d117defdcd0aa54 Reviewed-on: https://go-review.googlesource.com/c/go/+/232662 Run-TryBot: Katie Hockman <katie@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Filippo Valsorda <filippo@golang.org>
1 parent 66ee975 commit cb14bd8

File tree

1 file changed

+15
-17
lines changed

1 file changed

+15
-17
lines changed

src/crypto/tls/ticket.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

5150
func (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

Comments
 (0)