1d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root/*
2d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * Copyright 2013 The Android Open Source Project
3d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root *
4d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * you may not use this file except in compliance with the License.
6d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * You may obtain a copy of the License at
7d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root *
8d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root *     http://www.apache.org/licenses/LICENSE-2.0
9d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root *
10d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * Unless required by applicable law or agreed to in writing, software
11d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * See the License for the specific language governing permissions and
14d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root * limitations under the License.
15d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root */
16d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
17d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Rootpackage org.apache.harmony.crypto.tests.javax.crypto.spec;
18d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
19d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Rootimport java.util.Arrays;
20d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
21d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Rootimport javax.crypto.spec.GCMParameterSpec;
22d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
23d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Rootimport junit.framework.TestCase;
24d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
25d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Rootpublic class GCMParameterSpecTest extends TestCase {
26d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    private static final byte[] TEST_IV = new byte[8];
27d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
28d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArray_Success() throws Exception {
29d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        new GCMParameterSpec(8, TEST_IV);
30d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
31d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
32d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArray_NegativeTLen_Failure() throws Exception {
33d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        try {
34d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            new GCMParameterSpec(-1, TEST_IV);
35d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            fail("Should throw IllegalArgumentException");
36d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        } catch (IllegalArgumentException expected) {
37d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
38d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
39d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
40d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArray_NullIv_Failure() throws Exception {
41d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        try {
42d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            new GCMParameterSpec(8, null);
43d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            fail("Should throw IllegalArgumentException");
44d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        } catch (IllegalArgumentException expected) {
45d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
46d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
47d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
48d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArrayWithOffsets_Success() throws Exception {
49d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        new GCMParameterSpec(8, TEST_IV, 0, TEST_IV.length);
50d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
51d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
52d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArrayWithOffsets_NullIv_Failure() throws Exception {
53d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        try {
54d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            new GCMParameterSpec(8, null, 0, TEST_IV.length);
55d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            fail("Should throw IllegalArgumentException");
56d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        } catch (IllegalArgumentException expected) {
57d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
58d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
59d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
60d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArrayWithOffsets_NegativeOffset_Failure() throws Exception {
61d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        try {
62d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            new GCMParameterSpec(8, TEST_IV, -1, TEST_IV.length);
63d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            fail("Should throw IllegalArgumentException");
64d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        } catch (IllegalArgumentException expected) {
65d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
66d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
67d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
68d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testConstructor_IntByteArrayWithOffsets_TooLongLength_Failure() throws Exception {
69d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        try {
70d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            new GCMParameterSpec(8, TEST_IV, 0, TEST_IV.length + 1);
71d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            fail("Should throw IllegalArgumentException");
72d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        } catch (IllegalArgumentException expected) {
73d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
74d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
75d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
76d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testGetIV_Success() throws Exception {
77d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        GCMParameterSpec spec = new GCMParameterSpec(8, TEST_IV);
78d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
79d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        byte[] actual = spec.getIV();
80d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        assertEquals(Arrays.toString(TEST_IV), Arrays.toString(actual));
81d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
82d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        // XOR with 0xFF so we're sure we changed the array
83d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        for (int i = 0; i < actual.length; i++) {
84d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root            actual[i] ^= 0xFF;
85d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        }
86d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
87d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        assertFalse("Changing the IV returned shouldn't change the parameter spec",
88d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root                Arrays.equals(spec.getIV(), actual));
89d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        assertEquals(Arrays.toString(TEST_IV), Arrays.toString(spec.getIV()));
90d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
91d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
92d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testGetIV_Subarray_Success() throws Exception {
93d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        GCMParameterSpec spec = new GCMParameterSpec(8, TEST_IV, 2, 4);
94d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        assertEquals(Arrays.toString(Arrays.copyOfRange(TEST_IV, 2, 6)),
95d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root                Arrays.toString(spec.getIV()));
96d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
97d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root
98d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    public void testGetTLen_Success() throws Exception {
99d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        GCMParameterSpec spec = new GCMParameterSpec(8, TEST_IV);
100d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root        assertEquals(8, spec.getTLen());
101d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root    }
102d416195acbc08f2b3bdd5d5532d40438465d99e9Kenny Root}
103