1561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/*
2561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Licensed to the Apache Software Foundation (ASF) under one or more
3561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  contributor license agreements.  See the NOTICE file distributed with
4561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  this work for additional information regarding copyright ownership.
5561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  The ASF licenses this file to You under the Apache License, Version 2.0
6561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  (the "License"); you may not use this file except in compliance with
7561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  the License.  You may obtain a copy of the License at
8561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
9561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *     http://www.apache.org/licenses/LICENSE-2.0
10561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *
11561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  Unless required by applicable law or agreed to in writing, software
12561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  distributed under the License is distributed on an "AS IS" BASIS,
13561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  See the License for the specific language governing permissions and
15561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes *  limitations under the License.
16561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
17561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
18561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath * @author Alexander Y. Kleymenov
208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.crypto.tests.javax.crypto.spec;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.lang.NullPointerException;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.lang.IllegalArgumentException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.lang.ArrayIndexOutOfBoundsException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.crypto.spec.IvParameterSpec;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite;
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class IvParameterSpecTest extends TestCase {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * IvParameterSpec(byte[] iv) constructor testing. Checks that
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * NullPointerException is thrown in the case of null input
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * array and that input array is copied during initialization.
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testIvParameterSpec1() {
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new IvParameterSpec(null);
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null byte array.");
498d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (NullPointerException e) {
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] iv = new byte[] { 1, 2, 3, 4, 5 };
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        IvParameterSpec ivps = new IvParameterSpec(iv);
548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        iv[0]++;
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of input array's content should not cause "
568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "the change of internal array", iv[0] == ivps.getIV()[0]);
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * IvParameterSpec(byte[] iv) constructor testing. Checks that
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * NullPointerException is thrown in the case of null input
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * array and that input array is copied during initialization.
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testIvParameterSpec2() {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new IvParameterSpec(null, 1, 1);
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an IllegalArgumentException "
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null byte array.");
698d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (ArrayIndexOutOfBoundsException e) {
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected ArrayIndexOutOfBoundsException was thrown");
718d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
728d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (NullPointerException e) {
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown");
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new IvParameterSpec(new byte[] { 1, 2, 3 }, 2, 2);
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an IllegalArgumentException "
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "if (iv.length - offset < len).");
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (ArrayIndexOutOfBoundsException e) {
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected ArrayIndexOutOfBoundsException was thrown");
828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
838d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (NullPointerException e) {
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown");
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new IvParameterSpec(new byte[] { 1, 2, 3 }, -1, 1);
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an ArrayIndexOutOfBoundsException "
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "if offset index bytes outside the iv.");
918d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (ArrayIndexOutOfBoundsException e) {
928d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (IllegalArgumentException e) {
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected IllegalArgumentException was thrown");
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        } catch (NullPointerException e) {
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown");
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        /* TODO: DRL fail with java.lang.NegativeArraySizeException
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new IvParameterSpec(new byte[] {1, 2, 3}, 1, -2);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an ArrayIndexOutOfBoundsException "
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "if len index bytes outside the iv.");
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch(ArrayIndexOutOfBoundsException e) {
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch(IllegalArgumentException e) {
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected IllegalArgumentException was thrown");
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch(NullPointerException e) {
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown");
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        */
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] iv = new byte[] { 1, 2, 3, 4, 5 };
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        IvParameterSpec ivps = new IvParameterSpec(iv, 0, iv.length);
1138d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        iv[0]++;
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of input array's content should not cause "
1158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "the change of internal array", iv[0] == ivps.getIV()[0]);
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        //Regression for HARMONY-1089
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new IvParameterSpec(new byte[2], 2, -1);
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("ArrayIndexOutOfBoundsException expected");
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ArrayIndexOutOfBoundsException e) {
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //expected
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetIV() {
1278d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] iv = new byte[] { 1, 2, 3, 4, 5 };
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        IvParameterSpec ivps = new IvParameterSpec(iv);
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        iv = ivps.getIV();
1308d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        iv[0]++;
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of returned array should not cause "
1328d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "the change of internal array", iv[0] == ivps.getIV()[0]);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(IvParameterSpecTest.class);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
140