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