diff --git a/docs/reference-manual/native-image/JCASecurityServices.md b/docs/reference-manual/native-image/JCASecurityServices.md
index 15e25c1df7b4..ceec16b5d860 100644
--- a/docs/reference-manual/native-image/JCASecurityServices.md
+++ b/docs/reference-manual/native-image/JCASecurityServices.md
@@ -38,18 +38,17 @@ The report will detail all registered service classes, the API methods that trig
## Provider Initialization
-Currently security providers are initialized at build time.
-To move their initialization to run time, use the option `--future-defaults=all` or `--future-defaults=run-time-initialized-jdk`.
-Provider verification will still occur at build time.
+Currently, security providers are initialized at build time.
+To move their initialization to run time, use the option `--future-defaults=run-time-initialize-security-providers`, `--future-defaults=all`, or `--future-defaults=run-time-initialize-jdk`.
+Provider verification will still occur at build time.
Run-time initialization of security providers helps reduce image heap size.
-To move their initialization to run time, you can use the flag `--future-defaults=all` or `--future-defaults=run-time-initialized-jdk`.
## Provider Registration
The `native-image` builder captures the list of providers and their preference order from the underlying JVM.
The provider order is specified in the `java.security` file under `
run-time-security-providers
it can enable it similarly to all
that
+ * enables all future defaults.
+ *
+ * Note 3: future defaults can not be simply removed as user code can depend on the system property
* values that are set by the option. When removing a future-default option, one has to leave the
* system property both a build time and at run time set to true
.
*/
public class FutureDefaultsOptions {
private static final String OPTION_NAME = "future-defaults";
- private static final String DEFAULT_NAME = "--future-defaults=run-time-initialize-security-providers
*
* * The initialization strategy is: @@ -251,7 +251,7 @@ public static class Options { @Override public void afterRegistration(AfterRegistrationAccess a) { - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { ImageSingletons.add(SecurityProvidersSupport.class, new SecurityProvidersSupport(Options.AdditionalSecurityProviders.getValue().values())); } @@ -267,7 +267,7 @@ public void duringSetup(DuringSetupAccess a) { RuntimeClassInitializationSupport rci = ImageSingletons.lookup(RuntimeClassInitializationSupport.class); oidTableField = access.findField("sun.security.util.ObjectIdentifier", "oidTable"); oidMapField = access.findField(OIDMap.class, "oidMap"); - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { addManuallyConfiguredUsedProviders(a); verificationResultsField = access.findField("javax.crypto.JceSecurity", "verificationResults"); providerListField = access.findField("sun.security.jca.Providers", "providerList"); @@ -288,9 +288,9 @@ public void duringSetup(DuringSetupAccess a) { * in the build-time initialization, so we need to mark them explicitly for run-time * initialization instead. */ - rci.initializeAtRunTime("java.security.Security", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("sun.security.jca.Providers", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("sun.security.provider.certpath.ldap.JdkLDAP", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtRunTime("java.security.Security", FutureDefaultsOptions.RUN_TIME_INITIALIZE_SECURITY_PROVIDERS_REASON); + rci.initializeAtRunTime("sun.security.jca.Providers", FutureDefaultsOptions.RUN_TIME_INITIALIZE_SECURITY_PROVIDERS_REASON); + rci.initializeAtRunTime("sun.security.provider.certpath.ldap.JdkLDAP", FutureDefaultsOptions.RUN_TIME_INITIALIZE_SECURITY_PROVIDERS_REASON); } /* @@ -398,7 +398,7 @@ public void beforeAnalysis(BeforeAnalysisAccess a) { PlatformNativeLibrarySupport.singleton().addBuiltinPkgNativePrefix("sun_security_mscapi"); } - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { substitutionProcessor = ((Inflation) access.getBigBang()).getAnnotationSubstitutionProcessor(); access.registerFieldValueTransformer(providerListField, new FieldValueTransformerWithAvailability() { @@ -826,7 +826,7 @@ private void registerProvider(DuringAnalysisAccess access, Provider provider) { * support. See also Target_javax_crypto_JceSecurity. */ Object result = getVerificationResult.invoke(null, provider); - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { /* * Note that after verification, we move the result to a separate structure * since we don't want to keep the provider object in the image heap. @@ -928,7 +928,7 @@ private void registerX509Extensions(DuringAnalysisAccess a) { public void duringAnalysis(DuringAnalysisAccess a) { DuringAnalysisAccessImpl access = (DuringAnalysisAccessImpl) a; access.rescanRoot(oidTableField); - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { maybeScanVerificationResultsField(access); maybeScanProvidersField(access); if (cachedProviders != null) { diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ServiceLoaderFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ServiceLoaderFeature.java index dc54ab3d24af..83d2ce24bd4f 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ServiceLoaderFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/ServiceLoaderFeature.java @@ -149,7 +149,7 @@ public boolean isInConfiguration(IsInConfigurationAccess access) { @Override public void afterRegistration(AfterRegistrationAccess access) { - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { servicesToSkip.add(java.security.Provider.class.getName()); } servicesToSkip.addAll(Options.ServiceLoaderFeatureExcludeServices.getValue().values()); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java index 74c4cc2946dc..1ec2736fd407 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/jdk/JDKInitializationFeature.java @@ -147,23 +147,23 @@ public void afterRegistration(AfterRegistrationAccess access) { rci.initializeAtBuildTime("java.awt.font.JavaAWTFontAccessImpl", "Required for sun.text.bidi.BidiBase.NumericShapings"); /* FileSystemProviders related */ - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { - rci.initializeAtRunTime("java.nio.file.spi", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("sun.nio.fs", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + if (FutureDefaultsOptions.fileSystemProvidersInitializedAtRunTime()) { + rci.initializeAtRunTime("java.nio.file.spi", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("sun.nio.fs", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); - rci.initializeAtRunTime("java.nio.file.FileSystems", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("java.nio.file.FileSystems$DefaultFileSystemHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtRunTime("java.nio.file.FileSystems", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("java.nio.file.FileSystems$DefaultFileSystemHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); - rci.initializeAtRunTime("java.util.zip.ZipFile$Source", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("java.util.zip.ZipFile$Source", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtRunTime("java.util.zip.ZipFile$Source", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("java.util.zip.ZipFile$Source", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); - rci.initializeAtRunTime("java.io.FileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("java.io.FileSystem$CurrentWorkingDirectoryHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("java.io.UnixFileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); - rci.initializeAtRunTime("java.io.WindowsFileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtRunTime("java.io.FileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("java.io.FileSystem$CurrentWorkingDirectoryHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("java.io.UnixFileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); + rci.initializeAtRunTime("java.io.WindowsFileSystem", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); /* Holder for the default file system. */ - rci.initializeAtRunTime("com.oracle.svm.core.jdk.runtimeinit.DefaultFileSystemHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtRunTime("com.oracle.svm.core.jdk.runtimeinit.DefaultFileSystemHolder", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); /* * The following need to be build-time initialized because they can end up in the image @@ -175,24 +175,16 @@ public void afterRegistration(AfterRegistrationAccess access) { * Require explicit initializeAtBuildTime because the sun.nio.fs is registered for * run-time initialization. */ - rci.initializeAtBuildTime("sun.nio.fs.UnixPath", "Allow UnixPath objects in the image heap (" + FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON + ")"); - rci.initializeAtBuildTime("sun.nio.fs.WindowsPath", "Allow WindowsPath objects in the image heap (" + FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON + ")"); + rci.initializeAtBuildTime("sun.nio.fs.UnixPath", "Allow UnixPath objects in the image heap (" + FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON + ")"); + rci.initializeAtBuildTime("sun.nio.fs.WindowsPath", "Allow WindowsPath objects in the image heap (" + FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON + ")"); /* JrtFS support. */ - rci.initializeAtBuildTime("jdk.internal.jrtfs.SystemImage", FutureDefaultsOptions.RUN_TIME_INITIALIZE_JDK_REASON); + rci.initializeAtBuildTime("jdk.internal.jrtfs.SystemImage", FutureDefaultsOptions.RUN_TIME_INITIALIZE_FILE_SYSTEM_PROVIDERS_REASON); } - /* XML-related */ - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { - // GR-50683 should remove this part - rci.initializeAtBuildTime("com.sun.xml", JDK_CLASS_REASON); - rci.initializeAtBuildTime("com.sun.org.apache", JDK_CLASS_REASON); - rci.initializeAtBuildTime("com.sun.org.slf4j.internal", JDK_CLASS_REASON); - } else { - rci.initializeAtBuildTime("com.sun.xml", JDK_CLASS_REASON); - rci.initializeAtBuildTime("com.sun.org.apache", JDK_CLASS_REASON); - rci.initializeAtBuildTime("com.sun.org.slf4j.internal", JDK_CLASS_REASON); - } + rci.initializeAtBuildTime("com.sun.xml", JDK_CLASS_REASON); + rci.initializeAtBuildTime("com.sun.org.apache", JDK_CLASS_REASON); + rci.initializeAtBuildTime("com.sun.org.slf4j.internal", JDK_CLASS_REASON); /* Security services */ rci.initializeAtBuildTime("com.sun.crypto.provider", JDK_CLASS_REASON); @@ -232,7 +224,7 @@ public void afterRegistration(AfterRegistrationAccess access) { rci.initializeAtBuildTime("sun.security.validator", JDK_CLASS_REASON); rci.initializeAtBuildTime("sun.security.x509", JDK_CLASS_REASON); rci.initializeAtBuildTime("com.sun.jndi", JDK_CLASS_REASON); - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { rci.initializeAtBuildTime("sun.security.pkcs11", JDK_CLASS_REASON); rci.initializeAtBuildTime("sun.security.smartcardio", JDK_CLASS_REASON); rci.initializeAtBuildTime("com.sun.security.sasl", JDK_CLASS_REASON); diff --git a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java index 21d1078344f3..04c1377af708 100644 --- a/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java +++ b/substratevm/src/com.oracle.svm.hosted/src/com/oracle/svm/hosted/reflect/ReflectionDataBuilder.java @@ -205,7 +205,7 @@ public void register(ConfigurationCondition condition, boolean unsafeInstantiate Objects.requireNonNull(clazz, () -> nullErrorMessage("class")); runConditionalInAnalysisTask(condition, (cnd) -> { registerClass(cnd, clazz, unsafeInstantiated, true); - if (FutureDefaultsOptions.treatNameAsType()) { + if (FutureDefaultsOptions.completeReflectionTypes()) { registerClassMetadata(cnd, clazz); } }); diff --git a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/services/SecurityServiceTest.java b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/services/SecurityServiceTest.java index 904aebf36333..4bfd37f38c16 100644 --- a/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/services/SecurityServiceTest.java +++ b/substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/services/SecurityServiceTest.java @@ -61,7 +61,7 @@ public void afterRegistration(AfterRegistrationAccess access) { @Override public void duringSetup(final DuringSetupAccess access) { - if (!FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (!FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { // we use these (application) classes during Native image build RuntimeClassInitialization.initializeAtBuildTime(NoOpService.class); RuntimeClassInitialization.initializeAtBuildTime(NoOpProvider.class); @@ -80,7 +80,7 @@ public void duringSetup(final DuringSetupAccess access) { */ @Test public void testSecurityProviderRuntimeRegistration() { - Assume.assumeTrue("needs runtime initialization", FutureDefaultsOptions.isJDKInitializedAtRunTime()); + Assume.assumeTrue("needs runtime initialization", FutureDefaultsOptions.securityProvidersInitializedAtRunTime()); Provider notRegistered = Security.getProvider("no-op-provider"); Assert.assertNull("Provider is registered.", notRegistered); @@ -99,7 +99,7 @@ public void testSecurityProviderRuntimeRegistration() { */ @Test public void testUnknownSecurityServices() throws Exception { - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { /* Register the provider at run time. */ Security.addProvider(new NoOpProvider()); } @@ -113,7 +113,7 @@ public void testUnknownSecurityServices() throws Exception { @Test public void testAutomaticSecurityServiceRegistration() { try { - if (FutureDefaultsOptions.isJDKInitializedAtRunTime()) { + if (FutureDefaultsOptions.securityProvidersInitializedAtRunTime()) { /* Register the provider at run time. */ Security.addProvider(new NoOpProviderTwo()); }