[Server Padding] Don't pad on resumption handshake. Resumption handshakes don't pass back certificates, so servers shouldn't send back padding in these circumstances. Change-Id: I88f2a27cb9c15927a52c529f83fc60846cf5db04 Bug: 509499093 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/95427 Reviewed-by: David Benjamin <davidben@google.com> Commit-Queue: David Benjamin <davidben@google.com>
diff --git a/ssl/extensions.cc b/ssl/extensions.cc index 4f4965b..db1a291 100644 --- a/ssl/extensions.cc +++ b/ssl/extensions.cc
@@ -2876,6 +2876,11 @@ return true; } + // The extension shouldn't be sent when resuming sessions. + if (ssl->s3->session_reused) { + return true; + } + // Limit max padding; if a client requests more than this, don't return any // padding. uint16_t padding_len = hs->client_requested_server_padding_size.value();
diff --git a/ssl/test/runner/handshake_client.go b/ssl/test/runner/handshake_client.go index bc36003..338ab58 100644 --- a/ssl/test/runner/handshake_client.go +++ b/ssl/test/runner/handshake_client.go
@@ -2031,27 +2031,6 @@ func (hs *clientHandshakeState) processServerExtensions(serverExtensions *serverExtensions) error { c := hs.c - if serverExtensions.serverPadding != nil && c.vers.protocolVersion() < VersionTLS13 { - return errors.New("tls: server sent padding over non-TLS 1.3 connection") - } - - if !c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding != nil { - return errors.New("tls: server sent unexpected padding") - } - - if c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding == nil { - return fmt.Errorf("tls: server did not send padding, expected %d bytes", - *c.config.RequestServerPadding) - } - - // We expected padding of a certain amount, and got some padding. Check that - // they match. - if c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding != nil { - if *serverExtensions.serverPadding != *c.config.RequestServerPadding { - return fmt.Errorf("tls: server sent %d bytes of padding instead of %d bytes", *serverExtensions.serverPadding, *c.config.RequestServerPadding) - } - } - if c.vers.protocolVersion() < VersionTLS13 { if c.config.Bugs.RequireRenegotiationInfo && serverExtensions.secureRenegotiation == nil { return errors.New("tls: renegotiation extension missing") @@ -2273,6 +2252,35 @@ } c.clientCertificateType = serverExtensions.clientCertificateType + // Server padding should never be sent on resumption handshakes. + if serverExtensions.serverPadding != nil && isResume { + return errors.New("tls: server sent padding on a resumption handshake") + } + + // If this isn't a resumption handshake, run server padding checks. + if !isResume { + if serverExtensions.serverPadding != nil && c.vers.protocolVersion() < VersionTLS13 { + return errors.New("tls: server sent padding over non-TLS 1.3 connection") + } + + if !c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding != nil { + return errors.New("tls: server sent unexpected padding") + } + + if c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding == nil { + return fmt.Errorf("tls: server did not send padding, expected %d bytes", + *c.config.RequestServerPadding) + } + + // We expected padding of a certain amount, and got some padding. Check that + // they match. + if c.config.Bugs.ExpectedServerPadding && serverExtensions.serverPadding != nil { + if *serverExtensions.serverPadding != *c.config.RequestServerPadding { + return fmt.Errorf("tls: server sent %d bytes of padding instead of %d bytes", *serverExtensions.serverPadding, *c.config.RequestServerPadding) + } + } + } + return nil }
diff --git a/ssl/test/runner/server_padding_tests.go b/ssl/test/runner/server_padding_tests.go index f4de16e..a5b89f3 100644 --- a/ssl/test/runner/server_padding_tests.go +++ b/ssl/test/runner/server_padding_tests.go
@@ -224,4 +224,22 @@ "-server-supports-padding", }, }) + + // Runner requests padding, and then does a resumption handshake. Shim should + // send server padding on initial handshake, but not resumption handshake. + testCases = append(testCases, testCase{ + name: "ServerPaddingServer-ResumeSession", + testType: serverTest, + resumeSession: true, + config: Config{ + MinVersion: VersionTLS13, + RequestServerPadding: ptrTo(uint16(10)), + Bugs: ProtocolBugs{ + ExpectedServerPadding: true, + }, + }, + flags: []string{ + "-server-supports-padding", + }, + }) }