@@ -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 ) {
0 commit comments