mirror of
https://github.com/golang/go
synced 2024-11-17 02:04:48 -07:00
crypto/tls: reject duplicate extensions
Does what it says on the tin. Fixes #51088 Change-Id: I12c0fa6bba1c1ce96c1ad31ba387c77a93f801c9 Reviewed-on: https://go-review.googlesource.com/c/go/+/384894 Reviewed-by: Roland Shoemaker <roland@golang.org> Run-TryBot: Roland Shoemaker <roland@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Damien Neil <dneil@google.com>
This commit is contained in:
parent
aa24255541
commit
1715a86721
@ -384,6 +384,7 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
seenExts := make(map[uint16]bool)
|
||||
for !extensions.Empty() {
|
||||
var extension uint16
|
||||
var extData cryptobyte.String
|
||||
@ -392,6 +393,11 @@ func (m *clientHelloMsg) unmarshal(data []byte) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if seenExts[extension] {
|
||||
return false
|
||||
}
|
||||
seenExts[extension] = true
|
||||
|
||||
switch extension {
|
||||
case extensionServerName:
|
||||
// RFC 6066, Section 3
|
||||
@ -750,6 +756,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
seenExts := make(map[uint16]bool)
|
||||
for !extensions.Empty() {
|
||||
var extension uint16
|
||||
var extData cryptobyte.String
|
||||
@ -758,6 +765,11 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
|
||||
return false
|
||||
}
|
||||
|
||||
if seenExts[extension] {
|
||||
return false
|
||||
}
|
||||
seenExts[extension] = true
|
||||
|
||||
switch extension {
|
||||
case extensionStatusRequest:
|
||||
m.ocspStapling = true
|
||||
|
@ -6,6 +6,7 @@ package tls
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/hex"
|
||||
"math/rand"
|
||||
"reflect"
|
||||
"strings"
|
||||
@ -463,3 +464,23 @@ func TestRejectEmptySCT(t *testing.T) {
|
||||
t.Fatal("Unmarshaled ServerHello with zero-length SCT")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRejectDuplicateExtensions(t *testing.T) {
|
||||
clientHelloBytes, err := hex.DecodeString("010000440303000000000000000000000000000000000000000000000000000000000000000000000000001c0000000a000800000568656c6c6f0000000a000800000568656c6c6f")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to decode test ClientHello: %s", err)
|
||||
}
|
||||
var clientHelloCopy clientHelloMsg
|
||||
if clientHelloCopy.unmarshal(clientHelloBytes) {
|
||||
t.Error("Unmarshaled ClientHello with duplicate extensions")
|
||||
}
|
||||
|
||||
serverHelloBytes, err := hex.DecodeString("02000030030300000000000000000000000000000000000000000000000000000000000000000000000000080005000000050000")
|
||||
if err != nil {
|
||||
t.Fatalf("failed to decode test ServerHello: %s", err)
|
||||
}
|
||||
var serverHelloCopy serverHelloMsg
|
||||
if serverHelloCopy.unmarshal(serverHelloBytes) {
|
||||
t.Fatal("Unmarshaled ServerHello with duplicate extensions")
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user