1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  the License.  You may obtain a copy of the License at
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *  limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Vera Y. Petrashkova
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255e0de5adc153f16923008af80ae88578c4801235Sergio Giroimport java.nio.DirectByteBuffer;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Key;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AlgorithmParameters;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.BadPaddingException;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.IllegalBlockSizeException;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.NoSuchPaddingException;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.ShortBufferException;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.CipherSpi;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer;
395e0de5adc153f16923008af80ae88578c4801235Sergio Giroimport java.util.concurrent.atomic.AtomicInteger;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Tests for <code>CipherSpi</code> class constructors and methods.
46f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CipherSpiTest extends TestCase {
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class Mock_CipherSpi extends myCipherSpi {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws IllegalBlockSizeException, BadPaddingException {
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineDoFinal(input, inputOffset, inputLen);
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output,
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int outputOffset) throws ShortBufferException, IllegalBlockSizeException,
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                BadPaddingException {
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineDoFinal(input, inputOffset, inputLen, output, outputOffset);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineGetBlockSize() {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineGetBlockSize();
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected byte[] engineGetIV() {
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineGetIV();
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineGetOutputSize(int inputLen) {
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineGetOutputSize(inputLen);
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected AlgorithmParameters engineGetParameters() {
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineGetParameters();
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineInit(int opmode, Key key, SecureRandom random)
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws InvalidKeyException {
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.engineInit(opmode, key, random);
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params,
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.engineInit(opmode, key, params, random);
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineInit(int opmode, Key key, AlgorithmParameters params,
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                SecureRandom random) throws InvalidKeyException, InvalidAlgorithmParameterException {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.engineInit(opmode, key, params, random);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.engineSetMode(mode);
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected void engineSetPadding(String padding) throws NoSuchPaddingException {
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.engineSetPadding(padding);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineUpdate(input, inputOffset, inputLen);
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output,
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                int outputOffset) throws ShortBufferException {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineUpdate(input, inputOffset, inputLen, output, outputOffset);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected int engineGetKeySize(Key key) throws InvalidKeyException {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineGetKeySize(key);
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected byte[] engineWrap(Key key) throws InvalidKeyException, IllegalBlockSizeException {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineWrap(key);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @Override
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Key engineUnwrap(byte[] wrappedKey, String wrappedKeyAlgorithm, int wrappedKeyType)
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws InvalidKeyException, NoSuchAlgorithmException {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return super.engineUnwrap(wrappedKey, wrappedKeyAlgorithm, wrappedKeyType);
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>CipherSpi</code> constructor
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertion: constructs CipherSpi
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpiTests01() throws IllegalBlockSizeException,
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BadPaddingException, ShortBufferException {
146f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("BlockSize is not 0", cSpi.engineGetBlockSize(), 0);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("OutputSize is not 0", cSpi.engineGetOutputSize(1), 0);
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bb = cSpi.engineGetIV();
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Length of result byte array is not 0", bb.length, 0);
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull("Not null result", cSpi.engineGetParameters());
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bb1 = new byte[10];
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bb2 = new byte[10];
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb = cSpi.engineUpdate(bb1, 1, 2);
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect result of engineUpdate(byte, int, int)",
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bb.length, 2);
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb = cSpi.engineDoFinal(bb1, 1, 2);
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect result of engineDoFinal(byte, int, int)", 2,
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bb.length);
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "Incorrect result of engineUpdate(byte, int, int, byte, int)",
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                cSpi.engineUpdate(bb1, 1, 2, bb2, 7), 2);
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals(
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                "Incorrect result of engineDoFinal(byte, int, int, byte, int)",
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                2, cSpi.engineDoFinal(bb1, 1, 2, bb2, 0));
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
168f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
170f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>engineGetKeySize(Key)</code> method
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertion: It throws UnsupportedOperationException if it is not overridden
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpi02() throws Exception {
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineGetKeySize(null);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("UnsupportedOperationException must be thrown");
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnsupportedOperationException e) {
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
183f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Test for <code>engineWrap(Key)</code> method
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertion: It throws UnsupportedOperationException if it is not overridden
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpi03() throws Exception {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineWrap(null);
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("UnsupportedOperationException must be thrown");
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnsupportedOperationException e) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>engineUnwrap(byte[], String, int)</code> method
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertion: It throws UnsupportedOperationException if it is not overridden
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpi04() throws Exception {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineUnwrap(new byte[0], "", 0);
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("UnsupportedOperationException must be thrown");
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnsupportedOperationException e) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>engineUpdate(ByteBuffer, ByteBuffer)</code> method
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Assertions:
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws NullPointerException if one of these buffers is null;
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws ShortBufferException is there is no space in output to hold result
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpi05() throws ShortBufferException {
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bb = { (byte) 0, (byte) 1, (byte) 2, (byte) 3, (byte) 4,
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                (byte) 5, (byte) 6, (byte) 7, (byte) 8, (byte) 9, (byte) 10 };
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int pos = 5;
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int len = bb.length;
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbNull = null;
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb1 = ByteBuffer.allocate(len);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.put(bb);
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(0);
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineUpdate(bbNull, bb1);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException must be thrown");
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NullPointerException e) {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineUpdate(bb1, bbNull);
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException must be thrown");
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NullPointerException e) {
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb2 = ByteBuffer.allocate(bb.length);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(len);
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect number of stored bytes", 0, cSpi.engineUpdate(
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bb1, bb2));
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(0);
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb2.position(len - 2);
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineUpdate(bb1, bb2);
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ShortBufferException bust be thrown. Output buffer remaining: "
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .concat(Integer.toString(bb2.remaining())));
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (ShortBufferException e) {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(10);
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb2.position(0);
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Incorrect number of stored bytes", cSpi.engineUpdate(bb1,
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bb2) > 0);
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(bb.length);
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cSpi.engineUpdate(bb1, bb2);
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(pos);
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb2.position(0);
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int res = cSpi.engineUpdate(bb1, bb2);
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Incorrect result", res > 0);
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Test for <code>engineDoFinal(ByteBuffer, ByteBuffer)</code> method
262f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * Assertions:
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws NullPointerException if one of these buffers is null;
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * throws ShortBufferException is there is no space in output to hold result
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testCipherSpi06() throws BadPaddingException,
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ShortBufferException, IllegalBlockSizeException {
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Mock_CipherSpi cSpi = new Mock_CipherSpi();
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int len = 10;
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bbuf = new byte[len];
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < bbuf.length; i++) {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            bbuf[i] = (byte) i;
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb1 = ByteBuffer.wrap(bbuf);
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bbNull = null;
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineDoFinal(bbNull, bb1);
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException must be thrown");
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NullPointerException e) {
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineDoFinal(bb1, bbNull);
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException must be thrown");
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (NullPointerException e) {
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bb2 = ByteBuffer.allocate(len);
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(bb1.limit());
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Incorrect result", 0, cSpi.engineDoFinal(bb1, bb2));
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(0);
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb2.position(len - 2);
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cSpi.engineDoFinal(bb1, bb2);
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("ShortBufferException must be thrown. Output buffer remaining: "
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .concat(Integer.toString(bb2.remaining())));
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (ShortBufferException e) {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int pos = 5;
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb1.position(pos);
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bb2.position(0);
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Incorrect result", cSpi.engineDoFinal(bb1, bb2) > 0);
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
3035e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3045e0de5adc153f16923008af80ae88578c4801235Sergio Giro    public void testCrypt_doNotCallPositionInNonArrayBackedInputBuffer() throws Exception {
3055e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer nonArrayBackedInputBuffer = new MockNonArrayBackedByteBuffer(10, false);
3065e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer nonArrayBackedOutputBuffer = new MockNonArrayBackedByteBuffer(10, false);
3075e0de5adc153f16923008af80ae88578c4801235Sergio Giro        Mock_CipherSpi cipherSpi = new Mock_CipherSpi() {
3085e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public int engineGetOutputSize(int inputLength) {
3095e0de5adc153f16923008af80ae88578c4801235Sergio Giro                return inputLength;
3105e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3115e0de5adc153f16923008af80ae88578c4801235Sergio Giro        };
3125e0de5adc153f16923008af80ae88578c4801235Sergio Giro        cipherSpi.engineUpdate(nonArrayBackedInputBuffer, nonArrayBackedOutputBuffer);
3135e0de5adc153f16923008af80ae88578c4801235Sergio Giro        assertEquals(0, nonArrayBackedInputBuffer.position());
3145e0de5adc153f16923008af80ae88578c4801235Sergio Giro    }
3155e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3165e0de5adc153f16923008af80ae88578c4801235Sergio Giro    public void testCrypt_doNotCallPutForZeroLengthOutput() throws Exception {
3175e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer nonArrayBackedInputBuffer = new MockNonArrayBackedByteBuffer(10, false);
3185e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer nonArrayBackedOutputBuffer = new MockNonArrayBackedByteBuffer(10, false) {
3195e0de5adc153f16923008af80ae88578c4801235Sergio Giro            @Override
3205e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public ByteBuffer put(byte[] dst, int offset, int length) {
3215e0de5adc153f16923008af80ae88578c4801235Sergio Giro                if (length == 0) {
3225e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    throw new IllegalStateException("put shouldn't be called with length 0");
3235e0de5adc153f16923008af80ae88578c4801235Sergio Giro                }
3245e0de5adc153f16923008af80ae88578c4801235Sergio Giro                return this;
3255e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3265e0de5adc153f16923008af80ae88578c4801235Sergio Giro        };
3275e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3285e0de5adc153f16923008af80ae88578c4801235Sergio Giro        Mock_CipherSpi cipherSpi = new Mock_CipherSpi() {
3295e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public int engineUpdate(
3305e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    byte[] input, int inputOffset, int inputLen, byte[] output, int outputOffset) {
3315e0de5adc153f16923008af80ae88578c4801235Sergio Giro                return 0;
3325e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3335e0de5adc153f16923008af80ae88578c4801235Sergio Giro        };
3345e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3355e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // The put method is not called in the output buffer and so the test passes.
3365e0de5adc153f16923008af80ae88578c4801235Sergio Giro        cipherSpi.engineUpdate(nonArrayBackedInputBuffer, nonArrayBackedOutputBuffer);
3375e0de5adc153f16923008af80ae88578c4801235Sergio Giro    }
3385e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3395e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // In case a call to engineGetOutputSize returns 0 for the whole input size, but a positive
3405e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // value for the chunk size to be written, check that the positive output size is used in the
3415e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // second attempt to read from the the buffer.
3425e0de5adc153f16923008af80ae88578c4801235Sergio Giro    public void testCrypt_outputSizeUpdatedAfterShortBufferException()
3435e0de5adc153f16923008af80ae88578c4801235Sergio Giro            throws Exception {
3445e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3455e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // 4096 is the value hardcoded for a maximum array allocation in CipherSpi#getTempArraySize
3465e0de5adc153f16923008af80ae88578c4801235Sergio Giro        final int maxInternalArrayAllocation = 4096;
3475e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // The length of the input is greater than the max chunk allowed, so the size of the chunk
3485e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // and the size of the input will differ.
3495e0de5adc153f16923008af80ae88578c4801235Sergio Giro        final int testInputLength = maxInternalArrayAllocation + 1;
3505e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // Length to be returned the second time engineGetOutputSize is called (that is, when it's
3515e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // called with maxInternalArrayAllocation). First length returned (that is, when it's
3525e0de5adc153f16923008af80ae88578c4801235Sergio Giro        // called with testInputLength) is 0.
3535e0de5adc153f16923008af80ae88578c4801235Sergio Giro        final int testSecondOutputLength = 1000;
3545e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3555e0de5adc153f16923008af80ae88578c4801235Sergio Giro        final AtomicInteger firstGetLength = new AtomicInteger(0);
3565e0de5adc153f16923008af80ae88578c4801235Sergio Giro        final AtomicInteger secondGetLength = new AtomicInteger(0);
3575e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3585e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer inputBuffer = new MockNonArrayBackedByteBuffer(testInputLength, false) {
3595e0de5adc153f16923008af80ae88578c4801235Sergio Giro            private boolean getWasCalled = false;
3605e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3615e0de5adc153f16923008af80ae88578c4801235Sergio Giro            @Override
3625e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public ByteBuffer get(byte[] dst, int offset, int length) {
3635e0de5adc153f16923008af80ae88578c4801235Sergio Giro                if (!getWasCalled) {
3645e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    getWasCalled = true;
3655e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    firstGetLength.set(length);
3665e0de5adc153f16923008af80ae88578c4801235Sergio Giro                } else {
3675e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    if (secondGetLength.get() == 0) {
3685e0de5adc153f16923008af80ae88578c4801235Sergio Giro                        secondGetLength.set(length);
3695e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    }
3705e0de5adc153f16923008af80ae88578c4801235Sergio Giro                }
3715e0de5adc153f16923008af80ae88578c4801235Sergio Giro                return this;
3725e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3735e0de5adc153f16923008af80ae88578c4801235Sergio Giro        };
3745e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3755e0de5adc153f16923008af80ae88578c4801235Sergio Giro        ByteBuffer outputBuffer = new MockNonArrayBackedByteBuffer(10, false);
3765e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3775e0de5adc153f16923008af80ae88578c4801235Sergio Giro        Mock_CipherSpi cipherSpi = new Mock_CipherSpi() {
3785e0de5adc153f16923008af80ae88578c4801235Sergio Giro            @Override
3795e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public int engineGetOutputSize(int inputLength) {
3805e0de5adc153f16923008af80ae88578c4801235Sergio Giro                if (inputLength == testInputLength) {
3815e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    return 0;
3825e0de5adc153f16923008af80ae88578c4801235Sergio Giro                } else if (inputLength == maxInternalArrayAllocation) {
3835e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    return testSecondOutputLength;
3845e0de5adc153f16923008af80ae88578c4801235Sergio Giro                } else {
3855e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    throw new IllegalStateException("Unexpected value " + inputLength);
3865e0de5adc153f16923008af80ae88578c4801235Sergio Giro                }
3875e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3885e0de5adc153f16923008af80ae88578c4801235Sergio Giro
3895e0de5adc153f16923008af80ae88578c4801235Sergio Giro            @Override
3905e0de5adc153f16923008af80ae88578c4801235Sergio Giro            public int engineUpdate(
3915e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    byte[] inArray, int inOfs, int inLen, byte[] outArray, int outputOffset)
3925e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    throws ShortBufferException {
3935e0de5adc153f16923008af80ae88578c4801235Sergio Giro                if (inLen == maxInternalArrayAllocation) {
3945e0de5adc153f16923008af80ae88578c4801235Sergio Giro                    throw new ShortBufferException("to be caught in order to retry with a new"
3955e0de5adc153f16923008af80ae88578c4801235Sergio Giro                            + "output size");
3965e0de5adc153f16923008af80ae88578c4801235Sergio Giro                }
3975e0de5adc153f16923008af80ae88578c4801235Sergio Giro                return 0;
3985e0de5adc153f16923008af80ae88578c4801235Sergio Giro            }
3995e0de5adc153f16923008af80ae88578c4801235Sergio Giro        };
4005e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4015e0de5adc153f16923008af80ae88578c4801235Sergio Giro        cipherSpi.engineUpdate(inputBuffer, outputBuffer);
4025e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4035e0de5adc153f16923008af80ae88578c4801235Sergio Giro        assertEquals(
4045e0de5adc153f16923008af80ae88578c4801235Sergio Giro                "first call to get must use the input length, as the output length "
4055e0de5adc153f16923008af80ae88578c4801235Sergio Giro                        + "from engineGetOutputSize is 0",
4065e0de5adc153f16923008af80ae88578c4801235Sergio Giro                maxInternalArrayAllocation,
4075e0de5adc153f16923008af80ae88578c4801235Sergio Giro                firstGetLength.get());
4085e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4095e0de5adc153f16923008af80ae88578c4801235Sergio Giro        assertEquals(
4105e0de5adc153f16923008af80ae88578c4801235Sergio Giro                "second call to get must use the new output length",
4115e0de5adc153f16923008af80ae88578c4801235Sergio Giro                testSecondOutputLength,
4125e0de5adc153f16923008af80ae88578c4801235Sergio Giro                secondGetLength.get());
4135e0de5adc153f16923008af80ae88578c4801235Sergio Giro    }
4145e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4155e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // The tests using ByteBuffer depend on final methods (like hasArray) that cannot be mocked in
4165e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // Mockito, so the mock is done manually. ByteBuffer has abstract methods that are
4175e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // package-private, so extending DirectByteBuffer. It happens to be not backed by an array, so
4185e0de5adc153f16923008af80ae88578c4801235Sergio Giro    // we use it when we need a byte buffer not array-backed.
4195e0de5adc153f16923008af80ae88578c4801235Sergio Giro    private class MockNonArrayBackedByteBuffer extends DirectByteBuffer {
4205e0de5adc153f16923008af80ae88578c4801235Sergio Giro        public MockNonArrayBackedByteBuffer(int capacity, boolean isReadOnly) {
4215e0de5adc153f16923008af80ae88578c4801235Sergio Giro            super(capacity, 0 /* addr */, null /* fd */, null /* unmapper */, isReadOnly);
4225e0de5adc153f16923008af80ae88578c4801235Sergio Giro        }
4235e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4245e0de5adc153f16923008af80ae88578c4801235Sergio Giro        @Override
4255e0de5adc153f16923008af80ae88578c4801235Sergio Giro        public ByteBuffer get(byte[] dst, int offset, int length) {
4265e0de5adc153f16923008af80ae88578c4801235Sergio Giro            return this;
4275e0de5adc153f16923008af80ae88578c4801235Sergio Giro        }
4285e0de5adc153f16923008af80ae88578c4801235Sergio Giro
4295e0de5adc153f16923008af80ae88578c4801235Sergio Giro        @Override
4305e0de5adc153f16923008af80ae88578c4801235Sergio Giro        public ByteBuffer put(byte[] dst, int offset, int length) {
4315e0de5adc153f16923008af80ae88578c4801235Sergio Giro            return this;
4325e0de5adc153f16923008af80ae88578c4801235Sergio Giro        }
4335e0de5adc153f16923008af80ae88578c4801235Sergio Giro    }
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Additional class for CipherGeneratorSpi constructor verification
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectclass myCipherSpi extends CipherSpi {
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private byte[] initV;
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static byte[] resV = { (byte) 7, (byte) 6, (byte) 5, (byte) 4,
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            (byte) 3, (byte) 2, (byte) 1, (byte) 0 };
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public myCipherSpi() {
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.initV = new byte[0];
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void engineSetMode(String mode) throws NoSuchAlgorithmException {
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void engineSetPadding(String padding)
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws NoSuchPaddingException {
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineGetBlockSize() {
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return 0;
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineGetOutputSize(int inputLen) {
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return 0;
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected byte[] engineGetIV() {
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return new byte[0];
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected AlgorithmParameters engineGetParameters() {
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void engineInit(int opmode, Key key, SecureRandom random)
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException {
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void engineInit(int opmode, Key key,
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            AlgorithmParameterSpec params, SecureRandom random)
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException, InvalidAlgorithmParameterException {
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected void engineInit(int opmode, Key key, AlgorithmParameters params,
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SecureRandom random) throws InvalidKeyException,
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InvalidAlgorithmParameterException {
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) {
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (initV.length < inputLen) {
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            initV = new byte[inputLen];
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < inputLen; i++) {
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            initV[i] = input[inputOffset + i];
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return initV;
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineUpdate(byte[] input, int inputOffset, int inputLen,
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] output, int outputOffset) throws ShortBufferException {
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte []res = engineUpdate(input, inputOffset, inputLen);
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int t = res.length;
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((output.length - outputOffset) < t) {
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ShortBufferException("Update");
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < t; i++) {
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            output[i + outputOffset] = initV[i];
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return t;
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen)
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IllegalBlockSizeException, BadPaddingException {
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (resV.length > inputLen) {
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] bb = new byte[inputLen];
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < inputLen; i++) {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bb[i] = resV[i];
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return bb;
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return resV;
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineDoFinal(byte[] input, int inputOffset, int inputLen,
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] output, int outputOffset) throws ShortBufferException,
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IllegalBlockSizeException, BadPaddingException {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] res = engineDoFinal(input, inputOffset, inputLen);
526f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int t = res.length;
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((output.length - outputOffset) < t) {
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new ShortBufferException("DoFinal");
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
531f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        for (int i = 0; i < t; i++) {
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            output[i + outputOffset] = res[i];
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return t;
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
537f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineUpdate(ByteBuffer input, ByteBuffer output)
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    throws ShortBufferException {
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.engineUpdate(input, output);
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int engineDoFinal(ByteBuffer input, ByteBuffer output)
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    throws ShortBufferException, IllegalBlockSizeException,
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    BadPaddingException {
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return super.engineDoFinal(input, output);
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
548