Home | History | Annotate | Download | only in cert
      1 /*
      2  *  Licensed to the Apache Software Foundation (ASF) under one or more
      3  *  contributor license agreements.  See the NOTICE file distributed with
      4  *  this work for additional information regarding copyright ownership.
      5  *  The ASF licenses this file to You under the Apache License, Version 2.0
      6  *  (the "License"); you may not use this file except in compliance with
      7  *  the License.  You may obtain a copy of the License at
      8  *
      9  *     http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  */
     17 
     18 /**
     19 * @author Vera Y. Petrashkova
     20 * @version $Revision$
     21 */
     22 
     23 package tests.security.cert;
     24 
     25 import dalvik.annotation.KnownFailure;
     26 
     27 import org.apache.harmony.security.tests.support.SpiEngUtils;
     28 import org.apache.harmony.security.tests.support.cert.MyCertPathBuilderSpi;
     29 import org.apache.harmony.security.tests.support.cert.TestUtils;
     30 
     31 import java.security.InvalidAlgorithmParameterException;
     32 import java.security.NoSuchAlgorithmException;
     33 import java.security.NoSuchProviderException;
     34 import java.security.Provider;
     35 import java.security.Security;
     36 import java.security.cert.CertPath;
     37 import java.security.cert.CertPathBuilder;
     38 import java.security.cert.CertPathBuilderException;
     39 import java.security.cert.CertPathBuilderResult;
     40 import java.security.cert.CertPathBuilderSpi;
     41 import java.security.cert.CertPathParameters;
     42 import java.security.cert.CertificateException;
     43 
     44 import junit.framework.TestCase;
     45 
     46 /**
     47  * Tests for <code>CertPathBuilder</code> class constructors and
     48  * methods.
     49  *
     50  */
     51 public class CertPathBuilder1Test extends TestCase {
     52 
     53     public static final String srvCertPathBuilder = "CertPathBuilder";
     54 
     55     public static final String defaultType = "PKIX";
     56     public static final String [] validValues = {
     57             "PKIX", "pkix", "PkiX", "pKiX" };
     58 
     59     private static String [] invalidValues = SpiEngUtils.invalidValues;
     60 
     61     private static boolean PKIXSupport = false;
     62 
     63     private static Provider defaultProvider;
     64     private static String defaultProviderName;
     65 
     66     private static String NotSupportMsg = "";
     67 
     68     public static final String DEFAULT_TYPE_PROPERTY = "certpathbuilder.type";
     69 
     70     static {
     71         defaultProvider = SpiEngUtils.isSupport(defaultType,
     72                 srvCertPathBuilder);
     73         PKIXSupport = (defaultProvider != null);
     74         defaultProviderName = (PKIXSupport ? defaultProvider.getName() : null);
     75         NotSupportMsg = defaultType.concat(" is not supported");
     76     }
     77     private static CertPathBuilder[] createCPBs() {
     78         if (!PKIXSupport) {
     79             fail(NotSupportMsg);
     80             return null;
     81         }
     82         try {
     83             CertPathBuilder[] certPBs = new CertPathBuilder[3];
     84             certPBs[0] = CertPathBuilder.getInstance(defaultType);
     85             certPBs[1] = CertPathBuilder.getInstance(defaultType,
     86                     defaultProviderName);
     87             certPBs[2] = CertPathBuilder.getInstance(defaultType,
     88                     defaultProvider);
     89             return certPBs;
     90         } catch (Exception e) {
     91             return null;
     92         }
     93     }
     94 
     95     /**
     96      * java.security.cert.CertPathBuilder#getDefaultType()
     97      */
     98     public void test_getDefaultType() throws Exception {
     99 
    100         // Regression for HARMONY-2785
    101 
    102         // test: default value
    103         assertNull(Security.getProperty(DEFAULT_TYPE_PROPERTY));
    104         assertEquals("PKIX", CertPathBuilder.getDefaultType());
    105     }
    106 
    107     /**
    108      * Test for <code>getInstance(String algorithm)</code> method
    109      * Assertion:
    110      * throws NullPointerException when algorithm is null
    111      * throws NoSuchAlgorithmException when algorithm  is not correct
    112      * or it is not available
    113      */
    114     public void testCertPathBuilder02() throws NoSuchAlgorithmException {
    115         try {
    116             CertPathBuilder.getInstance(null);
    117             fail("No expected NullPointerException");
    118         } catch (NullPointerException e) {
    119         }
    120         for (int i = 0; i < invalidValues.length; i++) {
    121             try {
    122                 CertPathBuilder.getInstance(invalidValues[i]);
    123                 fail("NoSuchAlgorithmException must be thrown");
    124             } catch (NoSuchAlgorithmException e) {
    125             }
    126         }
    127     }
    128 
    129     /**
    130      * Test for <code>getInstance(String algorithm)</code> method
    131      * Assertion: returns CertPathBuilder object
    132      */
    133     public void testCertPathBuilder03() throws NoSuchAlgorithmException  {
    134         if (!PKIXSupport) {
    135             fail(NotSupportMsg);
    136             return;
    137         }
    138         for (int i = 0; i < validValues.length; i++) {
    139             CertPathBuilder cpb = CertPathBuilder.getInstance(validValues[i]);
    140             assertEquals("Incorrect algorithm", cpb.getAlgorithm(), validValues[i]);
    141         }
    142     }
    143     /**
    144      * Test for <code>getInstance(String algorithm, String provider)</code> method
    145      * Assertion: throws IllegalArgumentException when provider is null or empty
    146      *
    147      * FIXME: verify what exception will be thrown if provider is empty
    148      */
    149     public void testCertPathBuilder04()
    150             throws NoSuchAlgorithmException, NoSuchProviderException  {
    151         if (!PKIXSupport) {
    152             fail(NotSupportMsg);
    153             return;
    154         }
    155         String provider = null;
    156         for (int i = 0; i < validValues.length; i++) {
    157             try {
    158                 CertPathBuilder.getInstance(validValues[i], provider);
    159                 fail("IllegalArgumentException must be thrown thrown");
    160             } catch (IllegalArgumentException e) {
    161             }
    162             try {
    163                 CertPathBuilder.getInstance(validValues[i], "");
    164                 fail("IllegalArgumentException must be thrown thrown");
    165             } catch (IllegalArgumentException e) {
    166             }
    167         }
    168     }
    169 
    170     /**
    171      * Test for <code>getInstance(String algorithm, String provider)</code> method
    172      * Assertion:
    173      * throws NoSuchProviderException when provider has invalid value
    174      */
    175     public void testCertPathBuilder05()
    176             throws NoSuchAlgorithmException  {
    177         if (!PKIXSupport) {
    178             fail(NotSupportMsg);
    179             return;
    180         }
    181         for (int i = 0; i < validValues.length; i++ ) {
    182             for (int j = 1; j < invalidValues.length; j++) {
    183                 try {
    184                     CertPathBuilder.getInstance(validValues[i], invalidValues[j]);
    185                     fail("NoSuchProviderException must be hrown");
    186                 } catch (NoSuchProviderException e1) {
    187                 }
    188             }
    189         }
    190     }
    191     /**
    192      * Test for <code>getInstance(String algorithm, String provider)</code> method
    193      * Assertion:
    194      * throws NullPointerException when algorithm is null
    195      * throws NoSuchAlgorithmException when algorithm  is not correct
    196      */
    197     public void testCertPathBuilder06()
    198             throws NoSuchAlgorithmException, NoSuchProviderException  {
    199         if (!PKIXSupport) {
    200             fail(NotSupportMsg);
    201             return;
    202         }
    203         try {
    204             CertPathBuilder.getInstance(null, defaultProviderName);
    205             fail("No expected NullPointerException");
    206         } catch (NullPointerException e) {
    207         }
    208         for (int i = 0; i < invalidValues.length; i++) {
    209             try {
    210                 CertPathBuilder.getInstance(invalidValues[i], defaultProviderName);
    211                 fail("NoSuchAlgorithmException must be thrown");
    212             } catch (NoSuchAlgorithmException e1) {
    213             }
    214         }
    215     }
    216 
    217     /**
    218      * Test for <code>getInstance(String algorithm, String provider)</code> method
    219      * Assertion: returns CertPathBuilder object
    220      */
    221     public void testCertPathBuilder07()
    222             throws NoSuchAlgorithmException, NoSuchProviderException  {
    223         if (!PKIXSupport) {
    224             fail(NotSupportMsg);
    225             return;
    226         }
    227         CertPathBuilder certPB;
    228         for (int i = 0; i < validValues.length; i++) {
    229             certPB = CertPathBuilder.getInstance(validValues[i], defaultProviderName);
    230             assertEquals("Incorrect algorithm", certPB.getAlgorithm(), validValues[i]);
    231             assertEquals("Incorrect provider name", certPB.getProvider().getName(), defaultProviderName);
    232         }
    233     }
    234 
    235     /**
    236      * Test for <code>getInstance(String algorithm, Provider provider)</code> method
    237      * Assertion: throws IllegalArgumentException when provider is null
    238      */
    239     public void testCertPathBuilder08()
    240             throws NoSuchAlgorithmException  {
    241         if (!PKIXSupport) {
    242             fail(NotSupportMsg);
    243             return;
    244         }
    245         Provider prov = null;
    246         for (int t = 0; t < validValues.length; t++ ) {
    247             try {
    248                 CertPathBuilder.getInstance(validValues[t], prov);
    249                 fail("IllegalArgumentException must be thrown");
    250             } catch (IllegalArgumentException e1) {
    251             }
    252         }
    253     }
    254 
    255     /**
    256      * Test for <code>getInstance(String algorithm, String provider)</code> method
    257      * Assertion:
    258      * throws NullPointerException when algorithm is null
    259      * throws NoSuchAlgorithmException when algorithm  is not correct
    260      */
    261     public void testCertPathBuilder09()
    262             throws NoSuchAlgorithmException, NoSuchProviderException  {
    263         if (!PKIXSupport) {
    264             fail(NotSupportMsg);
    265             return;
    266         }
    267         try {
    268             CertPathBuilder.getInstance(null, defaultProvider);
    269             fail("No expected NullPointerException");
    270         } catch (NullPointerException e) {
    271         }
    272         for (int i = 0; i < invalidValues.length; i++) {
    273             try {
    274                 CertPathBuilder.getInstance(invalidValues[i], defaultProvider);
    275                 fail("NoSuchAlgorithm must be thrown");
    276             } catch (NoSuchAlgorithmException e1) {
    277             }
    278         }
    279     }
    280     /**
    281      * Test for <code>getInstance(String algorithm, String provider)</code> method
    282      * Assertion: returns CertPathBuilder object
    283      */
    284     public void testCertPathBuilder10()
    285             throws NoSuchAlgorithmException, NoSuchProviderException  {
    286         if (!PKIXSupport) {
    287             fail(NotSupportMsg);
    288             return;
    289         }
    290         CertPathBuilder certPB;
    291         for (int i = 0; i < invalidValues.length; i++) {
    292             certPB = CertPathBuilder.getInstance(validValues[i], defaultProvider);
    293             assertEquals("Incorrect algorithm", certPB.getAlgorithm(), validValues[i]);
    294             assertEquals("Incorrect provider name", certPB.getProvider(), defaultProvider);
    295         }
    296     }
    297     /**
    298      * Test for <code>build(CertPathParameters params)</code> method
    299      * Assertion: throws InvalidAlgorithmParameterException params is null
    300      */
    301     public void testCertPathBuilder11()
    302             throws NoSuchAlgorithmException, NoSuchProviderException,
    303             CertPathBuilderException {
    304         if (!PKIXSupport) {
    305             fail(NotSupportMsg);
    306             return;
    307         }
    308         CertPathBuilder [] certPB = createCPBs();
    309         assertNotNull("CertPathBuilder objects were not created", certPB);
    310         for (int i = 0; i < certPB.length; i++ ){
    311             try {
    312                 certPB[i].build(null);
    313                 fail("InvalidAlgorithmParameterException must be thrown");
    314             } catch(InvalidAlgorithmParameterException e) {
    315             }
    316         }
    317     }
    318 
    319     // Test passed on RI
    320     @KnownFailure(value="expired certificate bug 2322662")
    321     public void testBuild() throws Exception {
    322         TestUtils.initCertPathSSCertChain();
    323         CertPathParameters params = TestUtils.getCertPathParameters();
    324         CertPathBuilder builder = TestUtils.getCertPathBuilder();
    325 
    326         try {
    327             CertPathBuilderResult result = builder.build(params);
    328             assertNotNull("builder result is null", result);
    329             CertPath certPath = result.getCertPath();
    330             assertNotNull("certpath of builder result is null", certPath);
    331         } catch (InvalidAlgorithmParameterException e) {
    332             fail("unexpected Exception: " + e);
    333         }
    334 
    335     }
    336     /**
    337      * Test for
    338      * <code>CertPathBuilder</code> constructor
    339      * Assertion: returns CertPathBuilder object
    340      */
    341     public void testCertPathBuilder12()
    342             throws CertificateException, NoSuchProviderException,
    343             NoSuchAlgorithmException, InvalidAlgorithmParameterException,
    344             CertPathBuilderException {
    345         if (!PKIXSupport) {
    346             fail(NotSupportMsg);
    347             return;
    348         }
    349         CertPathBuilderSpi spi = new MyCertPathBuilderSpi();
    350         CertPathBuilder certPB = new myCertPathBuilder(spi,
    351                     defaultProvider, defaultType);
    352         assertEquals("Incorrect algorithm", certPB.getAlgorithm(), defaultType);
    353         assertEquals("Incorrect provider", certPB.getProvider(), defaultProvider);
    354         try {
    355             certPB.build(null);
    356             fail("CertPathBuilderException must be thrown ");
    357         } catch (CertPathBuilderException e) {
    358         }
    359         certPB = new myCertPathBuilder(null, null, null);
    360         assertNull("Incorrect algorithm", certPB.getAlgorithm());
    361         assertNull("Incorrect provider", certPB.getProvider());
    362         try {
    363             certPB.build(null);
    364             fail("NullPointerException must be thrown ");
    365         } catch (NullPointerException e) {
    366         }
    367     }
    368 
    369     /**
    370      * Test for <code>getAlgorithm()</code> method Assertion: returns
    371      * CertPathBuilder object
    372      */
    373     public void testCertPathBuilder13() throws NoSuchAlgorithmException {
    374         if (!PKIXSupport) {
    375             fail(NotSupportMsg);
    376             return;
    377         }
    378 
    379         for (int i = 0; i < validValues.length; i++) {
    380             CertPathBuilder cpb = CertPathBuilder.getInstance(validValues[i]);
    381             assertEquals("Incorrect algorithm", cpb.getAlgorithm(),
    382                     validValues[i]);
    383             try {
    384                 cpb = CertPathBuilder.getInstance(validValues[i],
    385                         defaultProviderName);
    386                 assertEquals("Incorrect algorithm", cpb.getAlgorithm(),
    387                         validValues[i]);
    388             } catch (NoSuchProviderException e) {
    389                 fail("Unexpected NoSuchProviderException exeption "
    390                         + e.getMessage());
    391             }
    392 
    393             try {
    394                 cpb = CertPathBuilder.getInstance(validValues[i],
    395                         defaultProviderName);
    396                 assertEquals("Incorrect algorithm", cpb.getAlgorithm(),
    397                         validValues[i]);
    398             } catch (NoSuchProviderException e) {
    399                 fail("Unexpected NoSuchProviderException " + e.getMessage());
    400             }
    401         }
    402     }
    403 
    404     /**
    405      * Test for <code>getProvider()</code> method Assertion: returns
    406      * CertPathBuilder object
    407      */
    408     public void testCertPathBuilder14() throws NoSuchAlgorithmException {
    409         if (!PKIXSupport) {
    410             fail(NotSupportMsg);
    411             return;
    412         }
    413 
    414         for (int i = 0; i < validValues.length; i++) {
    415             CertPathBuilder cpb2 = CertPathBuilder.getInstance(validValues[i],
    416                     defaultProvider);
    417             assertEquals("Incorrect provider", cpb2.getProvider(),
    418                     defaultProvider);
    419 
    420             try {
    421                 CertPathBuilder cpb3 = CertPathBuilder.getInstance(
    422                         validValues[i], defaultProviderName);
    423                 assertEquals("Incorrect provider", cpb3.getProvider(),
    424                         defaultProvider);
    425             } catch (NoSuchProviderException e) {
    426                 fail("Unexpected NoSuchProviderException " + e.getMessage());
    427             }
    428         }
    429 
    430     }
    431 }
    432 /**
    433  * Additional class to verify CertPathBuilder constructor
    434  */
    435 class myCertPathBuilder extends CertPathBuilder {
    436 
    437     private static Provider provider;
    438 
    439     public myCertPathBuilder(CertPathBuilderSpi spi, Provider prov, String type) {
    440         super(spi, prov, type);
    441     }
    442 
    443     public static CertPathBuilder getInstance(String algorithm)
    444             throws NoSuchAlgorithmException {
    445         myCertPathBuilder mcpb = new myCertPathBuilder(null, null, null);
    446         provider = mcpb.new MyProvider();
    447         return CertPathBuilder.getInstance(algorithm);
    448     }
    449 
    450     public Provider getMyProvider() {
    451         return provider;
    452     }
    453 
    454     public class MyProvider extends Provider {
    455 
    456         private static final long serialVersionUID = -6537447905658191184L;
    457 
    458         MyProvider() {
    459             super("MyProvider", 1.0, "Provider for testing");
    460         }
    461 
    462         MyProvider(String name, double version, String info) {
    463             super(name, version, info);
    464         }
    465 
    466         public void putService(Provider.Service s) {
    467             super.putService(s);
    468         }
    469 
    470         public void removeService(Provider.Service s) {
    471             super.removeService(s);
    472         }
    473     }
    474 
    475 }
    476