# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
# 
#     http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# This is the system security properties file
# It should be named: ${java.home}/lib/security/java.security


#
# Providers
# See also: J2SE doc. "How to Implement a Provider for the JavaTM Cryptography Architecture"
#
# Harmony providers
security.provider.1=org.apache.harmony.security.provider.cert.DRLCertFactory
security.provider.2=org.apache.harmony.security.provider.crypto.CryptoProvider
security.provider.3=org.apache.harmony.xnet.provider.jsse.JSSEProvider
# Other Open Source providers
security.provider.4=org.bouncycastle.jce.provider.BouncyCastleProvider
# Default Policy provider
security.provider.5=org.apache.harmony.security.provider.PolicyProvider

#
# Class to instantiate as a default Configuration implementation
# See specification for javax.security.auth.login.Configuration class.
#
login.configuration.provider=org.apache.harmony.auth.login.DefaultConfiguration


#
# Flag to enable/disable append/overwrite this properties file by the 
# extra properties file passed on the command line with
# -Djava.security.properties=<file|url> or -Djava.security.properties==<file|url>
# Possible values: true/false.
#
security.allowCustomPropertiesFile=true


# Class to instantiate as the default system Policy.
# The class should be available via bootclasspath.
# See specification for java.security.Policy class.
policy.provider=org.apache.harmony.security.fortress.DefaultPolicy


# The default is to have a single system-wide policy file,
# and an optional policy file in the user's home directory.
# It is possible to specify any number of policy files, via policy.url.n keys.
# See also: "JavaTM 2 Platform Security Architecture.", chapter 3. Permissions and Security Policy
policy.url.1=file:${java.home}/lib/security/java.policy
policy.url.2=file:${user.home}/.java.policy


# Flag to enable/disable properties expansion (${...}) in policy files. 
# Possible values: true/false.
# See also: "JavaTM 2 Platform Security Architecture.", chapter 3. Permissions and Security Policy
policy.expandProperties=true


# Flag to enable/disable an extra policy to be passed on the command line
# with -Djava.security.policy=<file|url>. Possible values: true/false.
# See also: "JavaTM 2 Platform Security Architecture.", chapter 3. Permissions and Security Policy
policy.allowSystemProperty=true


# A comma-separated list of package prefixes that require 
# extra protection at ClassLoader's level. 
# See java/lang/SecurityManager#checkPackageAccess for more details.
package.access=org.apache.harmony.security.fortress.,com.intel.fortress.,com.ibm.oti.


# Class to instantiate as default JGSS manager.
jgss.spi.manager=org.apache.harmony.auth.jgss.GSSManagerImpl


# The default SSLSocketFactory and SSLServerSocketFactory provider implementations.
# See specification for 
# javax/net/ssl/SSLSocketFactory.html#getDefault()
# javax/net/ssl/SSLServerSocketFactory.html#getDefault()
ssl.SocketFactory.provider=org.apache.harmony.xnet.provider.jsse.SSLSocketFactoryImpl
ssl.ServerSocketFactory.provider=org.apache.harmony.xnet.provider.jsse.SSLServerSocketFactoryImpl


# Default KeyStore type.
# See specification for java/security/KeyStore.html#getDefaultType()
keystore.type=BKS


# Default KeyManagerFactory and TrustManagerFactory algorithms. 
# See specification for
# javax/net/ssl/KeyManagerFactory.html#getDefaultAlgorithm()
# javax/net/ssl/TrustManagerFactory.html#getDefaultAlgorithm()
ssl.KeyManagerFactory.algorithm=X509
ssl.TrustManagerFactory.algorithm=X509

# system.scope is used to specify implementation class of IdentityScope
# this class should can be loaded by boot classloader
system.scope=org.apache.harmony.security.SystemScope
