/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @author Boris V. Kuznetsov */ package org.apache.harmony.crypto.tests.javax.crypto; import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Provider; import java.security.Security; import java.security.spec.InvalidKeySpecException; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import org.apache.harmony.security.tests.support.TestKeyPair; import junit.framework.TestCase; /** * Tests for Cipher class constructors and methods. */ public class Cipher_ImplTest extends TestCase { private Provider p1; private Provider p2; private TestKeyPair tkp = null; private Key key = null; private boolean noKey = false; /* * @see TestCase#setUp() */ protected void setUp() throws Exception { super.setUp(); p1 = new MyProvider1(); p2 = new MyProvider2(); Security.insertProviderAt(p1, 1); Security.insertProviderAt(p2, 1); try { tkp = new TestKeyPair("DSA"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); noKey = true; return; } try { key = tkp.getPrivate(); } catch (InvalidKeySpecException e) { e.printStackTrace(); noKey = true; return; } } /* * @see TestCase#tearDown() */ protected void tearDown() throws Exception { super.tearDown(); Security.removeProvider("MyProvider1"); Security.removeProvider("MyProvider2"); } /* * Class under test for Cipher getInstance(String) */ public void testGetInstanceString1() throws NoSuchAlgorithmException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES"); assertSame(p2, c.getProvider()); } /* * Class under test for Cipher getInstance(String) */ public void testGetInstanceString2() throws NoSuchAlgorithmException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding"); assertSame("Case1:", p1, c.getProvider()); Security.removeProvider(p1.getName()); c = Cipher.getInstance("DES/CBC/PKCS5Padding"); assertSame("Case2:", p2, c.getProvider()); } /* * Class under test for Cipher getInstance(String) */ public void testGetInstanceString3() throws NoSuchAlgorithmException, NoSuchPaddingException { try { Cipher.getInstance("DES/CBC/"); fail("Case1: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES//PKCS5Padding"); fail("Case2: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES/CBC/IncorrectPadding"); fail("No expected NoSuchPaddingException"); } catch (NoSuchPaddingException e) { } } /* * Class under test for Cipher getInstance(String, String) */ public void testGetInstanceStringString1() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException { try { Cipher.getInstance("DES/CBC/", "MyProvider2"); fail("Case1: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES//PKCS5Padding", "MyProvider2"); fail("Case2: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES/CBC/IncorrectPadding", "MyProvider2"); fail("No expected NoSuchPaddingException"); } catch (NoSuchPaddingException e) { } try { Cipher.getInstance("DES/CBC/PKCS5Padding", "IncorrectProvider"); fail("No expected NoSuchProviderException"); } catch (NoSuchProviderException e) { } } /* * Class under test for Cipher getInstance(String, String) */ public void testGetInstanceStringString2() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES", "MyProvider2"); assertSame("Case1:", p2, c.getProvider()); c = Cipher.getInstance("DES/CBC/PKCS5Padding", "MyProvider2"); assertSame("Case2:", p2, c.getProvider()); } /* * Class under test for Cipher getInstance(String, Provider) */ public void testGetInstanceStringProvider1() throws NoSuchAlgorithmException, NoSuchPaddingException { try { Cipher.getInstance("DES/CBC/", p2); fail("Case1: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES//PKCS5Padding", p2); fail("Case2: No expected NoSuchAlgorithmException"); } catch (NoSuchAlgorithmException e) { } try { Cipher.getInstance("DES/CBC/IncorrectPadding", p2); fail("No expected NoSuchProviderException"); } catch (NoSuchPaddingException e) { } try { Cipher.getInstance("DES/CBC/PKCS5Padding", "IncorrectProvider"); fail("No expected NoSuchProviderException"); } catch (NoSuchProviderException e) { } } /* * Class under test for Cipher getInstance(String, Provider) */ public void testGetInstanceStringProvider2() throws NoSuchAlgorithmException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES", p2); assertSame("Case1:", p2, c.getProvider()); c = Cipher.getInstance("DES/CBC/PKCS5Padding", p2); assertSame("Case2:", p2, c.getProvider()); assertFalse("getAlgorithm", "DES".equals(c.getAlgorithm())); } public void testGetBlockSize() throws NoSuchAlgorithmException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES"); assertEquals("getBlockSize", 111, c.getBlockSize()); } public void testGetOutputSize() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { Cipher c = Cipher.getInstance("DES"); try { c.getOutputSize(111); fail("No expected IllegalStateException"); } catch (IllegalStateException e) { } if (noKey) { return; } c.init(Cipher.DECRYPT_MODE, key); assertEquals("getOutputSize", 121, c.getOutputSize(111)); } public void testGetIV() throws NoSuchAlgorithmException, NoSuchPaddingException { Cipher c = Cipher.getInstance("DES"); assertEquals(3, c.getIV().length); } /* * Class under test for byte[] update(byte[]) */ public void testUpdatebyteArray() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException { Cipher c = Cipher.getInstance("DES"); byte[] b = { 1, 2, 3, 4 }; try { c.update(b); fail("No expected IllegalStateException"); } catch (IllegalStateException e) { } if (noKey) { return; } c.init(Cipher.DECRYPT_MODE, key); try { c.update(null); fail("No expected IllegalArgumentException"); } catch (IllegalArgumentException e) { } assertNull(c.update(new byte[0])); } private class MyProvider1 extends Provider { MyProvider1() { super("MyProvider1", 1.0, "Provider1 for testing"); put("Cipher.DES/CBC/PKCS5Padding", "org.apache.harmony.crypto.tests.support.MyCipher"); put("Cipher.DES/ECB/PKCS5Padding", "org.apache.harmony.crypto.tests.support.MyCipher"); } } private class MyProvider2 extends Provider { MyProvider2() { super("MyProvider2", 1.0, "Provider2 for testing"); put("Cipher.DES", "org.apache.harmony.crypto.tests.support.MyCipher"); } } }