mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
crypto/tls: Server can specify an unadvertised cipher suite
During the TLS handshake, check the cipher suite the server selects is one of those offered in the ClientHello. The code was checking it was in the larger list that was sometimes whittled down for the ClientHello. Fixes #13174 Change-Id: Iad8eebbcfa5027f30403b9700c43cfa949e135bb Reviewed-on: https://go-review.googlesource.com/16698 Reviewed-by: Adam Langley <agl@golang.org> Run-TryBot: Adam Langley <agl@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Russ Cox <rsc@golang.org>
This commit is contained in:
parent
b717090e01
commit
db4ef216cc
2 changed files with 53 additions and 2 deletions
|
|
@ -19,6 +19,7 @@ import (
|
|||
"os/exec"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
|
@ -643,3 +644,53 @@ func TestNoIPAddressesInSNI(t *testing.T) {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestServerSelectingUnconfiguredCipherSuite(t *testing.T) {
|
||||
// This checks that the server can't select a cipher suite that the
|
||||
// client didn't offer. See #13174.
|
||||
|
||||
c, s := net.Pipe()
|
||||
errChan := make(chan error, 1)
|
||||
|
||||
go func() {
|
||||
client := Client(c, &Config{
|
||||
ServerName: "foo",
|
||||
CipherSuites: []uint16{TLS_RSA_WITH_AES_128_GCM_SHA256},
|
||||
})
|
||||
errChan <- client.Handshake()
|
||||
}()
|
||||
|
||||
var header [5]byte
|
||||
if _, err := io.ReadFull(s, header[:]); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
recordLen := int(header[3])<<8 | int(header[4])
|
||||
|
||||
record := make([]byte, recordLen)
|
||||
if _, err := io.ReadFull(s, record); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
// Create a ServerHello that selects a different cipher suite than the
|
||||
// sole one that the client offered.
|
||||
serverHello := &serverHelloMsg{
|
||||
vers: VersionTLS12,
|
||||
random: make([]byte, 32),
|
||||
cipherSuite: TLS_RSA_WITH_AES_256_GCM_SHA384,
|
||||
}
|
||||
serverHelloBytes := serverHello.marshal()
|
||||
|
||||
s.Write([]byte{
|
||||
byte(recordTypeHandshake),
|
||||
byte(VersionTLS12 >> 8),
|
||||
byte(VersionTLS12 & 0xff),
|
||||
byte(len(serverHelloBytes) >> 8),
|
||||
byte(len(serverHelloBytes)),
|
||||
})
|
||||
s.Write(serverHelloBytes)
|
||||
s.Close()
|
||||
|
||||
if err := <-errChan; !strings.Contains(err.Error(), "unconfigured cipher") {
|
||||
t.Fatalf("Expected error about unconfigured cipher suite but got %q", err)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue