1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @author Alexander Y. Kleymenov 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project* @version $Revision$ 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project*/ 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage org.apache.harmony.crypto.tests.javax.crypto; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.BufferedOutputStream; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayOutputStream; 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream; 284d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport java.security.AlgorithmParameters; 294d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport java.security.InvalidAlgorithmParameterException; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Key; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.SecureRandom; 344d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport java.security.Security; 354d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport java.security.spec.AlgorithmParameterSpec; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 384d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport javax.crypto.BadPaddingException; 394d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport javax.crypto.CipherSpi; 404d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport javax.crypto.IllegalBlockSizeException; 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.KeyGenerator; 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.NoSuchPaddingException; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.NullCipher; 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.CipherOutputStream; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.Cipher; 464d8b5b2a31220193401129212afbce4608d6dbdcSergio Giroimport javax.crypto.ShortBufferException; 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase; 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class CipherOutputStream1Test extends TestCase { 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class TestOutputStream extends ByteArrayOutputStream { 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean closed = false; 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void close() { 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project closed = true; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public boolean wasClosed() { 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return closed; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CipherOutputStream(OutputStream os) method testing. Tests that 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CipherOutputStream uses NullCipher if Cipher is not specified 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the constructor. 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testCipherOutputStream() throws Exception { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos){}; 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data); 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.flush(); 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullCipher should be used " + "if Cipher is not specified."); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write(int b) method testing. Tests that method writes correct values to 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the underlying output stream. 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testWrite1() throws Exception { 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos, new NullCipher()); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < data.length; i++) { 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data[i]); 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.flush(); 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("CipherOutputStream wrote incorrect data."); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write(byte[] b) method testing. Tests that method writes correct values 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * to the underlying output stream. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testWrite2() throws Exception { 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos, new NullCipher()); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data); 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.flush(); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("CipherOutputStream wrote incorrect data."); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(null); 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("NullPointerException expected"); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (NullPointerException e) { 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //expected 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * write(byte[] b, int off, int len) method testing. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testWrite3() throws Exception { 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos, new NullCipher()); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < data.length; i++) { 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data, i, 1); 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.flush(); 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("CipherOutputStream wrote incorrect data."); 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 142229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * write(byte[] b, int off, int len) 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testWrite4() throws Exception { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //Regression for HARMONY-758 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project new CipherOutputStream(new BufferedOutputStream((OutputStream) null), new NullCipher()).write(new byte[] {0}, 1, Integer.MAX_VALUE); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (IllegalArgumentException e) { 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 153229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom * write(byte[] b, int off, int len) 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testWrite5() throws Exception { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //Regression for HARMONY-758 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Cipher cf = Cipher.getInstance("DES/CBC/PKCS5Padding"); 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NullCipher nc = new NullCipher(); 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream stream1 = new CipherOutputStream(new BufferedOutputStream((OutputStream) null), nc); 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream stream2 = new CipherOutputStream(stream1, cf); 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream stream3 = new CipherOutputStream(stream2, nc); 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project stream3.write(new byte[] {0}, 0, 0); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project //no exception expected 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * flush() method testing. Tests that method flushes the data to the 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * underlying output stream. 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testFlush() throws Exception { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos){}; 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data); 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.flush(); 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("CipherOutputStream did not flush the data."); 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * close() method testing. Tests that the method calls the close() method of 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the underlying input stream. 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void testClose() throws Exception { 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] data = new byte[] { -127, -100, -50, -10, -1, 0, 1, 10, 50, 127 }; 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project TestOutputStream tos = new TestOutputStream(); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(tos){}; 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.write(data); 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project cos.close(); 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project byte[] result = tos.toByteArray(); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!Arrays.equals(result, data)) { 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("CipherOutputStream did not flush the data."); 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertTrue("The close() method should call the close() method " 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project + "of its underlying output stream.", tos.wasClosed()); 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_ConstructorLjava_io_OutputStreamLjavax_crypto_Cipher() throws 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ByteArrayOutputStream baos = new ByteArrayOutputStream(); 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project KeyGenerator kg = KeyGenerator.getInstance("DES"); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project kg.init(56, new SecureRandom()); 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Key key = kg.generateKey(); 207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Cipher c = Cipher.getInstance("DES/CBC/NoPadding"); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project c.init(Cipher.ENCRYPT_MODE, key); 210f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CipherOutputStream cos = new CipherOutputStream(baos, c); 212f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project assertNotNull(cos); 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2154d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2164d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro private static class CipherSpiThatThrowsOnSecondDoFinal extends CipherSpi { 2174d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2184d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro private boolean wasDoFinalCalled = false; 2194d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2204d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2214d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected void engineSetMode(String mode) throws NoSuchAlgorithmException { 2224d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2234d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2244d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2254d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2264d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected void engineSetPadding(String padding) throws NoSuchPaddingException { 2274d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2284d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2294d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2304d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2314d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected int engineGetBlockSize() { 2324d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return 0; 2334d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2344d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2354d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2364d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected int engineGetOutputSize(int inputLen) { 2374d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return 0; 2384d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2394d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2404d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2414d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected byte[] engineGetIV() { 2424d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return new byte[0]; 2434d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2444d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2454d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2464d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected AlgorithmParameters engineGetParameters() { 2474d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return null; 2484d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2494d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2504d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2514d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected void engineInit(int opmode, Key key, SecureRandom random) 2524d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throws InvalidKeyException { 2534d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2544d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2554d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2564d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2574d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected void engineInit(int opmode, Key key, AlgorithmParameterSpec params, 2584d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro SecureRandom random) 2594d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throws InvalidKeyException, InvalidAlgorithmParameterException { 2604d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2614d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2624d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2634d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2644d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected void engineInit(int opmode, Key key, AlgorithmParameters params, 2654d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro SecureRandom random) 2664d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throws InvalidKeyException, InvalidAlgorithmParameterException { 2674d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2684d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2694d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2704d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2714d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected byte[] engineUpdate(byte[] input, int inputOffset, int inputLen) { 2724d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return new byte[0]; 2734d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2744d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2754d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2764d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected int engineUpdate(byte[] input, int inputOffset, int inputLen, byte[] output, 2774d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro int outputOffset) throws ShortBufferException { 2784d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return 0; 2794d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2804d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2814d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2824d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected byte[] engineDoFinal(byte[] input, int inputOffset, int inputLen) 2834d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throws IllegalBlockSizeException, BadPaddingException { 2844d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro // Just call the other overriding for engineDoFinal. 2854d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro try { 2864d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro engineDoFinal(input, inputOffset, inputLen, new byte[10], 0); 2874d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } catch (ShortBufferException e) { 2884d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throw new RuntimeException(e); 2894d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2904d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return new byte[0]; 2914d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 2924d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 2934d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro @Override 2944d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro protected int engineDoFinal(byte[] input, int inputOffset, int inputLen, byte[] output, 2954d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro int outputOffset) 2964d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throws ShortBufferException, IllegalBlockSizeException, BadPaddingException { 2974d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro if (wasDoFinalCalled) { 2984d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro throw new UnsupportedOperationException( 2994d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro "doFinal not supposed to be called two times"); 3004d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 3014d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro wasDoFinalCalled = true; 3024d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro return 0; 3034d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 3044d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro }; 3054d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3064d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3074d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro public void test_close_doubleCloseDoesntCallDoFinal() throws Exception { 3084d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro CipherSpi cipherSpiThatThrowsOnSecondDoFinal = new CipherSpiThatThrowsOnSecondDoFinal(); 3094d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro Cipher cipherThatThrowsOnSecondDoFinal = new Cipher( 3104d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro cipherSpiThatThrowsOnSecondDoFinal, 3114d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro Security.getProviders()[0], 3124d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro "SomeTransformation") { 3134d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro }; 3144d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3154d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro TestOutputStream testOutputStream = new TestOutputStream(); 3164d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro CipherOutputStream cipherOutputStream = new CipherOutputStream( 3174d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro testOutputStream, cipherThatThrowsOnSecondDoFinal); 3184d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3194d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro cipherThatThrowsOnSecondDoFinal.init(Cipher.ENCRYPT_MODE, (Key) null); 3204d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3214d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro cipherOutputStream.close(); 3224d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro // Should just check that it's already closed and return, without calling doFinal, thus 3234d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro // throwing any exception 3244d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro cipherOutputStream.close(); 3254d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro 3264d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro // Check that the spi didn't change, as it might be changed dynamically by the Cipher 3274d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro // methods. 3284d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro assertEquals(cipherSpiThatThrowsOnSecondDoFinal, 3294d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro cipherThatThrowsOnSecondDoFinal.getCurrentSpi()); 3304d8b5b2a31220193401129212afbce4608d6dbdcSergio Giro } 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 333