• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Licensed to the Apache Software Foundation (ASF) under one or more
3  * contributor license agreements.  See the NOTICE file distributed with
4  * this work for additional information regarding copyright ownership.
5  * The ASF licenses this file to You under the Apache License, Version 2.0
6  * (the "License"); you may not use this file except in compliance with
7  * the License.  You may obtain a copy of the License at
8  *
9  *   http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  */
17 
18 package org.apache.harmony.tests.javax.security;
19 
20 import libcore.test.annotation.NonCts;
21 import libcore.test.reasons.NonCtsReasons;
22 
23 import java.security.NoSuchAlgorithmException;
24 import java.security.NoSuchProviderException;
25 import java.security.SecureRandom;
26 
27 import junit.framework.TestCase;
28 
29 /**
30  * Tests against methods in SecureRandom class object using
31  * SHA1PRNG_SecureRandomImpl.
32  */
33 public class OldSHA1PRNGSecureRandomTest extends TestCase {
34 
35     private static final int LENGTH = 20; // constant defining loop limit
36 
37     private static final int INCR = 2; // constant defining loop increment
38 
39     private static final String algorithm = "SHA1PRNG"; // algorithm's name
40 
41     private static SecureRandom sr; // fields used by tests
42 
43     private static SecureRandom sr2; //
44 
45     /*
46      * @see TestCase#setUp()
47      */
setUp()48     protected void setUp() throws Exception {
49         super.setUp();
50         sr = SecureRandom.getInstance(algorithm);
51         sr2 = SecureRandom.getInstance(algorithm);
52     }
53 
54     /**
55      * test against the "void generateSeed(int)" method; it checks out that the
56      * method throws NegativeArraySizeException if argument <0
57      */
58     @NonCts(bug = 260847206, reason = NonCtsReasons.NON_BREAKING_BEHAVIOR_FIX)
testGenerateSeedint01()59     public final void testGenerateSeedint01() {
60         try {
61             sr.generateSeed(-1);
62             fail("generateSeed(-1) :: No NegativeArraySizeException");
63         } catch (NegativeArraySizeException | IllegalArgumentException e) {
64         }
65     }
66 
67     /**
68      * test against the "void generateSeed(int)" method; it checks out that
69      * number of bits returned is equal to one requested; the check includes
70      * case for argument's value == 0;
71      */
testGenerateSeedint02()72     public final void testGenerateSeedint02() {
73         for (int i = 0; i < LENGTH; i++) {
74             byte[] myBytes = sr.generateSeed(i);
75             assertFalse("unexpected: myBytes.length != i  :: i==" + i + " myBytes.length="
76                     + myBytes.length, myBytes.length != i);
77         }
78     }
79 
80     /**
81      * test against the "void generateSeed(int)" method; it checks out the
82      * quality of entropy (# of different bytes in sequential calls is more or
83      * equal to 50%)
84      */
testGenerateSeedint03()85     public final void testGenerateSeedint03() {
86         byte[] myBytes1;
87         byte[] myBytes2;
88 
89         for (int i = 0; i < LENGTH; i += INCR) {
90             int n = 0;
91             myBytes1 = sr.generateSeed(i);
92             myBytes2 = sr.generateSeed(i);
93 
94             for (int j = 0; j < i; j++) {
95                 if (myBytes1[j] == myBytes2[j]) {
96                     n++;
97                 }
98             }
99             assertFalse("unexpected: n*2 > i  :: i=" + i + " n=" + n, n * 2 > i);
100         }
101     }
102 
103     /**
104      * test against the "void nextBytes(byte[])" method; it checks out that the
105      * method throws NPE if argument supplied is null
106      */
testNextBytesbyteArray01()107     public final void testNextBytesbyteArray01() {
108         try {
109             sr.nextBytes(null);
110             fail("unexpected: nextBytes(null) :: No NullPointerException");
111         } catch (NullPointerException e) {
112         }
113     }
114 
115     /**
116      * test against the "void nextBytes(byte[])" method; it checks out that
117      * different SecureRandom objects being supplied with the same seed return
118      * the same sequencies of bytes as results of their "nextBytes(byte[])"
119      * methods
120      */
testNextBytesbyteArray02()121     public final void testNextBytesbyteArray02() {
122         byte[] myBytes;
123         byte[] myBytes1;
124         byte[] myBytes2;
125 
126         // case1: sequencies are of the same length
127         for (int i = 1; i < LENGTH; i += INCR) {
128             myBytes = new byte[i];
129 
130             for (int j = 1; j < i; j++) {
131                 myBytes[j] = (byte) (j & 0xFF);
132             }
133             sr.setSeed(myBytes);
134             sr2.setSeed(myBytes);
135 
136             for (int k = 1; k < LENGTH; k += INCR) {
137                 myBytes1 = new byte[k];
138                 myBytes2 = new byte[k];
139                 sr.nextBytes(myBytes1);
140                 sr2.nextBytes(myBytes2);
141 
142                 for (int l = 0; l < k; l++) {
143                     assertFalse("unexpected: myBytes1[l] != myBytes2[l]  :: l==" + l + " k=" + k
144                             + " i=" + i + " myBytes1[l]=" + myBytes1[l] + " myBytes2[l]="
145                             + myBytes2[l], myBytes1[l] != myBytes2[l]);
146                 }
147             }
148         }
149 
150         // case2: sequencies are of different lengths
151         for (int n = 1; n < LENGTH; n += INCR) {
152             int n1 = 10;
153             int n2 = 20;
154             int n3 = 100;
155             byte[][] bytes1 = new byte[10][n1];
156             byte[][] bytes2 = new byte[5][n2];
157 
158             for (int k = 0; k < bytes1.length; k++) {
159                 sr.nextBytes(bytes1[k]);
160             }
161             for (int k = 0; k < bytes2.length; k++) {
162                 sr2.nextBytes(bytes2[k]);
163             }
164 
165             for (int k = 0; k < n3; k++) {
166                 int i1 = k / n1;
167                 int i2 = k % n1;
168                 int i3 = k / n2;
169                 int i4 = k % n2;
170                 assertTrue("non-equality: i1=" + i1 + " i2=" + i2 + " i3=" + i3 + " i4=" + i4,
171                         bytes1[i1][i2] == bytes2[i3][i4]);
172             }
173         }
174     }
175 
176     /**
177      * test against the "void nextBytes(byte[])" method; it checks out that
178      * different SecureRandom objects being supplied with seed by themselves
179      * return different sequencies of bytes as results of their
180      * "nextBytes(byte[])" methods
181      */
testNextBytesbyteArray03()182     public final void testNextBytesbyteArray03() throws NoSuchAlgorithmException,
183             NoSuchProviderException {
184         /* these are needed to test new SecureRandom objects in loop */
185         SecureRandom sr1;
186         SecureRandom sr2;
187 
188         byte[] myBytes1;
189         byte[] myBytes2;
190 
191         for (int i = 1; i < LENGTH / 2; i += INCR) {
192             sr1 = SecureRandom.getInstance(algorithm);
193             sr2 = SecureRandom.getInstance(algorithm);
194 
195             boolean flag = true;
196 
197             myBytes1 = new byte[i];
198             myBytes2 = new byte[i];
199 
200             sr1.nextBytes(myBytes1);
201             sr2.nextBytes(myBytes2);
202             for (int j = 0; j < i; j++) {
203                 flag &= myBytes1[j] == myBytes2[j];
204             }
205 
206             // check again to avoid intermittent failures
207             sr1.nextBytes(myBytes1);
208             sr2.nextBytes(myBytes2);
209             for (int j = 0; j < i; j++) {
210                 flag &= myBytes1[j] == myBytes2[j];
211             }
212 
213             if (flag) {
214                 // probability of false failure is 1.5*10^-5 per run for i=1 or
215                 // less for i > 1
216                 fail("TESTING RANDOM NUMBER GENERATOR QUALITY: IGNORE THIS FAILURE IF INTERMITTENT :: i="
217                         + i);
218             }
219         }
220     }
221 
222     /**
223      * test against the "void nextBytes(byte[])" method; it checks out behavior
224      * of SecureRandom object in cases of passing byte array of zero length to
225      * "nextBytes(byte[])" method. The test contains two testcases: - first
226      * testcase checks out that if for two newly created SecureRandom objects
227      * invocation of "nextBytes(new byte[0])" method are first ones then further
228      * calls to nextBytes(..) methods return different byte arrays, that is,
229      * first "nextBytes(new byte[0])" aslo randomizes internal state; - second
230      * testcase checks out that if for two newly created SecureRandom objects
231      * invocation of "setSeed(..)" methods are first ones then further calls to
232      * "nextBytes(new byte[0])" methods has no effect
233      */
testNextBytesbyteArray04()234     public final void testNextBytesbyteArray04() throws NoSuchAlgorithmException,
235             NoSuchProviderException {
236         /*
237          * these are needed to test new SecureRandom objects in loop
238          */
239         SecureRandom sr1;
240         SecureRandom sr2;
241 
242         byte[] myBytes;
243         byte[] myBytes1;
244         byte[] myBytes2;
245 
246         // case 1:
247         for (int i = 1; i < LENGTH / 2; i += INCR) {
248             sr1 = SecureRandom.getInstance(algorithm);
249             sr2 = SecureRandom.getInstance(algorithm);
250 
251             sr1.nextBytes(new byte[0]);
252             sr2.nextBytes(new byte[0]);
253 
254             boolean flag = true;
255 
256             myBytes1 = new byte[i];
257             myBytes2 = new byte[i];
258 
259             sr1.nextBytes(myBytes1);
260             sr2.nextBytes(myBytes2);
261             for (int j = 0; j < i; j++) {
262                 flag &= myBytes1[j] == myBytes2[j];
263             }
264 
265             // check again to avoid intermittent failures
266             sr1.nextBytes(myBytes1);
267             sr2.nextBytes(myBytes2);
268             for (int j = 0; j < i; j++) {
269                 flag &= myBytes1[j] == myBytes2[j];
270             }
271 
272             if (flag) {
273                 // probability of false failure is 1.5*10^-5 per run for i=1 or
274                 // less for i > 1
275                 fail("TESTING RANDOM NUMBER GENERATOR QUALITY: IGNORE THIS FAILURE IF INTERMITTENT :: i="
276                         + i);
277             }
278         }
279 
280         myBytes = new byte[] {
281             (byte) 0
282         };
283 
284         // case2:
285         for (int n = 1; n < LENGTH; n += INCR) {
286             byte[][] bytes1 = new byte[2][n];
287             byte[][] bytes2 = new byte[2][n];
288 
289             sr1 = SecureRandom.getInstance(algorithm);
290             sr2 = SecureRandom.getInstance(algorithm);
291 
292             sr1.setSeed(myBytes);
293             sr2.setSeed(myBytes);
294 
295             sr1.nextBytes(bytes1[0]);
296             sr1.nextBytes(bytes1[1]);
297 
298             sr2.nextBytes(bytes2[0]);
299             sr2.nextBytes(new byte[0]);
300             sr2.nextBytes(bytes2[1]);
301 
302             for (int k = 0; k < 2; k++) {
303                 for (int j = 0; j < n; j++) {
304                     assertTrue("non-equality: k=" + k + " j=" + j + " bytes1[k][j]=" + bytes1[k][j]
305                             + " bytes2[k][j]=" + bytes2[k][j], bytes1[k][j] == bytes2[k][j]);
306                 }
307             }
308         }
309     }
310 
311     /**
312      * test against the "void setSeed(byte[])" method; it checks out that the
313      * method throws NPE if argument supplied is null
314      */
testSetSeedbyteArray01()315     public final void testSetSeedbyteArray01() {
316         try {
317             sr.setSeed(null);
318             fail("setSeed(null) :: No NullPointerException");
319         } catch (NullPointerException e) {
320         }
321     }
322 
323     /**
324      * test against the "void setSeed(byte[])" method; it checks out that
325      * "setSeed(byte[])" method supplements its argument to current seed rather
326      * than replaces current seed
327      */
testSetSeedbyteArray02()328     public final void testSetSeedbyteArray02() throws NoSuchFieldException, SecurityException,
329             IllegalAccessException {
330         byte[] seed = new byte[LENGTH];
331         byte[] bytes1 = new byte[LENGTH];
332         byte[] bytes2 = new byte[LENGTH];
333         boolean b;
334 
335         for (int i = 0; i < seed.length; i++) {
336             seed[i] = (byte) i;
337         }
338 
339         sr.setSeed(seed);
340         sr.setSeed(seed);
341         sr2.setSeed(seed);
342 
343         sr.nextBytes(bytes1);
344         sr2.nextBytes(bytes2);
345 
346         b = true;
347         for (int j = 0; j < bytes1.length; j++) {
348             b &= bytes1[j] == bytes2[j];
349         }
350         assertFalse("unexpected: sequences are equal", b);
351     }
352 
353     /**
354      * test against the "void setSeed(byte[])" method; it checks out that the
355      * "byte[0]" argument has no effect; there are two testcases: - if one of
356      * two SecureRandom objects supplied with the same seed is additionally
357      * supplied with such array, "nextBytes(..)" of both objects return the same
358      * bytes; - two byte arrays returned by "nextBytes(..)" in following
359      * sequence nextBytes(..); setSeed(new byte[0]); nextBytes(..); don't
360      * contain the same byte sequencies.
361      */
testSetSeedbyteArray03()362     public final void testSetSeedbyteArray03() throws NoSuchFieldException, SecurityException,
363             IllegalAccessException {
364         byte[] seed = new byte[LENGTH];
365         byte[] bytes1;
366         byte[] bytes2;
367 
368         for (int i = 0; i < seed.length; i++) {
369             seed[i] = (byte) i;
370         }
371 
372         // testcase begins with "bytes1" and "bytes2" of zero length
373         for (int i = 0; i < LENGTH; i++) {
374             bytes1 = new byte[i];
375             bytes2 = new byte[i];
376 
377             sr.setSeed(seed);
378             sr.setSeed(new byte[0]);
379             sr.nextBytes(bytes1);
380 
381             sr2.setSeed(seed);
382             sr2.nextBytes(bytes2);
383 
384             for (int j = 0; j < bytes1.length; j++) {
385                 assertEquals("bytes1[j] != bytes2[j] :: j=" + j, bytes1[j], bytes2[j]);
386             }
387         }
388 
389         for (int i = 1; i < LENGTH; i++) {
390             bytes1 = new byte[i];
391             bytes2 = new byte[i];
392 
393             sr.setSeed(seed);
394             sr.nextBytes(bytes1);
395             sr.setSeed(new byte[0]);
396             sr.nextBytes(bytes2);
397 
398             boolean b = true;
399             for (int j = 0; j < bytes1.length; j++) {
400                 b &= bytes1[j] == bytes2[j];
401             }
402             assertFalse("sequences are equal i=" + i, b);
403         }
404     }
405 }
406