From 56387a09810a3204ed820885e0ff0b26408be59d Mon Sep 17 00:00:00 2001 From: Artur Barashev Date: Mon, 9 Sep 2024 21:04:04 +0000 Subject: [PATCH] 8329754: The ThreadSafe attribute is ignored for SecureRandom algorithm aliases Reviewed-by: weijun --- .../classes/java/security/SecureRandom.java | 4 +- .../security/SecureRandom/ThreadSafe.java | 55 +++++++++++++------ 2 files changed, 40 insertions(+), 19 deletions(-) diff --git a/src/java.base/share/classes/java/security/SecureRandom.java b/src/java.base/share/classes/java/security/SecureRandom.java index 4242b5da04a..fac7f6b9383 100644 --- a/src/java.base/share/classes/java/security/SecureRandom.java +++ b/src/java.base/share/classes/java/security/SecureRandom.java @@ -225,8 +225,8 @@ public class SecureRandom extends java.util.Random { if (provider == null || algorithm == null) { return false; } else { - return Boolean.parseBoolean(provider.getProperty( - "SecureRandom." + algorithm + " ThreadSafe", "false")); + Service service = provider.getService("SecureRandom", algorithm); + return Boolean.parseBoolean(service.getAttribute("ThreadSafe")); } } diff --git a/test/jdk/java/security/SecureRandom/ThreadSafe.java b/test/jdk/java/security/SecureRandom/ThreadSafe.java index 174f3253c5f..b0975678e96 100644 --- a/test/jdk/java/security/SecureRandom/ThreadSafe.java +++ b/test/jdk/java/security/SecureRandom/ThreadSafe.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,33 +21,46 @@ * questions. */ +import static jdk.test.lib.Utils.runAndCheckException; + +import java.lang.Override; import java.security.Provider; import java.security.SecureRandom; import java.security.SecureRandomSpi; +import java.util.List; import java.util.Map; /* * @test - * @bug 7004967 + * @library /test/lib + * @bug 7004967 8329754 * @summary SecureRandom should be more explicit about threading */ + public class ThreadSafe { public static void main(String[] args) throws Exception { Provider p = new P(); NoSync.test(SecureRandom.getInstance("S1", p), 5, 5); - try { - NoSync.test(SecureRandom.getInstance("S2", p), 5, 5); - throw new Exception("Failed"); - } catch (RuntimeException re) { - // Good - } + NoSync.test(SecureRandom.getInstance("AliasS1", p), 5, 5); + + runAndCheckException( + () -> NoSync.test(SecureRandom.getInstance("S2", p), 5, 5), + RuntimeException.class); + + runAndCheckException( + () -> NoSync.test(SecureRandom.getInstance("AliasS2", p), 5, 5), + RuntimeException.class); + NoSync.test(SecureRandom.getInstance("S3", p), 5, 5); - try { - NoSync.test(SecureRandom.getInstance("S4", p), 5, 5); - throw new Exception("Failed"); - } catch (RuntimeException re) { - // Good - } + NoSync.test(SecureRandom.getInstance("AliasS3", p), 5, 5); + + runAndCheckException( + () -> NoSync.test(SecureRandom.getInstance("S4", p), 5, 5), + RuntimeException.class); + + runAndCheckException( + () -> NoSync.test(SecureRandom.getInstance("AliasS4", p), 5, 5), + RuntimeException.class); } public static class P extends Provider { @@ -58,28 +71,36 @@ public class ThreadSafe { // Good. No attribute. put("SecureRandom.S1", S.class.getName()); + // Good. Alias of S1, should pass because S1 is not marked as ThreadSafe + put("Alg.alias.SecureRandom.AliasS1", "S1"); + // Bad. Boasting ThreadSafe but isn't put("SecureRandom.S2", S.class.getName()); put("SecureRandom.S2 ThreadSafe", "true"); + //Bad. Alias of S2, should fail because S2 is marked as ThreadSafe + put("alg.Alias.SecureRandom.AliasS2", "S2"); + // Good. No attribute. putService(new Service(this, "SecureRandom", "S3", - S.class.getName(), null, null)); + S.class.getName(), List.of("AliasS3"), null)); // Bad. Boasting ThreadSafe but isn't putService(new Service(this, "SecureRandom", "S4", - S.class.getName(), null, Map.of("ThreadSafe", "true"))); + S.class.getName(), List.of("AliasS4"), Map.of("ThreadSafe", "true"))); } } // This implementation is not itself thread safe. public static class S extends SecureRandomSpi { - @java.lang.Override + + @Override protected void engineSetSeed(byte[] seed) { return; } private volatile boolean inCall = false; + @Override protected void engineNextBytes(byte[] bytes) { if (inCall) {