Commit 7e90f7b4 authored by Adam Langley's avatar Adam Langley

crypto/tls: fix NPN extension parsing.

I typoed the code and tried to parse all the way to the end of the
message. Therefore it fails when NPN is not the last extension in the
ServerHello.

Fixes #4088.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/6637052
parent 49a5c28a
...@@ -247,6 +247,8 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool { ...@@ -247,6 +247,8 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
m.nextProtoNeg = false m.nextProtoNeg = false
m.serverName = "" m.serverName = ""
m.ocspStapling = false m.ocspStapling = false
m.ticketSupported = false
m.sessionTicket = nil
if len(data) == 0 { if len(data) == 0 {
// ClientHello is optionally followed by extension data // ClientHello is optionally followed by extension data
...@@ -478,6 +480,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool { ...@@ -478,6 +480,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
m.nextProtoNeg = false m.nextProtoNeg = false
m.nextProtos = nil m.nextProtos = nil
m.ocspStapling = false m.ocspStapling = false
m.ticketSupported = false
if len(data) == 0 { if len(data) == 0 {
// ServerHello is optionally followed by extension data // ServerHello is optionally followed by extension data
...@@ -507,14 +510,14 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool { ...@@ -507,14 +510,14 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
switch extension { switch extension {
case extensionNextProtoNeg: case extensionNextProtoNeg:
m.nextProtoNeg = true m.nextProtoNeg = true
d := data d := data[:length]
for len(d) > 0 { for len(d) > 0 {
l := int(d[0]) l := int(d[0])
d = d[1:] d = d[1:]
if l == 0 || l > len(d) { if l == 0 || l > len(d) {
return false return false
} }
m.nextProtos = append(m.nextProtos, string(d[0:l])) m.nextProtos = append(m.nextProtos, string(d[:l]))
d = d[l:] d = d[l:]
} }
case extensionStatusRequest: case extensionStatusRequest:
......
...@@ -129,6 +129,12 @@ func (*clientHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value { ...@@ -129,6 +129,12 @@ func (*clientHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
for i := range m.supportedCurves { for i := range m.supportedCurves {
m.supportedCurves[i] = uint16(rand.Intn(30000)) m.supportedCurves[i] = uint16(rand.Intn(30000))
} }
if rand.Intn(10) > 5 {
m.ticketSupported = true
if rand.Intn(10) > 5 {
m.sessionTicket = randomBytes(rand.Intn(300), rand)
}
}
return reflect.ValueOf(m) return reflect.ValueOf(m)
} }
...@@ -151,6 +157,13 @@ func (*serverHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value { ...@@ -151,6 +157,13 @@ func (*serverHelloMsg) Generate(rand *rand.Rand, size int) reflect.Value {
} }
} }
if rand.Intn(10) > 5 {
m.ocspStapling = true
}
if rand.Intn(10) > 5 {
m.ticketSupported = true
}
return reflect.ValueOf(m) return reflect.ValueOf(m)
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment