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.security.InvalidKeyException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.util.Arrays;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport javax.crypto.spec.DESedeKeySpec;
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 DESedeKeySpecTest extends TestCase {
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructors testing. Tests behavior of each of two constructors
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * in the cases of: null array, short array, normal array.
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testDESedeKeySpec() {
44561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
458d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec((byte[]) null);
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
52561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
548d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec(new byte[] { 1, 2, 3 });
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an InvalidKeyException on a short byte array.");
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
57561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
618d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
628d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
638d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4 });
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected InvalidKeyException was thrown.");
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec((byte[]) null, 1);
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4 }, 1);
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an InvalidKeyException on a short byte array.");
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
888d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            new DESedeKeySpec(new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
898d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
908d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    1, 2, 3, 4, 5 }, 1);
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
94561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected InvalidKeyException was thrown.");
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * getKey() method testing. Checks that modification of returned key
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * does not affect the internal key. Also test check an equality of
101e98fbf8686c5289bf03fe5c3de7ff82d3a77104dElliott Hughes     * the key with the key specified in the constructor. The object under
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * the test is created by different constructors.
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testGetKey() {
1058d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] key = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
1068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 };
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        DESedeKeySpec ks;
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ks = new DESedeKeySpec(key);
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("InvalidKeyException should not be thrown.");
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return;
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] res = ks.getKey();
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The returned array should be equal to the specified "
1168d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "in constructor.", Arrays.equals(key, res));
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        res[0] += 1;
118561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertFalse("The modification of returned key should not affect"
1198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "the underlying key.", key[0] == res[0]);
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1218d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] key1 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3,
1228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 };
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ks = new DESedeKeySpec(key1, 2);
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("InvalidKeyException should not be thrown.");
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return;
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        res = ks.getKey();
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNotSame("The returned array should not be the same object "
1318d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "as specified in a constructor.", key1, res);
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] exp = new byte[24];
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        System.arraycopy(key1, 2, exp, 0, 24);
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("The returned array should be equal to the specified "
1358d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                + "in constructor.", Arrays.equals(exp, res));
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * isParityAdjusted(byte[] key, offset) method testing. Tests if the
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * method throws appropriate exceptions on incorrect byte array, if
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * it returns false on the key which is not parity adjusted, and if
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * it returns true on parity adjusted key.
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testIsParityAdjusted() {
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            DESedeKeySpec.isParityAdjusted(null, 1);
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an NullPointerException "
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of null byte array.");
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1558d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] key = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,
1568d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            DESedeKeySpec.isParityAdjusted(key, 1);
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Should raise an InvalidKeyException "
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    + "in case of short byte array.");
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1668d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] key_not_pa = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
1678d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2 };
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertFalse("Method returns true when false is expected.",
1708d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    DESedeKeySpec.isParityAdjusted(key_not_pa, 0));
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
173561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected InvalidKeyException was thrown.");
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
1778d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] key_pa = { (byte) 128, (byte) 131, (byte) 133, (byte) 134,
1788d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                (byte) 137, (byte) 138, (byte) 140, (byte) 143,
1798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                (byte) 145, (byte) 146, (byte) 148, (byte) 151,
1808d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                (byte) 152, (byte) 155, (byte) 157, (byte) 158,
1818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                (byte) 161, (byte) 162, (byte) 164, (byte) 167,
1828d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                (byte) 168, (byte) 171, (byte) 173, (byte) 174 };
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            assertTrue("Method returns false when true is expected.",
1858d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath                    DESedeKeySpec.isParityAdjusted(key_pa, 0));
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected NullPointerException was thrown.");
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (InvalidKeyException e) {
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("Unexpected InvalidKeyException was thrown.");
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public static Test suite() {
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new TestSuite(DESedeKeySpecTest.class);
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
198