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 Boris V. Kuznetsov 20 * @version $Revision$ 21 */ 22 23 package org.apache.harmony.security.tests.java.security; 24 25 import java.io.IOException; 26 import java.math.BigInteger; 27 import java.security.AlgorithmParameters; 28 import java.security.AlgorithmParametersSpi; 29 import java.security.Provider; 30 import java.security.Security; 31 import java.security.spec.AlgorithmParameterSpec; 32 import java.security.spec.DSAParameterSpec; 33 import java.security.spec.InvalidParameterSpecException; 34 import java.util.Arrays; 35 import java.security.NoSuchAlgorithmException; 36 import java.security.NoSuchProviderException; 37 38 import junit.framework.TestCase; 39 40 import org.apache.harmony.security.tests.support.MyAlgorithmParameterGeneratorSpi; 41 42 /** 43 * Tests for <code>AlgorithmParameters</code> class constructors and 44 * methods. 45 * 46 */ 47 public class AlgorithmParametersTest extends TestCase { 48 49 /** 50 * Provider 51 */ 52 Provider p; 53 54 /* 55 * @see TestCase#setUp() 56 */ setUp()57 protected void setUp() throws Exception { 58 super.setUp(); 59 p = new MyProvider(); 60 Security.insertProviderAt(p, 1); 61 } 62 63 /* 64 * @see TestCase#tearDown() 65 */ tearDown()66 protected void tearDown() throws Exception { 67 super.tearDown(); 68 Security.removeProvider(p.getName()); 69 } 70 71 /** 72 * java.security.AlgorithmParameters#getAlgorithm() 73 */ test_getAlgorithm()74 public void test_getAlgorithm() throws Exception { 75 76 // test: null value 77 AlgorithmParameters ap = new FakeAlgorithmParameters(null, p, null); 78 assertNull(ap.getAlgorithm()); 79 80 // test: not null value 81 ap = new FakeAlgorithmParameters(null, p, "AAA"); 82 assertEquals("AAA", ap.getAlgorithm()); 83 } 84 85 /** 86 * java.security.AlgorithmParameters#getEncoded() 87 */ test_getEncoded()88 public void test_getEncoded() throws Exception { 89 90 final byte[] enc = new byte[] { 0x02, 0x01, 0x03 }; 91 92 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 93 protected byte[] engineGetEncoded() throws IOException { 94 return enc; 95 } 96 }; 97 98 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 99 "algorithm"); 100 101 // 102 // test: IOException if not initialized 103 // 104 try { 105 params.getEncoded(); 106 fail("should not get encoded from un-initialized instance"); 107 } catch (IOException e) { 108 // expected 109 } 110 111 // 112 // test: corresponding spi method is invoked 113 // 114 params.init(new MyAlgorithmParameterSpec()); 115 assertSame(enc, params.getEncoded()); 116 } 117 118 /** 119 * java.security.AlgorithmParameters#getEncoded(String) 120 */ test_getEncodedLjava_lang_String()121 public void test_getEncodedLjava_lang_String() throws Exception { 122 123 final byte[] enc = new byte[] { 0x02, 0x01, 0x03 }; 124 125 final String strFormatParam = "format"; 126 127 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 128 protected byte[] engineGetEncoded(String format) throws IOException { 129 assertEquals(strFormatParam, format); 130 return enc; 131 } 132 }; 133 134 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 135 "algorithm"); 136 137 // 138 // test: IOException if not initialized 139 // 140 try { 141 params.getEncoded(strFormatParam); 142 fail("should not get encoded from un-initialized instance"); 143 } catch (IOException e) { 144 // expected 145 } 146 147 // 148 // test: corresponding spi method is invoked 149 // 150 params.init(new MyAlgorithmParameterSpec()); 151 assertSame(enc, params.getEncoded(strFormatParam)); 152 153 // 154 // test: if format param is null 155 // Regression test for HARMONY-2680 156 // 157 paramSpi = new MyAlgorithmParameters() { 158 protected byte[] engineGetEncoded(String format) throws IOException { 159 assertNull(format); // null is passed to spi-provider 160 return enc; 161 } 162 }; 163 164 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 165 params.init(new MyAlgorithmParameterSpec()); 166 assertSame(enc, params.getEncoded(null)); 167 } 168 169 /** 170 * java.security.AlgorithmParameters#getInstance(String) 171 */ test_getInstanceLjava_lang_String()172 public void test_getInstanceLjava_lang_String() { 173 String[] str = {"", "qwertyu", "!@#$%^&*()"}; 174 try { 175 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC"); 176 checkUnititialized(ap); 177 ap.init(new MyAlgorithmParameterSpec()); 178 checkAP(ap, p); 179 } catch (Exception e) { 180 fail("Unexpected exception"); 181 } 182 183 for(int i = 0; i < str.length; i++) { 184 try { 185 AlgorithmParameters ap = AlgorithmParameters.getInstance(str[i]); 186 fail("NoSuchAlgorithmException was not thrown for parameter " + str[i]); 187 } catch (NoSuchAlgorithmException nsae) { 188 //expected 189 } 190 } 191 } 192 193 /** 194 * java.security.AlgorithmParameters#getInstance(String, String) 195 */ test_getInstanceLjava_lang_StringLjava_lang_String()196 public void test_getInstanceLjava_lang_StringLjava_lang_String() { 197 String[] alg = {"", "qwertyu", "!@#$%^&*()"}; 198 String[] prv = {"", null}; 199 String[] prv1 = {"1234567890", "qwertyu", "!@#$%^&*()"}; 200 try { 201 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC", "MyProvider"); 202 checkUnititialized(ap); 203 ap.init(new byte[6]); 204 checkAP(ap, p); 205 } catch (Exception e) { 206 fail("Unexpected exception"); 207 } 208 209 for (int i = 0; i < alg.length; i++) { 210 try { 211 AlgorithmParameters ap = AlgorithmParameters.getInstance(alg[i], "MyProvider"); 212 fail("NoSuchAlgorithmException was not thrown for parameter " + alg[i]); 213 } catch (NoSuchAlgorithmException nsae) { 214 //expected 215 } catch (Exception e) { 216 fail("Incorrect exception " + e + " was thrown for " + alg[i]); 217 } 218 } 219 220 for (int i = 0; i < prv.length; i++) { 221 try { 222 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC", prv[i]); 223 fail("IllegalArgumentException was not thrown for parameter " + prv[i]); 224 } catch (IllegalArgumentException iae) { 225 //expected 226 } catch (Exception e) { 227 fail("Incorrect exception " + e + " was thrown for " + prv[i]); 228 } 229 } 230 231 for (int i = 0; i < prv1.length; i++) { 232 try { 233 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC", prv1[i]); 234 fail("NoSuchProviderException was not thrown for parameter " + prv1[i]); 235 } catch (NoSuchProviderException nspe) { 236 //expected 237 } catch (Exception e) { 238 fail("Incorrect exception " + e + " was thrown for " + prv1[i]); 239 } 240 } 241 } 242 243 /** 244 * java.security.AlgorithmParameters#getParameterSpec(Class) 245 */ test_getParameterSpecLjava_lang_Class()246 public void test_getParameterSpecLjava_lang_Class() throws Exception { 247 248 final MyAlgorithmParameterSpec myParamSpec = new MyAlgorithmParameterSpec(); 249 250 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 251 protected AlgorithmParameterSpec engineGetParameterSpec( 252 Class paramSpec) { 253 return myParamSpec; 254 } 255 }; 256 257 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 258 "algorithm"); 259 260 // 261 // test: InvalidParameterSpecException if not initialized 262 // 263 try { 264 params.getParameterSpec(null); 265 fail("No expected InvalidParameterSpecException"); 266 } catch (InvalidParameterSpecException e) { 267 // expected 268 } 269 try { 270 params.getParameterSpec(MyAlgorithmParameterSpec.class); 271 fail("No expected InvalidParameterSpecException"); 272 } catch (InvalidParameterSpecException e) { 273 // expected 274 } 275 276 // 277 // test: corresponding spi method is invoked 278 // 279 params.init(new MyAlgorithmParameterSpec()); 280 assertSame(myParamSpec, params 281 .getParameterSpec(MyAlgorithmParameterSpec.class)); 282 283 // 284 // test: if paramSpec is null 285 // Regression test for HARMONY-2733 286 // 287 paramSpi = new MyAlgorithmParameters() { 288 289 protected AlgorithmParameterSpec engineGetParameterSpec( 290 Class paramSpec) { 291 assertNull(paramSpec); // null is passed to spi-provider 292 return null; 293 } 294 }; 295 296 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 297 params.init(new MyAlgorithmParameterSpec()); 298 assertNull(params.getParameterSpec(null)); 299 } 300 301 /** 302 * java.security.AlgorithmParameters#getInstance(String, Provider) 303 */ test_getInstanceLjava_lang_StringLjava_security_Provider()304 public void test_getInstanceLjava_lang_StringLjava_security_Provider() { 305 String[] alg = {"", "qwertyu", "!@#$%^&*()"}; 306 Provider pp = null; 307 308 try { 309 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC", p); 310 checkUnititialized(ap); 311 ap.init(new byte[6], "aaa"); 312 checkAP(ap, p); 313 } catch (Exception e){ 314 fail("Unexpected exception"); 315 } 316 317 for (int i = 0; i < alg.length; i++) { 318 try { 319 AlgorithmParameters ap = AlgorithmParameters.getInstance(alg[i], p); 320 fail("NoSuchAlgorithmException was not thrown for parameter " + alg[i]); 321 } catch (NoSuchAlgorithmException nsae) { 322 //expected 323 } catch (Exception e) { 324 fail("Incorrect exception " + e + " was thrown for " + alg[i]); 325 } 326 } 327 328 try { 329 AlgorithmParameters ap = AlgorithmParameters.getInstance("ABC", pp); 330 fail("IllegalArgumentException was not thrown for NULL provider"); 331 } catch (IllegalArgumentException iae) { 332 //expected 333 } catch (Exception e){ 334 fail("Incorrect exception " + e + " was thrown"); 335 } 336 } 337 338 /** 339 * java.security.AlgorithmParameters#getProvider() 340 */ test_getProvider()341 public void test_getProvider() throws Exception { 342 // test: null value 343 AlgorithmParameters ap = new FakeAlgorithmParameters(null, null, "AAA"); 344 assertNull(ap.getProvider()); 345 346 // test: not null value 347 ap = new FakeAlgorithmParameters(null, p, "AAA"); 348 assertSame(p, ap.getProvider()); 349 } 350 351 /** 352 * java.security.AlgorithmParameters#init(java.security.spec.AlgorithmParameterSpec) 353 */ test_initLjava_security_spec_AlgorithmParameterSpec()354 public void test_initLjava_security_spec_AlgorithmParameterSpec() 355 throws Exception { 356 357 // 358 // test: corresponding spi method is invoked 359 // 360 final MyAlgorithmParameterSpec spec = new MyAlgorithmParameterSpec(); 361 362 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 363 protected void engineInit(AlgorithmParameterSpec paramSpec) 364 throws InvalidParameterSpecException { 365 assertSame(spec, paramSpec); 366 runEngineInit_AlgParamSpec = true; 367 } 368 }; 369 370 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 371 "algorithm"); 372 373 params.init(spec); 374 assertTrue(paramSpi.runEngineInit_AlgParamSpec); 375 376 // 377 // test: InvalidParameterSpecException if already initialized 378 // 379 try { 380 params.init(spec); 381 fail("No expected InvalidParameterSpecException"); 382 } catch (InvalidParameterSpecException e) { 383 // expected 384 } 385 386 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 387 params.init(new byte[0]); 388 try { 389 params.init(spec); 390 fail("No expected InvalidParameterSpecException"); 391 } catch (InvalidParameterSpecException e) { 392 // expected 393 } 394 395 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 396 params.init(new byte[0], "format"); 397 try { 398 params.init(spec); 399 fail("No expected InvalidParameterSpecException"); 400 } catch (InvalidParameterSpecException e) { 401 // expected 402 } 403 404 // 405 // test: if paramSpec is null 406 // 407 paramSpi = new MyAlgorithmParameters() { 408 409 protected void engineInit(AlgorithmParameterSpec paramSpec) 410 throws InvalidParameterSpecException { 411 assertNull(paramSpec);// null is passed to spi-provider 412 runEngineInit_AlgParamSpec = true; 413 } 414 }; 415 416 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 417 params.init((AlgorithmParameterSpec) null); 418 assertTrue(paramSpi.runEngineInit_AlgParamSpec); 419 } 420 421 /** 422 * java.security.AlgorithmParameters#init(byte[]) 423 */ test_init$B()424 public void test_init$B() throws Exception { 425 426 // 427 // test: corresponding spi method is invoked 428 // 429 final byte[] enc = new byte[] { 0x02, 0x01, 0x03 }; 430 431 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 432 protected void engineInit(byte[] params) throws IOException { 433 runEngineInitB$ = true; 434 assertSame(enc, params); 435 } 436 }; 437 438 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 439 "algorithm"); 440 441 params.init(enc); 442 assertTrue(paramSpi.runEngineInitB$); 443 444 // 445 // test: IOException if already initialized 446 // 447 try { 448 params.init(enc); 449 fail("No expected IOException"); 450 } catch (IOException e) { 451 // expected 452 } 453 454 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 455 params.init(new MyAlgorithmParameterSpec()); 456 try { 457 params.init(enc); 458 fail("No expected IOException"); 459 } catch (IOException e) { 460 // expected 461 } 462 463 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 464 params.init(enc, "format"); 465 try { 466 params.init(enc); 467 fail("No expected IOException"); 468 } catch (IOException e) { 469 // expected 470 } 471 472 // 473 // test: if params is null 474 // 475 paramSpi = new MyAlgorithmParameters() { 476 477 protected void engineInit(byte[] params) throws IOException { 478 runEngineInitB$ = true; 479 assertNull(params); // null is passed to spi-provider 480 } 481 }; 482 483 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 484 params.init((byte[]) null); 485 assertTrue(paramSpi.runEngineInitB$); 486 } 487 488 /** 489 * java.security.AlgorithmParameters#init(byte[],String) 490 */ test_init$BLjava_lang_String()491 public void test_init$BLjava_lang_String() throws Exception { 492 493 // 494 // test: corresponding spi method is invoked 495 // 496 final byte[] enc = new byte[] { 0x02, 0x01, 0x03 }; 497 final String strFormatParam = "format"; 498 499 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 500 protected void engineInit(byte[] params, String format) 501 throws IOException { 502 503 runEngineInitB$String = true; 504 assertSame(enc, params); 505 assertSame(strFormatParam, format); 506 } 507 }; 508 509 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 510 "algorithm"); 511 512 params.init(enc, strFormatParam); 513 assertTrue(paramSpi.runEngineInitB$String); 514 515 // 516 // test: IOException if already initialized 517 // 518 try { 519 params.init(enc, strFormatParam); 520 fail("No expected IOException"); 521 } catch (IOException e) { 522 // expected 523 } 524 525 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 526 params.init(new MyAlgorithmParameterSpec()); 527 try { 528 params.init(enc, strFormatParam); 529 fail("No expected IOException"); 530 } catch (IOException e) { 531 // expected 532 } 533 534 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 535 params.init(enc); 536 try { 537 params.init(enc, strFormatParam); 538 fail("No expected IOException"); 539 } catch (IOException e) { 540 // expected 541 } 542 543 // 544 // test: if params and format are null 545 // Regression test for HARMONY-2724 546 // 547 paramSpi = new MyAlgorithmParameters() { 548 549 protected void engineInit(byte[] params, String format) 550 throws IOException { 551 552 runEngineInitB$String = true; 553 554 // null is passed to spi-provider 555 assertNull(params); 556 assertNull(format); 557 } 558 }; 559 560 params = new FakeAlgorithmParameters(paramSpi, p, "algorithm"); 561 params.init(null, null); 562 assertTrue(paramSpi.runEngineInitB$String); 563 } 564 565 /** 566 * java.security.AlgorithmParameters#toString() 567 */ test_toString()568 public void test_toString() throws Exception { 569 570 final String str = "AlgorithmParameters"; 571 572 MyAlgorithmParameters paramSpi = new MyAlgorithmParameters() { 573 protected String engineToString() { 574 return str; 575 } 576 }; 577 578 AlgorithmParameters params = new FakeAlgorithmParameters(paramSpi, p, 579 "algorithm"); 580 581 assertNull("unititialized", params.toString()); 582 583 params.init(new byte[0]); 584 585 assertSame(str, params.toString()); 586 } 587 588 /** 589 * Tests DSA AlgorithmParameters provider 590 */ testDSAProvider()591 public void testDSAProvider() throws Exception { 592 AlgorithmParameters params = AlgorithmParameters.getInstance("DSA"); 593 594 assertEquals("Algorithm", "DSA", params.getAlgorithm()); 595 596 // init(AlgorithmParameterSpec) 597 BigInteger p = BigInteger.ONE; 598 BigInteger q = BigInteger.TEN; 599 BigInteger g = BigInteger.ZERO; 600 params.init(new DSAParameterSpec(p, q, g)); 601 602 // getEncoded() and getEncoded(String) (TODO verify returned encoding) 603 byte[] enc = params.getEncoded(); 604 assertNotNull(enc); 605 assertNotNull(params.getEncoded("ASN.1")); 606 // TODO assertNotNull(params.getEncoded(null)); // HARMONY-2680 607 608 // getParameterSpec(Class) 609 DSAParameterSpec spec = params.getParameterSpec(DSAParameterSpec.class); 610 assertEquals("p is wrong ", p, spec.getP()); 611 assertEquals("q is wrong ", q, spec.getQ()); 612 assertEquals("g is wrong ", g, spec.getG()); 613 614 // init(byte[]) 615 params = AlgorithmParameters.getInstance("DSA"); 616 params.init(enc); 617 assertTrue("param encoded is different", Arrays.equals(enc, params 618 .getEncoded())); 619 620 // init(byte[], String) 621 params = AlgorithmParameters.getInstance("DSA"); 622 params.init(enc, "ASN.1"); 623 assertTrue("param encoded is different", Arrays.equals(enc, params 624 .getEncoded())); 625 626 params = AlgorithmParameters.getInstance("DSA"); 627 try { 628 params.init(enc, "DOUGLASMAWSON"); 629 fail("unsupported format should have raised IOException"); 630 } catch (IOException e) { 631 // expected 632 } 633 } 634 635 /** 636 * Tests OAEP AlgorithmParameters provider 637 */ testOAEPProvider()638 public void testOAEPProvider() throws Exception { 639 AlgorithmParameters params = AlgorithmParameters.getInstance("OAEP"); 640 641 assertEquals("Algorithm", "OAEP", params.getAlgorithm()); 642 } 643 644 /** 645 * Test for <code>AlgorithmParameters</code> constructor 646 * Assertion: returns AlgorithmParameters object 647 */ testAlgorithmParametersConst()648 public void testAlgorithmParametersConst() throws Exception { 649 AlgorithmParametersSpi spi = new MyAlgorithmParameters(); 650 AlgorithmParameters ap = new myAlgP(spi, p, "ABC"); 651 652 checkUnititialized(ap); 653 ap.init(new byte[6], "aaa"); 654 checkAP(ap, p); 655 656 //NULL parameters 657 try { 658 ap = new myAlgP(null, null, null); 659 } catch (Exception e){ 660 fail("Exception should be not thrown"); 661 } 662 } 663 checkUnititialized(AlgorithmParameters ap)664 private void checkUnititialized(AlgorithmParameters ap) { 665 assertNull("Uninitialized: toString() failed", ap.toString()); 666 } 667 checkAP(AlgorithmParameters ap, Provider p)668 private void checkAP(AlgorithmParameters ap, Provider p) throws Exception { 669 670 assertSame("getProvider() failed", p, ap.getProvider()); 671 assertEquals("getAlgorithm() failed", "ABC", ap.getAlgorithm()); 672 673 assertEquals("AlgorithmParameters", ap.toString()); 674 assertTrue("toString() failed", MyAlgorithmParameters.runEngineToString); 675 } 676 677 @SuppressWarnings("serial") 678 private class MyProvider extends Provider { MyProvider()679 MyProvider() { 680 super("MyProvider", 1.0, "Provider for testing"); 681 put("AlgorithmParameters.ABC", MyAlgorithmParameters.class 682 .getName()); 683 } 684 MyProvider(String name, double version, String info)685 MyProvider(String name, double version, String info) { 686 super(name, version, info); 687 } 688 } 689 690 private class MyAlgorithmParameterSpec implements java.security.spec.AlgorithmParameterSpec{ 691 } 692 693 private class FakeAlgorithmParameters extends AlgorithmParameters { FakeAlgorithmParameters(AlgorithmParametersSpi paramSpi, Provider provider, String algorithm)694 public FakeAlgorithmParameters(AlgorithmParametersSpi paramSpi, 695 Provider provider, String algorithm) { 696 super(paramSpi, provider, algorithm); 697 } 698 } 699 700 public static class MyAlgorithmParameters extends AlgorithmParametersSpi { 701 702 public boolean runEngineInit_AlgParamSpec = false; 703 704 public boolean runEngineInitB$ = false; 705 706 public boolean runEngineInitB$String = false; 707 708 public static boolean runEngineToString = false; 709 engineInit(AlgorithmParameterSpec paramSpec)710 protected void engineInit(AlgorithmParameterSpec paramSpec) 711 throws InvalidParameterSpecException { 712 } 713 engineInit(byte[] params)714 protected void engineInit(byte[] params) throws IOException { 715 } 716 engineInit(byte[] params, String format)717 protected void engineInit(byte[] params, String format) 718 throws IOException { 719 } 720 engineGetParameterSpec(Class paramSpec)721 protected AlgorithmParameterSpec engineGetParameterSpec(Class paramSpec) 722 throws InvalidParameterSpecException { 723 return null; 724 } 725 engineGetEncoded()726 protected byte[] engineGetEncoded() throws IOException { 727 return null; 728 } 729 engineGetEncoded(String format)730 protected byte[] engineGetEncoded(String format) throws IOException { 731 return null; 732 } 733 engineToString()734 protected String engineToString() { 735 runEngineToString = true; 736 return "AlgorithmParameters"; 737 } 738 } 739 740 /** 741 * Additional class to verify AlgorithmParameters constructor 742 */ 743 class myAlgP extends AlgorithmParameters { myAlgP(AlgorithmParametersSpi spi, Provider prov, String alg)744 public myAlgP(AlgorithmParametersSpi spi, Provider prov, String alg) { 745 super(spi, prov, alg); 746 } 747 } 748 } 749