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 Vera Y. Petrashkova
208d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath */
21561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
22561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespackage javax.crypto;
23561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
24561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.spec.AlgorithmParameterSpec;
25561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidAlgorithmParameterException;
26561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.InvalidKeyException;
27561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.Key;
28561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.NoSuchAlgorithmException;
29561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.SecureRandom;
30561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.security.AlgorithmParameters;
31561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport java.nio.ByteBuffer;
32561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
33561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesimport junit.framework.TestCase;
34561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
35561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
36561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
37561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Tests for <code>CipherSpi</code> class constructors and methods.
38561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
39561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
40561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughespublic class CipherSpiTest extends TestCase {
41561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
42561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
43561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Constructor for CipherSpiTests.
448d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     *
45561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * @param arg0
46561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
47561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public CipherSpiTest(String arg0) {
48561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        super(arg0);
49561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
50561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
51561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
528d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Test for <code>CipherSpi</code> constructor
53561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Assertion: constructs CipherSpi
54561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
55561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpiTests01() throws IllegalBlockSizeException,
56561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            BadPaddingException, ShortBufferException {
578d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
58561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
59561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("BlockSize is not 0", cSpi.engineGetBlockSize(), 0);
60561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("OutputSize is not 0", cSpi.engineGetOutputSize(1), 0);
61561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bb = cSpi.engineGetIV();
62561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Length of result byte array is not 0", bb.length, 0);
63561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertNull("Not null result", cSpi.engineGetParameters());
64561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bb1 = new byte[10];
65561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bb2 = new byte[10];
66561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb = cSpi.engineUpdate(bb1, 1, 2);
67561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrect result of engineUpdate(byte, int, int)",
68561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bb.length, 2);
69561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb = cSpi.engineDoFinal(bb1, 1, 2);
70561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrect result of engineDoFinal(byte, int, int)", 2,
71561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bb.length);
72561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(
73561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Incorrect result of engineUpdate(byte, int, int, byte, int)",
74561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                cSpi.engineUpdate(bb1, 1, 2, bb2, 7), 2);
75561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals(
76561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                "Incorrect result of engineDoFinal(byte, int, int, byte, int)",
77561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                2, cSpi.engineDoFinal(bb1, 1, 2, bb2, 0));
78561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
80561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
818d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Test for <code>engineGetKeySize(Key)</code> method
82561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Assertion: It throws UnsupportedOperationException if it is not overridden
83561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
84561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpi02() throws Exception {
85561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
86561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
87561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineGetKeySize(null);
88561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("UnsupportedOperationException must be thrown");
89561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
90561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
91561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
92561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
93561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
948d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Test for <code>engineWrap(Key)</code> method
95561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Assertion: It throws UnsupportedOperationException if it is not overridden
96561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
97561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpi03() throws Exception {
98561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
99561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
100561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineWrap(null);
101561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("UnsupportedOperationException must be thrown");
102561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
103561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
104561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
105561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
106561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
107561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Test for <code>engineUnwrap(byte[], String, int)</code> method
108561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Assertion: It throws UnsupportedOperationException if it is not overridden
109561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
110561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpi04() throws Exception {
111561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
112561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
113561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineUnwrap(new byte[0], "", 0);
114561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("UnsupportedOperationException must be thrown");
115561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (UnsupportedOperationException e) {
116561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
117561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
1188d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
119561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
120561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Test for <code>engineUpdate(ByteBuffer, ByteBuffer)</code> method
121561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Assertions:
122561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * throws NullPointerException if one of these buffers is null;
123561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * throws ShortBufferException is there is no space in output to hold result
124561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
125561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpi05() throws ShortBufferException {
126561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
127561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bb = { (byte) 0, (byte) 1, (byte) 2, (byte) 3, (byte) 4,
128561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 9, (byte) 10 };
129561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int pos = 5;
130561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int len = bb.length;
131561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bbNull = null;
132561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bb1 = ByteBuffer.allocate(len);
133561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.put(bb);
134561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(0);
135561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
136561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineUpdate(bbNull, bb1);
137561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException must be thrown");
138561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
139561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
140561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
141561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineUpdate(bb1, bbNull);
142561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException must be thrown");
143561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
144561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
145561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bb2 = ByteBuffer.allocate(bb.length);
146561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(len);
147561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrect number of stored bytes", 0, cSpi.engineUpdate(
148561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bb1, bb2));
149561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
150561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(0);
151561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb2.position(len - 2);
152561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
153561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineUpdate(bb1, bb2);
154561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("ShortBufferException bust be thrown. Output buffer remaining: "
155561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .concat(Integer.toString(bb2.remaining())));
156561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ShortBufferException e) {
157561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
158561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(10);
159561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb2.position(0);
160561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Incorrect number of stored bytes", cSpi.engineUpdate(bb1,
161561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bb2) > 0);
162561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(bb.length);
163561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        cSpi.engineUpdate(bb1, bb2);
164561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
165561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(pos);
166561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb2.position(0);
167561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int res = cSpi.engineUpdate(bb1, bb2);
168561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Incorrect result", res > 0);
169561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
170561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
171561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    /**
172561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * Test for <code>engineDoFinal(ByteBuffer, ByteBuffer)</code> method
1738d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath     * Assertions:
174561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * throws NullPointerException if one of these buffers is null;
175561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     * throws ShortBufferException is there is no space in output to hold result
176561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes     */
177561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public void testCipherSpi06() throws BadPaddingException,
178561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            ShortBufferException, IllegalBlockSizeException {
179561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        CipherSpi cSpi = new myCipherSpi();
180561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int len = 10;
181561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] bbuf = new byte[len];
182561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < bbuf.length; i++) {
183561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            bbuf[i] = (byte) i;
184561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
185561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bb1 = ByteBuffer.wrap(bbuf);
186561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bbNull = null;
187561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
188561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineDoFinal(bbNull, bb1);
189561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException must be thrown");
190561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
191561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
192561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
193561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineDoFinal(bb1, bbNull);
194561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("NullPointerException must be thrown");
195561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (NullPointerException e) {
196561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
197561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        ByteBuffer bb2 = ByteBuffer.allocate(len);
198561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(bb1.limit());
199561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertEquals("Incorrect result", 0, cSpi.engineDoFinal(bb1, bb2));
200561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
201561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(0);
202561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb2.position(len - 2);
203561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        try {
204561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            cSpi.engineDoFinal(bb1, bb2);
205561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            fail("ShortBufferException must be thrown. Output buffer remaining: "
206561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                    .concat(Integer.toString(bb2.remaining())));
207561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        } catch (ShortBufferException e) {
208561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
209561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int pos = 5;
210561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb1.position(pos);
211561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        bb2.position(0);
212561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        assertTrue("Incorrect result", cSpi.engineDoFinal(bb1, bb2) > 0);
213561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
214561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
2158d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
216561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes/**
217561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes * Additional class for CipherGeneratorSpi constructor verification
218561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes */
219561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
220561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughesclass myCipherSpi extends CipherSpi {
221561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private byte[] initV;
222561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
223561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    private static byte[] resV = { (byte) 7, (byte) 6, (byte) 5, (byte) 4,
224561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            (byte) 3, (byte) 2, (byte) 1, (byte) 0 };
225561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
226561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    public myCipherSpi() {
227561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        this.initV = new byte[0];
228561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
229561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
230561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
231561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
232561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
233561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void engineSetPadding(String padding)
234561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws NoSuchPaddingException {
235561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
236561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
237561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineGetBlockSize() {
238561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return 0;
239561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
240561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
241561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineGetOutputSize(int inputLen) {
242561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return 0;
243561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
244561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
245561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected byte[] engineGetIV() {
246561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return new byte[0];
247561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
248561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
249561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected AlgorithmParameters engineGetParameters() {
250561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return null;
251561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
252561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
253561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void engineInit(int opmode, Key key, SecureRandom random)
254561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws InvalidKeyException {
255561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
256561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
257561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void engineInit(int opmode, Key key,
258561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            AlgorithmParameterSpec params, SecureRandom random)
259561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws InvalidKeyException, InvalidAlgorithmParameterException {
260561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
261561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
262561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected void engineInit(int opmode, Key key, AlgorithmParameters params,
263561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            SecureRandom random) throws InvalidKeyException,
264561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            InvalidAlgorithmParameterException {
265561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
266561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
267561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) {
268561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (initV.length < inputLen) {
269561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            initV = new byte[inputLen];
270561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
271561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < inputLen; i++) {
272561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            initV[i] = input[inputOffset + i];
273561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
274561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return initV;
275561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
276561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
277561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineUpdate(byte[] input, int inputOffset, int inputLen,
278561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] output, int outputOffset) throws ShortBufferException {
2798d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        byte[] res = engineUpdate(input, inputOffset, inputLen);
280561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int t = res.length;
281561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if ((output.length - outputOffset) < t) {
282561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new ShortBufferException("Update");
283561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
284561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        for (int i = 0; i < t; i++) {
285561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            output[i + outputOffset] = initV[i];
286561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
287561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return t;
288561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
289561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
290561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
291561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throws IllegalBlockSizeException, BadPaddingException {
292561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if (resV.length > inputLen) {
293561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] bb = new byte[inputLen];
294561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            for (int i = 0; i < inputLen; i++) {
295561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes                bb[i] = resV[i];
296561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            }
297561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            return bb;
298561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
299561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return resV;
300561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
301561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
302561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineDoFinal(byte[] input, int inputOffset, int inputLen,
303561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            byte[] output, int outputOffset) throws ShortBufferException,
304561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            IllegalBlockSizeException, BadPaddingException {
305561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        byte[] res = engineDoFinal(input, inputOffset, inputLen);
3068d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
307561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        int t = res.length;
308561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        if ((output.length - outputOffset) < t) {
309561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            throw new ShortBufferException("DoFinal");
310561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
3118d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath        for (int i = 0; i < t; i++) {
312561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes            output[i + outputOffset] = res[i];
313561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        }
314561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return t;
315561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
316561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes
3178d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
318561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineUpdate(ByteBuffer input, ByteBuffer output)
3198d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            throws ShortBufferException {
320561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return super.engineUpdate(input, output);
321561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
3228d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath
323561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    protected int engineDoFinal(ByteBuffer input, ByteBuffer output)
3248d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            throws ShortBufferException, IllegalBlockSizeException,
3258d8858e39800de641b50f6e8e864af9cf68bedeaNarayan Kamath            BadPaddingException {
326561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes        return super.engineDoFinal(input, output);
327561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes    }
328561ee011997c6c2f1befbfaa9d5f0a99771c1d63Elliott Hughes}
329