RFR: 8241248: NullPointerException in sun.security.ssl.HKDF.extract(HKDF.java:93)

Alexey Bakhtin abakhtin at openjdk.java.net
Tue Apr 27 23:48:52 UTC 2021


On Tue, 27 Apr 2021 16:13:31 GMT, Xue-Lei Andrew Fan <xuelei at openjdk.org> wrote:

>> Hello All,
>> 
>> Could you please review the fix for the JDK-8241248?
>> The issue happens during the TLSv1.3 handshake without server stateless session resumption in case of server receives several parallel requests with the same pre_shared_key.
>> The main idea of the fix is to remove resuming session from the session cache in the early stage.
>> 
>> JBS: https://bugs.openjdk.java.net/browse/JDK-8241248
>> Webrev: http://cr.openjdk.java.net/~abakhtin/8241248/webrev.v0/
>> 
>> The test from the bug report using OpenSSL is passed ( -Djdk.tls.server.enableSessionTicketExtension=false )
>> javax/net/ssl and sun/security/ssl jtreg tests passed
>> 
>> Regards
>> Alexey
>
> src/java.base/share/classes/sun/security/ssl/PreSharedKeyExtension.java line 377:
> 
>> 375:                     // If we are keeping state, see if the identity is in the cache
>> 376:                     if (requestedId.identity.length == SessionId.MAX_LENGTH) {
>> 377:                         synchronized (sessionCache) {
> 
> Did you have a test if there is a performance regression by introducing the synchronization here?
> 
> I have to check the engineGetServerSessionContext() specification and implementation (if the sessionCache is a reference?), and the session cache implementation to make sure the synchronization works (if the synchronization on sessionCache is the same as the synchronization on the cache internal implementation) .  Maybe, the improvement could in the cache implementation for readability?

Yes, I’ve made a test that calculates total time spent by server to receive <N> connections. Every server handshake is performed in a separate thread
The client starts <T> threads. Every thread sends one initial connection and <R-1> renegotiated connections. So, the total number of connections is  <N>=<T>*<R>

Results for the original and JDK-8241248 code are almost identical:
<T>=10 <R>=100
Original OpenJDK: 1140 ms
JDK-8241248 code: 1090 ms

<T>=50 <R>=100
Original OpenJDK: 1164 ms
JDK-8241248 code: 1108 ms

<T>=60 <R>=100
Original OpenJDK: 1461 ms
JDK-8241248 code: 1579 ms

<T>=70 <R>=100
Original OpenJDK: 2058 ms
JDK-8241248 code: 1999 ms

<T>=80 <R>=100
Original OpenJDK: 2148 ms
JDK-8241248 code: 2125 ms

<T>=90 <R>=100
Original OpenJDK: 2540 ms
JDK-8241248 code: 2514 ms

<T>=90 <R>=100
Original OpenJDK: 3011 ms
JDK-8241248 code: 3010 ms

I can confirm that the synchronization code works. Without it I still catches exception from different threads trying to resume the same session from the cache

-------------

PR: https://git.openjdk.java.net/jdk/pull/3664


More information about the security-dev mailing list