-
Bug
-
Resolution: Fixed
-
P3
-
1.4.0
-
beta
-
sparc
-
solaris_2.6
An implementation of new API introduced in JDK-Merlin does not work.
Invoking CertPathBuilder.getInstance(String, Provider) causes the following
exception:
java.lang.IllegalArgumentException: argument type mismatch
at java.lang.reflect.Method.invoke(Native Method)
at java.security.cert.CertPathBuilder.getInstance(CertPathBuilder.java:232)
Indeed, in the sources there almost is no difference betweet realization of getInstance(String, String) and getInstance(String, Provider) and in the second
case Security.getImpl(String, String, String) method invoking with wrong parameter.
There is a minimized test :
-------------------------------
import java.security.cert.CertPathParameters;
import java.security.cert.CertPathBuilderResult;
import java.security.cert.CertPathBuilderSpi;
import java.security.Provider;
import java.security.AccessController;
import java.security.cert.CertPathBuilder;
import java.security.NoSuchAlgorithmException;
public class getInstanceTest {
public static void main(String[] argv) {
String stubCPB = "StubCPBSpi";
String stubAlgorithm = "CertPathBuilder.PKIX";
Provider stubProvider = new StubProvider( stubAlgorithm, stubCPB);
try {
CertPathBuilder cpb = CertPathBuilder.getInstance( "PKIX", stubProvider);
Provider provider = cpb.getProvider();
if( provider.getName().equals( stubAlgorithm) ) {
System.out.println(" Algorithm "+stubAlgorithm+" found in the specified provider "+stubProvider);
} else {
System.out.println(" Provider name does not match with specified");
System.out.println(" FAILED ");
}
} catch(NoSuchAlgorithmException nsae) {
System.out.println(" Algorithm "+stubAlgorithm+" has not been found in provider "+stubProvider);
System.out.println(" FAILED ");
}
System.out.println(" OKAY ");
}
}
class StubProvider extends Provider {
final String algorithm1;
final String spiClass1;
public StubProvider(String algorithm, String spiClass) {
super( algorithm, 1.1, "No Info");
this.algorithm1 = algorithm;
this.spiClass1 = spiClass;
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
put( algorithm1, spiClass1);
return null;
} } );
}
}
class StubCPBSpi extends CertPathBuilderSpi {
public boolean called;
public StubCPBSpi() {
super();
called = false;
}
public CertPathBuilderResult engineBuild(CertPathParameters params) {
called = true;
return null;
}
}
---------------------------- output from the test
:\>java getInstanceTest
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at java.lang.reflect.Method.invoke(Native Method)
at java.security.cert.CertPathBuilder.getInstance(CertPathBuilder.java:232)
at getInstanceTest.main(getInstanceTest.java:17)
Invoking CertPathBuilder.getInstance(String, Provider) causes the following
exception:
java.lang.IllegalArgumentException: argument type mismatch
at java.lang.reflect.Method.invoke(Native Method)
at java.security.cert.CertPathBuilder.getInstance(CertPathBuilder.java:232)
Indeed, in the sources there almost is no difference betweet realization of getInstance(String, String) and getInstance(String, Provider) and in the second
case Security.getImpl(String, String, String) method invoking with wrong parameter.
There is a minimized test :
-------------------------------
import java.security.cert.CertPathParameters;
import java.security.cert.CertPathBuilderResult;
import java.security.cert.CertPathBuilderSpi;
import java.security.Provider;
import java.security.AccessController;
import java.security.cert.CertPathBuilder;
import java.security.NoSuchAlgorithmException;
public class getInstanceTest {
public static void main(String[] argv) {
String stubCPB = "StubCPBSpi";
String stubAlgorithm = "CertPathBuilder.PKIX";
Provider stubProvider = new StubProvider( stubAlgorithm, stubCPB);
try {
CertPathBuilder cpb = CertPathBuilder.getInstance( "PKIX", stubProvider);
Provider provider = cpb.getProvider();
if( provider.getName().equals( stubAlgorithm) ) {
System.out.println(" Algorithm "+stubAlgorithm+" found in the specified provider "+stubProvider);
} else {
System.out.println(" Provider name does not match with specified");
System.out.println(" FAILED ");
}
} catch(NoSuchAlgorithmException nsae) {
System.out.println(" Algorithm "+stubAlgorithm+" has not been found in provider "+stubProvider);
System.out.println(" FAILED ");
}
System.out.println(" OKAY ");
}
}
class StubProvider extends Provider {
final String algorithm1;
final String spiClass1;
public StubProvider(String algorithm, String spiClass) {
super( algorithm, 1.1, "No Info");
this.algorithm1 = algorithm;
this.spiClass1 = spiClass;
AccessController.doPrivileged(new java.security.PrivilegedAction() {
public Object run() {
put( algorithm1, spiClass1);
return null;
} } );
}
}
class StubCPBSpi extends CertPathBuilderSpi {
public boolean called;
public StubCPBSpi() {
super();
called = false;
}
public CertPathBuilderResult engineBuild(CertPathParameters params) {
called = true;
return null;
}
}
---------------------------- output from the test
:\>java getInstanceTest
Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
at java.lang.reflect.Method.invoke(Native Method)
at java.security.cert.CertPathBuilder.getInstance(CertPathBuilder.java:232)
at getInstanceTest.main(getInstanceTest.java:17)