On Tue, 16 Mar 2021 20:53:27 GMT, Valerie Peng <valer...@openjdk.org> wrote:

>> I did not get the point that the code path should be unaffected". As there 
>> are a few update like:
>>          init(keysize, JCAUtil.getSecureRandom());
>>          init(keysize, JCAUtil.getDefSecureRandom());
>> 
>> I think there are some impact on the existing application which use the 
>> default sec
>> 
>>> Or, I can also separate out the instance returned by getSecureRandom() so 
>>> that code path should be unaffected, e.g.:
>> 
>> I did not get the point that the "code path should be unaffected"? 
>> JCAUtil.getDefSecureRandom() is used in updates like:
>>          init(keysize, JCAUtil.getSecureRandom());
>>          init(keysize, JCAUtil.getDefSecureRandom());
>> 
>>> 
>>> ```
>>>     // cached SecureRandom instance
>>>     private static class CachedSecureRandomHolder {
>>>         public static SecureRandom instance = new SecureRandom();
>>>         private static Provider[] cachedConfig = Security.getProviders();
>>>         private static SecureRandom def = instance;
>>> 
>>>         public static SecureRandom getDefault() {
>>>             synchronized (CachedSecureRandomHolder.class) {
>>>                 Provider[] currConfig = Security.getProviders();
>>>                 if (!Arrays.equals(cachedConfig, currConfig)) {
>>>                     def = new SecureRandom();
>>>                     cachedConfig = currConfig;
>>>                 }
>>>             }
>>>             return def;
>>>         }
>>>     }
>>> 
>>>     /**
>>>      * Get a SecureRandom instance. This method should be used by JDK
>>>      * internal code in favor of calling "new SecureRandom()". That needs to
>>>      * iterate through the provider table to find the default SecureRandom
>>>      * implementation, which is fairly inefficient.
>>>      */
>>>     public static SecureRandom getSecureRandom() {
>>>         return CachedSecureRandomHolder.instance;
>>>     }
>>> 
>>>     /**
>>>      * Get the default SecureRandom instance. This method is the
>>>      * optimized version of "new SecureRandom()" which re-uses the default
>>>      * SecureRandom impl if the provider table is the same.
>>>      */
>>>     public static SecureRandom getDefSecureRandom() {
>>>         return CachedSecureRandomHolder.getDefault();
>>>     }
>>> ```
>
>> As this behavior has been a while, I may not update the implementation. 
>> Instead, I would like to add an "implNote" tag to state that once the 
>> default provider is loaded, an implementation may be changed it any longer. 
>> Applications could use provider parameter if there is a preference.
> 
> Well, javadoc of the affected init methods clearly specifies that "get them 
> using the SecureRandom implementation of the highest-priority installed 
> provider as the source of randomness. ", thus I am not sure if we can just 
> get around this with an _@implNote_.

> I did not get the point that the code path should be unaffected". As there 
> are a few update like:
> init(keysize, JCAUtil.getSecureRandom());
> init(keysize, JCAUtil.getDefSecureRandom());

What I mean is that the new suggestion will not impact callers of 
JCAUtil.getSecureRandom() which I thought what your performance regression 
means. To enforce that the most preferred SecureRandom impl is used, this for 
sure will incur some cost especially when the existing impl just returns a 
cached obj w/o any checking.

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

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

Reply via email to