15850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann/* 25850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Copyright (C) 2009 The Android Open Source Project 35850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 45850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Licensed under the Apache License, Version 2.0 (the "License"); 55850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * you may not use this file except in compliance with the License. 65850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * You may obtain a copy of the License at 75850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 85850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * http://www.apache.org/licenses/LICENSE-2.0 95850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * 105850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * Unless required by applicable law or agreed to in writing, software 115850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * distributed under the License is distributed on an "AS IS" BASIS, 125850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * See the License for the specific language governing permissions and 145850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann * limitations under the License. 155850b60b2000dfdfd7c7bbe27d9ecee52d243933Jorg Pleumann */ 16f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonpackage tests.security; 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom; 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 217d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstromimport java.util.concurrent.Callable; 227d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstromimport java.util.concurrent.ExecutorCompletionService; 237d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstromimport java.util.concurrent.ExecutorService; 247d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstromimport java.util.concurrent.Executors; 25f979bbd1277c77ca945ad981e7864fb4e9f6ae05Jesse Wilsonimport junit.framework.TestCase; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 277d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrompublic abstract class SecureRandomTest extends TestCase { 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String algorithmName; 30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 317d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom private int counter = 0; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SecureRandomTest(String name) { 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.algorithmName = name; 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected void setUp() throws Exception { 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super.setUp(); 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testSecureRandom() { 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecureRandom secureRandom1 = null; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project secureRandom1 = SecureRandom.getInstance(algorithmName); 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchAlgorithmException e) { 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail(e.getMessage()); 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project SecureRandom secureRandom2 = null; 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project secureRandom2 = SecureRandom.getInstance(algorithmName); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NoSuchAlgorithmException e) { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail(e.getMessage()); 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] testRandom1 = getRandomBytes(secureRandom1); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] testRandom2 = getRandomBytes(secureRandom2); 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertFalse(Arrays.equals(testRandom1, testRandom2)); 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private byte[] getRandomBytes(SecureRandom random) { 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] randomData = new byte[64]; 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project random.setSeed(System.currentTimeMillis()+counter); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project counter++; 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project random.nextBytes(randomData); 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return randomData; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 747d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom 757d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom 767d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom public void testSecureRandomThreadSafety() throws Exception { 777d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom final SecureRandom secureRandom = SecureRandom.getInstance(algorithmName); 787d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom int threads = 2; 797d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom ExecutorService executor = Executors.newFixedThreadPool(threads); 807d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom ExecutorCompletionService ecs = new ExecutorCompletionService(executor); 817d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom for (int t = 0; t < threads; t++) { 827d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom ecs.submit(new Callable<Void>() { 837d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom public Void call () { 847d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom for (int i = 0; i < 1000; i++) { 857d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom secureRandom.generateSeed(1024); 867d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom } 877d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom return null; 887d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom } 897d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom }); 907d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom } 917d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom executor.shutdown(); 927d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom for (int i = 0; i < threads; i++) { 937d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom ecs.take().get(); 947d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom } 957d71a13aa0cb794f14152b36b3873bf8ca595cdcBrian Carlstrom } 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 97