# 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

#
# 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
