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