1f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements.  See the NOTICE file distributed with
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership.
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License.  You may obtain a copy of the License at
8f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.math.BigInteger;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.URL;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ByteBuffer;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.nio.ReadOnlyBufferException;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.AlgorithmParameters;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Key;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate;
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateFactory;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.AlgorithmParameterSpec;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.RSAKeyGenParameterSpec;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.BadPaddingException;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.Cipher;
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.CipherSpi;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.IllegalBlockSizeException;
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.SecretKeyFactory;
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.ShortBufferException;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.spec.DESedeKeySpec;
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.spec.IvParameterSpec;
49459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstromimport javax.crypto.spec.SecretKeySpec;
50fe8b870db2b374e21c69c2ff0050e6a34e0d8d94Brian Carlstromimport libcore.java.security.StandardNames;
51937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstromimport org.apache.harmony.crypto.tests.support.MyCipher;
52937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstromimport tests.support.resource.Support_Resources;
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CipherTest extends junit.framework.TestCase {
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom    private static final Key CIPHER_KEY_3DES;
57459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom    private static final String ALGORITHM_3DES = "DESede";
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom    private static final Key CIPHER_KEY_DES;
60459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom    private static final String ALGORITHM_DES = "DES";
61d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom    private static final byte[] IV = new byte[] {
62d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        (byte) 0,  (byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 6, (byte) 7,
63d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom    };
64f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    static {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
67459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            byte[] encoded_3des = {
68459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) -57,  (byte) -108, (byte) -42, (byte) 47,
69459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) 42,   (byte) -12,  (byte) -53, (byte) -83,
70459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) -123, (byte) 91,   (byte) -99, (byte) -101,
71459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) 93,   (byte) -62,  (byte) -42, (byte) -128,
72459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) -2,   (byte) 47,   (byte) -8,  (byte) 69,
73459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) -68,  (byte) 69,   (byte) 81,  (byte) 74,
74459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            };
75459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            CIPHER_KEY_3DES = new SecretKeySpec(encoded_3des, ALGORITHM_3DES);
76459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom
77459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            byte[] encoded_des = {
78459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) 2,   (byte) 41,  (byte) -77, (byte) 107,
79459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom                (byte) -99, (byte) -63, (byte) -42, (byte) -89,
80459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            };
81459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            CIPHER_KEY_DES = new SecretKeySpec(encoded_des, ALGORITHM_DES);
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
84459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            throw new AssertionError(e);
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
87d37c804ccd11e38ee9221194866a152a4de6c8e9Jesse Wilson
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
89937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getInstance(java.lang.String)
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getInstanceLjava_lang_String() throws Exception {
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("Received a null Cipher instance", cipher);
94f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getInstance("WrongAlgorithmName");
97937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
98937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
103937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getInstance(java.lang.String,
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.lang.String)
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getInstanceLjava_lang_StringLjava_lang_String()
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws Exception {
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.DES");
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("No installed providers support Cipher.DES", providers);
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < providers.length; i++) {
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher cipher = Cipher.getInstance("DES", providers[i].getName());
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Cipher.getInstance() returned a null value", cipher);
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                cipher = Cipher.getInstance("DoBeDoBeDo", providers[i]);
119937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom                fail();
120937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            } catch (NoSuchAlgorithmException expected) {
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getInstance("DES", (String) null);
126937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
127937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalArgumentException expected) {
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getInstance("DES", "IHaveNotBeenConfigured");
132937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
133937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchProviderException expected) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
138937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getInstance(java.lang.String,
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.security.Provider)
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
141937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_getInstanceLjava_lang_StringLjava_security_Provider() throws Exception {
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.DES");
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("No installed providers support Cipher.DES", providers);
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < providers.length; i++) {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher cipher = Cipher.getInstance("DES", providers[i]);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull("Cipher.getInstance() returned a null value", cipher);
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getInstance("DES", (Provider) null);
154937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
155937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalArgumentException expected) {
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getInstance("WrongAlg", providers[0]);
160937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
161937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
166937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getProvider()
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getProvider() throws Exception {
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider[] providers = Security.getProviders("Cipher.AES");
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull("No providers support Cipher.AES", providers);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < providers.length; i++) {
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider provider = providers[i];
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher cipher = Cipher.getInstance("AES", provider.getName());
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider cipherProvider = cipher.getProvider();
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertTrue("Cipher provider is not the same as that "
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + "provided as parameter to getInstance()", cipherProvider
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .equals(provider));
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
185937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getAlgorithm()
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getAlgorithm() throws Exception {
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String algorithm = "DESede/CBC/PKCS5Padding";
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm);
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Cipher algorithm does not match", cipher.getAlgorithm()
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                .equals(algorithm));
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
196937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getBlockSize()
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getBlockSize() throws Exception {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        final String algorithm = "DESede/CBC/PKCS5Padding";
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher cipher = Cipher.getInstance(algorithm);
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertEquals("Block size does not match", 8, cipher.getBlockSize());
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
206937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#getOutputSize(int)
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_getOutputSizeI() throws Exception {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
210459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES + "/ECB/PKCS5Padding");
211f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cipher.getOutputSize(25);
214937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
215937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
217f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
218d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, new SecureRandom());
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // A 25-byte input could result in at least 4 8-byte blocks
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int result = cipher.getOutputSize(25);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Output size too small", result > 31);
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // A 8-byte input should result in 2 8-byte blocks
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        result = cipher.getOutputSize(8);
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue("Output size too small", result > 15);
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
230937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#init(int, java.security.Key)
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
232937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithKey() throws Exception {
233459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES + "/ECB/PKCS5Padding");
234459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
236f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
239459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
240937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
241937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
246937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#init(int, java.security.Key,
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.security.SecureRandom)
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
249937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithSecureRandom() throws Exception {
250459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES + "/ECB/PKCS5Padding");
251d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, new SecureRandom());
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
255d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, new SecureRandom());
256937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
257937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
262937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#init(int, java.security.Key,
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.security.spec.AlgorithmParameterSpec)
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
265937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithAlgorithmParameterSpec() throws Exception {
266d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
268d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES + "/CBC/PKCS5Padding");
269459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, ap);
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] cipherIV = cipher.getIV();
271d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        assertTrue("IVs differ", Arrays.equals(cipherIV, IV));
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
275459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, ap);
276937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
277937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
281f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        ap = new RSAKeyGenParameterSpec(10, new BigInteger("10"));
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
283459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
284937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
285937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidAlgorithmParameterException expected) {
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
290937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#init(int, java.security.Key,
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.security.spec.AlgorithmParameterSpec,
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        java.security.SecureRandom)
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
294937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithKeyAlgorithmParameterSpecSecureRandom() throws Exception {
295d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
297d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        Cipher cipher = Cipher.getInstance(ALGORITHM_3DES + "/CBC/PKCS5Padding");
298d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, ap, new SecureRandom());
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] cipherIV = cipher.getIV();
300d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        assertTrue("IVs differ", Arrays.equals(cipherIV, IV));
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
304d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES, ap, new SecureRandom());
305937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
306937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        cipher = Cipher.getInstance("DES/CBC/NoPadding");
310f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes        ap = new RSAKeyGenParameterSpec(10, new BigInteger("10"));
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
313d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom            cipher.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
314937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
315937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidAlgorithmParameterException expected) {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
320937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#update(byte[], int, int)
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_update$BII() throws Exception {
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int index = 1; index < 4; index++) {
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher c = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] keyMaterial = loadBytes("hyts_" + "des-ede3-cbc.test"
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + index + ".key");
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            DESedeKeySpec keySpec = new DESedeKeySpec(keyMaterial);
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SecretKeyFactory skf = SecretKeyFactory.getInstance("DESEDE");
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Key k = skf.generateSecret(keySpec);
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] ivMaterial = loadBytes("hyts_" + "des-ede3-cbc.test" + index
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + ".iv");
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IvParameterSpec iv = new IvParameterSpec(ivMaterial);
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.init(Cipher.DECRYPT_MODE, k, iv);
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ByteArrayOutputStream baos = new ByteArrayOutputStream();
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] input = new byte[256];
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String resPath = "hyts_" + "des-ede3-cbc.test" + index
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + ".ciphertext";
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            File resources = Support_Resources.createTempFolder();
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, resPath);
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream is = Support_Resources.getStream(resPath);
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int bytesRead = is.read(input, 0, 256);
347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (bytesRead > 0) {
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                byte[] output = c.update(input, 0, bytesRead);
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (output != null) {
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    baos.write(output);
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bytesRead = is.read(input, 0, 256);
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] output = c.doFinal();
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (output != null) {
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                baos.write(output);
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] decipheredCipherText = baos.toByteArray();
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            is.close();
362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] plaintextBytes = loadBytes("hyts_" + "des-ede3-cbc.test"
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + index + ".plaintext");
3655189c980ebdc842e0e5ca7d6794b4880aa0b6cd5Kenny Root            assertEquals("Operation produced incorrect results for index " + index,
3665189c980ebdc842e0e5ca7d6794b4880aa0b6cd5Kenny Root                    Arrays.toString(plaintextBytes), Arrays.toString(decipheredCipherText));
367937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        }
368f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher cipher = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cipher.update(new byte[64], 0, 32);
372937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
373937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
378937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#doFinal()
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_doFinal() throws Exception {
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int index = 1; index < 4; index++) {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher c = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] keyMaterial = loadBytes("hyts_" + "des-ede3-cbc.test"
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + index + ".key");
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            DESedeKeySpec keySpec = new DESedeKeySpec(keyMaterial);
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            SecretKeyFactory skf = SecretKeyFactory.getInstance("DESEDE");
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Key k = skf.generateSecret(keySpec);
389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] ivMaterial = loadBytes("hyts_" + "des-ede3-cbc.test" + index
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + ".iv");
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IvParameterSpec iv = new IvParameterSpec(ivMaterial);
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, k, iv);
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ByteArrayOutputStream baos = new ByteArrayOutputStream();
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] input = new byte[256];
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String resPath = "hyts_" + "des-ede3-cbc.test" + index
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + ".plaintext";
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            File resources = Support_Resources.createTempFolder();
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Support_Resources.copyFile(resources, null, resPath);
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            InputStream is = Support_Resources.getStream(resPath);
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            int bytesRead = is.read(input, 0, 256);
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            while (bytesRead > 0) {
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                byte[] output = c.update(input, 0, bytesRead);
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (output != null) {
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    baos.write(output);
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                bytesRead = is.read(input, 0, 256);
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] output = c.doFinal();
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (output != null) {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                baos.write(output);
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] encryptedPlaintext = baos.toByteArray();
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            is.close();
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            byte[] cipherText = loadBytes("hyts_" + "des-ede3-cbc.test" + index
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    + ".ciphertext");
42146a749879a6d52408e51938b9e63683b238d0beeKenny Root            assertEquals("Operation produced incorrect results for index " + index,
42246a749879a6d52408e51938b9e63683b238d0beeKenny Root                    Arrays.toString(cipherText), Arrays.toString(encryptedPlaintext));
423937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        }
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
4273441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
4303441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 0, 10, b1, 5);
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal();
434937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
435937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal();
441937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
442937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
4463441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
447459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len = c.doFinal(b, 0, 16, b1, 0);
448459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len);
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
451459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
4523441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        assertTrue(Arrays.equals(c.getIV(), IV));
453f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b1, 0, 24, b, 0);
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal();
457937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
458937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
462937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    private byte[] loadBytes(String resPath) throws Exception {
463937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        File resources = Support_Resources.createTempFolder();
464937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        Support_Resources.copyFile(resources, null, resPath);
465937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        InputStream is = Support_Resources.getStream(resPath);
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
467937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        ByteArrayOutputStream out = new ByteArrayOutputStream();
468937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        byte[] buff = new byte[1024];
469937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        int readlen;
470937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        while ((readlen = is.read(buff)) > 0) {
471937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            out.write(buff, 0, readlen);
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
473937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        is.close();
474937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        return out.toByteArray();
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
476f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testGetParameters() throws Exception {
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES");
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNull(c.getParameters());
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
481f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Class under test for int update(byte[], int, int, byte[], int)
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testUpdatebyteArrayintintbyteArrayint() throws Exception {
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b = {1,2,3,4,5,6,7,8,9,10};
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[6];
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DESede");
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(b, 0, 10, b1, 5);
492937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
493937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
496459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(b, 0, 10, b1, 5);
499937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
500937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
502f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        b1 = new byte[30];
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 0, 10, b1, 5);
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
506f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /*
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Class under test for int doFinal(byte[], int, int, byte[], int)
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testDoFinalbyteArrayintintbyteArrayint() throws Exception {
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
5133441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
514f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
5163441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10, b1, 5);
519937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
520937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10, b1, 5);
526937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
527937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
5313441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
532459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len = c.doFinal(b, 0, 16, b1, 0);
533459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len);
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
536459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 0, 24, new byte[42], 0);
539937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
540937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        b1 = new byte[6];
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede");
545459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 3, 6, b1, 5);
548937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
549fe8b870db2b374e21c69c2ff0050e6a34e0d8d94Brian Carlstrom        } catch (IllegalBlockSizeException maybeExpected) {
550fe8b870db2b374e21c69c2ff0050e6a34e0d8d94Brian Carlstrom            assertTrue(StandardNames.IS_RI);
551fe8b870db2b374e21c69c2ff0050e6a34e0d8d94Brian Carlstrom        } catch (ShortBufferException maybeExpected) {
552fe8b870db2b374e21c69c2ff0050e6a34e0d8d94Brian Carlstrom            assertFalse(StandardNames.IS_RI);
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
555f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
556937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void testGetMaxAllowedKeyLength() throws Exception {
557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedKeyLength(null);
559937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
560937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NullPointerException expected) {
561937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        }
562937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        try {
563937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            Cipher.getMaxAllowedKeyLength("");
564d4b7449574ca69c713a3f2230cb77c68ee642700Tobias Thierer            fail();
565937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedKeyLength("//CBC/PKCS5Paddin");
569937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
570937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedKeyLength("/DES/CBC/PKCS5Paddin/1");
574937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
575937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertTrue(Cipher.getMaxAllowedKeyLength("/DES/CBC/PKCS5Paddin") > 0);
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
580937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void testGetMaxAllowedParameterSpec() throws Exception {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedParameterSpec(null);
583937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
584937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NullPointerException expected) {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedParameterSpec("/DES//PKCS5Paddin");
588937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
589937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Cipher.getMaxAllowedParameterSpec("/DES/CBC/ /1");
593937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
594937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher.getMaxAllowedParameterSpec("DES/CBC/PKCS5Paddin");
597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher.getMaxAllowedParameterSpec("RSA");
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
601937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom     * javax.crypto.Cipher#Cipher(CipherSpi cipherSpi, Provider provider,
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *        String transformation)
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_Ctor() throws Exception {
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Regression for Harmony-1184
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new testCipher(null, null, "s");
608937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
609937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NullPointerException expected) {
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new testCipher(new MyCipher(), null, "s");
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException expected for 'null' provider");
615937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NullPointerException expected) {
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new testCipher(null, new Provider("qwerty", 1.0, "qwerty") {}, "s");
620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("NullPointerException expected for 'null' cipherSpi");
621937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NullPointerException expected) {
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
625937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_doFinalLjava_nio_ByteBufferLjava_nio_ByteBuffer() throws Exception {
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bInput = ByteBuffer.allocate(64);
628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bOutput = ByteBuffer.allocate(64);
6293441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
630f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
6323441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 10);
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bInput, bOutput);
636937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
637937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bInput, bOutput);
643937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
644937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
6483441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput = ByteBuffer.allocate(16);
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
651459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len = c.doFinal(bInput, bOutput);
652459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(0, len);
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
655459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput = ByteBuffer.allocate(64);
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bOutput, bInput);
659937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
660937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
662f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
664459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bInput, bInput);
668937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
669937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalArgumentException expected) {
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
673459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bInput, bOutput.asReadOnlyBuffer());
677937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
678937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ReadOnlyBufferException expected) {
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bOutput = ByteBuffer.allocate(8);
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede");
685459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bInput, bOutput);
688937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
689937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
693937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithKeyAlgorithmParameters() throws Exception {
694d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
697459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull(c.getParameters());
699f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
701459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_3DES, ap);
702937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
703937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
705f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
707459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, (AlgorithmParameters)null);
708937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
709937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidAlgorithmParameterException expected) {
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
713937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithKeyAlgorithmParametersSecureRandom() throws Exception {
714d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
717d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull(c.getParameters());
719f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
721459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_3DES, ap, new SecureRandom());
722937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
723937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
725f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
727d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom            c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, (AlgorithmParameters)null,
728d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom                   new SecureRandom());
729937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
730937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidAlgorithmParameterException expected) {
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
733459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap, (SecureRandom)null);
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull(c.getParameters());
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
737937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithCertificate() throws Exception {
738f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
739f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /* Certificate creation notes: certificate should be valid 37273 starting
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from 13 Nov 2008
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it brcomes invalidated regenerate it using following commands:
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1. openssl genrsa -des3 -out test.key 1024
743adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 2. openssl req -new -key test.key -out test.csr
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 3. cp test.key test.key.org
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 4. openssl rsa -in test.key.org -out test.key
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 5. openssl x509 -req -days 37273 -in test.csr -signkey test.key -out test.cert
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * */
748f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
752f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate cert = cf.generateCertificate(is);
754937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        is.close();
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("RSA");
757f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cert);
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, cert);
762937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
763937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
767937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_initWithCertificateSecureRandom() throws Exception {
768f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
769f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /* Certificate creation notes: certificate should be valid 37273 starting
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * from 13 Nov 2008
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If it brcomes invalidated regenerate it using following commands:
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 1. openssl genrsa -des3 -out test.key 1024
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 2. openssl req -new -key test.key -out test.csr
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 3. cp test.key test.key.org
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 4. openssl rsa -in test.key.org -out test.key
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * 5. openssl x509 -req -days 37273 -in test.csr -signkey test.key -out test.cert
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * */
778f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
782f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate cert = cf.generateCertificate(is);
784937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        is.close();
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("RSA");
787f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.init(Cipher.ENCRYPT_MODE, cert, new SecureRandom());
789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.init(Cipher.ENCRYPT_MODE, cert, new SecureRandom());
792937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
793937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
797937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_unwrap$BLjava_lang_StringI() throws Exception {
798d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
802d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.WRAP_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
803459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        byte[] arDES = c.wrap(CIPHER_KEY_DES);
804459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        byte[] ar    = c.wrap(CIPHER_KEY_3DES);
805f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.unwrap(arDES, "DES", Cipher.SECRET_KEY);
808937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
809937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
812d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.UNWRAP_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
813459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertTrue(CIPHER_KEY_DES.equals(c.unwrap(arDES, "DES", Cipher.SECRET_KEY)));
814459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertFalse(CIPHER_KEY_DES.equals(c.unwrap(ar, "DES", Cipher.SECRET_KEY)));
815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.unwrap(arDES, "RSA38", Cipher.PUBLIC_KEY);
818937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
819937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (NoSuchAlgorithmException expected) {
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
823d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.UNWRAP_MODE, CIPHER_KEY_3DES, ap, new SecureRandom());
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.unwrap(arDES, "DESede", Cipher.SECRET_KEY);
826937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
827937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
830f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
831937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_updateLjava_nio_ByteBufferLjava_nio_ByteBuffer() throws Exception {
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bInput = ByteBuffer.allocate(256);
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ByteBuffer bOutput = ByteBuffer.allocate(256);
835f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
837459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 10);
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bOutput.rewind();
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(bInput, bOutput);
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(bInput, bOutput);
846937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
847937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
851459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput = ByteBuffer.allocate(16);
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bOutput.rewind();
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(bInput, bOutput);
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
858d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
861459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput = ByteBuffer.allocate(64);
863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
865459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(bInput, bInput);
870937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
871937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalArgumentException expected) {
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
875459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bOutput.rewind();
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(bInput, bOutput.asReadOnlyBuffer());
881937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
882937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ReadOnlyBufferException expected) {
883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.put(b, 0, 16);
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bInput.rewind();
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        bOutput = ByteBuffer.allocate(8);
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede");
890459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(bInput, bOutput);
893937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
894937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
897f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class Mock_Key implements Key {
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getAlgorithm() {
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public byte[] getEncoded() {
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String getFormat() {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return null;
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
910f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
912f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
913937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom    public void test_wrap_java_security_Key() throws Exception {
914d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
918d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.WRAP_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
919459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertNotNull(c.wrap(CIPHER_KEY_DES));
920459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertNotNull(c.wrap(CIPHER_KEY_3DES));
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String certName = Support_Resources.getURL("test.cert");
922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InputStream is = new URL(certName).openConnection().getInputStream();
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        CertificateFactory cf = CertificateFactory.getInstance("X.509");
924f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Certificate cert = cf.generateCertificate(is);
926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        assertNotNull(c.wrap(cert.getPublicKey()));
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
929d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.WRAP_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertNotNull(c.wrap(cert.getPublicKey()));
932937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
933937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
936d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
937f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
939459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom            c.wrap(CIPHER_KEY_DES);
940937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
941937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
943f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
944d77eccc93cbf92c400ebd114ea8e91413b882d69Brian Carlstrom        c.init(Cipher.WRAP_MODE, CIPHER_KEY_DES, ap, new SecureRandom());
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.wrap(new Mock_Key());
947937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
948937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (InvalidKeyException expected) {
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_doFinal$BI() throws Exception {
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
9553441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
956f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
9583441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 0, 10);
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 5);
962937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
963937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 5);
969937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
970937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
9743441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 3, 8);
976459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len = c.doFinal(b1, 0);
977459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(0, len);
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
980459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b1, 0, 24);
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0);
984937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
985937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        b1 = new byte[6];
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede");
990459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 3, 6);
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 5);
994937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
995937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_doFinal$B() throws Exception {
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[32];
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bI1 = {1,2,3,4,5,6,7,8,9,10};
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bI2 = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] bI4 = {1,2,3};
10053441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
1006f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
10083441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bI1);
1011937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1012937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(bI1);
1018937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1019937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
10233441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1024459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len1 = c.doFinal(bI2).length;
1025459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len1);
10263441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1027459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len2 = c.doFinal(bI3, 0, 16, b1, 0);
1028459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len2);
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1031459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1);
1034937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1035937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_doFinal$BII() throws Exception {
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
10423441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
1043f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
10453441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10);
1048937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1049937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10);
1055937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1056937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
10603441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1061459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len1 = c.doFinal(b, 0, 16).length;
1062459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len1);
10633441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1064459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len2 = c.doFinal(b, 0, 16, b1, 0);
1065459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len2);
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1068459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1070adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 0, 24);
1071937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1072937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_doFinal$BII$B() throws Exception {
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
10793441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        AlgorithmParameterSpec ap = new IvParameterSpec(IV);
1080f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
10823441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10, b1);
1085937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1086937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalBlockSizeException expected) {
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 0, 10, b1);
1092937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1093937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
10973441ddaa2ce320360292702dd63dad052cb6999dBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES, ap);
1098459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        int len = c.doFinal(b, 0, 16, b1);
1099459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        assertEquals(16, len);
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/PKCS5Padding");
1102459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.DECRYPT_MODE, CIPHER_KEY_DES, ap);
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b1, 0, 24, new byte[42]);
1105937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1106937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (BadPaddingException expected) {
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        b1 = new byte[6];
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DESede");
1111459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_3DES);
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.doFinal(b, 3, 6, b1);
1114937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1115937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_update$B() throws Exception {
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher cipher = Cipher.getInstance("DESEDE/CBC/PKCS5Padding");
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            cipher.update(new byte[64]);
1123937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1124937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void test_() throws Exception {
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe 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};
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        byte[] b1 = new byte[30];
1131f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Cipher c = Cipher.getInstance("DES/CBC/NoPadding");
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(b, 0, 10, b1);
1136937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1137937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (IllegalStateException expected) {
1138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c = Cipher.getInstance("DES/CBC/NoPadding");
1141459a8ccbcc3dfde730780244e2122a734858aceeBrian Carlstrom        c.init(Cipher.ENCRYPT_MODE, CIPHER_KEY_DES);
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        c.update(b, 0, 16, b1);
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        b1 = new byte[3];
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            c.update(b, 3, 15, b1);
1148937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom            fail();
1149937b6c4ef5f8ad57279e2ebed4393a78d1729d8bBrian Carlstrom        } catch (ShortBufferException expected) {
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class testCipher extends Cipher {
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        testCipher(CipherSpi c, Provider p, String s) {
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(c, p, s);
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1159