Thanks for your detailed review Brad. I’ve generated a new webrev: http://cr.openjdk.java.net/~vinnie/8170282/webrev.01/
> On 9 Dec 2016, at 01:34, Bradford Wetmore <bradford.wetm...@oracle.com> wrote: > > > Hi Vinnie, > > On 12/8/2016 2:18 PM, Vincent Ryan wrote: >> The Java Servlet Expect Group reported that they have identified a specific >> HTTP2 server use-case that cannot >> be easily addressed using the existing ALPN APIs. >> >> This changeset fixes that problem. It supports a new callback mechanism to >> allow TLS server applications >> to set an application protocol during the TLS handshake. Specifically it >> allows the cipher suite chosen by the >> TLS protocol implementation to be examined by the TLS server application >> before it sets the application protocol. >> Additional TLS parameters are also available for inspection in the callback >> function. >> >> This new mechanism is available only to TLS server applications. TLS clients >> will continue to use the existing ALPN APIs. > > Technically, the API could be used for NPN (though it's pretty much dead), so > that would be a listing the options on the server side, and selection on > client side. > >> Bug: https://bugs.openjdk.java.net/browse/JDK-8170282 >> Webrev: http://cr.openjdk.java.net/~vinnie/8170282/webrev.00/ > > SSLEngineImpl.java/SSLSocketImpl.java > ===================================== > Please use the standard handshaker initialization pattern where the > Handshaker is initialized with all of the data/mechanisms needed for a > complete handshake. This will will ensure consistent handshake results and > avoid potential strange race conditions. (There's some corresponding API > comments below.) > > You would register your callback after the > handshaker.setApplicationProtocols() calls at (currently) line 444 in the > SSLEngineImpl code. > > > SSLEngine.java/SSLSocket.java > ============================= > I would suggest putting an introduction to this addition in the class > description section, that application values can be set using > SSLParameters.setApplication...() and selected with the default algorithm, or > that a more accurate selection mechanism can be created by registering the > callback that could look at any Handshake in progress and make appropriate > decisions. > > 1339: > Registers the callback function that selects an application protocol > value during the SSL/TLS/DTLS handshake. > -> > Registers a callback function that selects an application protocol > value for a SSL/TLS/DTLS handshake. The function overrides any values set > using {@link SSLParameters#setApplicationProtocols > SSLParameters.setApplicationProtocols}. > > and remove the corresponding section from the return docs (in the {@code > String section}). > > the function's first argument enables the current > handshake settings to be inspected.<br> > -> > the function's first argument allows the current SSLEngine(SSLSocket) to be > inspected, including the handshake session and configuration settings.<br> > > If null is returned, or a value that was not advertised > then the underlying protocol will determine what action > to take. > (For example, ALPN will send a "no_application_protocol" > alert and terminate the connection.) > -> > If the return value is null (no value chosen) or is a value that was not > advertised by the peer, the underlying protocol will determine what action to > take. (For example, ALPN will send a "no_application_protocol" alert and > terminate the connection.) > > Also, TLS should be configured with parameters that > -> > Also, this SSLEngine(SSLSocket) should be configured with parameters that > > @param selector the callback function, or null to de-register. > -> > @param selector the callback function, or null to disable the callback > functionality. > > Retrieves the callback function that selects an application protocol > value during the SSL/TLS/DTLS handshake. > -> > Retrieves the callback function that selects an application protocol > value during a SSL/TLS/DTLS handshake. > > This method should be called by TLS protocol implementations during > the TLS handshake. The callback function should not be called until > after the cipher suite has been selected. > > I would suggest removing this apiNote entirely. I expect only applications > will call this method, so the first sentence is not necessary since it's up > to the implementation how it wants to store the BiFunction. I expect that > when the handshaker is initialized, the current BiFunction will be assigned > to it, and thus can't be changed for the current handshake/Handshaker in > progress. The second sentence ties an ordering to the selection of > ciphersuite and ALPN value, and will tie our hands if we ever revisit the > group protocol/ciphersuite/SNI/ALPN selection discussion. > > ServerHandshaker.java > ===================== > I was expecting that the ALPN callback logic would be an update for our > current ALPN decision logic. If a callback was set, use it, else look at > defined strings from the SSLParameters, else fail. e.g. > > ALPNExtension clientHelloALPN = (ALPNExtension) > mesg.extensions.get(ExtensionType.EXT_ALPN); > > if (clientHelloALPN != null) { > List<String> protocols = clientHelloALPN.getPeerAPs(); > if (applicationSelector != null) { > applicationProtocol = > selector.apply(SSLEngine/SSLSocket, peerAPs); > } else if (localApl.length > 0)) { > // Intersect the requested and the locally supported, > // and save for later. Use server preference order > for (String ap : localApl) { > ...deleted... > } > applicationProtocol = negotiatedValue; > } > if (negotiatedValue == null) { > fatalSE(Alerts.alert_no_application_protocol, > new SSLHandshakeException( > "No matching ALPN values")); > } > } > > Thanks. > > Brad > >