1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestLevel;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetClass;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport dalvik.annotation.TestTargets;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport org.apache.harmony.crypto.tests.support.MyCipher;
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport tests.support.resource.Support_Resources;
28dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilsonimport tests.util.TestEnvironment;
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.ByteArrayOutputStream;
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.File;
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.IOException;
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.io.InputStream;
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.math.BigInteger;
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.MalformedURLException;
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.net.URL;
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ByteBuffer;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.nio.ReadOnlyBufferException;
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.AlgorithmParameters;
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.InvalidKeyException;
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Key;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.NoSuchProviderException;
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Provider;
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.SecureRandom;
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.Security;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.cert.Certificate;
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.cert.CertificateException;
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.cert.CertificateFactory;
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.spec.RSAKeyGenParameterSpec;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.BadPaddingException;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.Cipher;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.CipherSpi;
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.IllegalBlockSizeException;
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.KeyGenerator;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.NoSuchPaddingException;
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.SecretKeyFactory;
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.ShortBufferException;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.spec.DESedeKeySpec;
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.spec.IvParameterSpec;
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project@TestTargetClass(Cipher.class)
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class CipherTest extends junit.framework.TestCase {
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Key cipherKey;
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final String algorithm = "DESede";
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final int keyLen = 168;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static Key cipherKeyDES;
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final String algorithmDES = "DES";
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static final int keyLenDES = 56;
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static {
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyGenerator kg = KeyGenerator.getInstance(algorithm);
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            kg.init(keyLen, new SecureRandom());
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipherKey = kg.generateKey();
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            kg = KeyGenerator.getInstance(algorithmDES);
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            kg.init(keyLenDES, new SecureRandom());
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipherKeyDES = kg.generateKey();
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (Exception e) {
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No key " + e);
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
90dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson
91dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson    @Override protected void setUp() throws Exception {
92dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson        super.setUp();
93dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson        TestEnvironment.reset();
94dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson    }
95dafd6348b2e1b46d10e1dbfa64fd2dd44bcfedf2Jesse Wilson
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getInstance(java.lang.String)
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getInstance",
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetMode",
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetPadding",
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_String() throws Exception {
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("Received a null Cipher instance", cipher);
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getInstance("WrongAlgorithmName");
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NoSuchAlgorithmException expected");
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//        RI throws  NoSuchAlgorithmException for wrong padding.
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getInstance(java.lang.String,
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.lang.String)
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getInstance",
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class, java.lang.String.class}
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetMode",
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetPadding",
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_StringLjava_lang_String()
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws Exception {
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.DES");
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("No installed providers support Cipher.DES", providers);
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < providers.length; i++) {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher cipher = Cipher.getInstance("DES", providers[i].getName());
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull("Cipher.getInstance() returned a null value", cipher);
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Exception case
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                cipher = Cipher.getInstance("DoBeDoBeDo", providers[i]);
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                fail("Should have thrown an NoSuchAlgorithmException");
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (NoSuchAlgorithmException e) {
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // Expected
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception case
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getInstance("DES", (String) null);
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have thrown an IllegalArgumentException");
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception case
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getInstance("DES", "IHaveNotBeenConfigured");
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have thrown an NoSuchProviderException");
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchProviderException e) {
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//      RI throws  NoSuchAlgorithmException for wrong padding.
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getInstance(java.lang.String,
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.Provider)
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getInstance",
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class, java.security.Provider.class}
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetMode",
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineSetPadding",
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.lang.String.class}
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getInstanceLjava_lang_StringLjava_security_Provider()
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws Exception {
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.DES");
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("No installed providers support Cipher.DES", providers);
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < providers.length; i++) {
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher cipher = Cipher.getInstance("DES", providers[i]);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull("Cipher.getInstance() returned a null value", cipher);
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception case
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getInstance("DES", (Provider) null);
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("Should have thrown an IllegalArgumentException");
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Exception case
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getInstance("WrongAlg", providers[0]);
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NoSuchAlgorithmException expected");
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // Expected
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project//      RI throws  NoSuchAlgorithmException for wrong padding.
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getProvider()
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getProvider",
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getProvider() throws Exception {
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.AES");
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull("No providers support Cipher.AES", providers);
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < providers.length; i++) {
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider provider = providers[i];
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher cipher = Cipher.getInstance("AES", provider.getName());
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Provider cipherProvider = cipher.getProvider();
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue("Cipher provider is not the same as that "
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + "provided as parameter to getInstance()", cipherProvider
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    .equals(provider));
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getAlgorithm()
281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getAlgorithm",
286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getAlgorithm() throws Exception {
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final String algorithm = "DESede/CBC/PKCS5Padding";
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm);
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("Cipher algorithm does not match", cipher.getAlgorithm()
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                .equals(algorithm));
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getBlockSize()
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getBlockSize",
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineGetBlockSize",
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getBlockSize() throws Exception {
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        final String algorithm = "DESede/CBC/PKCS5Padding";
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm);
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertEquals("Block size does not match", 8, cipher.getBlockSize());
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#getOutputSize(int)
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getOutputSize",
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class}
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineGetOutputSize",
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class}
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_getOutputSizeI() throws Exception {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.getOutputSize(25);
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher.init(Cipher.ENCRYPT_MODE, cipherKey, sr);
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // A 25-byte input could result in at least 4 8-byte blocks
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int result = cipher.getOutputSize(25);
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("Output size too small", result > 31);
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // A 8-byte input should result in 2 8-byte blocks
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        result = cipher.getOutputSize(8);
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("Output size too small", result > 15);
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#init(int, java.security.Key)
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "init",
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {int.class, java.security.Key.class}
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_Key() throws Exception {
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher.init(Cipher.ENCRYPT_MODE, cipherKey);
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKey);
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#init(int, java.security.Key,
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.SecureRandom)
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "init",
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.SecureRandom.class}
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineInit",
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.SecureRandom.class}
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_KeyLjava_security_SecureRandom()
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws Exception {
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm + "/ECB/PKCS5Padding");
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher.init(Cipher.ENCRYPT_MODE, cipherKey, sr);
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKey, sr);
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#init(int, java.security.Key,
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.spec.AlgorithmParameterSpec)
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "init",
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {int.class, java.security.Key.class, java.security.spec.AlgorithmParameterSpec.class}
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_KeyLjava_security_spec_AlgorithmParameterSpec()
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws Exception {
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = null;
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = null;
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = null;
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        iv = new byte[8];
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ap = new IvParameterSpec(iv);
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance(algorithm + "/CBC/PKCS5Padding");
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher.init(Cipher.ENCRYPT_MODE, cipherKey, ap);
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] cipherIV = cipher.getIV();
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("IVs differ", Arrays.equals(cipherIV, iv));
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKey, ap);
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ap = new RSAKeyGenParameterSpec(10, new BigInteger("10"));
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKeyDES, ap);
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidAlgorithmParameterException expected");
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidAlgorithmParameterException e) {
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#init(int, java.security.Key,
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.spec.AlgorithmParameterSpec,
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        java.security.SecureRandom)
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "init",
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.spec.AlgorithmParameterSpec.class, java.security.SecureRandom.class}
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineInit",
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.spec.AlgorithmParameterSpec.class, java.security.SecureRandom.class}
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_KeyLjava_security_spec_AlgorithmParameterSpecLjava_security_SecureRandom()
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws Exception {
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = null;
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = null;
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = null;
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        iv = new byte[8];
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ap = new IvParameterSpec(iv);
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance(algorithm + "/CBC/PKCS5Padding");
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher.init(Cipher.ENCRYPT_MODE, cipherKey, ap, sr);
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] cipherIV = cipher.getIV();
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue("IVs differ", Arrays.equals(cipherIV, iv));
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKey, ap, sr);
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ap = new RSAKeyGenParameterSpec(10, new BigInteger("10"));
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.init(Cipher.ENCRYPT_MODE, cipherKeyDES, ap, sr);
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidAlgorithmParameterException expected");
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidAlgorithmParameterException e) {
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#update(byte[], int, int)
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_update$BII() throws Exception {
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int index = 1; index < 4; index++) {
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher c = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] keyMaterial = loadBytes("hyts_" + "des-ede3-cbc.test"
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + index + ".key");
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DESedeKeySpec keySpec = new DESedeKeySpec(keyMaterial);
551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SecretKeyFactory skf = SecretKeyFactory.getInstance("DESEDE");
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key k = skf.generateSecret(keySpec);
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] ivMaterial = loadBytes("hyts_" + "des-ede3-cbc.test" + index
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + ".iv");
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IvParameterSpec iv = new IvParameterSpec(ivMaterial);
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.DECRYPT_MODE, k, iv);
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ByteArrayOutputStream baos = new ByteArrayOutputStream();
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] input = new byte[256];
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String resPath = "hyts_" + "des-ede3-cbc.test" + index
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + ".ciphertext";
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            File resources = Support_Resources.createTempFolder();
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Support_Resources.copyFile(resources, null, resPath);
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InputStream is = Support_Resources.getStream(resPath);
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int bytesRead = is.read(input, 0, 256);
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (bytesRead > 0) {
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                byte[] output = c.update(input, 0, bytesRead);
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (output != null) {
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    baos.write(output);
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                bytesRead = is.read(input, 0, 256);
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] output = c.doFinal();
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (output != null) {
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                baos.write(output);
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] decipheredCipherText = baos.toByteArray();
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            is.close();
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] plaintextBytes = loadBytes("hyts_" + "des-ede3-cbc.test"
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + index + ".plaintext");
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue("Operation produced incorrect results", Arrays.equals(
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    plaintextBytes, decipheredCipherText));
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }// end for
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.update(new byte[64], 0, 32);
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#doFinal()
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "doFinal",
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {}
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinal() throws Exception {
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int index = 1; index < 4; index++) {
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher c = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] keyMaterial = loadBytes("hyts_" + "des-ede3-cbc.test"
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + index + ".key");
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            DESedeKeySpec keySpec = new DESedeKeySpec(keyMaterial);
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            SecretKeyFactory skf = SecretKeyFactory.getInstance("DESEDE");
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Key k = skf.generateSecret(keySpec);
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] ivMaterial = loadBytes("hyts_" + "des-ede3-cbc.test" + index
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + ".iv");
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IvParameterSpec iv = new IvParameterSpec(ivMaterial);
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, k, iv);
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ByteArrayOutputStream baos = new ByteArrayOutputStream();
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] input = new byte[256];
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String resPath = "hyts_" + "des-ede3-cbc.test" + index
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + ".plaintext";
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            File resources = Support_Resources.createTempFolder();
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Support_Resources.copyFile(resources, null, resPath);
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InputStream is = Support_Resources.getStream(resPath);
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int bytesRead = is.read(input, 0, 256);
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while (bytesRead > 0) {
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                byte[] output = c.update(input, 0, bytesRead);
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                if (output != null) {
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    baos.write(output);
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                }
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                bytesRead = is.read(input, 0, 256);
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] output = c.doFinal();
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (output != null) {
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                baos.write(output);
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] encryptedPlaintext = baos.toByteArray();
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            is.close();
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] cipherText = loadBytes("hyts_" + "des-ede3-cbc.test" + index
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    + ".ciphertext");
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertTrue("Operation produced incorrect results", Arrays.equals(
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    encryptedPlaintext, cipherText));
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }// end for
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 0, 10, b1, 5);
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal();
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal();
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b, 0, 16, b1, 0);
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b1, 0, 24, b, 0);
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal();
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
691f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
692f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
693f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
694f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
695f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
696f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private byte[] loadBytes(String resPath) {
697f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
698f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            File resources = Support_Resources.createTempFolder();
699f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Support_Resources.copyFile(resources, null, resPath);
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            InputStream is = Support_Resources.getStream(resPath);
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            ByteArrayOutputStream out = new ByteArrayOutputStream();
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            byte[] buff = new byte[1024];
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            int readlen;
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            while ((readlen = is.read(buff)) > 0) {
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                out.write(buff, 0, readlen);
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            is.close();
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return out.toByteArray();
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IOException e) {
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "getParameters",
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineGetParameters",
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {}
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetParameters() throws Exception {
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES");
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNull(c.getParameters());
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class under test for int update(byte[], int, int, byte[], int)
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class, byte[].class, int.class}
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineUpdate",
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class, byte[].class, int.class}
751f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
752f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
753f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testUpdatebyteArrayintintbyteArrayint() throws Exception {
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10};
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[6];
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DESede");
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
759f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(b, 0, 10, b1, 5);
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
762f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(b, 0, 10, b1, 5);
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("ShortBufferException expected");
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
772f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        b1 = new byte[30];
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 0, 10, b1, 5);
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Class under test for int doFinal(byte[], int, int, byte[], int)
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class, byte[].class, int.class}
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class, byte[].class, int.class}
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testDoFinalbyteArrayintintbyteArrayint() throws Exception {
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10, b1, 5);
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10, b1, 5);
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
812f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
813f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
814f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b, 0, 16, b1, 0);
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 0, 24, new byte[42], 0);
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        b1 = new byte[6];
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede");
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 3, 6, b1, 5);
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getMaxAllowedKeyLength",
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class}
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetMaxAllowedKeyLength() throws NoSuchAlgorithmException {
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedKeyLength(null);
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NullPointerException");
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedKeyLength("//CBC/PKCS5Paddin");
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NoSuchAlgorithmException");
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedKeyLength("/DES/CBC/PKCS5Paddin/1");
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NoSuchAlgorithmException");
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(Cipher.getMaxAllowedKeyLength("/DES/CBC/PKCS5Paddin") > 0);
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "getMaxAllowedParameterSpec",
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {java.lang.String.class}
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void testGetMaxAllowedParameterSpec()
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            throws NoSuchAlgorithmException, Exception {
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedParameterSpec(null);
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NullPointerException");
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedParameterSpec("/DES//PKCS5Paddin");
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NoSuchAlgorithmException");
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            Cipher.getMaxAllowedParameterSpec("/DES/CBC/ /1");
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected NoSuchAlgorithmException");
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher.getMaxAllowedParameterSpec("DES/CBC/PKCS5Paddin");
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher.getMaxAllowedParameterSpec("RSA");
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @tests javax.crypto.Cipher#Cipher(CipherSpi cipherSpi, Provider provider,
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *        String transformation)
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "Cipher",
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {javax.crypto.CipherSpi.class, java.security.Provider.class, java.lang.String.class}
907f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
908f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_Ctor() throws Exception {
909f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // Regression for Harmony-1184
910f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new testCipher(null, null, "s");
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException expected");
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
917f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new testCipher(new MyCipher(), null, "s");
919f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException expected for 'null' provider");
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            new testCipher(null, new Provider("qwerty", 1.0, "qwerty") {}, "s");
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NullPointerException expected for 'null' cipherSpi");
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NullPointerException e) {
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            // expected
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class, java.nio.ByteBuffer.class}
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class, java.nio.ByteBuffer.class}
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinalLjava_nio_ByteBufferLjava_nio_ByteBuffer ()
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws NoSuchAlgorithmException, NoSuchPaddingException,
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    InvalidKeyException, ShortBufferException, BadPaddingException,
950f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    IllegalBlockSizeException, InvalidAlgorithmParameterException {
951f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
952f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer bInput = ByteBuffer.allocate(64);
953f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer bOutput = ByteBuffer.allocate(64);
954f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
957f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 10);
958f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
959f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bInput, bOutput);
960f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
961f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
962f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
963f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
964f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
965f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
966f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
967f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bInput, bOutput);
968f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
969f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
970f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
971f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
972f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
973f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
974f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
975f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput = ByteBuffer.allocate(16);
976f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
977f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(bInput, bOutput);
978f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
979f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
980f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
981f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
982f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
983f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
984f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
985f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
986f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput = ByteBuffer.allocate(64);
987f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
988f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
989f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bOutput, bInput);
990f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
991f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
992f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
993f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
994f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
995f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
996f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
997f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
998f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
999f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bInput, bInput);
1000f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalArgumentException expected");
1001f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
1002f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1003f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1004f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1005f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1006f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1007f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1008f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1009f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bInput, bOutput.asReadOnlyBuffer());
1010f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("ReadOnlyBufferException expected");
1011f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ReadOnlyBufferException e) {
1012f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1013f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1014f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1015f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1016f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1017f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bOutput = ByteBuffer.allocate(8);
1018f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede");
1019f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
1020f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1021f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bInput, bOutput);
1022f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
1023f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
1024f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1025f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1026f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1027f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1028f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1029f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1030f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1031f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "init",
1032f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {int.class, java.security.Key.class, java.security.AlgorithmParameters.class}
1033f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1034f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_KeyLjava_security_AlgorithmParameters ()
1035f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
1036f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    InvalidAlgorithmParameterException {
1037f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1038f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1039f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1040f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1041f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1042f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1043f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1044f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.getParameters());
1045f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1046f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1047f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.DECRYPT_MODE, cipherKey, ap);
1048f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException e");
1049f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1050f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1051f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1052f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1053f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1054f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.DECRYPT_MODE, cipherKeyDES, (AlgorithmParameters)null);
1055f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidAlgorithmParameterException e");
1056f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidAlgorithmParameterException e) {
1057f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1058f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1059f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1060f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1061f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1062f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1063f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1064f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1065f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "init",
1066f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.AlgorithmParameters.class, java.security.SecureRandom.class}
1067f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1068f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1069f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1070f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1071f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
1072f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineInit",
1073f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {int.class, java.security.Key.class, java.security.AlgorithmParameters.class, java.security.SecureRandom.class}
1074f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1075f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1076f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_KeyLjava_security_AlgorithmParametersLjava_security_SecureRandom ()
1077f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
1078f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    InvalidAlgorithmParameterException {
1079f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1080f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1081f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1082f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1083f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1084f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1085f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap, sr);
1086f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.getParameters());
1087f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1088f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1089f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.DECRYPT_MODE, cipherKey, ap, new SecureRandom());
1090f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException e");
1091f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1092f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1093f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1094f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1095f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1096f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.DECRYPT_MODE, cipherKeyDES, (AlgorithmParameters)null, sr);
1097f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidAlgorithmParameterException e");
1098f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidAlgorithmParameterException e) {
1099f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap, (SecureRandom)null);
1103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.getParameters());
1104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "init",
1110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {int.class, java.security.cert.Certificate.class}
1111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_cert_Certificate ()
1113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws MalformedURLException, IOException, CertificateException,
1114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
1115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Certificate creation notes: certificate should be valid 37273 starting
1117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * from 13 Nov 2008
1118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If it brcomes invalidated regenerate it using following commands:
1119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 1. openssl genrsa -des3 -out test.key 1024
1120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2. openssl req -new -key test.key -out test.csr
1121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 3. cp test.key test.key.org
1122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 4. openssl rsa -in test.key.org -out test.key
1123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 5. openssl x509 -req -days 37273 -in test.csr -signkey test.key -out test.cert
1124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * */
1125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
1127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
1128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
1129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Certificate cert = cf.generateCertificate(is);
1131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("RSA");
1133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cert);
1135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, cert);
1138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
1139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "init",
1148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {int.class, java.security.cert.Certificate.class, java.security.SecureRandom.class}
1149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_initILjava_security_cert_Certificate_java_security_SecureRandom ()
1151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    throws MalformedURLException, IOException, CertificateException,
1152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException {
1153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* Certificate creation notes: certificate should be valid 37273 starting
1155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * from 13 Nov 2008
1156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * If it brcomes invalidated regenerate it using following commands:
1157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 1. openssl genrsa -des3 -out test.key 1024
1158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 2. openssl req -new -key test.key -out test.csr
1159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 3. cp test.key test.key.org
1160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 4. openssl rsa -in test.key.org -out test.key
1161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * 5. openssl x509 -req -days 37273 -in test.csr -signkey test.key -out test.cert
1162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * */
1163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
1165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
1166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
1167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Certificate cert = cf.generateCertificate(is);
1169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("RSA");
1171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cert, new SecureRandom());
1173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, cert, new SecureRandom());
1176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
1177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "unwrap",
1187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, java.lang.String.class, int.class}
1188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                level = TestLevel.COMPLETE,
1191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                notes = "",
1192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                clazz = CipherSpi.class,
1193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                method = "engineUnwrap",
1194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                args = {byte[].class, java.lang.String.class, int.class}
1195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_unwrap$BLjava_lang_StringI () throws NoSuchAlgorithmException,
1198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException,
1199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    IllegalBlockSizeException {
1200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.WRAP_MODE, cipherKeyDES, ap, sr);
1208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] arDES = c.wrap(cipherKeyDES);
1209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] ar    = c.wrap(cipherKey);
1210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.unwrap(arDES, "DES", Cipher.SECRET_KEY);
1213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.UNWRAP_MODE, cipherKeyDES, ap, sr);
1219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertTrue(cipherKeyDES.equals(c.unwrap(arDES, "DES", Cipher.SECRET_KEY)));
1220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertFalse(cipherKeyDES.equals(c.unwrap(ar, "DES", Cipher.SECRET_KEY)));
1221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.unwrap(arDES, "RSA38", Cipher.PUBLIC_KEY);
1224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("NoSuchAlgorithmException expected");
1225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (NoSuchAlgorithmException e) {
1226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
1230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.UNWRAP_MODE, cipherKey, ap, sr);
1231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.unwrap(arDES, "DESede", Cipher.SECRET_KEY);
1233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
1234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "update",
1244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.nio.ByteBuffer.class, java.nio.ByteBuffer.class}
1245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                level = TestLevel.COMPLETE,
1248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                notes = "",
1249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                clazz = CipherSpi.class,
1250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                method = "engineUpdate",
1251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                args = {java.nio.ByteBuffer.class, java.nio.ByteBuffer.class}
1252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_updateLjava_nio_ByteBufferLjava_nio_ByteBuffer () throws
1255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
1256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ShortBufferException, InvalidAlgorithmParameterException {
1257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer bInput = ByteBuffer.allocate(256);
1259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ByteBuffer bOutput = ByteBuffer.allocate(256);
1260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 10);
1264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bOutput.rewind();
1266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(bInput, bOutput);
1267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(bInput, bOutput);
1271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput = ByteBuffer.allocate(16);
1279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1281f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bOutput.rewind();
1282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(bInput, bOutput);
1283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1286f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput = ByteBuffer.allocate(64);
1292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(bInput, bInput);
1299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalArgumentException expected");
1300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalArgumentException e) {
1301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bOutput.rewind();
1309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(bInput, bOutput.asReadOnlyBuffer());
1311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("ReadOnlyBufferException expected");
1312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ReadOnlyBufferException e) {
1313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.put(b, 0, 16);
1318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bInput.rewind();
1319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        bOutput = ByteBuffer.allocate(8);
1320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede");
1321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
1322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(bInput, bOutput);
1324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
1325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
1326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class Mock_Key implements Key {
1331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getAlgorithm() {
1332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
1333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public byte[] getEncoded() {
1336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
1337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        public String getFormat() {
1340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return null;
1341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "wrap",
1350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {java.security.Key.class}
1351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                level = TestLevel.COMPLETE,
1354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                notes = "",
1355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                clazz = CipherSpi.class,
1356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                method = "engineWrap",
1357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                args = {java.security.Key.class}
1358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_wrap_java_security_Key () throws NoSuchAlgorithmException,
1361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
1362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    InvalidAlgorithmParameterException, MalformedURLException, IOException,
1363f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    CertificateException {
1364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.WRAP_MODE, cipherKeyDES, ap, sr);
1372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.wrap(cipherKeyDES));
1373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.wrap(cipherKey));
1374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
1375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
1376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
1377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Certificate cert = cf.generateCertificate(is);
1379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        assertNotNull(c.wrap(cert.getPublicKey()));
1380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.WRAP_MODE, cipherKeyDES, ap, sr);
1383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            assertNotNull(c.wrap(cert.getPublicKey()));
1385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
1386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
1387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap, sr);
1391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.wrap(cipherKeyDES);
1394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.WRAP_MODE, cipherKeyDES, ap, sr);
1400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.wrap(new Mock_Key());
1402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("InvalidKeyException expected");
1403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (InvalidKeyException e) {
1404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "doFinal",
1412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class, int.class}
1413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinal$BI() throws Exception {
1415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
1417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 0, 10);
1421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 5);
1423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
1424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
1425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 5);
1431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 3, 8);
1439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b1, 0);
1440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b1, 0, 24);
1450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0);
1452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
1453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
1454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        b1 = new byte[6];
1458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede");
1459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
1460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 3, 6);
1461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 5);
1463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
1464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
1465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "doFinal",
1473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class}
1474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinal$B() throws Exception {
1476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[32];
1477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] bI1 = {1,2,3,4,5,6,7,8,9,10};
1478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] bI2 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
1479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] bI3 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] bI4 = {1,2,3};
1481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bI1);
1486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
1487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
1488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(bI1);
1494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(bI2);
1502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(bI3, 0, 16, b1, 0);
1504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1);
1515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
1516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
1517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargets({
1522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "doFinal",
1526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
1527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        ),
1528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        @TestTargetNew(
1529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            level = TestLevel.COMPLETE,
1530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            notes = "",
1531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            clazz = CipherSpi.class,
1532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            method = "engineDoFinal",
1533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            args = {byte[].class, int.class, int.class}
1534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        )
1535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    })
1536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinal$BII() throws Exception {
1537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
1539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10);
1544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
1545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
1546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1551f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10);
1552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b, 0, 16);
1560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b, 0, 16, b1, 0);
1562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 0, 24);
1573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
1574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
1575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "doFinal",
1583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class, int.class, int.class, byte[].class}
1584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_doFinal$BII$B() throws Exception {
1586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
1588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10, b1);
1593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalBlockSizeException expected");
1594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalBlockSizeException e) {
1595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 0, 10, b1);
1601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.doFinal(b, 0, 16, b1);
1609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        SecureRandom sr = new SecureRandom();
1611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] iv = new byte[8];
1612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        sr.nextBytes(iv);
1613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        AlgorithmParameterSpec ap = new IvParameterSpec(iv);
1614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.DECRYPT_MODE, cipherKeyDES, ap);
1617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b1, 0, 24, new byte[42]);
1620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("BadPaddingException expected");
1621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (BadPaddingException e) {
1622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        b1 = new byte[6];
1626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DESede");
1627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKey);
1628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.doFinal(b, 3, 6, b1);
1630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
1631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
1632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.PARTIAL_COMPLETE,
1638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "Checks exception",
1639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "update",
1640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class}
1641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_update$B() throws Exception {
1643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher cipher = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
1644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cipher.update(new byte[64]);
1646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    @TestTargetNew(
1653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        level = TestLevel.COMPLETE,
1654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        notes = "",
1655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        method = "update",
1656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        args = {byte[].class, int.class, int.class, byte[].class}
1657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    )
1658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public void test_() throws Exception {
1659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
1660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        byte[] b1 = new byte[30];
1661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(b, 0, 10, b1);
1666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("IllegalStateException expected");
1667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (IllegalStateException e) {
1668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cipherKeyDES);
1673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        c.update(b, 0, 16, b1);
1674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        b1 = new byte[3];
1676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        try {
1678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            c.update(b, 3, 15, b1);
1679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            fail("No expected ShortBufferException");
1680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } catch (ShortBufferException e) {
1681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            //expected
1682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
1685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    class testCipher extends Cipher {
1686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        testCipher(CipherSpi c, Provider p, String s) {
1687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            super(c, p, s);
1688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
1689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
1690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
1691