Test empty extensions fields are omitted.

For historical reasons, TLS allows ServerHellos (and ClientHellos)
without extensions to omit the extensions fields entirely.
https://github.com/openssl/openssl/pull/4296 reports this is even
necessary for compatibility with extension-less clients. We continue to
do so, but add a test for it anyway.

Change-Id: I63c2e3a5f298674eb21952fca6914dad07d7c245
Reviewed-on: https://boringssl-review.googlesource.com/19864
Commit-Queue: Steven Valdez <svaldez@google.com>
Reviewed-by: Steven Valdez <svaldez@google.com>
CQ-Verified: CQ bot account: commit-bot@chromium.org <commit-bot@chromium.org>
This commit is contained in:
David Benjamin 2017-08-31 00:19:57 -04:00 committed by CQ bot account: commit-bot@chromium.org
parent 2762b3542d
commit 0a471910b4
4 changed files with 30 additions and 0 deletions

View File

@ -1427,6 +1427,10 @@ type ProtocolBugs struct {
// and ServerHello messages to be present, but empty. // and ServerHello messages to be present, but empty.
EmptyExtensions bool EmptyExtensions bool
// ExpectOmitExtensions, if true, causes the client to reject
// ServerHello messages that do not omit extensions.
ExpectOmitExtensions bool
// ExpectRecordSplitting, if true, causes application records to only be // ExpectRecordSplitting, if true, causes application records to only be
// accepted if they follow a 1/n-1 record split. // accepted if they follow a 1/n-1 record split.
ExpectRecordSplitting bool ExpectRecordSplitting bool

View File

@ -579,6 +579,10 @@ NextCipherSuite:
return errors.New("tls: ServerHello parameters did not match HelloRetryRequest") return errors.New("tls: ServerHello parameters did not match HelloRetryRequest")
} }
if c.config.Bugs.ExpectOmitExtensions && !serverHello.omitExtensions {
return errors.New("tls: ServerHello did not omit extensions")
}
hs := &clientHandshakeState{ hs := &clientHandshakeState{
c: c, c: c,
serverHello: serverHello, serverHello: serverHello,

View File

@ -974,6 +974,7 @@ func (m *serverHelloMsg) unmarshal(data []byte) bool {
if len(data) == 0 && m.vers < VersionTLS13 { if len(data) == 0 && m.vers < VersionTLS13 {
// Extension data is optional before TLS 1.3. // Extension data is optional before TLS 1.3.
m.extensions = serverExtensions{} m.extensions = serverExtensions{}
m.omitExtensions = true
return true return true
} }
if len(data) < 2 { if len(data) < 2 {

View File

@ -12565,6 +12565,21 @@ func addExtraHandshakeTests() {
// Test that omitted and empty extensions blocks are tolerated. // Test that omitted and empty extensions blocks are tolerated.
func addOmitExtensionsTests() { func addOmitExtensionsTests() {
// Check the ExpectOmitExtensions setting works.
testCases = append(testCases, testCase{
testType: serverTest,
name: "ExpectOmitExtensions",
config: Config{
MinVersion: VersionTLS12,
MaxVersion: VersionTLS12,
Bugs: ProtocolBugs{
ExpectOmitExtensions: true,
},
},
shouldFail: true,
expectedLocalError: "tls: ServerHello did not omit extensions",
})
for _, ver := range tlsVersions { for _, ver := range tlsVersions {
if ver.version > VersionTLS12 { if ver.version > VersionTLS12 {
continue continue
@ -12579,6 +12594,9 @@ func addOmitExtensionsTests() {
SessionTicketsDisabled: true, SessionTicketsDisabled: true,
Bugs: ProtocolBugs{ Bugs: ProtocolBugs{
OmitExtensions: true, OmitExtensions: true,
// With no client extensions, the ServerHello must not have
// extensions. It should then omit the extensions field.
ExpectOmitExtensions: true,
}, },
}, },
}) })
@ -12592,6 +12610,9 @@ func addOmitExtensionsTests() {
SessionTicketsDisabled: true, SessionTicketsDisabled: true,
Bugs: ProtocolBugs{ Bugs: ProtocolBugs{
EmptyExtensions: true, EmptyExtensions: true,
// With no client extensions, the ServerHello must not have
// extensions. It should then omit the extensions field.
ExpectOmitExtensions: true,
}, },
}, },
}) })