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 import dalvik.annotation.TestLevel; 27 import dalvik.annotation.TestTargetClass; 28 import dalvik.annotation.TestTargetNew; 29 30 import org.apache.harmony.security.tests.support.SpiEngUtils; 31 import org.apache.harmony.security.tests.support.cert.MyCertPathBuilderSpi; 32 import org.apache.harmony.security.tests.support.cert.TestUtils; 33 34 import java.security.InvalidAlgorithmParameterException; 35 import java.security.NoSuchAlgorithmException; 36 import java.security.NoSuchProviderException; 37 import java.security.Provider; 38 import java.security.Security; 39 import java.security.cert.CertPath; 40 import java.security.cert.CertPathBuilder; 41 import java.security.cert.CertPathBuilderException; 42 import java.security.cert.CertPathBuilderResult; 43 import java.security.cert.CertPathBuilderSpi; 44 import java.security.cert.CertPathParameters; 45 import java.security.cert.CertificateException; 46 47 import junit.framework.TestCase; 48 49 /** 50 * Tests for <code>CertPathBuilder</code> class constructors and 51 * methods. 52 * 53 */ 54 @TestTargetClass(CertPathBuilder.class) 55 public class CertPathBuilder1Test extends TestCase { 56 57 public static final String srvCertPathBuilder = "CertPathBuilder"; 58 59 public static final String defaultType = "PKIX"; 60 public static final String [] validValues = { 61 "PKIX", "pkix", "PkiX", "pKiX" }; 62 63 private static String [] invalidValues = SpiEngUtils.invalidValues; 64 65 private static boolean PKIXSupport = false; 66 67 private static Provider defaultProvider; 68 private static String defaultProviderName; 69 70 private static String NotSupportMsg = ""; 71 72 public static final String DEFAULT_TYPE_PROPERTY = "certpathbuilder.type"; 73 74 static { 75 defaultProvider = SpiEngUtils.isSupport(defaultType, 76 srvCertPathBuilder); 77 PKIXSupport = (defaultProvider != null); 78 defaultProviderName = (PKIXSupport ? defaultProvider.getName() : null); 79 NotSupportMsg = defaultType.concat(" is not supported"); 80 } 81 private static CertPathBuilder[] createCPBs() { 82 if (!PKIXSupport) { 83 fail(NotSupportMsg); 84 return null; 85 } 86 try { 87 CertPathBuilder[] certPBs = new CertPathBuilder[3]; 88 certPBs[0] = CertPathBuilder.getInstance(defaultType); 89 certPBs[1] = CertPathBuilder.getInstance(defaultType, 90 defaultProviderName); 91 certPBs[2] = CertPathBuilder.getInstance(defaultType, 92 defaultProvider); 93 return certPBs; 94 } catch (Exception e) { 95 return null; 96 } 97 } 98 99 /** 100 * @tests java.security.cert.CertPathBuilder#getDefaultType() 101 */ 102 @TestTargetNew( 103 level = TestLevel.COMPLETE, 104 notes = "", 105 method = "getDefaultType", 106 args = {} 107 ) 108 public void test_getDefaultType() throws Exception { 109 110 // Regression for HARMONY-2785 111 112 // test: default value 113 assertNull(Security.getProperty(DEFAULT_TYPE_PROPERTY)); 114 assertEquals("PKIX", CertPathBuilder.getDefaultType()); 115 } 116 117 /** 118 * Test for <code>getInstance(String algorithm)</code> method 119 * Assertion: 120 * throws NullPointerException when algorithm is null 121 * throws NoSuchAlgorithmException when algorithm is not correct 122 * or it is not available 123 */ 124 @TestTargetNew( 125 level = TestLevel.PARTIAL, 126 notes = "Verifies NoSuchAlgorithmException.", 127 method = "getInstance", 128 args = {java.lang.String.class} 129 ) 130 public void testCertPathBuilder02() throws NoSuchAlgorithmException { 131 try { 132 CertPathBuilder.getInstance(null); 133 fail("No expected NullPointerException"); 134 } catch (NullPointerException e) { 135 } 136 for (int i = 0; i < invalidValues.length; i++) { 137 try { 138 CertPathBuilder.getInstance(invalidValues[i]); 139 fail("NoSuchAlgorithmException must be thrown"); 140 } catch (NoSuchAlgorithmException e) { 141 } 142 } 143 } 144 145 /** 146 * Test for <code>getInstance(String algorithm)</code> method 147 * Assertion: returns CertPathBuilder object 148 */ 149 @TestTargetNew( 150 level = TestLevel.PARTIAL, 151 notes = "Verifies positive functionality.", 152 method = "getInstance", 153 args = {java.lang.String.class} 154 ) 155 public void testCertPathBuilder03() throws NoSuchAlgorithmException { 156 if (!PKIXSupport) { 157 fail(NotSupportMsg); 158 return; 159 } 160 for (int i = 0; i < validValues.length; i++) { 161 CertPathBuilder cpb = CertPathBuilder.getInstance(validValues[i]); 162 assertEquals("Incorrect algorithm", cpb.getAlgorithm(), validValues[i]); 163 } 164 } 165 /** 166 * Test for <code>getInstance(String algorithm, String provider)</code> method 167 * Assertion: throws IllegalArgumentException when provider is null or empty 168 * 169 * FIXME: verify what exception will be thrown if provider is empty 170 */ 171 @TestTargetNew( 172 level = TestLevel.PARTIAL_COMPLETE, 173 notes = "Verifies IllegalArgumentException.", 174 method = "getInstance", 175 args = {java.lang.String.class, java.lang.String.class} 176 ) 177 public void testCertPathBuilder04() 178 throws NoSuchAlgorithmException, NoSuchProviderException { 179 if (!PKIXSupport) { 180 fail(NotSupportMsg); 181 return; 182 } 183 String provider = null; 184 for (int i = 0; i < validValues.length; i++) { 185 try { 186 CertPathBuilder.getInstance(validValues[i], provider); 187 fail("IllegalArgumentException must be thrown thrown"); 188 } catch (IllegalArgumentException e) { 189 } 190 try { 191 CertPathBuilder.getInstance(validValues[i], ""); 192 fail("IllegalArgumentException must be thrown thrown"); 193 } catch (IllegalArgumentException e) { 194 } 195 } 196 } 197 198 /** 199 * Test for <code>getInstance(String algorithm, String provider)</code> method 200 * Assertion: 201 * throws NoSuchProviderException when provider has invalid value 202 */ 203 @TestTargetNew( 204 level = TestLevel.PARTIAL_COMPLETE, 205 notes = "Verifies that getInstance throws NoSuchProviderException when provider has invalid value.", 206 method = "getInstance", 207 args = {java.lang.String.class, java.lang.String.class} 208 ) 209 public void testCertPathBuilder05() 210 throws NoSuchAlgorithmException { 211 if (!PKIXSupport) { 212 fail(NotSupportMsg); 213 return; 214 } 215 for (int i = 0; i < validValues.length; i++ ) { 216 for (int j = 1; j < invalidValues.length; j++) { 217 try { 218 CertPathBuilder.getInstance(validValues[i], invalidValues[j]); 219 fail("NoSuchProviderException must be hrown"); 220 } catch (NoSuchProviderException e1) { 221 } 222 } 223 } 224 } 225 /** 226 * Test for <code>getInstance(String algorithm, String provider)</code> method 227 * Assertion: 228 * throws NullPointerException when algorithm is null 229 * throws NoSuchAlgorithmException when algorithm is not correct 230 */ 231 @TestTargetNew( 232 level = TestLevel.PARTIAL_COMPLETE, 233 notes = "Verifies NullPointerException when algorithm is null; verifies NoSuchAlgorithmException when algorithm is not correct.", 234 method = "getInstance", 235 args = {java.lang.String.class, java.lang.String.class} 236 ) 237 public void testCertPathBuilder06() 238 throws NoSuchAlgorithmException, NoSuchProviderException { 239 if (!PKIXSupport) { 240 fail(NotSupportMsg); 241 return; 242 } 243 try { 244 CertPathBuilder.getInstance(null, defaultProviderName); 245 fail("No expected NullPointerException"); 246 } catch (NullPointerException e) { 247 } 248 for (int i = 0; i < invalidValues.length; i++) { 249 try { 250 CertPathBuilder.getInstance(invalidValues[i], defaultProviderName); 251 fail("NoSuchAlgorithmException must be thrown"); 252 } catch (NoSuchAlgorithmException e1) { 253 } 254 } 255 } 256 257 /** 258 * Test for <code>getInstance(String algorithm, String provider)</code> method 259 * Assertion: returns CertPathBuilder object 260 */ 261 @TestTargetNew( 262 level = TestLevel.PARTIAL_COMPLETE, 263 notes = "Verifies positive case.", 264 method = "getInstance", 265 args = {java.lang.String.class, java.lang.String.class} 266 ) 267 public void testCertPathBuilder07() 268 throws NoSuchAlgorithmException, NoSuchProviderException { 269 if (!PKIXSupport) { 270 fail(NotSupportMsg); 271 return; 272 } 273 CertPathBuilder certPB; 274 for (int i = 0; i < validValues.length; i++) { 275 certPB = CertPathBuilder.getInstance(validValues[i], defaultProviderName); 276 assertEquals("Incorrect algorithm", certPB.getAlgorithm(), validValues[i]); 277 assertEquals("Incorrect provider name", certPB.getProvider().getName(), defaultProviderName); 278 } 279 } 280 281 /** 282 * Test for <code>getInstance(String algorithm, Provider provider)</code> method 283 * Assertion: throws IllegalArgumentException when provider is null 284 */ 285 @TestTargetNew( 286 level = TestLevel.PARTIAL, 287 notes = "Verifies that getInstance method throws IllegalArgumentException when provider is null method.", 288 method = "getInstance", 289 args = {java.lang.String.class, java.security.Provider.class} 290 ) 291 public void testCertPathBuilder08() 292 throws NoSuchAlgorithmException { 293 if (!PKIXSupport) { 294 fail(NotSupportMsg); 295 return; 296 } 297 Provider prov = null; 298 for (int t = 0; t < validValues.length; t++ ) { 299 try { 300 CertPathBuilder.getInstance(validValues[t], prov); 301 fail("IllegalArgumentException must be thrown"); 302 } catch (IllegalArgumentException e1) { 303 } 304 } 305 } 306 307 /** 308 * Test for <code>getInstance(String algorithm, String provider)</code> method 309 * Assertion: 310 * throws NullPointerException when algorithm is null 311 * throws NoSuchAlgorithmException when algorithm is not correct 312 */ 313 @TestTargetNew( 314 level = TestLevel.PARTIAL, 315 notes = "Verifies that getInstance method throws NullPointerException when algorithm is null, throws NoSuchAlgorithmException when algorithm is not correct.", 316 method = "getInstance", 317 args = {java.lang.String.class, java.security.Provider.class} 318 ) 319 public void testCertPathBuilder09() 320 throws NoSuchAlgorithmException, NoSuchProviderException { 321 if (!PKIXSupport) { 322 fail(NotSupportMsg); 323 return; 324 } 325 try { 326 CertPathBuilder.getInstance(null, defaultProvider); 327 fail("No expected NullPointerException"); 328 } catch (NullPointerException e) { 329 } 330 for (int i = 0; i < invalidValues.length; i++) { 331 try { 332 CertPathBuilder.getInstance(invalidValues[i], defaultProvider); 333 fail("NoSuchAlgorithm must be thrown"); 334 } catch (NoSuchAlgorithmException e1) { 335 } 336 } 337 } 338 /** 339 * Test for <code>getInstance(String algorithm, String provider)</code> method 340 * Assertion: returns CertPathBuilder object 341 */ 342 @TestTargetNew( 343 level = TestLevel.PARTIAL_COMPLETE, 344 notes = "Verifies that getInstance returns CertPathBuilder object.", 345 method = "getInstance", 346 args = {java.lang.String.class, java.lang.String.class} 347 ) 348 public void testCertPathBuilder10() 349 throws NoSuchAlgorithmException, NoSuchProviderException { 350 if (!PKIXSupport) { 351 fail(NotSupportMsg); 352 return; 353 } 354 CertPathBuilder certPB; 355 for (int i = 0; i < invalidValues.length; i++) { 356 certPB = CertPathBuilder.getInstance(validValues[i], defaultProvider); 357 assertEquals("Incorrect algorithm", certPB.getAlgorithm(), validValues[i]); 358 assertEquals("Incorrect provider name", certPB.getProvider(), defaultProvider); 359 } 360 } 361 /** 362 * Test for <code>build(CertPathParameters params)</code> method 363 * Assertion: throws InvalidAlgorithmParameterException params is null 364 */ 365 @TestTargetNew( 366 level = TestLevel.PARTIAL_COMPLETE, 367 notes = "Verifies that build method throws InvalidAlgorithmParameterException if a parameter is null.", 368 method = "build", 369 args = {java.security.cert.CertPathParameters.class} 370 ) 371 public void testCertPathBuilder11() 372 throws NoSuchAlgorithmException, NoSuchProviderException, 373 CertPathBuilderException { 374 if (!PKIXSupport) { 375 fail(NotSupportMsg); 376 return; 377 } 378 CertPathBuilder [] certPB = createCPBs(); 379 assertNotNull("CertPathBuilder objects were not created", certPB); 380 for (int i = 0; i < certPB.length; i++ ){ 381 try { 382 certPB[i].build(null); 383 fail("InvalidAlgorithmParameterException must be thrown"); 384 } catch(InvalidAlgorithmParameterException e) { 385 } 386 } 387 } 388 389 @TestTargetNew( 390 level=TestLevel.PARTIAL_COMPLETE, 391 notes = "Verifies normal case", 392 method="build", 393 args={CertPathParameters.class} 394 ) 395 // Test passed on RI 396 @KnownFailure(value="expired certificate bug 2322662") 397 public void testBuild() throws Exception { 398 TestUtils.initCertPathSSCertChain(); 399 CertPathParameters params = TestUtils.getCertPathParameters(); 400 CertPathBuilder builder = TestUtils.getCertPathBuilder(); 401 402 try { 403 CertPathBuilderResult result = builder.build(params); 404 assertNotNull("builder result is null", result); 405 CertPath certPath = result.getCertPath(); 406 assertNotNull("certpath of builder result is null", certPath); 407 } catch (InvalidAlgorithmParameterException e) { 408 fail("unexpected Exception: " + e); 409 } 410 411 } 412 /** 413 * Test for 414 * <code>CertPathBuilder</code> constructor 415 * Assertion: returns CertPathBuilder object 416 */ 417 @TestTargetNew( 418 level = TestLevel.COMPLETE, 419 notes = "", 420 method = "CertPathBuilder", 421 args = {java.security.cert.CertPathBuilderSpi.class, java.security.Provider.class, java.lang.String.class} 422 ) 423 public void testCertPathBuilder12() 424 throws CertificateException, NoSuchProviderException, 425 NoSuchAlgorithmException, InvalidAlgorithmParameterException, 426 CertPathBuilderException { 427 if (!PKIXSupport) { 428 fail(NotSupportMsg); 429 return; 430 } 431 CertPathBuilderSpi spi = new MyCertPathBuilderSpi(); 432 CertPathBuilder certPB = new myCertPathBuilder(spi, 433 defaultProvider, defaultType); 434 assertEquals("Incorrect algorithm", certPB.getAlgorithm(), defaultType); 435 assertEquals("Incorrect provider", certPB.getProvider(), defaultProvider); 436 try { 437 certPB.build(null); 438 fail("CertPathBuilderException must be thrown "); 439 } catch (CertPathBuilderException e) { 440 } 441 certPB = new myCertPathBuilder(null, null, null); 442 assertNull("Incorrect algorithm", certPB.getAlgorithm()); 443 assertNull("Incorrect provider", certPB.getProvider()); 444 try { 445 certPB.build(null); 446 fail("NullPointerException must be thrown "); 447 } catch (NullPointerException e) { 448 } 449 } 450 451 /** 452 * Test for <code>getAlgorithm()</code> method Assertion: returns 453 * CertPathBuilder object 454 */ 455 @TestTargetNew( 456 level = TestLevel.COMPLETE, 457 notes = "", 458 method = "getAlgorithm", 459 args = {} 460 ) 461 public void testCertPathBuilder13() throws NoSuchAlgorithmException { 462 if (!PKIXSupport) { 463 fail(NotSupportMsg); 464 return; 465 } 466 467 for (int i = 0; i < validValues.length; i++) { 468 CertPathBuilder cpb = CertPathBuilder.getInstance(validValues[i]); 469 assertEquals("Incorrect algorithm", cpb.getAlgorithm(), 470 validValues[i]); 471 try { 472 cpb = CertPathBuilder.getInstance(validValues[i], 473 defaultProviderName); 474 assertEquals("Incorrect algorithm", cpb.getAlgorithm(), 475 validValues[i]); 476 } catch (NoSuchProviderException e) { 477 fail("Unexpected NoSuchProviderException exeption " 478 + e.getMessage()); 479 } 480 481 try { 482 cpb = CertPathBuilder.getInstance(validValues[i], 483 defaultProviderName); 484 assertEquals("Incorrect algorithm", cpb.getAlgorithm(), 485 validValues[i]); 486 } catch (NoSuchProviderException e) { 487 fail("Unexpected NoSuchProviderException " + e.getMessage()); 488 } 489 } 490 } 491 492 /** 493 * Test for <code>getProvider()</code> method Assertion: returns 494 * CertPathBuilder object 495 */ 496 @TestTargetNew( 497 level = TestLevel.COMPLETE, 498 notes = "", 499 method = "getProvider", 500 args = {} 501 ) 502 public void testCertPathBuilder14() throws NoSuchAlgorithmException { 503 if (!PKIXSupport) { 504 fail(NotSupportMsg); 505 return; 506 } 507 508 for (int i = 0; i < validValues.length; i++) { 509 CertPathBuilder cpb2 = CertPathBuilder.getInstance(validValues[i], 510 defaultProvider); 511 assertEquals("Incorrect provider", cpb2.getProvider(), 512 defaultProvider); 513 514 try { 515 CertPathBuilder cpb3 = CertPathBuilder.getInstance( 516 validValues[i], defaultProviderName); 517 assertEquals("Incorrect provider", cpb3.getProvider(), 518 defaultProvider); 519 } catch (NoSuchProviderException e) { 520 fail("Unexpected NoSuchProviderException " + e.getMessage()); 521 } 522 } 523 524 } 525 } 526 /** 527 * Additional class to verify CertPathBuilder constructor 528 */ 529 class myCertPathBuilder extends CertPathBuilder { 530 531 private static Provider provider; 532 533 public myCertPathBuilder(CertPathBuilderSpi spi, Provider prov, String type) { 534 super(spi, prov, type); 535 } 536 537 public static CertPathBuilder getInstance(String algorithm) 538 throws NoSuchAlgorithmException { 539 myCertPathBuilder mcpb = new myCertPathBuilder(null, null, null); 540 provider = mcpb.new MyProvider(); 541 return CertPathBuilder.getInstance(algorithm); 542 } 543 544 public Provider getMyProvider() { 545 return provider; 546 } 547 548 public class MyProvider extends Provider { 549 550 private static final long serialVersionUID = -6537447905658191184L; 551 552 MyProvider() { 553 super("MyProvider", 1.0, "Provider for testing"); 554 } 555 556 MyProvider(String name, double version, String info) { 557 super(name, version, info); 558 } 559 560 public void putService(Provider.Service s) { 561 super.putService(s); 562 } 563 564 public void removeService(Provider.Service s) { 565 super.removeService(s); 566 } 567 } 568 569 } 570