RFR 8226338: Updates to Stateless Resumption

Xuelei Fan xuelei.fan at oracle.com
Fri Jul 5 05:14:00 UTC 2019


SSLSessionImpl.java
-------------------
  526     boolean checkSessionTicket(HandshakeContext hc) {
As the return value is a boolean type, the method is better to use 
"isSomething".  Otherwise, the meaning of the code 
"!checkSessionTicket()" is clear and need to read the implementation code.

NewSessionTicket.java
---------------------
  104     //     opaque ticket<1..2^16-1>;
  108     if (m.remaining() < 6) {

Per sectio 3.3, RFC 5077, line 104 should be:
          opaque ticket<0..2^16-1>;

To be better understand the number 6, as you are already there, would 
you please update line 104 as well?

I did not get the idea of the update of 
T13NewSessionTicketMessage.T13NewSessionTicketMessage().  It looks like 
that the updated code does not comply to TLS 1.3 specification of 
NewSessionTicket.


  453             NewSessionTicketMessage nstm;
  454             nstm = new T12NewSessionTicketMessage(shc, 
sessionTimeoutSeconds,

Maybe better to use one statement.
  453             NewSessionTicketMessage nstm =
  454                      new T12NewSessionTicketMessage(shc, 
sessionTimeoutSeconds,

  499             if (nstm.ticket.length == 0) {
Empty ticket should be not allowed in TLS 1.3.

ServerHelloDone.java
--------------------
  110             if (shc.statelessResumption) {
  111 
shc.handshakeConsumers.put(SSLHandshake.NEW_SESSION_TICKET.id,
  112                         SSLHandshake.NEW_SESSION_TICKET);
  113             }

I think the NewSessionTicket is produced by server and consumed in 
client side.  I did not get the idea to have NST consumer in server 
side.  Am I missing something?

SessionTicketExtension.java
---------------------------
  260             if (!hc.handshakeSession.checkSessionTicket(hc)) {
  261                 return new byte[0];
  262             }

 From the above line, I guess why you use empty ticket for TLS 1.3, 
although empty ticket is not allowed in TLS 1.3.

I may suggest never use empty ticket.  Always use a proper ticket in a 
proper NewSessionTicket message, at least in format.  When there is a 
problem to retrieve the values, cache the session and prefer to use the 
case rather than the ticket for session resumption.   As may be a little 
bit more interop friendly.

  295                 if (SSLLogger.isOn && 
SSLLogger.isOn("ssl,handshake")) {
  296                     SSLLogger.fine("Encryption failed." + 
e.getMessage());
  297                     e.printStackTrace(); // Helps with session.write()
  298                 }

Line 297 does not use SSLLogger.  It could be:
          SSLLogger.fine("Encryption failed", e);

On 7/2/2019 10:35 AM, Anthony Scarpino wrote:
> 
> Hi,
> 
> I need a code review on some updates to the stateless resumption.
> 1) Changing peerSupportedSignAlgs from a String[] to Collection[]
> 2) Additional items added to the stateless ticket
> 3) Not provide a stateless ticket when the masterkey is not accessible 
> (FIPS) or when boundValues are used
I did not whether the update works if bound values are set after the 
handshake completed (i.e., after the NewSessionTicket has been produced 
and used).  Did you have a test for the case?

Thanks,
Xuelei

> 4) Be more graceful in case of stateless ticket generation failure
> 
> http://cr.openjdk.java.net/~ascarpino/8226338/webrev.00/
> 
> Tony


More information about the security-dev mailing list