/* * 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. */ package tests.api.javax.net.ssl; import dalvik.annotation.KnownFailure; import java.io.IOException; import java.security.InvalidAlgorithmParameterException; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; import java.security.NoSuchProviderException; import java.security.Provider; import java.security.PublicKey; import java.security.Security; import java.security.cert.CertificateException; import java.security.cert.PKIXBuilderParameters; import java.security.cert.TrustAnchor; import java.security.cert.X509CertSelector; import java.util.HashSet; import java.util.Set; import javax.net.ssl.CertPathTrustManagerParameters; import javax.net.ssl.ManagerFactoryParameters; import javax.net.ssl.TrustManager; import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.TrustManagerFactorySpi; import junit.framework.TestCase; import org.apache.harmony.security.tests.support.SpiEngUtils; import org.apache.harmony.security.tests.support.TestKeyPair; import org.apache.harmony.xnet.tests.support.MyTrustManagerFactorySpi; /** * Tests for <code>TrustManagerFactory</code> class constructors and methods. * */ public class TrustManagerFactory1Test extends TestCase { private static final String srvTrustManagerFactory = "TrustManagerFactory"; private static final String[] invalidValues = SpiEngUtils.invalidValues; private static String DEFAULT_ALGORITHM; private static String DEFAULT_PROVIDER_NAME; private static Provider DEFAULT_PROVIDER; private static String[] VALID_VALUES; private static String getDefaultAlgorithm() { init(); return DEFAULT_ALGORITHM; } private static String getDefaultProviderName() { init(); return DEFAULT_PROVIDER_NAME; } private static Provider getDefaultProvider() { init(); return DEFAULT_PROVIDER; } private static String[] getValidValues() { init(); return VALID_VALUES; } private static synchronized void init() { if (DEFAULT_ALGORITHM != null) { return; } DEFAULT_ALGORITHM = Security.getProperty("ssl.TrustManagerFactory.algorithm"); assertNotNull(DEFAULT_ALGORITHM); DEFAULT_PROVIDER = SpiEngUtils.isSupport(DEFAULT_ALGORITHM, srvTrustManagerFactory); DEFAULT_PROVIDER_NAME = DEFAULT_PROVIDER.getName(); VALID_VALUES = new String[] { DEFAULT_ALGORITHM, DEFAULT_ALGORITHM.toUpperCase(), DEFAULT_ALGORITHM.toLowerCase() }; } private static TrustManagerFactory[] createTMFac() throws Exception { return new TrustManagerFactory[] { TrustManagerFactory.getInstance(getDefaultAlgorithm()), TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider()), TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProviderName()) }; } public void test_ConstructorLjavax_net_ssl_TrustManagerFactorySpiLjava_security_ProviderLjava_lang_String() throws NoSuchAlgorithmException { TrustManagerFactorySpi spi = new MyTrustManagerFactorySpi(); TrustManagerFactory tmF = new myTrustManagerFactory(spi, getDefaultProvider(), getDefaultAlgorithm()); assertTrue("Not CertStore object", tmF instanceof TrustManagerFactory); assertEquals("Incorrect algorithm", tmF.getAlgorithm(), getDefaultAlgorithm()); assertEquals("Incorrect provider", tmF.getProvider(), getDefaultProvider()); assertNull("Incorrect result", tmF.getTrustManagers()); tmF = new myTrustManagerFactory(null, null, null); assertTrue("Not CertStore object", tmF instanceof TrustManagerFactory); assertNull("Provider must be null", tmF.getProvider()); assertNull("Algorithm must be null", tmF.getAlgorithm()); try { tmF.getTrustManagers(); fail("NullPointerException must be thrown"); } catch (NullPointerException e) { } } /** * Test for <code>getAlgorithm()</code> method * Assertion: returns the algorithm name of this object * @throws NoSuchAlgorithmException * @throws NoSuchProviderException */ public void test_getAlgorithm() throws NoSuchAlgorithmException, NoSuchProviderException { assertEquals("Incorrect algorithm", getDefaultAlgorithm(), TrustManagerFactory .getInstance(getDefaultAlgorithm()).getAlgorithm()); assertEquals("Incorrect algorithm", getDefaultAlgorithm(), TrustManagerFactory .getInstance(getDefaultAlgorithm(), getDefaultProviderName()) .getAlgorithm()); assertEquals("Incorrect algorithm", getDefaultAlgorithm(), TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider()) .getAlgorithm()); } /** * Test for <code>getDefaultAlgorithm()</code> method * Assertion: returns value which is specifoed in security property */ public void test_getDefaultAlgorithm() { String def = TrustManagerFactory.getDefaultAlgorithm(); if (getDefaultAlgorithm() == null) { assertNull("DefaultAlgorithm must be null", def); } else { assertEquals("Invalid default algorithm", def, getDefaultAlgorithm()); } String defA = "Proba.trustmanagerfactory.defaul.type"; Security.setProperty("ssl.TrustManagerFactory.algorithm", defA); assertEquals("Incorrect getDefaultAlgorithm()", TrustManagerFactory.getDefaultAlgorithm(), defA); if (def == null) { def = ""; } Security.setProperty("ssl.TrustManagerFactory.algorithm", def); assertEquals("Incorrect getDefaultAlgorithm()", TrustManagerFactory.getDefaultAlgorithm(), def); } /** * Test for <code>getInstance(String algorithm)</code> method * Assertions: returns security property "ssl.TrustManagerFactory.algorithm"; * returns instance of TrustManagerFactory */ public void test_getInstanceLjava_lang_String01() throws NoSuchAlgorithmException { for (String validValue : getValidValues()) { TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue); assertTrue("Not TrustManagerFactory object", trustMF instanceof TrustManagerFactory); assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue); } } /** * Test for <code>getInstance(String algorithm)</code> method * Assertion: * throws NullPointerException when algorithm is null; * throws NoSuchAlgorithmException when algorithm is not correct; */ public void test_getInstanceLjava_lang_String02() { try { TrustManagerFactory.getInstance(null); fail(); } catch (NoSuchAlgorithmException expected) { } catch (NullPointerException expected) { } for (int i = 0; i < invalidValues.length; i++) { try { TrustManagerFactory.getInstance(invalidValues[i]); fail("NoSuchAlgorithmException was not thrown as expected for algorithm: " .concat(invalidValues[i])); } catch (NoSuchAlgorithmException e) { } } } /** * Test for <code>getInstance(String algorithm, String provider)</code> * method * Assertion: throws IllegalArgumentException when provider is null * or empty */ public void test_getInstanceLjava_lang_StringLjava_lang_String01() throws Exception { for (String validValue : getValidValues()) { try { TrustManagerFactory.getInstance(validValue, (String) null); fail(); } catch (IllegalArgumentException expected) { } try { TrustManagerFactory.getInstance(validValue, ""); fail(); } catch (IllegalArgumentException expected) { } } } /** * Test for <code>getInstance(String algorithm, String provider)</code> * method * Assertion: * throws NullPointerException when algorithm is null; * throws NoSuchAlgorithmException when algorithm is not correct; */ public void test_getInstanceLjava_lang_StringLjava_lang_String02() throws Exception { try { TrustManagerFactory.getInstance(null, getDefaultProviderName()); fail(); } catch (NoSuchAlgorithmException expected) { } catch (NullPointerException expected) { } for (int i = 0; i < invalidValues.length; i++) { try { TrustManagerFactory.getInstance(invalidValues[i], getDefaultProviderName()); fail("NoSuchAlgorithmException must be thrown (algorithm: " .concat(invalidValues[i]).concat(")")); } catch (NoSuchAlgorithmException e) { } } } /** * Test for <code>getInstance(String algorithm, String provider)</code> * method * Assertion: throws NoSuchProviderException when provider has * invalid value */ public void test_getInstanceLjava_lang_StringLjava_lang_String03() throws Exception { for (String invalidValue : invalidValues) { for (String validValue : getValidValues()) { try { TrustManagerFactory.getInstance(validValue, invalidValue); fail("NoSuchProviderException must be thrown (algorithm: " .concat(validValue).concat(" provider: ") .concat(invalidValue).concat(")")); } catch (NoSuchProviderException expected) { assertFalse("".equals(invalidValue)); } catch (IllegalArgumentException expected) { assertEquals("", invalidValue); } } } } /** * Test for <code>getInstance(String algorithm, String provider)</code> * method * Assertion: returns instance of TrustManagerFactory */ public void test_getInstanceLjava_lang_StringLjava_lang_String04() throws Exception { for (String validValue : getValidValues()) { TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue, getDefaultProviderName()); assertTrue("Not TrustManagerFactory object", trustMF instanceof TrustManagerFactory); assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue); assertEquals("Invalid provider", trustMF.getProvider(), getDefaultProvider()); } } /** * Test for <code>getInstance(String algorithm, Provider provider)</code> * method * Assertion: throws IllegalArgumentException when provider is null */ public void test_getInstanceLjava_lang_StringLjava_security_Provider01() throws Exception { for (String validValue : getValidValues()) { try { TrustManagerFactory.getInstance(validValue, (Provider) null); } catch (IllegalArgumentException expected) { } } } /** * Test for <code>getInstance(String algorithm, Provider provider)</code> * method * Assertion: * throws NullPointerException when algorithm is null; * throws NoSuchAlgorithmException when algorithm is not correct; */ public void test_getInstanceLjava_lang_StringLjava_security_Provider02() { try { TrustManagerFactory.getInstance(null, getDefaultProvider()); fail(""); } catch (NoSuchAlgorithmException expected) { } catch (NullPointerException expected) { } for (int i = 0; i < invalidValues.length; i++) { try { TrustManagerFactory.getInstance(invalidValues[i], getDefaultProvider()); fail("NoSuchAlgorithmException must be thrown (algorithm: " .concat(invalidValues[i]).concat(")")); } catch (NoSuchAlgorithmException e) { } } } /** * Test for <code>getInstance(String algorithm, Provider provider)</code> * method * Assertion: returns instance of TrustManagerFactory */ public void test_getInstanceLjava_lang_StringLjava_security_Provider03() throws Exception { for (String validValue : getValidValues()) { TrustManagerFactory trustMF = TrustManagerFactory.getInstance(validValue, getDefaultProvider()); assertTrue("Not TrustManagerFactory object", trustMF instanceof TrustManagerFactory); assertEquals("Invalid algorithm", trustMF.getAlgorithm(), validValue); assertEquals("Invalid provider", trustMF.getProvider(), getDefaultProvider()); } } /** * Test for <code>getProvider()</code> * @throws NoSuchAlgorithmException * @throws NoSuchProviderException */ public void test_getProvider() throws NoSuchAlgorithmException, NoSuchProviderException { assertEquals("Incorrect provider", getDefaultProvider(), TrustManagerFactory .getInstance(getDefaultAlgorithm()).getProvider()); assertEquals("Incorrect provider", getDefaultProvider(), TrustManagerFactory .getInstance(getDefaultAlgorithm(), getDefaultProviderName()) .getProvider()); assertEquals("Incorrect provider", getDefaultProvider(), TrustManagerFactory.getInstance(getDefaultAlgorithm(), getDefaultProvider()) .getProvider()); } /** * Test for <code>geTrustManagers()</code> * @throws KeyStoreException * @throws IOException * @throws CertificateException * @throws NoSuchAlgorithmException */ public void test_getTrustManagers() { try { TrustManagerFactory trustMF = TrustManagerFactory.getInstance(getDefaultAlgorithm()); KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); ks.load(null, null); trustMF.init(ks); TrustManager[] tm = trustMF.getTrustManagers(); assertNotNull("Result has not be null", tm); assertTrue("Length of result TrustManager array should not be 0", (tm.length > 0)); } catch (Exception ex) { fail("Unexpected exception " + ex.toString()); } } /** * Test for <code>init(KeyStore keyStore)</code> * Assertion: call method with null parameter */ public void test_initLjava_security_KeyStore_01() throws Exception { KeyStore ksNull = null; TrustManagerFactory[] trustMF = createTMFac(); assertNotNull("TrustManagerFactory objects were not created", trustMF); // null parameter try { trustMF[0].init(ksNull); } catch (Exception ex) { fail(ex + " unexpected exception was thrown for null parameter"); } } /** * Test for <code>init(KeyStore keyStore)</code> * Assertion: call method with not null parameter */ public void test_initLjava_security_KeyStore_02() throws Exception { KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType()); TrustManagerFactory[] trustMF = createTMFac(); assertNotNull("TrustManagerFactory objects were not created", trustMF); // not null parameter trustMF[0].init(ks); } /** * Test for <code>init(ManagerFactoryParameters params)</code> * Assertion: * throws InvalidAlgorithmParameterException when params is null */ @KnownFailure("ManagerFactoryParameters object is not supported " + "and InvalidAlgorithmParameterException was thrown.") public void test_initLjavax_net_ssl_ManagerFactoryParameters() throws Exception { ManagerFactoryParameters par = null; TrustManagerFactory[] trustMF = createTMFac(); assertNotNull("TrustManagerFactory objects were not created", trustMF); for (int i = 0; i < trustMF.length; i++) { try { trustMF[i].init(par); fail("InvalidAlgorithmParameterException must be thrown"); } catch (InvalidAlgorithmParameterException e) { } } String keyAlg = "DSA"; String validCaNameRfc2253 = ("CN=Test CA," + "OU=Testing Division," + "O=Test It All," + "L=Test Town," + "ST=Testifornia," + "C=Testland"); try { KeyStore kStore = KeyStore.getInstance(KeyStore.getDefaultType()); kStore.load(null, null); PublicKey pk = new TestKeyPair(keyAlg).getPublic(); TrustAnchor ta = new TrustAnchor(validCaNameRfc2253, pk, getFullEncoding()); Set<TrustAnchor> trustAnchors = new HashSet<TrustAnchor>(); trustAnchors.add(ta); X509CertSelector xcs = new X509CertSelector(); PKIXBuilderParameters pkixBP = new PKIXBuilderParameters(trustAnchors, xcs); CertPathTrustManagerParameters cptmp = new CertPathTrustManagerParameters(pkixBP); TrustManagerFactory tmf = TrustManagerFactory.getInstance(getDefaultAlgorithm()); try { tmf.init(cptmp); } catch (Exception ex) { fail(ex + " was thrown for init(ManagerFactoryParameters spec)"); } } catch (Exception e) { fail("Unexpected exception for configuration: " + e); } } private static final byte[] getFullEncoding() { // DO NOT MODIFY! return new byte[] { (byte)0x30,(byte)0x81,(byte)0x8c,(byte)0xa0, (byte)0x44,(byte)0x30,(byte)0x16,(byte)0x86, (byte)0x0e,(byte)0x66,(byte)0x69,(byte)0x6c, (byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f, (byte)0x66,(byte)0x6f,(byte)0x6f,(byte)0x2e, (byte)0x63,(byte)0x6f,(byte)0x6d,(byte)0x80, (byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01, (byte)0x01,(byte)0x30,(byte)0x16,(byte)0x86, (byte)0x0e,(byte)0x66,(byte)0x69,(byte)0x6c, (byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f, (byte)0x62,(byte)0x61,(byte)0x72,(byte)0x2e, (byte)0x63,(byte)0x6f,(byte)0x6d,(byte)0x80, (byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01, (byte)0x01,(byte)0x30,(byte)0x12,(byte)0x86, (byte)0x0a,(byte)0x66,(byte)0x69,(byte)0x6c, (byte)0x65,(byte)0x3a,(byte)0x2f,(byte)0x2f, (byte)0x6d,(byte)0x75,(byte)0x75,(byte)0x80, (byte)0x01,(byte)0x00,(byte)0x81,(byte)0x01, (byte)0x01,(byte)0xa1,(byte)0x44,(byte)0x30, (byte)0x16,(byte)0x86,(byte)0x0e,(byte)0x68, (byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a, (byte)0x2f,(byte)0x2f,(byte)0x66,(byte)0x6f, (byte)0x6f,(byte)0x2e,(byte)0x63,(byte)0x6f, (byte)0x6d,(byte)0x80,(byte)0x01,(byte)0x00, (byte)0x81,(byte)0x01,(byte)0x01,(byte)0x30, (byte)0x16,(byte)0x86,(byte)0x0e,(byte)0x68, (byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a, (byte)0x2f,(byte)0x2f,(byte)0x62,(byte)0x61, (byte)0x72,(byte)0x2e,(byte)0x63,(byte)0x6f, (byte)0x6d,(byte)0x80,(byte)0x01,(byte)0x00, (byte)0x81,(byte)0x01,(byte)0x01,(byte)0x30, (byte)0x12,(byte)0x86,(byte)0x0a,(byte)0x68, (byte)0x74,(byte)0x74,(byte)0x70,(byte)0x3a, (byte)0x2f,(byte)0x2f,(byte)0x6d,(byte)0x75, (byte)0x75,(byte)0x80,(byte)0x01,(byte)0x00, (byte)0x81,(byte)0x01,(byte)0x01 }; } } /** * Addifional class to verify TrustManagerFactory constructor */ class myTrustManagerFactory extends TrustManagerFactory { public myTrustManagerFactory(TrustManagerFactorySpi spi, Provider prov, String alg) { super(spi, prov, alg); } }