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/**
19561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes* @author Alexander Y. Kleymenov
20561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes*/
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage org.apache.harmony.crypto.tests.javax.crypto.spec;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.crypto.spec.SecretKeySpec;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.Test;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestSuite;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class SecretKeySpecTest extends TestCase {
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SecretKeySpec(byte[] key, String algorithm) method testing. Tests that
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * IllegalArgumentException is thrown in the case of inappropriate
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * constructor parameters and that input iv array is
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * copied to protect against subsequent modification.
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSecretKeySpec1() {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(new byte[] {}, algorithm);
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of empty key.");
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(null, algorithm);
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null key.");
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, null);
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null algorithm.");
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks = new SecretKeySpec(key, algorithm);
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        key[0] ++;
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of key specified in the constructor "
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "should not cause the change of internal array.",
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    key[0] == ks.getEncoded()[0]);
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * SecretKeySpec(byte[] key, int offset, int len, String algorithm) method
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * testing. Tests that IllegalArgumentException is thrown in
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * the case of inappropriate constructor parameters and that input iv array
79561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * is copied to protect against subsequent modification.
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
81561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testSecretKeySpec2() {
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int offset = 1;
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int len = 4;
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(new byte[] {}, 0, 0, algorithm);
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of empty key.");
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(null, 0, 0, algorithm);
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null key.");
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, offset, len, null);
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of short key algorithm.");
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, offset, key.length, algorithm);
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "when offset and len specify an invalid chunk of key.");
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, -1, key.length, algorithm);
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An ArrayIndexOutOfBoundsException should be thrown "
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of negative offset.");
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Not expected IllegalArgumentException was thrown.");
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ArrayIndexOutOfBoundsException e) {
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-6347
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, -1, key.length+2, algorithm);
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An ArrayIndexOutOfBoundsException should be thrown "
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of negative offset.");
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Not expected IllegalArgumentException was thrown.");
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ArrayIndexOutOfBoundsException e) {
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(key, offset, len, null);
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("An IllegalArgumentException should be thrown "
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the case of null algorithm.");
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (IllegalArgumentException e) {
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks = new SecretKeySpec(key, algorithm);
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        key[offset] ++;
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of key specified in the constructor "
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "should not cause the change of internal array.",
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    key[offset] == ks.getEncoded()[0]);
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // Regression test for HARMONY-1077
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            new SecretKeySpec(new byte[] { 2 }, 4, -100, "CCC");
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("ArrayIndexOutOfBoundsException expected");
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ArrayIndexOutOfBoundsException e) {
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            //expected
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getAlgorithm() method testing. Tests that returned value is
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * equal to the value specified in the constructor.
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetAlgorithm() {
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks = new SecretKeySpec(key, algorithm);
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("The returned value does not equal to the "
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                + "value specified in the constructor.",
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                algorithm, ks.getAlgorithm());
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getFormat() method testing. Tests that returned value is "RAW".
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetFormat() {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks = new SecretKeySpec(key, algorithm);
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The returned value is not \"RAW\".",
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                ks.getFormat() == "RAW");
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getEncoded() method testing. Tests that returned array is equal to the
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * array specified in the constructor. Checks that modification
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * of returned array does not affect the internal array.
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetEncoded() {
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks = new SecretKeySpec(key, algorithm);
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] result = ks.getEncoded();
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (! Arrays.equals(key, result)) {
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("The returned key does not equal to the specified "
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in the constructor.");
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        result[0] ++;
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The change of returned by getEncoded() method key "
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "should not cause the change of internal array.",
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    result[0] == ks.getEncoded()[0]);
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		// Regression for HARMONY-78
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int offset = 1;
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		int len = 4;
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		SecretKeySpec sks = new SecretKeySpec(key, offset, len, algorithm);
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes		assertEquals("Key length is incorrect", len, sks.getEncoded().length);
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * hashCode() method testing. Tests that for equal objects hash codes
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * are equal.
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testHashCode() {
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
215561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks1 = new SecretKeySpec(key, algorithm);
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks2 = new SecretKeySpec(key, algorithm);
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Equal objects should have the same hash codes.",
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                            ks1.hashCode() == ks2.hashCode());
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * equals(Object obj) method testing. Tests the correctness of equal
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * operation: it should be reflexive, symmetric, transitive, consistent
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * and should be false on null object.
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testEquals() {
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] key = new byte[] {1, 2, 3, 4, 5};
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        String algorithm = "Algorithm";
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks1 = new SecretKeySpec(key, algorithm);
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks2 = new SecretKeySpec(key, algorithm);
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        SecretKeySpec ks3 = new SecretKeySpec(key, algorithm);
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checking for reflexive law:
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The equivalence relation should be reflexive.",
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks1.equals(ks1));
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Objects built on the same parameters should be equal.",
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks1.equals(ks2));
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checking for symmetric law:
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The equivalence relation should be symmetric.",
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks2.equals(ks1));
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Objects built on the equal parameters should be equal.",
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks2.equals(ks3));
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        // checking for transitive law:
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The equivalence relation should be transitive.",
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks1.equals(ks3));
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Should not be equal to null object.",
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                                                        ks1.equals(null));
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ks2 = new SecretKeySpec(new byte[] {1}, algorithm);
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Objects should not be equal.", ks1.equals(ks2));
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ks2 = new SecretKeySpec(key, "Another Algorithm");
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("Objects should not be equal.", ks1.equals(ks2));
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(SecretKeySpecTest.class);
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
267