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