Skip to content

Commit 8a5e292

Browse files
committed
Allow jdk.crypto.mscapi module to be unavailable on Windows
1 parent d009d4f commit 8a5e292

File tree

2 files changed

+26
-17
lines changed

2 files changed

+26
-17
lines changed

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/SecurityServicesFeature.java

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ public static class Options {
154154
/** The list of known service classes defined by the JCA. */
155155
private static final List<Class<?>> knownServices;
156156

157+
private static final boolean isMscapiModulePresent;
158+
157159
static {
158160
List<Class<?>> classList = new ArrayList<>(List.of(
159161
AlgorithmParameterGenerator.class, AlgorithmParameters.class,
@@ -175,6 +177,9 @@ public static class Options {
175177
if (ModuleLayer.boot().findModule("java.smartcardio").isPresent()) {
176178
classList.add(ReflectionUtil.lookupClass(false, "javax.smartcardio.TerminalFactory"));
177179
}
180+
181+
isMscapiModulePresent = ModuleLayer.boot().findModule("jdk.crypto.mscapi").isPresent();
182+
178183
knownServices = Collections.unmodifiableList(classList);
179184
}
180185

@@ -254,7 +259,7 @@ public void duringSetup(DuringSetupAccess a) {
254259
* SeedGenerator.getSystemEntropy().
255260
*/
256261
rci.rerunInitialization(clazz(access, "sun.security.provider.AbstractDrbg$SeederHolder"), "for substitutions");
257-
if (isWindows()) {
262+
if (isMscapiModulePresent) {
258263
/* PRNG.<clinit> creates a Cleaner (see JDK-8210476), which starts its thread. */
259264
rci.rerunInitialization(clazz(access, "sun.security.mscapi.PRNG"), "for substitutions");
260265
}
@@ -338,7 +343,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) {
338343
});
339344
}
340345

341-
if (isWindows()) {
346+
if (isMscapiModulePresent) {
342347
access.registerReachabilityHandler(SecurityServicesFeature::registerSunMSCAPIConfig, clazz(access, "sun.security.mscapi.SunMSCAPI"));
343348
/* Resolve calls to sun_security_mscapi* as builtIn. */
344349
PlatformNativeLibrarySupport.singleton().addBuiltinPkgNativePrefix("sun_security_mscapi");
@@ -419,20 +424,23 @@ private static void registerSunMSCAPIConfig(BeforeAnalysisAccess a) {
419424
"java.security.KeyException", "java.security.KeyStoreException", "java.security.ProviderException",
420425
"java.security.SignatureException", "java.lang.OutOfMemoryError");
421426

422-
/*
423-
* JDK-6782021 changed the `loadKeysOrCertificateChains` method signature, so we try the new
424-
* signature first and fall back to the old one in case we're on a JDK without the change.
425-
*/
426-
a.registerReachabilityHandler(SecurityServicesFeature::registerLoadKeysOrCertificateChains,
427-
optionalMethod(a, "sun.security.mscapi.CKeyStore", "loadKeysOrCertificateChains", String.class, int.class)
428-
.orElseGet(() -> method(a, "sun.security.mscapi.CKeyStore", "loadKeysOrCertificateChains", String.class)));
429-
a.registerReachabilityHandler(SecurityServicesFeature::registerGenerateCKeyPair,
430-
method(a, "sun.security.mscapi.CKeyPairGenerator$RSA", "generateCKeyPair", String.class, int.class, String.class));
431-
a.registerReachabilityHandler(SecurityServicesFeature::registerCPrivateKeyOf,
432-
method(a, "sun.security.mscapi.CKeyStore", "storePrivateKey", String.class, byte[].class, String.class, int.class));
433-
a.registerReachabilityHandler(SecurityServicesFeature::registerCPublicKeyOf,
434-
method(a, "sun.security.mscapi.CSignature", "importECPublicKey", String.class, byte[].class, int.class),
435-
method(a, "sun.security.mscapi.CSignature", "importPublicKey", String.class, byte[].class, int.class));
427+
if (isMscapiModulePresent) {
428+
/*
429+
* JDK-6782021 changed the `loadKeysOrCertificateChains` method signature, so we try the
430+
* new signature first and fall back to the old one in case we're on a JDK without the
431+
* change.
432+
*/
433+
a.registerReachabilityHandler(SecurityServicesFeature::registerLoadKeysOrCertificateChains,
434+
optionalMethod(a, "sun.security.mscapi.CKeyStore", "loadKeysOrCertificateChains", String.class, int.class)
435+
.orElseGet(() -> method(a, "sun.security.mscapi.CKeyStore", "loadKeysOrCertificateChains", String.class)));
436+
a.registerReachabilityHandler(SecurityServicesFeature::registerGenerateCKeyPair,
437+
method(a, "sun.security.mscapi.CKeyPairGenerator$RSA", "generateCKeyPair", String.class, int.class, String.class));
438+
a.registerReachabilityHandler(SecurityServicesFeature::registerCPrivateKeyOf,
439+
method(a, "sun.security.mscapi.CKeyStore", "storePrivateKey", String.class, byte[].class, String.class, int.class));
440+
a.registerReachabilityHandler(SecurityServicesFeature::registerCPublicKeyOf,
441+
method(a, "sun.security.mscapi.CSignature", "importECPublicKey", String.class, byte[].class, int.class),
442+
method(a, "sun.security.mscapi.CSignature", "importPublicKey", String.class, byte[].class, int.class));
443+
}
436444
}
437445

438446
private static void registerLoadKeysOrCertificateChains(DuringAnalysisAccess a) {

substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JNIRegistrationSupport.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,8 @@ public void beforeAnalysis(BeforeAnalysisAccess access) {
102102
@Override
103103
public void afterAnalysis(AfterAnalysisAccess access) {
104104
if (isWindows()) {
105-
isSunMSCAPIProviderReachable = access.isReachable(clazz(access, "sun.security.mscapi.SunMSCAPI"));
105+
var optSunMSCAPIClass = optionalClazz(access, "sun.security.mscapi.SunMSCAPI");
106+
isSunMSCAPIProviderReachable = optSunMSCAPIClass.isPresent() && access.isReachable(optSunMSCAPIClass.get());
106107
}
107108
}
108109

0 commit comments

Comments
 (0)