From 7d71a13aa0cb794f14152b36b3873bf8ca595cdc Mon Sep 17 00:00:00 2001 From: Brian Carlstrom Date: Wed, 1 Dec 2010 11:20:32 -0800 Subject: SecureRandom should be thread safe Random is documented to be thread safe and our implementation appears to be. However, the SecureRandom subclass implementation was not. This was quite reproducible with the javax.net.ssl unit tests when run on a multicore device, but not seen on a uniprocessor. Details: Actual bug fix by adding synchronized to engine* methods luni/src/main/java/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java New testSecureRandomThreadSafety based on generateSeed errors in javax.net.ssl tests. luni/src/test/java/tests/security/SecureRandomTest.java Removing dalvik.annotation.* from assorted SecureRandom tests. luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandom2Test.java luni/src/test/java/org/apache/harmony/security/tests/java/security/SecureRandomSpiTest.java luni/src/test/java/tests/java/security/SecureRandomTest.java luni/src/test/java/tests/security/SecureRandomTest.java Change-Id: I5e8ece4c0836b02277d7cac1b9b2f60b3c4a7755 --- .../test/java/tests/security/SecureRandomTest.java | 55 +++++++++++----------- 1 file changed, 28 insertions(+), 27 deletions(-) (limited to 'luni/src/test/java/tests/security/SecureRandomTest.java') diff --git a/luni/src/test/java/tests/security/SecureRandomTest.java b/luni/src/test/java/tests/security/SecureRandomTest.java index cf9c6dc..bb038e1 100644 --- a/luni/src/test/java/tests/security/SecureRandomTest.java +++ b/luni/src/test/java/tests/security/SecureRandomTest.java @@ -15,19 +15,20 @@ */ package tests.security; -import dalvik.annotation.TestLevel; -import dalvik.annotation.TestTargetNew; -import dalvik.annotation.TestTargets; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Arrays; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorCompletionService; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; import junit.framework.TestCase; -public abstract class SecureRandomTest extends TestCase { +public abstract class SecureRandomTest extends TestCase { private final String algorithmName; - private int counter=0; + private int counter = 0; protected SecureRandomTest(String name) { this.algorithmName = name; @@ -37,28 +38,6 @@ public abstract class SecureRandomTest extends TestCase { super.setUp(); } - @TestTargets({ - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="getInstance", - args={String.class} - ), - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="setSeed", - args={long.class} - ), - @TestTargetNew( - level=TestLevel.ADDITIONAL, - method="nextBytes", - args={byte[].class} - ), - @TestTargetNew( - level=TestLevel.COMPLETE, - method="method", - args={} - ) - }) public void testSecureRandom() { SecureRandom secureRandom1 = null; try { @@ -92,4 +71,26 @@ public abstract class SecureRandomTest extends TestCase { return randomData; } + + + public void testSecureRandomThreadSafety() throws Exception { + final SecureRandom secureRandom = SecureRandom.getInstance(algorithmName); + int threads = 2; + ExecutorService executor = Executors.newFixedThreadPool(threads); + ExecutorCompletionService ecs = new ExecutorCompletionService(executor); + for (int t = 0; t < threads; t++) { + ecs.submit(new Callable() { + public Void call () { + for (int i = 0; i < 1000; i++) { + secureRandom.generateSeed(1024); + } + return null; + } + }); + } + executor.shutdown(); + for (int i = 0; i < threads; i++) { + ecs.take().get(); + } + } } -- cgit v1.1