RFR 8226338: Updates to Stateless Resumption

Xuelei Fan xuelei.fan at oracle.com
Tue Jul 16 02:50:42 UTC 2019


 > http://cr.openjdk.java.net/~ascarpino/8226338/webrev.01/

NewSessionTicket.java
---------------------
-    189    if (m.remaining() < 14) {
+    189    if (m.remaining() < 9) {

I did not get the point of this update.  I think 14 should be fine so 
that to fail earlier if no sufficient data.


  317 public byte[] produce(ConnectionContext context) ...
  324 public byte[] produce(ServerHandshakeContext shc) ...
  433 public byte[] produce(PostHandshakeContext hc) ...

I did not get the point to use three methods here.  Read more inlines, 
please.

On 7/15/2019 4:04 PM, Anthony Scarpino wrote:
> I've updated the webrev
> 
> http://cr.openjdk.java.net/~ascarpino/8226338/webrev.01/
> 
> As I need to push this by wednesday, please review it soon.
> 
> There are fixes for the comments that were made, added a NST for 
> boundVaules, a very basic test to make sure the post handshake NST is 
> sent after boundValues have changed.
> 
Did you mean send a new NST of the boundValues is changed?  What if the 
previous NST was used for resumption?

Thanks,
Xuelei

> There is no change to invalidate() as these is not enough time to 
> address that.
> 
> Tony
> 
> On 7/7/19 9:14 PM, Anthony Scarpino wrote:
>> On 7/4/19 10:14 PM, Xuelei Fan wrote:
>>> 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.
>>
>> I'll see if I can come up with a "is*" name
>>
>>>
>>> NewSessionTicket.java
>>> ---------------------
>>>   104     //     opaque ticket<1..2^16-1>;
>>>   108     if (m.remaining() < 6) {
>>>
>>> Per section 3.3, RFC 5077, line 104 should be:
>>>           opaque ticket<0..2^16-1>;
>>
>> I'm glad you saw that because it was confusing me why a zero buffer 
>> was allowed in 5077
>>
>>>
>>> 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.
>>>
>>
>> So I assume you are talking about the zero length ticket.  I never 
>> noticed that 1.3 changed behavior away from zero length tickets.  It 
>> would appear the spec writings made every attempt to make NST usage 
>> confusing between versions.
>>
>>>
>>>   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?
>>>
>>
>> Hmm.. I remember making this change, and I thought it was a good idea, 
>> but clearly it does nothing.
>>
>>> 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.
>>
>> Yes, the 1.3 non-zero length sure complicates the code.. Very 
>> unfortunate.
>>
>>>
>>>   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);
>>
>> I didn't noticed logger accepted exceptions.
>>
>>>
>>> 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?
>>
>> It was my understanding from previous discussions that we were going 
>> to take a wait and see approach with boundValues and NST.
>>
>> When I took a glance at how boundValues were added, they appear to be 
>> outside of the normal flow of the ConnectionContext.
>>
>>>
>>> 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