mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
crypto/tls: don't select TLS 1.2 cipher suites in prior versions.
AES-GCM cipher suites are only defined for TLS 1.2, although there's nothing really version specific about them. However, development versions of NSS (meaning Firefox and Chrome) have an issue where they'll advertise TLS 1.2-only cipher suites in a TLS 1.1 ClientHello but then balk when the server selects one. This change causes Go clients not to advertise TLS 1.2 cipher suites unless TLS 1.2 is being used, and prevents servers from selecting them unless TLS 1.2 has been negotiated. https://code.google.com/p/chromium/issues/detail?id=297151 https://bugzilla.mozilla.org/show_bug.cgi?id=919677 R=golang-dev, rsc CC=golang-dev https://golang.org/cl/13573047
This commit is contained in:
parent
649a2a9be5
commit
f752484c74
4 changed files with 77 additions and 6 deletions
|
|
@ -104,6 +104,53 @@ func TestNoCompressionOverlap(t *testing.T) {
|
|||
testClientHelloFailure(t, clientHello, alertHandshakeFailure)
|
||||
}
|
||||
|
||||
func TestTLS12OnlyCipherSuites(t *testing.T) {
|
||||
// Test that a Server doesn't select a TLS 1.2-only cipher suite when
|
||||
// the client negotiates TLS 1.1.
|
||||
var zeros [32]byte
|
||||
|
||||
clientHello := &clientHelloMsg{
|
||||
vers: VersionTLS11,
|
||||
random: zeros[:],
|
||||
cipherSuites: []uint16{
|
||||
// The Server, by default, will use the client's
|
||||
// preference order. So the GCM cipher suite
|
||||
// will be selected unless it's excluded because
|
||||
// of the version in this ClientHello.
|
||||
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
|
||||
TLS_RSA_WITH_RC4_128_SHA,
|
||||
},
|
||||
compressionMethods: []uint8{compressionNone},
|
||||
supportedCurves: []uint16{curveP256, curveP384, curveP521},
|
||||
supportedPoints: []uint8{pointFormatUncompressed},
|
||||
}
|
||||
|
||||
c, s := net.Pipe()
|
||||
var reply interface{}
|
||||
var clientErr error
|
||||
go func() {
|
||||
cli := Client(c, testConfig)
|
||||
cli.vers = clientHello.vers
|
||||
cli.writeRecord(recordTypeHandshake, clientHello.marshal())
|
||||
reply, clientErr = cli.readHandshake()
|
||||
c.Close()
|
||||
}()
|
||||
config := *testConfig
|
||||
config.CipherSuites = clientHello.cipherSuites
|
||||
Server(s, &config).Handshake()
|
||||
s.Close()
|
||||
if clientErr != nil {
|
||||
t.Fatal(clientErr)
|
||||
}
|
||||
serverHello, ok := reply.(*serverHelloMsg)
|
||||
if !ok {
|
||||
t.Fatalf("didn't get ServerHello message in reply. Got %v\n", reply)
|
||||
}
|
||||
if s := serverHello.cipherSuite; s != TLS_RSA_WITH_RC4_128_SHA {
|
||||
t.Fatalf("bad cipher suite from server: %x", s)
|
||||
}
|
||||
}
|
||||
|
||||
func TestAlertForwarding(t *testing.T) {
|
||||
c, s := net.Pipe()
|
||||
go func() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue