On Wed, 26 Apr 2023 11:51:23 GMT, Jaikiran Pai <j...@openjdk.org> wrote:
>> Can I please get a review of this change which proposes to fix the issue >> reported in https://bugs.openjdk.org/browse/JDK-8301686? >> >> The internal implementation of SSLContext caches SSLSession(s). These >> sessions are for a particular combination or peer host and port. When a TLS >> handshake completes successfully, the session is then stored in this cache. >> If/when subsequent handshake attempts against the same host/port combination >> happens, using this same SSLContext instance, then the internal >> implementation triggers a session resumption, which is allowed by the TLS >> RFC. During session resumption, the client then uses the pre-shared key from >> the previous successful handshake and sends it as part of the `ClientHello` >> message. >> >> One other part of the TLS handshake is the `server_name` extension. The >> client sends a `SNI` in the handshake which the server side can either >> reject or accept. To facilitate this matching on the server side, the >> `javax.net.ssl.SNIMatcher` can be configured on the (server side) >> `SSLParameters`. Setting of `SNIMatcher` is optional. >> >> If a successful handshake session (that was cached by the client) used a SNI >> name which the server accepted, then this SNI name is sent as part of the >> session resumption `ClientHello` along with the pre-shared key. The current >> issue is that, during session resumption, on the server side, if the >> `SNIMatcher` is no longer present, then the server rightly aborts the >> session resumption, but still ends up sending the pre-shared key extension >> as part of the `ServerHello` message. The client, upon seeing this >> pre-shared key extension in the `ServerHello` considers that the session >> resumption succeeded and ends up using that pre-shared key to derive the >> early secret. On the server side though, the server has already rejected >> this resumption request and thus when the client next sends data, the server >> will no longer be able to decode the data and will fail with >> `javax.crypto.AEADBadTagException: Tag mismatch` as noted in the JBS issue. >> >> The change in this PR, removes the pre-shared key extension data from the >> `ServerHello` message, when the server side notices that the session >> resumption is being aborted. >> >> A new jtreg test has been added which reproduces the issue and verifies the >> fix. Existing tests in tier1, tier2 and tier3 continue to pass with this >> change. > > Jaikiran Pai has updated the pull request incrementally with one additional > commit since the last revision: > > review comment - use SSLContextTemplate for SSLContext creation in test Other than the two small comments, LGTM. src/java.base/share/classes/sun/security/ssl/ServerNameExtension.java line 346: > 344: shc.isResumption = false; > 345: shc.resumingSession = null; > 346: // the server is disallowing this session resumption, Would you please change "the server" to "this server." test/jdk/javax/net/ssl/SSLSession/ServerNameRejectedTLSSessionResumption.java line 1: > 1: /* Please reformat to <= 80 chars. This helps reviewers who prefer side/side reviews from having to horizontally scroll, even with large screens. Thanks. ------------- Marked as reviewed by wetmore (Reviewer). PR Review: https://git.openjdk.org/jdk/pull/13669#pullrequestreview-1647728171 PR Review Comment: https://git.openjdk.org/jdk/pull/13669#discussion_r1339367454 PR Review Comment: https://git.openjdk.org/jdk/pull/13669#discussion_r1339371434