diff --git a/handshake_messages.go b/handshake_messages.go index 2ea4ddb..694bd91 100644 --- a/handshake_messages.go +++ b/handshake_messages.go @@ -813,7 +813,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool { } sctLen := int(d[0])<<8 | int(d[1]) d = d[2:] - if len(d) < sctLen { + if sctLen == 0 || len(d) < sctLen { return false } m.scts = append(m.scts, d[:sctLen]) diff --git a/handshake_messages_test.go b/handshake_messages_test.go index cb3634c..f1154d4 100644 --- a/handshake_messages_test.go +++ b/handshake_messages_test.go @@ -305,3 +305,21 @@ func TestRejectEmptySCTList(t *testing.T) { t.Fatal("Unmarshaled ServerHello with empty SCT list") } } + +func TestRejectEmptySCT(t *testing.T) { + // Not only must the SCT list be non-empty, but the SCT elements must + // not be zero length. + + var random [32]byte + serverHello := serverHelloMsg{ + vers: VersionTLS12, + random: random[:], + scts: [][]byte{nil}, + } + serverHelloBytes := serverHello.marshal() + + var serverHelloCopy serverHelloMsg + if serverHelloCopy.unmarshal(serverHelloBytes) { + t.Fatal("Unmarshaled ServerHello with zero-length SCT") + } +}