RFR: 8260274: Cipher.init(int, key) does not use highest priority provider for random bytes [v2]

SalusaSecondus github.com+829871+salusasecondus at openjdk.java.net
Wed Mar 17 19:54:50 UTC 2021


On Wed, 17 Mar 2021 19:25:13 GMT, Valerie Peng <valeriep at openjdk.org> wrote:

>> Can someone help review this somewhat trivial change?
>> 
>> Updated JCAUtil class to return the cached SecureRandom object only when the provider configuration has not changed. 
>> Added a regression test to check the affected classes, i.e. AlgorithmParameterGenerator, KeyPairGenerator, Cipher, KeyAgreement, KeyGenerator. 
>> 
>> Thanks,
>> Valerie
>
> Valerie Peng has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Changed to use volatile for the default SecureRandom object reference

src/java.base/share/classes/sun/security/jca/JCAUtil.java line 29:

> 27: 
> 28: import java.lang.ref.*;
> 29: import java.util.Arrays;

Import no longer needed.

src/java.base/share/classes/sun/security/jca/JCAUtil.java line 84:

> 82:      * SecureRandom impl if the provider table is the same.
> 83:      */
> 84:     public static SecureRandom getDefSecureRandom() {

When should people use `getSecureRandom` rather than `getDefSecureRandom()`? Are we leaving the old to avoid changing behavior out from under people who may not expect it?

src/java.base/share/classes/sun/security/jca/JCAUtil.java line 92:

> 90:             }
> 91:         }
> 92:         return def;

Do we need to worry about `clearDefSecureRandom()` being called between lines 88 and 92?

Thread 1: `getDefSecureRandom()#85` (`def` is `null`)
Thread 1: `getDefSecureRandom()#86`
Thread 1: `getDefSecureRandom()#87` (`def` is still `null`)
Thread 1: `getDefSecureRandom()#88` (`def` is **not** `null`)
Thread 2: `clearDefSecureRandom()` (`def` is `null` again)
Thread 1: `getDefSecureRandom()#92` (return `def` which is incorrectly `null`)


Suggestion:

        SecureRandom result = def;
        if (result == null) {
            synchronized (JCAUtil.class) {
                result = def;
                if (result == null) {
                    def = result = new SecureRandom()
                }
            }
        }
        return result;

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

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


More information about the security-dev mailing list