Skip to content

Commit 7b5e4ab

Browse files
Parse java.security.properties file at run time.
1 parent 53e07c8 commit 7b5e4ab

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-3
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SecurityProvidersSupport.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import java.util.HashSet;
3434
import java.util.List;
3535
import java.util.Map;
36+
import java.util.Properties;
3637
import java.util.Set;
3738

3839
import org.graalvm.nativeimage.ImageSingletons;
@@ -69,6 +70,8 @@ public final class SecurityProvidersSupport {
6970
*/
7071
private final Map<String, Object> verifiedSecurityProviders = Collections.synchronizedMap(new HashMap<>());
7172

73+
private Properties savedInitialSecurityProperties;
74+
7275
private Constructor<?> sunECConstructor;
7376

7477
@Platforms(Platform.HOSTED_ONLY.class)
@@ -126,4 +129,12 @@ public Provider allocateSunECProvider() {
126129
throw VMError.shouldNotReachHere("The SunEC constructor is not present.");
127130
}
128131
}
132+
133+
public void setSavedInitialSecurityProperties(Properties savedSecurityProperties) {
134+
this.savedInitialSecurityProperties = savedSecurityProperties;
135+
}
136+
137+
public Properties getSavedInitialSecurityProperties() {
138+
return savedInitialSecurityProperties;
139+
}
129140
}

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk/SecuritySubstitutions.java

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626

2727
import static com.oracle.svm.core.snippets.KnownIntrinsics.readCallerStackPointer;
2828

29+
import java.io.File;
2930
import java.lang.reflect.Constructor;
3031
import java.net.URL;
3132
import java.security.AccessControlContext;
@@ -42,6 +43,7 @@
4243
import java.util.List;
4344
import java.util.Map;
4445
import java.util.Objects;
46+
import java.util.Properties;
4547
import java.util.WeakHashMap;
4648
import java.util.function.BooleanSupplier;
4749
import java.util.function.Predicate;
@@ -71,6 +73,7 @@
7173

7274
import jdk.graal.compiler.core.common.SuppressFBWarnings;
7375
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
76+
import sun.security.util.Debug;
7477
import sun.security.util.SecurityConstants;
7578

7679
/*
@@ -220,6 +223,54 @@ final class Target_java_security_Provider_Service {
220223
private Object constructorCache;
221224
}
222225

226+
@TargetClass(value = java.security.Security.class)
227+
final class Target_java_security_Security {
228+
@Alias //
229+
@RecomputeFieldValue(kind = RecomputeFieldValue.Kind.FromAlias) //
230+
static Properties props;
231+
232+
@Alias //
233+
private static Properties initialSecurityProperties;
234+
235+
@Alias //
236+
private static Debug sdebug;
237+
238+
@Substitute
239+
@TargetElement(onlyWith = JDK21OrEarlier.class)
240+
private static void initialize() {
241+
props = SecurityProvidersSupport.singleton().getSavedInitialSecurityProperties();
242+
boolean overrideAll = false;
243+
244+
if ("true".equalsIgnoreCase(props.getProperty("security.overridePropertiesFile"))) {
245+
String extraPropFile = System.getProperty("java.security.properties");
246+
if (extraPropFile != null && extraPropFile.startsWith("=")) {
247+
overrideAll = true;
248+
extraPropFile = extraPropFile.substring(1);
249+
}
250+
loadProps(null, extraPropFile, overrideAll);
251+
}
252+
initialSecurityProperties = (Properties) props.clone();
253+
if (sdebug != null) {
254+
for (String key : props.stringPropertyNames()) {
255+
sdebug.println("Initial security property: " + key + "=" + props.getProperty(key));
256+
}
257+
}
258+
}
259+
260+
@Alias
261+
@TargetElement(onlyWith = JDK21OrEarlier.class)
262+
private static native boolean loadProps(File masterFile, String extraPropFile, boolean overrideAll);
263+
}
264+
265+
@TargetClass(value = java.security.Security.class, innerClass = "SecPropLoader", onlyWith = JDKLatest.class)
266+
final class Target_java_security_Security_SecPropLoader {
267+
268+
@Substitute
269+
private static void loadMaster() {
270+
Target_java_security_Security.props = SecurityProvidersSupport.singleton().getSavedInitialSecurityProperties();
271+
}
272+
}
273+
223274
class ServiceKeyProvider {
224275
static Object getNewServiceKey() {
225276
Class<?> serviceKey = ReflectionUtil.lookupClass("java.security.Provider$ServiceKey");

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

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@
6464
import java.util.Map;
6565
import java.util.Objects;
6666
import java.util.Optional;
67+
import java.util.Properties;
6768
import java.util.Set;
6869
import java.util.concurrent.ConcurrentHashMap;
6970
import java.util.function.BiConsumer;
@@ -109,6 +110,7 @@
109110

110111
import jdk.graal.compiler.options.Option;
111112
import jdk.graal.compiler.serviceprovider.JavaVersionUtil;
113+
import jdk.internal.access.SharedSecrets;
112114
import sun.security.provider.NativePRNG;
113115
import sun.security.x509.OIDMap;
114116

@@ -229,13 +231,17 @@ public void duringSetup(DuringSetupAccess a) {
229231
SecurityProvidersSupport.singleton().setSunECConstructor(sunECConstructor);
230232
}
231233

234+
Properties securityProperties = SharedSecrets.getJavaSecurityPropertiesAccess().getInitialProperties();
235+
SecurityProvidersSupport.singleton().setSavedInitialSecurityProperties(securityProperties);
236+
232237
RuntimeClassInitializationSupport rci = ImageSingletons.lookup(RuntimeClassInitializationSupport.class);
233238
/*
234239
* Security providers will be initialized at run time because the class initialization
235-
* simulation will determine that automatically. For the two classes below, however, we need
236-
* to handle this explicitly because their packages are already marked for initialization at
237-
* build time by JdkInitializationFeature#afterRegistration.
240+
* simulation will determine that automatically. For the three classes below, however, we
241+
* need to handle this explicitly because their packages are already marked for
242+
* initialization at build time by JdkInitializationFeature#afterRegistration.
238243
*/
244+
rci.initializeAtRunTime("java.security.Security", SECURITY_PROVIDERS_INITIALIZATION);
239245
rci.initializeAtRunTime("sun.security.jca.Providers", SECURITY_PROVIDERS_INITIALIZATION);
240246
rci.initializeAtRunTime("sun.security.provider.certpath.ldap.JdkLDAP", SECURITY_PROVIDERS_INITIALIZATION);
241247

0 commit comments

Comments
 (0)