#158 Rebase FIPS patches from fips branch and simplify by using a single patch from that repository
Merged 2 years ago by ahughes. Opened 2 years ago by ahughes.
rpms/ ahughes/java-11-openjdk fips  into  rawhide

file modified
+29 -5
@@ -9,35 +9,59 @@ 

      // JDK 8

      private static final String JDK_PROPS_FILE_JDK_8 = System.getProperty("java.home") + "/lib/security/java.security";

  

+     private static final String POLICY_FILE = "/etc/crypto-policies/back-ends/java.config";

+ 

+     private static final String MSG_PREFIX = "DEBUG: ";

+ 

      public static void main(String[] args) {

+         if (args.length == 0) {

+             System.err.println("TestSecurityProperties <true|false>");

+             System.err.println("Invoke with 'true' if system security properties should be enabled.");

+             System.err.println("Invoke with 'false' if system security properties should be disabled.");

+             System.exit(1);

+         }

+         boolean enabled = Boolean.valueOf(args[0]);

+         System.out.println(MSG_PREFIX + "System security properties enabled: " + enabled);

          Properties jdkProps = new Properties();

          loadProperties(jdkProps);

+         if (enabled) {

+             loadPolicy(jdkProps);

+         }

          for (Object key: jdkProps.keySet()) {

              String sKey = (String)key;

              String securityVal = Security.getProperty(sKey);

              String jdkSecVal = jdkProps.getProperty(sKey);

              if (!securityVal.equals(jdkSecVal)) {

-                 String msg = "Expected value '" + jdkSecVal + "' for key '" + 

+                 String msg = "Expected value '" + jdkSecVal + "' for key '" +

                               sKey + "'" + " but got value '" + securityVal + "'";

                  throw new RuntimeException("Test failed! " + msg);

              } else {

-                 System.out.println("DEBUG: " + sKey + " = " + jdkSecVal + " as expected.");

+                 System.out.println(MSG_PREFIX + sKey + " = " + jdkSecVal + " as expected.");

              }

          }

          System.out.println("TestSecurityProperties PASSED!");

      }

-     

+ 

      private static void loadProperties(Properties props) {

          String javaVersion = System.getProperty("java.version");

-         System.out.println("Debug: Java version is " + javaVersion);

+         System.out.println(MSG_PREFIX + "Java version is " + javaVersion);

          String propsFile = JDK_PROPS_FILE_JDK_11;

          if (javaVersion.startsWith("1.8.0")) {

              propsFile = JDK_PROPS_FILE_JDK_8;

          }

-         try (FileInputStream fin = new FileInputStream(new File(propsFile))) {

+         try (FileInputStream fin = new FileInputStream(propsFile)) {

+             props.load(fin);

+         } catch (Exception e) {

+             throw new RuntimeException("Test failed!", e);

+         }

+     }

+ 

+     private static void loadPolicy(Properties props) {

+         try (FileInputStream fin = new FileInputStream(POLICY_FILE)) {

              props.load(fin);

          } catch (Exception e) {

              throw new RuntimeException("Test failed!", e);

          }

      }

+ 

  }

The added file is too large to be shown here, see it at: fips-11u-9087e80d0ab.patch
file modified
+47 -42
@@ -360,6 +360,8 @@ 

  

  # Define IcedTea version used for SystemTap tapsets and desktop file

  %global icedteaver      6.0.0pre00-c848b93a8598

+ # Define current Git revision for the FIPS support patches

+ %global fipsver 9087e80d0ab

  

  # Standard JPackage naming and versioning defines

  %global origin          openjdk
@@ -367,7 +369,7 @@ 

  %global top_level_dir_name   %{origin}

  %global top_level_dir_name_backup %{top_level_dir_name}-backup

  %global buildver        10

- %global rpmrelease      2

+ %global rpmrelease      3

  #%%global tagsuffix     %%{nil}

  # Priority must be 8 digits in total; up to openjdk 1.8, we were using 18..... so when we moved to 11, we had to add another digit

  %if %is_system_jdk
@@ -383,12 +385,11 @@ 

  %endif

  %global newjavaver %{featurever}.%{interimver}.%{updatever}.%{patchver}

  

- # Omit trailing 0 in filenames when the patch version is 0

- %if 0%{?patchver} > 0

- %global filever %{newjavaver}

- %else

- %global filever %{featurever}.%{interimver}.%{updatever}

- %endif

+ # Strip up to 6 trailing zeros in newjavaver, as the JDK does, to get the correct version used in filenames

+ %global filever %(svn=%{newjavaver}; for i in 1 2 3 4 5 6 ; do svn=${svn%%.0} ; done; echo ${svn})

+ 

+ # The tag used to create the OpenJDK tarball

+ %global vcstag jdk-%{filever}+%{buildver}%{?tagsuffix:-%{tagsuffix}}

  

  %global javaver         %{featurever}

  
@@ -1290,7 +1291,7 @@ 

  

  # to regenerate source0 (jdk) run update_package.sh

  # update_package.sh contains hard-coded repos, revisions, tags, and projects to regenerate the source archives

- Source0: jdk-updates-jdk%{featurever}u-jdk-%{filever}+%{buildver}%{?tagsuffix:-%{tagsuffix}}-4curve.tar.xz

+ Source0: jdk-updates-jdk%{featurever}u-%{vcstag}-4curve.tar.xz

  

  # Use 'icedtea_sync.sh' to update the following

  # They are based on code contained in the IcedTea project (6.x).
@@ -1341,28 +1342,28 @@ 

  # RH1582504: Use RSA as default for keytool, as DSA is disabled in all crypto policies except LEGACY

  Patch1003: rh1842572-rsa_default_for_keytool.patch

  

- # FIPS support patches

+ # Crypto policy and FIPS support patches

+ # Patch is generated from the fips tree at https://github.com/rh-openjdk/jdk11u/tree/fips

+ # as follows: git diff %%{vcstag} src make > fips-11u-$(git show -s --format=%h HEAD).patch

+ # Diff is limited to src and make subdirectories to exclude .github changes

+ # Fixes currently included:

+ # PR3694, RH1340845: Add security.useSystemPropertiesFile option to java.security to use system crypto policy

+ # PR3695: Allow use of system crypto policy to be disabled by the user

  # RH1655466: Support RHEL FIPS mode using SunPKCS11 provider

- Patch1001: rh1655466-global_crypto_and_fips.patch

  # RH1818909: No ciphersuites availale for SSLSocket in FIPS mode

- Patch1002: rh1818909-fips_default_keystore_type.patch

  # RH1860986: Disable TLSv1.3 with the NSS-FIPS provider until PKCS#11 v3.0 support is available

- Patch1004: rh1860986-disable_tlsv1.3_in_fips_mode.patch

  # RH1915071: Always initialise JavaSecuritySystemConfiguratorAccess

- Patch1007: rh1915071-always_initialise_configurator_access.patch

  # RH1929465: Improve system FIPS detection

- Patch1008: rh1929465-improve_system_FIPS_detection.patch

  # RH1996182: Login to the NSS software token in FIPS mode

- Patch1009: rh1996182-login_to_nss_software_token.patch

  # RH1991003: Allow plain key import unless com.redhat.fips.plainKeySupport is set to false

- Patch1011: rh1991003-enable_fips_keys_import.patch

- # RH2021263: Resolve outstanding FIPS issues

- Patch1014: rh2021263-fips_ensure_security_initialised.patch

- Patch1015: rh2021263-fips_missing_native_returns.patch

+ # RH2021263: Make sure java.security.Security is initialised when retrieving JavaSecuritySystemConfiguratorAccess instance

+ # RH2021263: Return in C code after having generated Java exception

+ # RH2052819: Improve Security initialisation, now FIPS support no longer relies on crypto policy support

+ # RH2051605: Detect NSS at Runtime for FIPS detection

  # RH2052819: Fix FIPS reliance on crypto policies

- Patch1016: rh2021263-fips_separate_policy_and_fips_init.patch

- # RH2052829: Detect NSS at Runtime for FIPS detection

- Patch1017: rh2052829-fips_runtime_nss_detection.patch

+ # RH2036462: sun.security.pkcs11.wrapper.PKCS11.getInstance breakage

+ # RH2090378: Revert to disabling system security properties and FIPS mode support together

+ Patch1001: fips-11u-%{fipsver}.patch

  

  #############################################

  #
@@ -1382,10 +1383,6 @@ 

  #############################################

  

  Patch3:    rh649512-remove_uses_of_far_in_jpeg_libjpeg_turbo_1_4_compat_for_jdk10_and_up.patch

- # PR3694, RH1340845: Add security.useSystemPropertiesFile option to java.security to use system crypto policy

- Patch4: pr3694-rh1340845-support_fedora_rhel_system_crypto_policy.patch

- # PR3695: Allow use of system crypto policy to be disabled by the user

- Patch7: pr3695-toggle_system_crypto_policy.patch

  # JDK-8282004: x86_32.ad rules that call SharedRuntime helpers should have CALL effects

  Patch8: jdk8282004-x86_32-missing_call_effects.patch

  
@@ -1799,27 +1796,17 @@ 

  %patch1 -p1

  %patch2 -p1

  %patch3 -p1

- %patch4 -p1

- %patch7 -p1

  %patch8 -p1

+ # Add crypto policy and FIPS support

+ %patch1001 -p1

+ # nss.cfg PKCS11 support; must come last as it also alters java.security

+ %patch1000 -p1

  popd # openjdk

  

  %patch101

  

- %patch1000

  %patch600

- %patch1001

- %patch1002

  %patch1003

- %patch1004

- %patch1007

- %patch1008

- %patch1009

- %patch1011

- %patch1014

- %patch1015

- %patch1016

- %patch1017

  

  # Extract systemtap tapsets

  %if %{with_systemtap}
@@ -2016,6 +2003,10 @@ 

  	# Install nss.fips.cfg: NSS configuration for global FIPS mode (crypto-policies)

  	install -m 644 nss.fips.cfg ${imagepath}/conf/security/

  

+ 	# Turn on system security properties

+ 	sed -i -e "s:^security.useSystemPropertiesFile=.*:security.useSystemPropertiesFile=true:" \

+ 	    ${imagepath}/conf/security/java.security

+ 

  	# Use system-wide tzdata

  	rm ${imagepath}/lib/tzdb.dat

  	ln -s %{_datadir}/javazi-1.8/tzdb.dat ${imagepath}/lib/tzdb.dat
@@ -2126,9 +2117,14 @@ 

  $JAVA_HOME/bin/javac -d . %{SOURCE14}

  $JAVA_HOME/bin/java $(echo $(basename %{SOURCE14})|sed "s|\.java||")

  

- # Check system crypto (policy) can be disabled

+ # Check system crypto (policy) is active and can be disabled

+ # Test takes a single argument - true or false - to state whether system

+ # security properties are enabled or not.

  $JAVA_HOME/bin/javac -d . %{SOURCE15}

- $JAVA_HOME/bin/java -Djava.security.disableSystemPropertiesFile=true $(echo $(basename %{SOURCE15})|sed "s|\.java||")

+ export PROG=$(echo $(basename %{SOURCE15})|sed "s|\.java||")

+ export SEC_DEBUG="-Djava.security.debug=properties"

+ $JAVA_HOME/bin/java ${SEC_DEBUG} ${PROG} true

+ $JAVA_HOME/bin/java ${SEC_DEBUG} -Djava.security.disableSystemPropertiesFile=true ${PROG} false

  

  # Check correct vendor values have been set

  $JAVA_HOME/bin/javac -d . %{SOURCE16}
@@ -2621,6 +2617,15 @@ 

  %endif

  

  %changelog

+ * Thu Jul 07 2022 Andrew Hughes <gnu.andrew@redhat.com> - 1:11.0.15.0.10-3

+ - Rebase FIPS patches from fips branch and simplify by using a single patch from that repository

+ - * RH2036462: sun.security.pkcs11.wrapper.PKCS11.getInstance breakage

+ - * RH2090378: Revert to disabling system security properties and FIPS mode support together

+ - Rebase RH1648249 nss.cfg patch so it applies after the FIPS patch

+ - Enable system security properties in the RPM (now disabled by default in the FIPS repo)

+ - Improve security properties test to check both enabled and disabled behaviour

+ - Run security properties test with property debugging on

+ 

  * Thu Jun 30 2022 Francisco Ferrari Bihurriet <fferrari@redhat.com> - 1:11.0.15.0.10-2

  - RH2007331: SecretKey generate/import operations don't add the CKA_SIGN attribute in FIPS mode

  

@@ -1,88 +0,0 @@ 

- 

- # HG changeset patch

- # User andrew

- # Date 1478057514 0

- # Node ID 1c4d5cb2096ae55106111da200b0bcad304f650c

- # Parent  3d53f19b48384e5252f4ec8891f7a3a82d77af2a

- PR3694: Support Fedora/RHEL system crypto policy

- diff -r 3d53f19b4838 -r 1c4d5cb2096a src/java.base/share/classes/java/security/Security.java

- --- a/src/java.base/share/classes/java/security/Security.java	Wed Oct 26 03:51:39 2016 +0100

- +++ b/src/java.base/share/classes/java/security/Security.java	Wed Nov 02 03:31:54 2016 +0000

- @@ -43,6 +43,9 @@

-   * implementation-specific location, which is typically the properties file

-   * {@code conf/security/java.security} in the Java installation directory.

-   *

- + * <p>Additional default values of security properties are read from a

- + * system-specific location, if available.</p>

- + *

-   * @author Benjamin Renaud

-   * @since 1.1

-   */

- @@ -52,6 +55,10 @@

-      private static final Debug sdebug =

-                          Debug.getInstance("properties");

-  

- +    /* System property file*/

- +    private static final String SYSTEM_PROPERTIES =

- +        "/etc/crypto-policies/back-ends/java.config";

- +

-      /* The java.security properties */

-      private static Properties props;

-  

- @@ -93,6 +100,7 @@

-                  if (sdebug != null) {

-                      sdebug.println("reading security properties file: " +

-                                  propFile);

- +                    sdebug.println(props.toString());

-                  }

-              } catch (IOException e) {

-                  if (sdebug != null) {

- @@ -114,6 +122,31 @@

-          }

-  

-          if ("true".equalsIgnoreCase(props.getProperty

- +                ("security.useSystemPropertiesFile"))) {

- +

- +            // now load the system file, if it exists, so its values

- +            // will win if they conflict with the earlier values

- +            try (BufferedInputStream bis =

- +                 new BufferedInputStream(new FileInputStream(SYSTEM_PROPERTIES))) {

- +                props.load(bis);

- +                loadedProps = true;

- +

- +                if (sdebug != null) {

- +                    sdebug.println("reading system security properties file " +

- +                                   SYSTEM_PROPERTIES);

- +                    sdebug.println(props.toString());

- +                }

- +            } catch (IOException e) {

- +                if (sdebug != null) {

- +                    sdebug.println

- +                        ("unable to load security properties from " +

- +                         SYSTEM_PROPERTIES);

- +                    e.printStackTrace();

- +                }

- +            }

- +        }

- +

- +        if ("true".equalsIgnoreCase(props.getProperty

-                  ("security.overridePropertiesFile"))) {

-  

-              String extraPropFile = System.getProperty

- diff -r 3d53f19b4838 -r 1c4d5cb2096a src/java.base/share/conf/security/java.security

- --- a/src/java.base/share/conf/security/java.security	Wed Oct 26 03:51:39 2016 +0100

- +++ b/src/java.base/share/conf/security/java.security	Wed Nov 02 03:31:54 2016 +0000

- @@ -276,6 +276,13 @@

-  security.overridePropertiesFile=true

-  

-  #

- +# Determines whether this properties file will be appended to

- +# using the system properties file stored at

- +# /etc/crypto-policies/back-ends/java.config

- +#

- +security.useSystemPropertiesFile=true

- +

- +#

-  # Determines the default key and trust manager factory algorithms for

-  # the javax.net.ssl package.

-  #

@@ -1,78 +0,0 @@ 

- # HG changeset patch

- # User andrew

- # Date 1545198926 0

- #      Wed Dec 19 05:55:26 2018 +0000

- # Node ID f2cbd688824c128db7fa848c8732fb0ab3507776

- # Parent  81f07f6d1f8b7b51b136d3974c61bc8bb513770c

- PR3695: Allow use of system crypto policy to be disabled by the user

- Summary: Read user overrides first so security.useSystemPropertiesFile can be disabled and add -Djava.security.disableSystemPropertiesFile

- 

- diff --git a/src/java.base/share/classes/java/security/Security.java b/src/java.base/share/classes/java/security/Security.java

- --- a/src/java.base/share/classes/java/security/Security.java

- +++ b/src/java.base/share/classes/java/security/Security.java

- @@ -125,31 +125,6 @@

-          }

-  

-          if ("true".equalsIgnoreCase(props.getProperty

- -                ("security.useSystemPropertiesFile"))) {

- -

- -            // now load the system file, if it exists, so its values

- -            // will win if they conflict with the earlier values

- -            try (BufferedInputStream bis =

- -                 new BufferedInputStream(new FileInputStream(SYSTEM_PROPERTIES))) {

- -                props.load(bis);

- -                loadedProps = true;

- -

- -                if (sdebug != null) {

- -                    sdebug.println("reading system security properties file " +

- -                                   SYSTEM_PROPERTIES);

- -                    sdebug.println(props.toString());

- -                }

- -            } catch (IOException e) {

- -                if (sdebug != null) {

- -                    sdebug.println

- -                        ("unable to load security properties from " +

- -                         SYSTEM_PROPERTIES);

- -                    e.printStackTrace();

- -                }

- -            }

- -        }

- -

- -        if ("true".equalsIgnoreCase(props.getProperty

-                  ("security.overridePropertiesFile"))) {

-  

-              String extraPropFile = System.getProperty

- @@ -215,6 +190,33 @@

-              }

-          }

-  

- +        String disableSystemProps = System.getProperty("java.security.disableSystemPropertiesFile");

- +        if (disableSystemProps == null &&

- +            "true".equalsIgnoreCase(props.getProperty

- +                ("security.useSystemPropertiesFile"))) {

- +

- +            // now load the system file, if it exists, so its values

- +            // will win if they conflict with the earlier values

- +            try (BufferedInputStream bis =

- +                 new BufferedInputStream(new FileInputStream(SYSTEM_PROPERTIES))) {

- +                props.load(bis);

- +                loadedProps = true;

- +

- +                if (sdebug != null) {

- +                    sdebug.println("reading system security properties file " +

- +                                   SYSTEM_PROPERTIES);

- +                    sdebug.println(props.toString());

- +                }

- +            } catch (IOException e) {

- +                if (sdebug != null) {

- +                    sdebug.println

- +                        ("unable to load security properties from " +

- +                         SYSTEM_PROPERTIES);

- +                    e.printStackTrace();

- +                }

- +            }

- +        }

- +

-          if (!loadedProps) {

-              initializeStatic();

-              if (sdebug != null) {

@@ -1,11 +1,12 @@ 

- diff -r 5b86f66575b7 src/share/lib/security/java.security-linux

- --- openjdk/src/java.base/share/conf/security/java.security	Tue May 16 13:29:05 2017 -0700

- +++ openjdk/src/java.base/share/conf/security/java.security	Tue Jun 06 14:05:12 2017 +0200

- @@ -83,6 +83,7 @@

+ diff --git a/src/java.base/share/conf/security/java.security b/src/java.base/share/conf/security/java.security

+ index 474fe6f401f..7e94ae32023 100644

+ --- a/src/java.base/share/conf/security/java.security

+ +++ b/src/java.base/share/conf/security/java.security

+ @@ -84,6 +84,7 @@ security.provider.tbd=Apple

   #ifndef solaris

   security.provider.tbd=SunPKCS11

   #endif

  +#security.provider.tbd=SunPKCS11 ${java.home}/lib/security/nss.cfg

   

   #

-  # A list of preferred providers for specific algorithms. These providers will

+  # Security providers used when FIPS mode support is active

@@ -1,205 +0,0 @@ 

- diff --git a/src/java.base/share/classes/javopenjdk.orig///security/Security.java openjdk///src/java.base/share/classes/java/security/Security.java

- --- openjdk.orig/src/java.base/share/classes/java/security/Security.java

- +++ openjdk/src/java.base/share/classes/java/security/Security.java

- @@ -196,26 +196,8 @@

-          if (disableSystemProps == null &&

-              "true".equalsIgnoreCase(props.getProperty

-                  ("security.useSystemPropertiesFile"))) {

- -

- -            // now load the system file, if it exists, so its values

- -            // will win if they conflict with the earlier values

- -            try (BufferedInputStream bis =

- -                 new BufferedInputStream(new FileInputStream(SYSTEM_PROPERTIES))) {

- -                props.load(bis);

- +            if (SystemConfigurator.configure(props)) {

-                  loadedProps = true;

- -

- -                if (sdebug != null) {

- -                    sdebug.println("reading system security properties file " +

- -                                   SYSTEM_PROPERTIES);

- -                    sdebug.println(props.toString());

- -                }

- -            } catch (IOException e) {

- -                if (sdebug != null) {

- -                    sdebug.println

- -                        ("unable to load security properties from " +

- -                         SYSTEM_PROPERTIES);

- -                    e.printStackTrace();

- -                }

-              }

-          }

-  

- diff --git a/src/java.base/share/classes/javopenjdk.orig///security/SystemConfigurator.java openjdk///src/java.base/share/classes/java/security/SystemConfigurator.java

- new file mode 100644

- --- /dev/null

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- @@ -0,0 +1,151 @@

- +/*

- + * Copyright (c) 2019, Red Hat, Inc.

- + *

- + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

- + *

- + * This code is free software; you can redistribute it and/or modify it

- + * under the terms of the GNU General Public License version 2 only, as

- + * published by the Free Software Foundation.

- + *

- + * This code is distributed in the hope that it will be useful, but WITHOUT

- + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

- + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

- + * version 2 for more details (a copy is included in the LICENSE file that

- + * accompanied this code).

- + *

- + * You should have received a copy of the GNU General Public License version

- + * 2 along with this work; if not, write to the Free Software Foundation,

- + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

- + *

- + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

- + * or visit www.oracle.com if you need additional information or have any

- + * questions.

- + */

- +

- +package java.security;

- +

- +import java.io.BufferedInputStream;

- +import java.io.FileInputStream;

- +import java.io.IOException;

- +

- +import java.nio.file.Files;

- +import java.nio.file.Path;

- +

- +import java.util.Iterator;

- +import java.util.Map.Entry;

- +import java.util.Properties;

- +import java.util.function.Consumer;

- +import java.util.regex.Matcher;

- +import java.util.regex.Pattern;

- +

- +import sun.security.util.Debug;

- +

- +/**

- + * Internal class to align OpenJDK with global crypto-policies.

- + * Called from java.security.Security class initialization,

- + * during startup.

- + *

- + */

- +

- +class SystemConfigurator {

- +

- +    private static final Debug sdebug =

- +            Debug.getInstance("properties");

- +

- +    private static final String CRYPTO_POLICIES_BASE_DIR =

- +            "/etc/crypto-policies";

- +

- +    private static final String CRYPTO_POLICIES_JAVA_CONFIG =

- +            CRYPTO_POLICIES_BASE_DIR + "/back-ends/java.config";

- +

- +    private static final String CRYPTO_POLICIES_CONFIG =

- +            CRYPTO_POLICIES_BASE_DIR + "/config";

- +

- +    private static final class SecurityProviderInfo {

- +        int number;

- +        String key;

- +        String value;

- +        SecurityProviderInfo(int number, String key, String value) {

- +            this.number = number;

- +            this.key = key;

- +            this.value = value;

- +        }

- +    }

- +

- +    /*

- +     * Invoked when java.security.Security class is initialized, if

- +     * java.security.disableSystemPropertiesFile property is not set and

- +     * security.useSystemPropertiesFile is true.

- +     */

- +    static boolean configure(Properties props) {

- +        boolean loadedProps = false;

- +

- +        try (BufferedInputStream bis =

- +                new BufferedInputStream(

- +                        new FileInputStream(CRYPTO_POLICIES_JAVA_CONFIG))) {

- +            props.load(bis);

- +            loadedProps = true;

- +            if (sdebug != null) {

- +                sdebug.println("reading system security properties file " +

- +                        CRYPTO_POLICIES_JAVA_CONFIG);

- +                sdebug.println(props.toString());

- +            }

- +        } catch (IOException e) {

- +            if (sdebug != null) {

- +                sdebug.println("unable to load security properties from " +

- +                        CRYPTO_POLICIES_JAVA_CONFIG);

- +                e.printStackTrace();

- +            }

- +        }

- +

- +        try {

- +            if (enableFips()) {

- +                if (sdebug != null) { sdebug.println("FIPS mode detected"); }

- +                loadedProps = false;

- +                // Remove all security providers

- +                Iterator<Entry<Object, Object>> i = props.entrySet().iterator();

- +                while (i.hasNext()) {

- +                    Entry<Object, Object> e = i.next();

- +                    if (((String) e.getKey()).startsWith("security.provider")) {

- +                        if (sdebug != null) { sdebug.println("Removing provider: " + e); }

- +                        i.remove();

- +                    }

- +                }

- +                // Add FIPS security providers

- +                String fipsProviderValue = null;

- +                for (int n = 1;

- +                     (fipsProviderValue = (String) props.get("fips.provider." + n)) != null; n++) {

- +                    String fipsProviderKey = "security.provider." + n;

- +                    if (sdebug != null) {

- +                        sdebug.println("Adding provider " + n + ": " +

- +                                fipsProviderKey + "=" + fipsProviderValue);

- +                    }

- +                    props.put(fipsProviderKey, fipsProviderValue);

- +                }

- +                loadedProps = true;

- +            }

- +        } catch (Exception e) {

- +            if (sdebug != null) {

- +                sdebug.println("unable to load FIPS configuration");

- +                e.printStackTrace();

- +            }

- +        }

- +        return loadedProps;

- +    }

- +

- +    /*

- +     * FIPS is enabled only if crypto-policies are set to "FIPS"

- +     * and the com.redhat.fips property is true.

- +     */

- +    private static boolean enableFips() throws Exception {

- +        boolean fipsEnabled = Boolean.valueOf(System.getProperty("com.redhat.fips", "true"));

- +        if (fipsEnabled) {

- +            String cryptoPoliciesConfig = new String(Files.readAllBytes(Path.of(CRYPTO_POLICIES_CONFIG)));

- +            if (sdebug != null) { sdebug.println("Crypto config:\n" + cryptoPoliciesConfig); }

- +            Pattern pattern = Pattern.compile("^FIPS$", Pattern.MULTILINE);

- +            return pattern.matcher(cryptoPoliciesConfig).find();

- +        } else {

- +            return false;

- +        }

- +    }

- +}

- diff --git openjdk.orig///src/java.base/share/conf/security/java.security openjdk///src/java.base/share/conf/security/java.security

- --- openjdk.orig/src/java.base/share/conf/security/java.security

- +++ openjdk/src/java.base/share/conf/security/java.security

- @@ -87,6 +87,14 @@

-  #security.provider.tbd=SunPKCS11 ${java.home}/lib/security/nss.cfg

-  

-  #

- +# Security providers used when global crypto-policies are set to FIPS.

- +#

- +fips.provider.1=SunPKCS11 ${java.home}/conf/security/nss.fips.cfg

- +fips.provider.2=SUN

- +fips.provider.3=SunEC

- +fips.provider.4=com.sun.net.ssl.internal.ssl.Provider SunPKCS11-NSS-FIPS

- +

- +#

-  # A list of preferred providers for specific algorithms. These providers will

-  # be searched for matching algorithms before the list of registered providers.

-  # Entries containing errors (parsing, etc) will be ignored. Use the

@@ -1,52 +0,0 @@ 

- diff -r 6efbd7b35a10 src/share/classes/java/security/SystemConfigurator.java

- --- openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java	Mon Mar 02 19:20:17 2020 -0300

- @@ -123,6 +123,33 @@

-                      }

-                      props.put(fipsProviderKey, fipsProviderValue);

-                  }

- +                // Add other security properties

- +                String keystoreTypeValue = (String) props.get("fips.keystore.type");

- +                if (keystoreTypeValue != null) {

- +                    String nonFipsKeystoreType = props.getProperty("keystore.type");

- +                    props.put("keystore.type", keystoreTypeValue);

- +                    if (keystoreTypeValue.equals("PKCS11")) {

- +                    	// If keystore.type is PKCS11, javax.net.ssl.keyStore

- +                    	// must be "NONE". See JDK-8238264.

- +                    	System.setProperty("javax.net.ssl.keyStore", "NONE");

- +                    }

- +                    if (System.getProperty("javax.net.ssl.trustStoreType") == null) {

- +                        // If no trustStoreType has been set, use the

- +                        // previous keystore.type under FIPS mode. In

- +                        // a default configuration, the Trust Store will

- +                        // be 'cacerts' (JKS type).

- +                        System.setProperty("javax.net.ssl.trustStoreType",

- +                                nonFipsKeystoreType);

- +                    }

- +                    if (sdebug != null) {

- +                        sdebug.println("FIPS mode default keystore.type = " +

- +                                keystoreTypeValue);

- +                        sdebug.println("FIPS mode javax.net.ssl.keyStore = " +

- +                        		System.getProperty("javax.net.ssl.keyStore", ""));

- +                        sdebug.println("FIPS mode javax.net.ssl.trustStoreType = " +

- +                                System.getProperty("javax.net.ssl.trustStoreType", ""));

- +                    }

- +                }

-                  loadedProps = true;

-              }

-          } catch (Exception e) {

- diff -r 6efbd7b35a10 src/share/lib/security/java.security-linux

- --- openjdk.orig/src/java.base/share/conf/security/java.security	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/conf/security/java.security	Mon Mar 02 19:20:17 2020 -0300

- @@ -299,6 +299,11 @@

-  keystore.type=pkcs12

-  

-  #

- +# Default keystore type used when global crypto-policies are set to FIPS.

- +#

- +fips.keystore.type=PKCS11

- +

- +#

-  # Controls compatibility mode for JKS and PKCS12 keystore types.

-  #

-  # When set to 'true', both JKS and PKCS12 keystore types support loading

@@ -1,311 +0,0 @@ 

- diff -r bbc65dfa59d1 src/java.base/share/classes/java/security/SystemConfigurator.java

- --- openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java	Sat Aug 01 23:16:51 2020 -0300

- @@ -1,11 +1,13 @@

-  /*

- - * Copyright (c) 2019, Red Hat, Inc.

- + * Copyright (c) 2019, 2020, Red Hat, Inc.

-   *

-   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

-   *

-   * This code is free software; you can redistribute it and/or modify it

-   * under the terms of the GNU General Public License version 2 only, as

- - * published by the Free Software Foundation.

- + * published by the Free Software Foundation.  Oracle designates this

- + * particular file as subject to the "Classpath" exception as provided

- + * by Oracle in the LICENSE file that accompanied this code.

-   *

-   * This code is distributed in the hope that it will be useful, but WITHOUT

-   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

- @@ -34,10 +36,10 @@

-  import java.util.Iterator;

-  import java.util.Map.Entry;

-  import java.util.Properties;

- -import java.util.function.Consumer;

- -import java.util.regex.Matcher;

-  import java.util.regex.Pattern;

-  

- +import jdk.internal.misc.SharedSecrets;

- +import jdk.internal.misc.JavaSecuritySystemConfiguratorAccess;

-  import sun.security.util.Debug;

-  

-  /**

- @@ -47,7 +49,7 @@

-   *

-   */

-  

- -class SystemConfigurator {

- +final class SystemConfigurator {

-  

-      private static final Debug sdebug =

-              Debug.getInstance("properties");

- @@ -61,15 +63,16 @@

-      private static final String CRYPTO_POLICIES_CONFIG =

-              CRYPTO_POLICIES_BASE_DIR + "/config";

-  

- -    private static final class SecurityProviderInfo {

- -        int number;

- -        String key;

- -        String value;

- -        SecurityProviderInfo(int number, String key, String value) {

- -            this.number = number;

- -            this.key = key;

- -            this.value = value;

- -        }

- +    private static boolean systemFipsEnabled = false;

- +

- +    static {

- +        SharedSecrets.setJavaSecuritySystemConfiguratorAccess(

- +            new JavaSecuritySystemConfiguratorAccess() {

- +                @Override

- +                public boolean isSystemFipsEnabled() {

- +                    return SystemConfigurator.isSystemFipsEnabled();

- +                }

- +            });

-      }

-  

-      /*

- @@ -128,9 +131,9 @@

-                      String nonFipsKeystoreType = props.getProperty("keystore.type");

-                      props.put("keystore.type", keystoreTypeValue);

-                      if (keystoreTypeValue.equals("PKCS11")) {

- -                    	// If keystore.type is PKCS11, javax.net.ssl.keyStore

- -                    	// must be "NONE". See JDK-8238264.

- -                    	System.setProperty("javax.net.ssl.keyStore", "NONE");

- +                        // If keystore.type is PKCS11, javax.net.ssl.keyStore

- +                        // must be "NONE". See JDK-8238264.

- +                        System.setProperty("javax.net.ssl.keyStore", "NONE");

-                      }

-                      if (System.getProperty("javax.net.ssl.trustStoreType") == null) {

-                          // If no trustStoreType has been set, use the

- @@ -144,12 +147,13 @@

-                          sdebug.println("FIPS mode default keystore.type = " +

-                                  keystoreTypeValue);

-                          sdebug.println("FIPS mode javax.net.ssl.keyStore = " +

- -                        		System.getProperty("javax.net.ssl.keyStore", ""));

- +                                System.getProperty("javax.net.ssl.keyStore", ""));

-                          sdebug.println("FIPS mode javax.net.ssl.trustStoreType = " +

-                                  System.getProperty("javax.net.ssl.trustStoreType", ""));

-                      }

-                  }

-                  loadedProps = true;

- +                systemFipsEnabled = true;

-              }

-          } catch (Exception e) {

-              if (sdebug != null) {

- @@ -160,13 +164,30 @@

-          return loadedProps;

-      }

-  

- +    /**

- +     * Returns whether or not global system FIPS alignment is enabled.

- +     *

- +     * Value is always 'false' before java.security.Security class is

- +     * initialized.

- +     *

- +     * Call from out of this package through SharedSecrets:

- +     *   SharedSecrets.getJavaSecuritySystemConfiguratorAccess()

- +     *           .isSystemFipsEnabled();

- +     *

- +     * @return  a boolean value indicating whether or not global

- +     *          system FIPS alignment is enabled.

- +     */

- +    static boolean isSystemFipsEnabled() {

- +        return systemFipsEnabled;

- +    }

- +

-      /*

-       * FIPS is enabled only if crypto-policies are set to "FIPS"

-       * and the com.redhat.fips property is true.

-       */

-      private static boolean enableFips() throws Exception {

- -        boolean fipsEnabled = Boolean.valueOf(System.getProperty("com.redhat.fips", "true"));

- -        if (fipsEnabled) {

- +        boolean shouldEnable = Boolean.valueOf(System.getProperty("com.redhat.fips", "true"));

- +        if (shouldEnable) {

-              String cryptoPoliciesConfig = new String(Files.readAllBytes(Path.of(CRYPTO_POLICIES_CONFIG)));

-              if (sdebug != null) { sdebug.println("Crypto config:\n" + cryptoPoliciesConfig); }

-              Pattern pattern = Pattern.compile("^FIPS$", Pattern.MULTILINE);

- diff -r bbc65dfa59d1 src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java

- --- /dev/null	Thu Jan 01 00:00:00 1970 +0000

- +++ openjdk/src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java	Sat Aug 01 23:16:51 2020 -0300

- @@ -0,0 +1,30 @@

- +/*

- + * Copyright (c) 2020, Red Hat, Inc.

- + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

- + *

- + * This code is free software; you can redistribute it and/or modify it

- + * under the terms of the GNU General Public License version 2 only, as

- + * published by the Free Software Foundation.  Oracle designates this

- + * particular file as subject to the "Classpath" exception as provided

- + * by Oracle in the LICENSE file that accompanied this code.

- + *

- + * This code is distributed in the hope that it will be useful, but WITHOUT

- + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

- + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

- + * version 2 for more details (a copy is included in the LICENSE file that

- + * accompanied this code).

- + *

- + * You should have received a copy of the GNU General Public License version

- + * 2 along with this work; if not, write to the Free Software Foundation,

- + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

- + *

- + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

- + * or visit www.oracle.com if you need additional information or have any

- + * questions.

- + */

- +

- +package jdk.internal.misc;

- +

- +public interface JavaSecuritySystemConfiguratorAccess {

- +    boolean isSystemFipsEnabled();

- +}

- diff -r bbc65dfa59d1 src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java

- --- openjdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java	Sat Aug 01 23:16:51 2020 -0300

- @@ -76,6 +76,7 @@

-      private static JavaIORandomAccessFileAccess javaIORandomAccessFileAccess;

-      private static JavaSecuritySignatureAccess javaSecuritySignatureAccess;

-      private static JavaxCryptoSealedObjectAccess javaxCryptoSealedObjectAccess;

- +    private static JavaSecuritySystemConfiguratorAccess javaSecuritySystemConfiguratorAccess;

-  

-      public static JavaUtilJarAccess javaUtilJarAccess() {

-          if (javaUtilJarAccess == null) {

- @@ -361,4 +362,12 @@

-          }

-          return javaxCryptoSealedObjectAccess;

-      }

- +

- +    public static void setJavaSecuritySystemConfiguratorAccess(JavaSecuritySystemConfiguratorAccess jssca) {

- +        javaSecuritySystemConfiguratorAccess = jssca;

- +    }

- +

- +    public static JavaSecuritySystemConfiguratorAccess getJavaSecuritySystemConfiguratorAccess() {

- +        return javaSecuritySystemConfiguratorAccess;

- +    }

-  }

- diff -r bbc65dfa59d1 src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java

- --- openjdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/classes/sun/security/ssl/SSLContextImpl.java	Sat Aug 01 23:16:51 2020 -0300

- @@ -31,6 +31,7 @@

-  import java.security.cert.*;

-  import java.util.*;

-  import javax.net.ssl.*;

- +import jdk.internal.misc.SharedSecrets;

-  import sun.security.action.GetPropertyAction;

-  import sun.security.provider.certpath.AlgorithmChecker;

-  import sun.security.validator.Validator;

- @@ -542,20 +543,38 @@

-  

-          static {

-              if (SunJSSE.isFIPS()) {

- -                supportedProtocols = Arrays.asList(

- -                    ProtocolVersion.TLS13,

- -                    ProtocolVersion.TLS12,

- -                    ProtocolVersion.TLS11,

- -                    ProtocolVersion.TLS10

- -                );

- +                if (SharedSecrets.getJavaSecuritySystemConfiguratorAccess()

- +                        .isSystemFipsEnabled()) {

- +                    // RH1860986: TLSv1.3 key derivation not supported with

- +                    // the Security Providers available in system FIPS mode.

- +                    supportedProtocols = Arrays.asList(

- +                        ProtocolVersion.TLS12,

- +                        ProtocolVersion.TLS11,

- +                        ProtocolVersion.TLS10

- +                    );

-  

- -                serverDefaultProtocols = getAvailableProtocols(

- -                        new ProtocolVersion[] {

- -                    ProtocolVersion.TLS13,

- -                    ProtocolVersion.TLS12,

- -                    ProtocolVersion.TLS11,

- -                    ProtocolVersion.TLS10

- -                });

- +                    serverDefaultProtocols = getAvailableProtocols(

- +                            new ProtocolVersion[] {

- +                        ProtocolVersion.TLS12,

- +                        ProtocolVersion.TLS11,

- +                        ProtocolVersion.TLS10

- +                    });

- +                } else {

- +                    supportedProtocols = Arrays.asList(

- +                        ProtocolVersion.TLS13,

- +                        ProtocolVersion.TLS12,

- +                        ProtocolVersion.TLS11,

- +                        ProtocolVersion.TLS10

- +                    );

- +

- +                    serverDefaultProtocols = getAvailableProtocols(

- +                            new ProtocolVersion[] {

- +                        ProtocolVersion.TLS13,

- +                        ProtocolVersion.TLS12,

- +                        ProtocolVersion.TLS11,

- +                        ProtocolVersion.TLS10

- +                    });

- +                }

-              } else {

-                  supportedProtocols = Arrays.asList(

-                      ProtocolVersion.TLS13,

- @@ -620,6 +639,16 @@

-  

-          static ProtocolVersion[] getSupportedProtocols() {

-              if (SunJSSE.isFIPS()) {

- +                if (SharedSecrets.getJavaSecuritySystemConfiguratorAccess()

- +                        .isSystemFipsEnabled()) {

- +                    // RH1860986: TLSv1.3 key derivation not supported with

- +                    // the Security Providers available in system FIPS mode.

- +                    return new ProtocolVersion[] {

- +                            ProtocolVersion.TLS12,

- +                            ProtocolVersion.TLS11,

- +                            ProtocolVersion.TLS10

- +                    };

- +                }

-                  return new ProtocolVersion[] {

-                          ProtocolVersion.TLS13,

-                          ProtocolVersion.TLS12,

- @@ -949,6 +978,16 @@

-  

-          static ProtocolVersion[] getProtocols() {

-              if (SunJSSE.isFIPS()) {

- +                if (SharedSecrets.getJavaSecuritySystemConfiguratorAccess()

- +                        .isSystemFipsEnabled()) {

- +                    // RH1860986: TLSv1.3 key derivation not supported with

- +                    // the Security Providers available in system FIPS mode.

- +                    return new ProtocolVersion[] {

- +                            ProtocolVersion.TLS12,

- +                            ProtocolVersion.TLS11,

- +                            ProtocolVersion.TLS10

- +                    };

- +                }

-                  return new ProtocolVersion[]{

-                          ProtocolVersion.TLS13,

-                          ProtocolVersion.TLS12,

- diff -r bbc65dfa59d1 src/java.base/share/classes/sun/security/ssl/SunJSSE.java

- --- openjdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java	Thu Jan 23 18:22:31 2020 -0300

- +++ openjdk/src/java.base/share/classes/sun/security/ssl/SunJSSE.java	Sat Aug 01 23:16:51 2020 -0300

- @@ -27,6 +27,8 @@

-  

-  import java.security.*;

-  import java.util.*;

- +

- +import jdk.internal.misc.SharedSecrets;

-  import sun.security.rsa.SunRsaSignEntries;

-  import static sun.security.util.SecurityConstants.PROVIDER_VER;

-  import static sun.security.provider.SunEntries.createAliases;

- @@ -195,8 +197,13 @@

-              "sun.security.ssl.SSLContextImpl$TLS11Context", null, null);

-          ps("SSLContext", "TLSv1.2",

-              "sun.security.ssl.SSLContextImpl$TLS12Context", null, null);

- -        ps("SSLContext", "TLSv1.3",

- -            "sun.security.ssl.SSLContextImpl$TLS13Context", null, null);

- +        if (!SharedSecrets.getJavaSecuritySystemConfiguratorAccess()

- +                .isSystemFipsEnabled()) {

- +            // RH1860986: TLSv1.3 key derivation not supported with

- +            // the Security Providers available in system FIPS mode.

- +            ps("SSLContext", "TLSv1.3",

- +                "sun.security.ssl.SSLContextImpl$TLS13Context", null, null);

- +        }

-          ps("SSLContext", "TLS",

-              "sun.security.ssl.SSLContextImpl$TLSContext",

-              (isfips? null : createAliases("SSL")), null);

@@ -1,68 +0,0 @@ 

- diff --git openjdk.orig/src/java.base/share/classes/java/security/Security.java openjdk/src/java.base/share/classes/java/security/Security.java

- --- openjdk.orig/src/java.base/share/classes/java/security/Security.java

- +++ openjdk/src/java.base/share/classes/java/security/Security.java

- @@ -32,6 +32,7 @@

-  

-  import jdk.internal.event.EventHelper;

-  import jdk.internal.event.SecurityPropertyModificationEvent;

- +import jdk.internal.misc.JavaSecuritySystemConfiguratorAccess;

-  import jdk.internal.misc.SharedSecrets;

-  import jdk.internal.util.StaticProperty;

-  import sun.security.util.Debug;

- @@ -74,6 +75,15 @@

-      }

-  

-      static {

- +        // Initialise here as used by code with system properties disabled

- +        SharedSecrets.setJavaSecuritySystemConfiguratorAccess(

- +            new JavaSecuritySystemConfiguratorAccess() {

- +                @Override

- +                public boolean isSystemFipsEnabled() {

- +                    return SystemConfigurator.isSystemFipsEnabled();

- +                }

- +            });

- +

-          // doPrivileged here because there are multiple

-          // things in initialize that might require privs.

-          // (the FileInputStream call and the File.exists call,

- @@ -193,9 +203,8 @@

-          }

-  

-          String disableSystemProps = System.getProperty("java.security.disableSystemPropertiesFile");

- -        if (disableSystemProps == null &&

- -            "true".equalsIgnoreCase(props.getProperty

- -                ("security.useSystemPropertiesFile"))) {

- +        if ((disableSystemProps == null || "false".equalsIgnoreCase(disableSystemProps)) &&

- +            "true".equalsIgnoreCase(props.getProperty("security.useSystemPropertiesFile"))) {

-              if (SystemConfigurator.configure(props)) {

-                  loadedProps = true;

-              }

- diff --git openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- --- openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- @@ -38,8 +38,6 @@

-  import java.util.Properties;

-  import java.util.regex.Pattern;

-  

- -import jdk.internal.misc.SharedSecrets;

- -import jdk.internal.misc.JavaSecuritySystemConfiguratorAccess;

-  import sun.security.util.Debug;

-  

-  /**

- @@ -65,16 +63,6 @@

-  

-      private static boolean systemFipsEnabled = false;

-  

- -    static {

- -        SharedSecrets.setJavaSecuritySystemConfiguratorAccess(

- -            new JavaSecuritySystemConfiguratorAccess() {

- -                @Override

- -                public boolean isSystemFipsEnabled() {

- -                    return SystemConfigurator.isSystemFipsEnabled();

- -                }

- -            });

- -    }

- -

-      /*

-       * Invoked when java.security.Security class is initialized, if

-       * java.security.disableSystemPropertiesFile property is not set and

@@ -1,430 +0,0 @@ 

- diff --git openjdk.orig/make/autoconf/libraries.m4 openjdk/make/autoconf/libraries.m4

- --- openjdk.orig/make/autoconf/libraries.m4

- +++ openjdk/make/autoconf/libraries.m4

- @@ -101,6 +101,7 @@

-    LIB_SETUP_LIBFFI

-    LIB_SETUP_BUNDLED_LIBS

-    LIB_SETUP_MISC_LIBS

- +  LIB_SETUP_SYSCONF_LIBS

-    LIB_SETUP_SOLARIS_STLPORT

-    LIB_TESTS_SETUP_GRAALUNIT

-  

- @@ -223,3 +224,62 @@

-    fi

-  ])

-  

- +################################################################################

- +# Setup system configuration libraries

- +################################################################################

- +AC_DEFUN_ONCE([LIB_SETUP_SYSCONF_LIBS],

- +[

- +  ###############################################################################

- +  #

- +  # Check for the NSS library

- +  #

- +

- +  AC_MSG_CHECKING([whether to use the system NSS library with the System Configurator (libsysconf)])

- +

- +  # default is not available

- +  DEFAULT_SYSCONF_NSS=no

- +

- +  AC_ARG_ENABLE([sysconf-nss], [AS_HELP_STRING([--enable-sysconf-nss],

- +     [build the System Configurator (libsysconf) using the system NSS library if available @<:@disabled@:>@])],

- +  [

- +    case "${enableval}" in

- +      yes)

- +        sysconf_nss=yes

- +        ;;

- +      *)

- +        sysconf_nss=no

- +        ;;

- +    esac

- +  ],

- +  [

- +    sysconf_nss=${DEFAULT_SYSCONF_NSS}

- +  ])

- +  AC_MSG_RESULT([$sysconf_nss])

- +

- +  USE_SYSCONF_NSS=false

- +  if test "x${sysconf_nss}" = "xyes"; then

- +      PKG_CHECK_MODULES(NSS, nss >= 3.53, [NSS_FOUND=yes], [NSS_FOUND=no])

- +      if test "x${NSS_FOUND}" = "xyes"; then

- +         AC_MSG_CHECKING([for system FIPS support in NSS])

- +         saved_libs="${LIBS}"

- +         saved_cflags="${CFLAGS}"

- +         CFLAGS="${CFLAGS} ${NSS_CFLAGS}"

- +         LIBS="${LIBS} ${NSS_LIBS}"

- +         AC_LANG_PUSH([C])

- +         AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <nss3/pk11pub.h>]],

- +                                         [[SECMOD_GetSystemFIPSEnabled()]])],

- +                        [AC_MSG_RESULT([yes])],

- +                        [AC_MSG_RESULT([no])

- +                        AC_MSG_ERROR([System NSS FIPS detection unavailable])])

- +         AC_LANG_POP([C])

- +         CFLAGS="${saved_cflags}"

- +         LIBS="${saved_libs}"

- +         USE_SYSCONF_NSS=true

- +      else

- +         dnl NSS 3.53 is the one that introduces the SECMOD_GetSystemFIPSEnabled API

- +         dnl in nss3/pk11pub.h.

- +         AC_MSG_ERROR([--enable-sysconf-nss specified, but NSS 3.53 or above not found.])

- +      fi

- +  fi

- +  AC_SUBST(USE_SYSCONF_NSS)

- +])

- diff --git openjdk.orig/make/autoconf/spec.gmk.in openjdk/make/autoconf/spec.gmk.in

- --- openjdk.orig/make/autoconf/spec.gmk.in

- +++ openjdk/make/autoconf/spec.gmk.in

- @@ -828,6 +828,10 @@

-  # Libraries

-  #

-  

- +USE_SYSCONF_NSS:=@USE_SYSCONF_NSS@

- +NSS_LIBS:=@NSS_LIBS@

- +NSS_CFLAGS:=@NSS_CFLAGS@

- +

-  USE_EXTERNAL_LCMS:=@USE_EXTERNAL_LCMS@

-  LCMS_CFLAGS:=@LCMS_CFLAGS@

-  LCMS_LIBS:=@LCMS_LIBS@

- diff --git openjdk.orig/make/lib/Lib-java.base.gmk openjdk/make/lib/Lib-java.base.gmk

- --- openjdk.orig/make/lib/Lib-java.base.gmk

- +++ openjdk/make/lib/Lib-java.base.gmk

- @@ -179,6 +179,31 @@

-  endif

-  

-  ################################################################################

- +# Create the systemconf library

- +

- +LIBSYSTEMCONF_CFLAGS :=

- +LIBSYSTEMCONF_CXXFLAGS :=

- +

- +ifeq ($(USE_SYSCONF_NSS), true)

- +  LIBSYSTEMCONF_CFLAGS += $(NSS_CFLAGS) -DSYSCONF_NSS

- +  LIBSYSTEMCONF_CXXFLAGS += $(NSS_CFLAGS) -DSYSCONF_NSS

- +endif

- +

- +ifeq ($(OPENJDK_BUILD_OS), linux)

- +  $(eval $(call SetupJdkLibrary, BUILD_LIBSYSTEMCONF, \

- +      NAME := systemconf, \

- +      OPTIMIZATION := LOW, \

- +      CFLAGS := $(CFLAGS_JDKLIB) $(LIBSYSTEMCONF_CFLAGS), \

- +      CXXFLAGS := $(CXXFLAGS_JDKLIB) $(LIBSYSTEMCONF_CXXFLAGS), \

- +      LDFLAGS := $(LDFLAGS_JDKLIB) \

- +          $(call SET_SHARED_LIBRARY_ORIGIN), \

- +      LIBS_unix := $(LIBDL) $(NSS_LIBS), \

- +  ))

- +

- +  TARGETS += $(BUILD_LIBSYSTEMCONF)

- +endif

- +

- +################################################################################

-  # Create the symbols file for static builds.

-  

-  ifeq ($(STATIC_BUILD), true)

- diff --git openjdk.orig/make/nb_native/nbproject/configurations.xml openjdk/make/nb_native/nbproject/configurations.xml

- --- openjdk.orig/make/nb_native/nbproject/configurations.xml

- +++ openjdk/make/nb_native/nbproject/configurations.xml

- @@ -2950,6 +2950,9 @@

-                    <in>LinuxWatchService.c</in>

-                  </df>

-                </df>

- +              <df name="libsystemconf">

- +                <in>systemconf.c</in>

- +              </df>

-              </df>

-            </df>

-            <df name="macosx">

- @@ -29301,6 +29304,11 @@

-              tool="0"

-              flavor2="0">

-        </item>

- +      <item path="../../src/java.base/linux/native/libsystemconf/systemconf.c"

- +            ex="false"

- +            tool="0"

- +            flavor2="0">

- +      </item>

-        <item path="../../src/java.base/macosx/native/include/jni_md.h"

-              ex="false"

-              tool="3"

- diff --git openjdk.orig/make/scripts/compare_exceptions.sh.incl openjdk/make/scripts/compare_exceptions.sh.incl

- --- openjdk.orig/make/scripts/compare_exceptions.sh.incl

- +++ openjdk/make/scripts/compare_exceptions.sh.incl

- @@ -179,6 +179,7 @@

-        ./lib/libsplashscreen.so

-        ./lib/libsunec.so

-        ./lib/libsunwjdga.so

- +      ./lib/libsystemconf.so

-        ./lib/libunpack.so

-        ./lib/libverify.so

-        ./lib/libzip.so

- @@ -289,6 +290,7 @@

-        ./lib/libsplashscreen.so

-        ./lib/libsunec.so

-        ./lib/libsunwjdga.so

- +      ./lib/libsystemconf.so

-        ./lib/libunpack.so

-        ./lib/libverify.so

-        ./lib/libzip.so

- diff --git openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- new file mode 100644

- --- /dev/null

- +++ openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- @@ -0,0 +1,168 @@

- +/*

- + * Copyright (c) 2021, Red Hat, Inc.

- + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

- + *

- + * This code is free software; you can redistribute it and/or modify it

- + * under the terms of the GNU General Public License version 2 only, as

- + * published by the Free Software Foundation.  Oracle designates this

- + * particular file as subject to the "Classpath" exception as provided

- + * by Oracle in the LICENSE file that accompanied this code.

- + *

- + * This code is distributed in the hope that it will be useful, but WITHOUT

- + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

- + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

- + * version 2 for more details (a copy is included in the LICENSE file that

- + * accompanied this code).

- + *

- + * You should have received a copy of the GNU General Public License version

- + * 2 along with this work; if not, write to the Free Software Foundation,

- + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

- + *

- + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

- + * or visit www.oracle.com if you need additional information or have any

- + * questions.

- + */

- +

- +#include <dlfcn.h>

- +#include <jni.h>

- +#include <jni_util.h>

- +#include <stdio.h>

- +

- +#ifdef SYSCONF_NSS

- +#include <nss3/pk11pub.h>

- +#endif //SYSCONF_NSS

- +

- +#include "java_security_SystemConfigurator.h"

- +

- +#define FIPS_ENABLED_PATH "/proc/sys/crypto/fips_enabled"

- +#define MSG_MAX_SIZE 96

- +

- +static jmethodID debugPrintlnMethodID = NULL;

- +static jobject debugObj = NULL;

- +

- +static void throwIOException(JNIEnv *env, const char *msg);

- +static void dbgPrint(JNIEnv *env, const char* msg);

- +

- +/*

- + * Class:     java_security_SystemConfigurator

- + * Method:    JNI_OnLoad

- + */

- +JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved)

- +{

- +    JNIEnv *env;

- +    jclass sysConfCls, debugCls;

- +    jfieldID sdebugFld;

- +

- +    if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_2) != JNI_OK) {

- +        return JNI_EVERSION; /* JNI version not supported */

- +    }

- +

- +    sysConfCls = (*env)->FindClass(env,"java/security/SystemConfigurator");

- +    if (sysConfCls == NULL) {

- +        printf("libsystemconf: SystemConfigurator class not found\n");

- +        return JNI_ERR;

- +    }

- +    sdebugFld = (*env)->GetStaticFieldID(env, sysConfCls,

- +            "sdebug", "Lsun/security/util/Debug;");

- +    if (sdebugFld == NULL) {

- +        printf("libsystemconf: SystemConfigurator::sdebug field not found\n");

- +        return JNI_ERR;

- +    }

- +    debugObj = (*env)->GetStaticObjectField(env, sysConfCls, sdebugFld);

- +    if (debugObj != NULL) {

- +        debugCls = (*env)->FindClass(env,"sun/security/util/Debug");

- +        if (debugCls == NULL) {

- +            printf("libsystemconf: Debug class not found\n");

- +            return JNI_ERR;

- +        }

- +        debugPrintlnMethodID = (*env)->GetMethodID(env, debugCls,

- +                "println", "(Ljava/lang/String;)V");

- +        if (debugPrintlnMethodID == NULL) {

- +            printf("libsystemconf: Debug::println(String) method not found\n");

- +            return JNI_ERR;

- +        }

- +        debugObj = (*env)->NewGlobalRef(env, debugObj);

- +    }

- +

- +    return (*env)->GetVersion(env);

- +}

- +

- +/*

- + * Class:     java_security_SystemConfigurator

- + * Method:    JNI_OnUnload

- + */

- +JNIEXPORT void JNICALL DEF_JNI_OnUnload(JavaVM *vm, void *reserved)

- +{

- +    JNIEnv *env;

- +

- +    if (debugObj != NULL) {

- +        if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_2) != JNI_OK) {

- +            return; /* Should not happen */

- +        }

- +        (*env)->DeleteGlobalRef(env, debugObj);

- +    }

- +}

- +

- +JNIEXPORT jboolean JNICALL Java_java_security_SystemConfigurator_getSystemFIPSEnabled

- +  (JNIEnv *env, jclass cls)

- +{

- +    int fips_enabled;

- +    char msg[MSG_MAX_SIZE];

- +    int msg_bytes;

- +

- +#ifdef SYSCONF_NSS

- +

- +    dbgPrint(env, "getSystemFIPSEnabled: calling SECMOD_GetSystemFIPSEnabled");

- +    fips_enabled = SECMOD_GetSystemFIPSEnabled();

- +    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:" \

- +            " SECMOD_GetSystemFIPSEnabled returned 0x%x", fips_enabled);

- +    if (msg_bytes > 0 && msg_bytes < MSG_MAX_SIZE) {

- +        dbgPrint(env, msg);

- +    } else {

- +        dbgPrint(env, "getSystemFIPSEnabled: cannot render" \

- +                " SECMOD_GetSystemFIPSEnabled return value");

- +    }

- +    return (fips_enabled == 1 ? JNI_TRUE : JNI_FALSE);

- +

- +#else // SYSCONF_NSS

- +

- +    FILE *fe;

- +

- +    dbgPrint(env, "getSystemFIPSEnabled: reading " FIPS_ENABLED_PATH);

- +    if ((fe = fopen(FIPS_ENABLED_PATH, "r")) == NULL) {

- +        throwIOException(env, "Cannot open " FIPS_ENABLED_PATH);

- +    }

- +    fips_enabled = fgetc(fe);

- +    fclose(fe);

- +    if (fips_enabled == EOF) {

- +        throwIOException(env, "Cannot read " FIPS_ENABLED_PATH);

- +    }

- +    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:" \

- +            " read character is '%c'", fips_enabled);

- +    if (msg_bytes > 0 && msg_bytes < MSG_MAX_SIZE) {

- +        dbgPrint(env, msg);

- +    } else {

- +        dbgPrint(env, "getSystemFIPSEnabled: cannot render" \

- +                " read character");

- +    }

- +    return (fips_enabled == '1' ? JNI_TRUE : JNI_FALSE);

- +

- +#endif // SYSCONF_NSS

- +}

- +

- +static void throwIOException(JNIEnv *env, const char *msg)

- +{

- +    jclass cls = (*env)->FindClass(env, "java/io/IOException");

- +    if (cls != 0)

- +        (*env)->ThrowNew(env, cls, msg);

- +}

- +

- +static void dbgPrint(JNIEnv *env, const char* msg)

- +{

- +    jstring jMsg;

- +    if (debugObj != NULL) {

- +        jMsg = (*env)->NewStringUTF(env, msg);

- +        CHECK_NULL(jMsg);

- +        (*env)->CallVoidMethod(env, debugObj, debugPrintlnMethodID, jMsg);

- +    }

- +}

- diff --git openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- --- openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- @@ -1,5 +1,5 @@

-  /*

- - * Copyright (c) 2019, 2020, Red Hat, Inc.

- + * Copyright (c) 2019, 2021, Red Hat, Inc.

-   *

-   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

-   *

- @@ -30,13 +30,9 @@

-  import java.io.FileInputStream;

-  import java.io.IOException;

-  

- -import java.nio.file.Files;

- -import java.nio.file.Path;

- -

-  import java.util.Iterator;

-  import java.util.Map.Entry;

-  import java.util.Properties;

- -import java.util.regex.Pattern;

-  

-  import sun.security.util.Debug;

-  

- @@ -58,10 +54,21 @@

-      private static final String CRYPTO_POLICIES_JAVA_CONFIG =

-              CRYPTO_POLICIES_BASE_DIR + "/back-ends/java.config";

-  

- -    private static final String CRYPTO_POLICIES_CONFIG =

- -            CRYPTO_POLICIES_BASE_DIR + "/config";

- +    private static boolean systemFipsEnabled = false;

- +

- +    private static final String SYSTEMCONF_NATIVE_LIB = "systemconf";

- +

- +    private static native boolean getSystemFIPSEnabled()

- +            throws IOException;

-  

- -    private static boolean systemFipsEnabled = false;

- +    static {

- +        AccessController.doPrivileged(new PrivilegedAction<Void>() {

- +            public Void run() {

- +                System.loadLibrary(SYSTEMCONF_NATIVE_LIB);

- +                return null;

- +            }

- +        });

- +    }

-  

-      /*

-       * Invoked when java.security.Security class is initialized, if

- @@ -170,16 +177,34 @@

-      }

-  

-      /*

- -     * FIPS is enabled only if crypto-policies are set to "FIPS"

- -     * and the com.redhat.fips property is true.

- +     * OpenJDK FIPS mode will be enabled only if the com.redhat.fips

- +     * system property is true (default) and the system is in FIPS mode.

- +     *

- +     * There are 2 possible ways in which OpenJDK detects that the system

- +     * is in FIPS mode: 1) if the NSS SECMOD_GetSystemFIPSEnabled API is

- +     * available at OpenJDK's built-time, it is called; 2) otherwise, the

- +     * /proc/sys/crypto/fips_enabled file is read.

-       */

-      private static boolean enableFips() throws Exception {

-          boolean shouldEnable = Boolean.valueOf(System.getProperty("com.redhat.fips", "true"));

-          if (shouldEnable) {

- -            String cryptoPoliciesConfig = new String(Files.readAllBytes(Path.of(CRYPTO_POLICIES_CONFIG)));

- -            if (sdebug != null) { sdebug.println("Crypto config:\n" + cryptoPoliciesConfig); }

- -            Pattern pattern = Pattern.compile("^FIPS$", Pattern.MULTILINE);

- -            return pattern.matcher(cryptoPoliciesConfig).find();

- +            if (sdebug != null) {

- +                sdebug.println("Calling getSystemFIPSEnabled (libsystemconf)...");

- +            }

- +            try {

- +                shouldEnable = getSystemFIPSEnabled();

- +                if (sdebug != null) {

- +                    sdebug.println("Call to getSystemFIPSEnabled (libsystemconf) returned: "

- +                            + shouldEnable);

- +                }

- +                return shouldEnable;

- +            } catch (IOException e) {

- +                if (sdebug != null) {

- +                    sdebug.println("Call to getSystemFIPSEnabled (libsystemconf) failed:");

- +                    sdebug.println(e.getMessage());

- +                }

- +                throw e;

- +            }

-          } else {

-              return false;

-          }

@@ -1,590 +0,0 @@ 

- diff --git openjdk.orig/src/java.base/share/classes/java/security/Security.java openjdk/src/java.base/share/classes/java/security/Security.java

- index 53f32d12cc..28ab184617 100644

- --- openjdk.orig/src/java.base/share/classes/java/security/Security.java

- +++ openjdk/src/java.base/share/classes/java/security/Security.java

- @@ -82,6 +82,10 @@ public final class Security {

-                  public boolean isSystemFipsEnabled() {

-                      return SystemConfigurator.isSystemFipsEnabled();

-                  }

- +                @Override

- +                public boolean isPlainKeySupportEnabled() {

- +                    return SystemConfigurator.isPlainKeySupportEnabled();

- +                }

-              });

-  

-          // doPrivileged here because there are multiple

- diff --git openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- index 5565acb7c6..874c6221eb 100644

- --- openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- @@ -55,6 +55,7 @@ final class SystemConfigurator {

-              CRYPTO_POLICIES_BASE_DIR + "/back-ends/java.config";

-  

-      private static boolean systemFipsEnabled = false;

- +    private static boolean plainKeySupportEnabled = false;

-  

-      private static final String SYSTEMCONF_NATIVE_LIB = "systemconf";

-  

- @@ -149,6 +150,16 @@ final class SystemConfigurator {

-                  }

-                  loadedProps = true;

-                  systemFipsEnabled = true;

- +                String plainKeySupport = System.getProperty("com.redhat.fips.plainKeySupport",

- +                                                            "true");

- +                plainKeySupportEnabled = !"false".equals(plainKeySupport);

- +                if (sdebug != null) {

- +                    if (plainKeySupportEnabled) {

- +                        sdebug.println("FIPS support enabled with plain key support");

- +                    } else {

- +                        sdebug.println("FIPS support enabled without plain key support");

- +                    }

- +                }

-              }

-          } catch (Exception e) {

-              if (sdebug != null) {

- @@ -176,6 +187,19 @@ final class SystemConfigurator {

-          return systemFipsEnabled;

-      }

-  

- +    /**

- +     * Returns {@code true} if system FIPS alignment is enabled

- +     * and plain key support is allowed.  Plain key support is

- +     * enabled by default but can be disabled with

- +     * {@code -Dcom.redhat.fips.plainKeySupport=false}.

- +     *

- +     * @return a boolean indicating whether plain key support

- +     *         should be enabled.

- +     */

- +    static boolean isPlainKeySupportEnabled() {

- +        return plainKeySupportEnabled;

- +    }

- +

-      /*

-       * OpenJDK FIPS mode will be enabled only if the com.redhat.fips

-       * system property is true (default) and the system is in FIPS mode.

- diff --git openjdk.orig/src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java openjdk/src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java

- index d8caa5640c..21bc6d0b59 100644

- --- openjdk.orig/src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java

- +++ openjdk/src/java.base/share/classes/jdk/internal/misc/JavaSecuritySystemConfiguratorAccess.java

- @@ -27,4 +27,5 @@ package jdk.internal.misc;

-  

-  public interface JavaSecuritySystemConfiguratorAccess {

-      boolean isSystemFipsEnabled();

- +    boolean isPlainKeySupportEnabled();

-  }

- diff --git openjdk.orig/src/java.base/share/classes/sun/security/ssl/KeyManagerFactoryImpl.java openjdk/src/java.base/share/classes/sun/security/ssl/KeyManagerFactoryImpl.java

- index ffee2c1603..ff3d5e0e4a 100644

- --- openjdk.orig/src/java.base/share/classes/sun/security/ssl/KeyManagerFactoryImpl.java

- +++ openjdk/src/java.base/share/classes/sun/security/ssl/KeyManagerFactoryImpl.java

- @@ -33,8 +33,13 @@ import java.security.KeyStore.*;

-  

-  import javax.net.ssl.*;

-  

- +import jdk.internal.misc.SharedSecrets;

- +

-  abstract class KeyManagerFactoryImpl extends KeyManagerFactorySpi {

-  

- +    private static final boolean plainKeySupportEnabled = SharedSecrets

- +            .getJavaSecuritySystemConfiguratorAccess().isPlainKeySupportEnabled();

- +

-      X509ExtendedKeyManager keyManager;

-      boolean isInitialized;

-  

- @@ -62,7 +67,8 @@ abstract class KeyManagerFactoryImpl extends KeyManagerFactorySpi {

-                  KeyStoreException, NoSuchAlgorithmException,

-                  UnrecoverableKeyException {

-              if ((ks != null) && SunJSSE.isFIPS()) {

- -                if (ks.getProvider() != SunJSSE.cryptoProvider) {

- +                if (ks.getProvider() != SunJSSE.cryptoProvider &&

- +                        !plainKeySupportEnabled) {

-                      throw new KeyStoreException("FIPS mode: KeyStore must be "

-                          + "from provider " + SunJSSE.cryptoProvider.getName());

-                  }

- @@ -91,8 +97,8 @@ abstract class KeyManagerFactoryImpl extends KeyManagerFactorySpi {

-                  keyManager = new X509KeyManagerImpl(

-                          Collections.<Builder>emptyList());

-              } else {

- -                if (SunJSSE.isFIPS() &&

- -                        (ks.getProvider() != SunJSSE.cryptoProvider)) {

- +                if (SunJSSE.isFIPS() && (ks.getProvider() != SunJSSE.cryptoProvider)

- +                        && !plainKeySupportEnabled) {

-                      throw new KeyStoreException(

-                          "FIPS mode: KeyStore must be " +

-                          "from provider " + SunJSSE.cryptoProvider.getName());

- diff --git openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/FIPSKeyImporter.java openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/FIPSKeyImporter.java

- new file mode 100644

- index 0000000000..b848a1fd78

- --- /dev/null

- +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/FIPSKeyImporter.java

- @@ -0,0 +1,290 @@

- +/*

- + * Copyright (c) 2021, Red Hat, Inc.

- + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.

- + *

- + * This code is free software; you can redistribute it and/or modify it

- + * under the terms of the GNU General Public License version 2 only, as

- + * published by the Free Software Foundation.  Oracle designates this

- + * particular file as subject to the "Classpath" exception as provided

- + * by Oracle in the LICENSE file that accompanied this code.

- + *

- + * This code is distributed in the hope that it will be useful, but WITHOUT

- + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or

- + * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License

- + * version 2 for more details (a copy is included in the LICENSE file that

- + * accompanied this code).

- + *

- + * You should have received a copy of the GNU General Public License version

- + * 2 along with this work; if not, write to the Free Software Foundation,

- + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.

- + *

- + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA

- + * or visit www.oracle.com if you need additional information or have any

- + * questions.

- + */

- +

- +package sun.security.pkcs11;

- +

- +import java.math.BigInteger;

- +import java.security.KeyFactory;

- +import java.security.Provider;

- +import java.security.Security;

- +import java.util.HashMap;

- +import java.util.Map;

- +import java.util.concurrent.locks.ReentrantLock;

- +

- +import javax.crypto.Cipher;

- +import javax.crypto.spec.DHPrivateKeySpec;

- +import javax.crypto.spec.IvParameterSpec;

- +

- +import sun.security.jca.JCAUtil;

- +import sun.security.pkcs11.TemplateManager;

- +import sun.security.pkcs11.wrapper.CK_ATTRIBUTE;

- +import sun.security.pkcs11.wrapper.CK_MECHANISM;

- +import static sun.security.pkcs11.wrapper.PKCS11Constants.*;

- +import sun.security.pkcs11.wrapper.PKCS11Exception;

- +import sun.security.rsa.RSAUtil.KeyType;

- +import sun.security.util.Debug;

- +import sun.security.util.ECUtil;

- +

- +final class FIPSKeyImporter {

- +

- +    private static final Debug debug =

- +            Debug.getInstance("sunpkcs11");

- +

- +    private static P11Key importerKey = null;

- +    private static final ReentrantLock importerKeyLock = new ReentrantLock();

- +    private static CK_MECHANISM importerKeyMechanism = null;

- +    private static Cipher importerCipher = null;

- +

- +    private static Provider sunECProvider = null;

- +    private static final ReentrantLock sunECProviderLock = new ReentrantLock();

- +

- +    private static KeyFactory DHKF = null;

- +    private static final ReentrantLock DHKFLock = new ReentrantLock();

- +

- +    static Long importKey(SunPKCS11 sunPKCS11, long hSession, CK_ATTRIBUTE[] attributes)

- +            throws PKCS11Exception {

- +        long keyID = -1;

- +        Token token = sunPKCS11.getToken();

- +        if (debug != null) {

- +            debug.println("Private or Secret key will be imported in" +

- +                    " system FIPS mode.");

- +        }

- +        if (importerKey == null) {

- +            importerKeyLock.lock();

- +            try {

- +                if (importerKey == null) {

- +                    if (importerKeyMechanism == null) {

- +                        // Importer Key creation has not been tried yet. Try it.

- +                        createImporterKey(token);

- +                    }

- +                    if (importerKey == null || importerCipher == null) {

- +                        if (debug != null) {

- +                            debug.println("Importer Key could not be" +

- +                                    " generated.");

- +                        }

- +                        throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +                    }

- +                    if (debug != null) {

- +                        debug.println("Importer Key successfully" +

- +                                " generated.");

- +                    }

- +                }

- +            } finally {

- +                importerKeyLock.unlock();

- +            }

- +        }

- +        long importerKeyID = importerKey.getKeyID();

- +        try {

- +            byte[] keyBytes = null;

- +            byte[] encKeyBytes = null;

- +            long keyClass = 0L;

- +            long keyType = 0L;

- +            Map<Long, CK_ATTRIBUTE> attrsMap = new HashMap<>();

- +            for (CK_ATTRIBUTE attr : attributes) {

- +                if (attr.type == CKA_CLASS) {

- +                    keyClass = attr.getLong();

- +                } else if (attr.type == CKA_KEY_TYPE) {

- +                    keyType = attr.getLong();

- +                }

- +                attrsMap.put(attr.type, attr);

- +            }

- +            BigInteger v = null;

- +            if (keyClass == CKO_PRIVATE_KEY) {

- +                if (keyType == CKK_RSA) {

- +                    if (debug != null) {

- +                        debug.println("Importing an RSA private key...");

- +                    }

- +                    keyBytes = sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(

- +                            KeyType.RSA,

- +                            null,

- +                            ((v = attrsMap.get(CKA_MODULUS).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PUBLIC_EXPONENT).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PRIVATE_EXPONENT).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PRIME_1).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PRIME_2).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_EXPONENT_1).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_EXPONENT_2).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_COEFFICIENT).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO

- +                            ).getEncoded();

- +                } else if (keyType == CKK_DSA) {

- +                    if (debug != null) {

- +                        debug.println("Importing a DSA private key...");

- +                    }

- +                    keyBytes = new sun.security.provider.DSAPrivateKey(

- +                            ((v = attrsMap.get(CKA_VALUE).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PRIME).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_SUBPRIME).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_BASE).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO

- +                            ).getEncoded();

- +                    if (token.config.getNssNetscapeDbWorkaround() &&

- +                            attrsMap.get(CKA_NETSCAPE_DB) == null) {

- +                        attrsMap.put(CKA_NETSCAPE_DB,

- +                                new CK_ATTRIBUTE(CKA_NETSCAPE_DB, BigInteger.ZERO));

- +                    }

- +                } else if (keyType == CKK_EC) {

- +                    if (debug != null) {

- +                        debug.println("Importing an EC private key...");

- +                    }

- +                    if (sunECProvider == null) {

- +                        sunECProviderLock.lock();

- +                        try {

- +                            if (sunECProvider == null) {

- +                                sunECProvider = Security.getProvider("SunEC");

- +                            }

- +                        } finally {

- +                            sunECProviderLock.unlock();

- +                        }

- +                    }

- +                    keyBytes = ECUtil.generateECPrivateKey(

- +                            ((v = attrsMap.get(CKA_VALUE).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ECUtil.getECParameterSpec(sunECProvider,

- +                                    attrsMap.get(CKA_EC_PARAMS).getByteArray()))

- +                            .getEncoded();

- +                    if (token.config.getNssNetscapeDbWorkaround() &&

- +                            attrsMap.get(CKA_NETSCAPE_DB) == null) {

- +                        attrsMap.put(CKA_NETSCAPE_DB,

- +                                new CK_ATTRIBUTE(CKA_NETSCAPE_DB, BigInteger.ZERO));

- +                    }

- +                } else if (keyType == CKK_DH) {

- +                    if (debug != null) {

- +                        debug.println("Importing a Diffie-Hellman private key...");

- +                    }

- +                    if (DHKF == null) {

- +                        DHKFLock.lock();

- +                        try {

- +                            if (DHKF == null) {

- +                                DHKF = KeyFactory.getInstance(

- +                                        "DH", P11Util.getSunJceProvider());

- +                            }

- +                        } finally {

- +                            DHKFLock.unlock();

- +                        }

- +                    }

- +                    DHPrivateKeySpec spec = new DHPrivateKeySpec

- +                            (((v = attrsMap.get(CKA_VALUE).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_PRIME).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO,

- +                            ((v = attrsMap.get(CKA_BASE).getBigInteger()) != null)

- +                                    ? v : BigInteger.ZERO);

- +                    keyBytes = DHKF.generatePrivate(spec).getEncoded();

- +                    if (token.config.getNssNetscapeDbWorkaround() &&

- +                            attrsMap.get(CKA_NETSCAPE_DB) == null) {

- +                        attrsMap.put(CKA_NETSCAPE_DB,

- +                                new CK_ATTRIBUTE(CKA_NETSCAPE_DB, BigInteger.ZERO));

- +                    }

- +                } else {

- +                    if (debug != null) {

- +                        debug.println("Unrecognized private key type.");

- +                    }

- +                    throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +                }

- +            } else if (keyClass == CKO_SECRET_KEY) {

- +                if (debug != null) {

- +                    debug.println("Importing a secret key...");

- +                }

- +                keyBytes = attrsMap.get(CKA_VALUE).getByteArray();

- +            }

- +            if (keyBytes == null || keyBytes.length == 0) {

- +                if (debug != null) {

- +                    debug.println("Private or secret key plain bytes could" +

- +                            " not be obtained. Import failed.");

- +                }

- +                throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +            }

- +            importerCipher.init(Cipher.ENCRYPT_MODE, importerKey,

- +                    new IvParameterSpec((byte[])importerKeyMechanism.pParameter),

- +                    null);

- +            attributes = new CK_ATTRIBUTE[attrsMap.size()];

- +            attrsMap.values().toArray(attributes);

- +            encKeyBytes = importerCipher.doFinal(keyBytes);

- +            attributes = token.getAttributes(TemplateManager.O_IMPORT,

- +                    keyClass, keyType, attributes);

- +            keyID = token.p11.C_UnwrapKey(hSession,

- +                    importerKeyMechanism, importerKeyID, encKeyBytes, attributes);

- +            if (debug != null) {

- +                debug.println("Imported key ID: " + keyID);

- +            }

- +        } catch (Throwable t) {

- +            throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +        } finally {

- +            importerKey.releaseKeyID();

- +        }

- +        return Long.valueOf(keyID);

- +    }

- +

- +    private static void createImporterKey(Token token) {

- +        if (debug != null) {

- +            debug.println("Generating Importer Key...");

- +        }

- +        byte[] iv = new byte[16];

- +        JCAUtil.getSecureRandom().nextBytes(iv);

- +        importerKeyMechanism = new CK_MECHANISM(CKM_AES_CBC_PAD, iv);

- +        try {

- +            CK_ATTRIBUTE[] attributes = token.getAttributes(TemplateManager.O_GENERATE,

- +                            CKO_SECRET_KEY, CKK_AES, new CK_ATTRIBUTE[] {

- +                                    new CK_ATTRIBUTE(CKA_CLASS, CKO_SECRET_KEY),

- +                                    new CK_ATTRIBUTE(CKA_VALUE_LEN, 256 >> 3)});

- +            Session s = null;

- +            try {

- +                s = token.getObjSession();

- +                long keyID = token.p11.C_GenerateKey(

- +                        s.id(), new CK_MECHANISM(CKM_AES_KEY_GEN),

- +                        attributes);

- +                if (debug != null) {

- +                    debug.println("Importer Key ID: " + keyID);

- +                }

- +                importerKey = (P11Key)P11Key.secretKey(s, keyID, "AES",

- +                        256 >> 3, null);

- +            } catch (PKCS11Exception e) {

- +                // best effort

- +            } finally {

- +                token.releaseSession(s);

- +            }

- +            if (importerKey != null) {

- +                importerCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

- +            }

- +        } catch (Throwable t) {

- +            // best effort

- +            importerKey = null;

- +            importerCipher = null;

- +            // importerKeyMechanism value is kept initialized to indicate that

- +            // Importer Key creation has been tried and failed.

- +        }

- +    }

- +}

- diff --git openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- index 1eca1f8f0a..72674a7330 100644

- --- openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- @@ -26,6 +26,9 @@

-  package sun.security.pkcs11;

-  

-  import java.io.*;

- +import java.lang.invoke.MethodHandle;

- +import java.lang.invoke.MethodHandles;

- +import java.lang.invoke.MethodType;

-  import java.util.*;

-  

-  import java.security.*;

- @@ -64,6 +67,26 @@ public final class SunPKCS11 extends AuthProvider {

-      private static final boolean systemFipsEnabled = SharedSecrets

-              .getJavaSecuritySystemConfiguratorAccess().isSystemFipsEnabled();

-  

- +    private static final boolean plainKeySupportEnabled = SharedSecrets

- +            .getJavaSecuritySystemConfiguratorAccess().isPlainKeySupportEnabled();

- +

- +    private static final MethodHandle fipsImportKey;

- +    static {

- +        MethodHandle fipsImportKeyTmp = null;

- +        if (plainKeySupportEnabled) {

- +            try {

- +                fipsImportKeyTmp = MethodHandles.lookup().findStatic(

- +                        FIPSKeyImporter.class, "importKey",

- +                        MethodType.methodType(Long.class, SunPKCS11.class,

- +                        long.class, CK_ATTRIBUTE[].class));

- +            } catch (Throwable t) {

- +                throw new SecurityException("FIPS key importer initialization" +

- +                        " failed", t);

- +            }

- +        }

- +        fipsImportKey = fipsImportKeyTmp;

- +    }

- +

-      private static final long serialVersionUID = -1354835039035306505L;

-  

-      static final Debug debug = Debug.getInstance("sunpkcs11");

- @@ -319,10 +342,15 @@ public final class SunPKCS11 extends AuthProvider {

-              // request multithreaded access first

-              initArgs.flags = CKF_OS_LOCKING_OK;

-              PKCS11 tmpPKCS11;

- +            MethodHandle fipsKeyImporter = null;

- +            if (plainKeySupportEnabled) {

- +                fipsKeyImporter = MethodHandles.insertArguments(

- +                        fipsImportKey, 0, this);

- +            }

-              try {

-                  tmpPKCS11 = PKCS11.getInstance(

-                      library, functionList, initArgs,

- -                    config.getOmitInitialize());

- +                    config.getOmitInitialize(), fipsKeyImporter);

-              } catch (PKCS11Exception e) {

-                  if (debug != null) {

-                      debug.println("Multi-threaded initialization failed: " + e);

- @@ -338,7 +366,7 @@ public final class SunPKCS11 extends AuthProvider {

-                      initArgs.flags = 0;

-                  }

-                  tmpPKCS11 = PKCS11.getInstance(library,

- -                    functionList, initArgs, config.getOmitInitialize());

- +                    functionList, initArgs, config.getOmitInitialize(), fipsKeyImporter);

-              }

-              p11 = tmpPKCS11;

-  

- diff --git openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java

- index 04a369f453..8d2081abaa 100644

- --- openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java

- +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11.java

- @@ -49,6 +49,7 @@ package sun.security.pkcs11.wrapper;

-  

-  import java.io.File;

-  import java.io.IOException;

- +import java.lang.invoke.MethodHandle;

-  import java.util.*;

-  

-  import java.security.AccessController;

- @@ -150,16 +151,28 @@ public class PKCS11 {

-  

-      public static synchronized PKCS11 getInstance(String pkcs11ModulePath,

-              String functionList, CK_C_INITIALIZE_ARGS pInitArgs,

- -            boolean omitInitialize) throws IOException, PKCS11Exception {

- +            boolean omitInitialize, MethodHandle fipsKeyImporter)

- +                    throws IOException, PKCS11Exception {

-          // we may only call C_Initialize once per native .so/.dll

-          // so keep a cache using the (non-canonicalized!) path

-          PKCS11 pkcs11 = moduleMap.get(pkcs11ModulePath);

-          if (pkcs11 == null) {

- +            boolean nssFipsMode = fipsKeyImporter != null;

-              if ((pInitArgs != null)

-                      && ((pInitArgs.flags & CKF_OS_LOCKING_OK) != 0)) {

- -                pkcs11 = new PKCS11(pkcs11ModulePath, functionList);

- +                if (nssFipsMode) {

- +                    pkcs11 = new FIPSPKCS11(pkcs11ModulePath, functionList,

- +                            fipsKeyImporter);

- +                } else {

- +                    pkcs11 = new PKCS11(pkcs11ModulePath, functionList);

- +                }

-              } else {

- -                pkcs11 = new SynchronizedPKCS11(pkcs11ModulePath, functionList);

- +                if (nssFipsMode) {

- +                    pkcs11 = new SynchronizedFIPSPKCS11(pkcs11ModulePath,

- +                            functionList, fipsKeyImporter);

- +                } else {

- +                    pkcs11 = new SynchronizedPKCS11(pkcs11ModulePath, functionList);

- +                }

-              }

-              if (omitInitialize == false) {

-                  try {

- @@ -1909,4 +1922,69 @@ static class SynchronizedPKCS11 extends PKCS11 {

-          super.C_GenerateRandom(hSession, randomData);

-      }

-  }

- +

- +// PKCS11 subclass that allows using plain private or secret keys in

- +// FIPS-configured NSS Software Tokens. Only used when System FIPS

- +// is enabled.

- +static class FIPSPKCS11 extends PKCS11 {

- +    private MethodHandle fipsKeyImporter;

- +    FIPSPKCS11(String pkcs11ModulePath, String functionListName,

- +            MethodHandle fipsKeyImporter) throws IOException {

- +        super(pkcs11ModulePath, functionListName);

- +        this.fipsKeyImporter = fipsKeyImporter;

- +    }

- +

- +    public synchronized long C_CreateObject(long hSession,

- +            CK_ATTRIBUTE[] pTemplate) throws PKCS11Exception {

- +        // Creating sensitive key objects from plain key material in a

- +        // FIPS-configured NSS Software Token is not allowed. We apply

- +        // a key-unwrapping scheme to achieve so.

- +        if (FIPSPKCS11Helper.isSensitiveObject(pTemplate)) {

- +            try {

- +                return ((Long)fipsKeyImporter.invoke(hSession, pTemplate))

- +                        .longValue();

- +            } catch (Throwable t) {

- +                throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +            }

- +        }

- +        return super.C_CreateObject(hSession, pTemplate);

- +    }

- +}

- +

- +// FIPSPKCS11 synchronized counterpart.

- +static class SynchronizedFIPSPKCS11 extends SynchronizedPKCS11 {

- +    private MethodHandle fipsKeyImporter;

- +    SynchronizedFIPSPKCS11(String pkcs11ModulePath, String functionListName,

- +            MethodHandle fipsKeyImporter) throws IOException {

- +        super(pkcs11ModulePath, functionListName);

- +        this.fipsKeyImporter = fipsKeyImporter;

- +    }

- +

- +    public synchronized long C_CreateObject(long hSession,

- +            CK_ATTRIBUTE[] pTemplate) throws PKCS11Exception {

- +        // See FIPSPKCS11::C_CreateObject.

- +        if (FIPSPKCS11Helper.isSensitiveObject(pTemplate)) {

- +            try {

- +                return ((Long)fipsKeyImporter.invoke(hSession, pTemplate))

- +                        .longValue();

- +            } catch (Throwable t) {

- +                throw new PKCS11Exception(CKR_GENERAL_ERROR);

- +            }

- +        }

- +        return super.C_CreateObject(hSession, pTemplate);

- +    }

- +}

- +

- +private static class FIPSPKCS11Helper {

- +    static boolean isSensitiveObject(CK_ATTRIBUTE[] pTemplate) {

- +        for (CK_ATTRIBUTE attr : pTemplate) {

- +            if (attr.type == CKA_CLASS &&

- +                    (attr.getLong() == CKO_PRIVATE_KEY ||

- +                    attr.getLong() == CKO_SECRET_KEY)) {

- +                return true;

- +            }

- +        }

- +        return false;

- +    }

- +}

-  }

@@ -1,60 +0,0 @@ 

- diff --git openjdk.orig/src/java.base/share/classes/module-info.java openjdk/src/java.base/share/classes/module-info.java

- index 5460efcf8c..f08dc2fafc 100644

- --- openjdk.orig/src/java.base/share/classes/module-info.java

- +++ openjdk/src/java.base/share/classes/module-info.java

- @@ -182,6 +182,7 @@ module java.base {

-          java.security.jgss,

-          java.sql,

-          java.xml,

- +        jdk.crypto.cryptoki,

-          jdk.jartool,

-          jdk.attach,

-          jdk.charsets,

- diff --git openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- index 099caac605..ffadb43eb1 100644

- --- openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/SunPKCS11.java

- @@ -43,6 +43,8 @@ import javax.security.auth.callback.PasswordCallback;

-  import com.sun.crypto.provider.ChaCha20Poly1305Parameters;

-  

-  import jdk.internal.misc.InnocuousThread;

- +import jdk.internal.misc.SharedSecrets;

- +

-  import sun.security.util.Debug;

-  import sun.security.util.ResourcesMgr;

-  import static sun.security.util.SecurityConstants.PROVIDER_VER;

- @@ -60,6 +62,9 @@ import static sun.security.pkcs11.wrapper.PKCS11Constants.*;

-   */

-  public final class SunPKCS11 extends AuthProvider {

-  

- +    private static final boolean systemFipsEnabled = SharedSecrets

- +            .getJavaSecuritySystemConfiguratorAccess().isSystemFipsEnabled();

- +

-      private static final long serialVersionUID = -1354835039035306505L;

-  

-      static final Debug debug = Debug.getInstance("sunpkcs11");

- @@ -376,6 +381,24 @@ public final class SunPKCS11 extends AuthProvider {

-              if (nssModule != null) {

-                  nssModule.setProvider(this);

-              }

- +            if (systemFipsEnabled) {

- +                // The NSS Software Token in FIPS 140-2 mode requires a user

- +                // login for most operations. See sftk_fipsCheck. The NSS DB

- +                // (/etc/pki/nssdb) PIN is empty.

- +                Session session = null;

- +                try {

- +                    session = token.getOpSession();

- +                    p11.C_Login(session.id(), CKU_USER, new char[] {});

- +                } catch (PKCS11Exception p11e) {

- +                    if (debug != null) {

- +                        debug.println("Error during token login: " +

- +                                p11e.getMessage());

- +                    }

- +                    throw p11e;

- +                } finally {

- +                    token.releaseSession(session);

- +                }

- +            }

-          } catch (Exception e) {

-              if (config.getHandleStartupErrors() == Config.ERR_IGNORE_ALL) {

-                  throw new UnsupportedOperationException

@@ -1,28 +0,0 @@ 

- commit 8a8452b9ae862755210a9a2f4e34b1aa3ec7343d

- Author: Andrew Hughes <gnu.andrew@redhat.com>

- Date:   Tue Jan 18 02:00:55 2022 +0000

- 

-     RH2021263: Make sure java.security.Security is initialised when retrieving JavaSecuritySystemConfiguratorAccess instance

- 

- diff --git openjdk.orig/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java openjdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java

- index 2ec51d57806..8489b940c43 100644

- --- openjdk.orig/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java

- +++ openjdk/src/java.base/share/classes/jdk/internal/misc/SharedSecrets.java

- @@ -36,6 +36,7 @@ import java.io.FilePermission;

-  import java.io.ObjectInputStream;

-  import java.io.RandomAccessFile;

-  import java.security.ProtectionDomain;

- +import java.security.Security;

-  import java.security.Signature;

-  

-  /** A repository of "shared secrets", which are a mechanism for

- @@ -368,6 +369,9 @@ public class SharedSecrets {

-      }

-  

-      public static JavaSecuritySystemConfiguratorAccess getJavaSecuritySystemConfiguratorAccess() {

- +        if (javaSecuritySystemConfiguratorAccess == null) {

- +            unsafe.ensureClassInitialized(Security.class);

- +        }

-          return javaSecuritySystemConfiguratorAccess;

-      }

-  }

@@ -1,24 +0,0 @@ 

- commit 1b5bd349bdfa7b9627ea58d819bc250a55112de2

- Author: Fridrich Strba <fstrba@suse.com>

- Date:   Mon Jan 17 19:44:03 2022 +0000

- 

-     RH2021263: Return in C code after having generated Java exception

- 

- diff --git openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- index 6f4656bfcb6..34d0ff0ce91 100644

- --- openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c

- +++ openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- @@ -131,11 +131,13 @@ JNIEXPORT jboolean JNICALL Java_java_security_SystemConfigurator_getSystemFIPSEn

-      dbgPrint(env, "getSystemFIPSEnabled: reading " FIPS_ENABLED_PATH);

-      if ((fe = fopen(FIPS_ENABLED_PATH, "r")) == NULL) {

-          throwIOException(env, "Cannot open " FIPS_ENABLED_PATH);

- +        return JNI_FALSE;

-      }

-      fips_enabled = fgetc(fe);

-      fclose(fe);

-      if (fips_enabled == EOF) {

-          throwIOException(env, "Cannot read " FIPS_ENABLED_PATH);

- +        return JNI_FALSE;

-      }

-      msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:" \

-              " read character is '%c'", fips_enabled);

@@ -1,99 +0,0 @@ 

- commit 0cd8cee94fe0f867b0b39890e00be620af1d9b07

- Author: Andrew Hughes <gnu.andrew@redhat.com>

- Date:   Tue Jan 18 02:09:27 2022 +0000

- 

-     RH2021263: Improve Security initialisation, now FIPS support no longer relies on crypto policy support

- 

- diff --git openjdk.orig/src/java.base/share/classes/java/security/Security.java openjdk/src/java.base/share/classes/java/security/Security.java

- index 28ab1846173..f9726741afd 100644

- --- openjdk.orig/src/java.base/share/classes/java/security/Security.java

- +++ openjdk/src/java.base/share/classes/java/security/Security.java

- @@ -61,10 +61,6 @@ public final class Security {

-      private static final Debug sdebug =

-                          Debug.getInstance("properties");

-  

- -    /* System property file*/

- -    private static final String SYSTEM_PROPERTIES =

- -        "/etc/crypto-policies/back-ends/java.config";

- -

-      /* The java.security properties */

-      private static Properties props;

-  

- @@ -206,22 +202,36 @@ public final class Security {

-              }

-          }

-  

- +        if (!loadedProps) {

- +            initializeStatic();

- +            if (sdebug != null) {

- +                sdebug.println("unable to load security properties " +

- +                        "-- using defaults");

- +            }

- +        }

- +

-          String disableSystemProps = System.getProperty("java.security.disableSystemPropertiesFile");

-          if ((disableSystemProps == null || "false".equalsIgnoreCase(disableSystemProps)) &&

-              "true".equalsIgnoreCase(props.getProperty("security.useSystemPropertiesFile"))) {

- -            if (SystemConfigurator.configure(props)) {

- -                loadedProps = true;

- +            if (!SystemConfigurator.configureSysProps(props)) {

- +                if (sdebug != null) {

- +                    sdebug.println("WARNING: System properties could not be loaded.");

- +                }

-              }

-          }

-  

- -        if (!loadedProps) {

- -            initializeStatic();

- +        // FIPS support depends on the contents of java.security so

- +        // ensure it has loaded first

- +        if (loadedProps) {

- +            boolean fipsEnabled = SystemConfigurator.configureFIPS(props);

-              if (sdebug != null) {

- -                sdebug.println("unable to load security properties " +

- -                        "-- using defaults");

- +                if (fipsEnabled) {

- +                    sdebug.println("FIPS support enabled.");

- +                } else {

- +                    sdebug.println("FIPS support disabled.");

- +                }

-              }

-          }

- -

-      }

-  

-      /*

- diff --git openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- index 874c6221ebe..b7ed41acf0f 100644

- --- openjdk.orig/src/java.base/share/classes/java/security/SystemConfigurator.java

- +++ openjdk/src/java.base/share/classes/java/security/SystemConfigurator.java

- @@ -76,7 +76,7 @@ final class SystemConfigurator {

-       * java.security.disableSystemPropertiesFile property is not set and

-       * security.useSystemPropertiesFile is true.

-       */

- -    static boolean configure(Properties props) {

- +    static boolean configureSysProps(Properties props) {

-          boolean loadedProps = false;

-  

-          try (BufferedInputStream bis =

- @@ -96,11 +96,19 @@ final class SystemConfigurator {

-                  e.printStackTrace();

-              }

-          }

- +        return loadedProps;

- +    }

- +

- +    /*

- +     * Invoked at the end of java.security.Security initialisation

- +     * if java.security properties have been loaded

- +     */

- +    static boolean configureFIPS(Properties props) {

- +        boolean loadedProps = false;

-  

-          try {

-              if (enableFips()) {

-                  if (sdebug != null) { sdebug.println("FIPS mode detected"); }

- -                loadedProps = false;

-                  // Remove all security providers

-                  Iterator<Entry<Object, Object>> i = props.entrySet().iterator();

-                  while (i.hasNext()) {

@@ -1,220 +0,0 @@ 

- commit e2be09f982af1cc05f5e6556d51900bca4757416

- Author: Andrew Hughes <gnu.andrew@redhat.com>

- Date:   Mon Feb 28 05:30:32 2022 +0000

- 

-     RH2051605: Detect NSS at Runtime for FIPS detection

- 

- diff --git openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- index 34d0ff0ce91..8dcb7d9073f 100644

- --- openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c

- +++ openjdk/src/java.base/linux/native/libsystemconf/systemconf.c

- @@ -23,25 +23,99 @@

-   * questions.

-   */

-  

- -#include <dlfcn.h>

-  #include <jni.h>

-  #include <jni_util.h>

- +#include "jvm_md.h"

-  #include <stdio.h>

-  

-  #ifdef SYSCONF_NSS

-  #include <nss3/pk11pub.h>

- +#else

- +#include <dlfcn.h>

-  #endif //SYSCONF_NSS

-  

-  #include "java_security_SystemConfigurator.h"

-  

- +#define MSG_MAX_SIZE 256

-  #define FIPS_ENABLED_PATH "/proc/sys/crypto/fips_enabled"

- -#define MSG_MAX_SIZE 96

-  

- +typedef int (SECMOD_GET_SYSTEM_FIPS_ENABLED_TYPE)(void);

- +

- +static SECMOD_GET_SYSTEM_FIPS_ENABLED_TYPE *getSystemFIPSEnabled;

-  static jmethodID debugPrintlnMethodID = NULL;

-  static jobject debugObj = NULL;

-  

- -static void throwIOException(JNIEnv *env, const char *msg);

- -static void dbgPrint(JNIEnv *env, const char* msg);

- +static void dbgPrint(JNIEnv *env, const char* msg)

- +{

- +    jstring jMsg;

- +    if (debugObj != NULL) {

- +        jMsg = (*env)->NewStringUTF(env, msg);

- +        CHECK_NULL(jMsg);

- +        (*env)->CallVoidMethod(env, debugObj, debugPrintlnMethodID, jMsg);

- +    }

- +}

- +

- +static void throwIOException(JNIEnv *env, const char *msg)

- +{

- +    jclass cls = (*env)->FindClass(env, "java/io/IOException");

- +    if (cls != 0)

- +        (*env)->ThrowNew(env, cls, msg);

- +}

- +

- +static void handle_msg(JNIEnv *env, const char* msg, int msg_bytes)

- +{

- +  if (msg_bytes > 0 && msg_bytes < MSG_MAX_SIZE) {

- +    dbgPrint(env, msg);

- +  } else {

- +    dbgPrint(env, "systemconf: cannot render message");

- +  }

- +}

- +

- +// Only used when NSS is not linked at build time

- +#ifndef SYSCONF_NSS

- +

- +static void *nss_handle;

- +

- +static jboolean loadNSS(JNIEnv *env)

- +{

- +  char msg[MSG_MAX_SIZE];

- +  int msg_bytes;

- +  const char* errmsg;

- +

- +  nss_handle = dlopen(JNI_LIB_NAME("nss3"), RTLD_LAZY);

- +  if (nss_handle == NULL) {

- +    errmsg = dlerror();

- +    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "loadNSS: dlopen: %s\n",

- +                         errmsg);

- +    handle_msg(env, msg, msg_bytes);

- +    return JNI_FALSE;

- +  }

- +  dlerror(); /* Clear errors */

- +  getSystemFIPSEnabled = (SECMOD_GET_SYSTEM_FIPS_ENABLED_TYPE*)dlsym(nss_handle, "SECMOD_GetSystemFIPSEnabled");

- +  if ((errmsg = dlerror()) != NULL) {

- +    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "loadNSS: dlsym: %s\n",

- +                         errmsg);

- +    handle_msg(env, msg, msg_bytes);

- +    return JNI_FALSE;

- +  }

- +  return JNI_TRUE;

- +}

- +

- +static void closeNSS(JNIEnv *env)

- +{

- +  char msg[MSG_MAX_SIZE];

- +  int msg_bytes;

- +  const char* errmsg;

- +

- +  if (dlclose(nss_handle) != 0) {

- +    errmsg = dlerror();

- +    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "closeNSS: dlclose: %s\n",

- +                         errmsg);

- +    handle_msg(env, msg, msg_bytes);

- +  }

- +}

- +

- +#endif

-  

-  /*

-   * Class:     java_security_SystemConfigurator

- @@ -84,6 +158,14 @@ JNIEXPORT jint JNICALL DEF_JNI_OnLoad(JavaVM *vm, void *reserved)

-          debugObj = (*env)->NewGlobalRef(env, debugObj);

-      }

-  

- +#ifdef SYSCONF_NSS

- +    getSystemFIPSEnabled = *SECMOD_GetSystemFIPSEnabled;

- +#else

- +    if (loadNSS(env) == JNI_FALSE) {

- +      dbgPrint(env, "libsystemconf: Failed to load NSS library.");

- +    }

- +#endif

- +

-      return (*env)->GetVersion(env);

-  }

-  

- @@ -99,6 +181,9 @@ JNIEXPORT void JNICALL DEF_JNI_OnUnload(JavaVM *vm, void *reserved)

-          if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_2) != JNI_OK) {

-              return; /* Should not happen */

-          }

- +#ifndef SYSCONF_NSS

- +        closeNSS(env);

- +#endif

-          (*env)->DeleteGlobalRef(env, debugObj);

-      }

-  }

- @@ -110,61 +195,30 @@ JNIEXPORT jboolean JNICALL Java_java_security_SystemConfigurator_getSystemFIPSEn

-      char msg[MSG_MAX_SIZE];

-      int msg_bytes;

-  

- -#ifdef SYSCONF_NSS

- -

- -    dbgPrint(env, "getSystemFIPSEnabled: calling SECMOD_GetSystemFIPSEnabled");

- -    fips_enabled = SECMOD_GetSystemFIPSEnabled();

- -    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:" \

- -            " SECMOD_GetSystemFIPSEnabled returned 0x%x", fips_enabled);

- -    if (msg_bytes > 0 && msg_bytes < MSG_MAX_SIZE) {

- -        dbgPrint(env, msg);

- +    if (getSystemFIPSEnabled != NULL) {

- +      dbgPrint(env, "getSystemFIPSEnabled: calling SECMOD_GetSystemFIPSEnabled");

- +      fips_enabled = (*getSystemFIPSEnabled)();

- +      msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:"   \

- +                           " SECMOD_GetSystemFIPSEnabled returned 0x%x", fips_enabled);

- +      handle_msg(env, msg, msg_bytes);

- +      return (fips_enabled == 1 ? JNI_TRUE : JNI_FALSE);

-      } else {

- -        dbgPrint(env, "getSystemFIPSEnabled: cannot render" \

- -                " SECMOD_GetSystemFIPSEnabled return value");

- -    }

- -    return (fips_enabled == 1 ? JNI_TRUE : JNI_FALSE);

- -

- -#else // SYSCONF_NSS

- +      FILE *fe;

-  

- -    FILE *fe;

- -

- -    dbgPrint(env, "getSystemFIPSEnabled: reading " FIPS_ENABLED_PATH);

- -    if ((fe = fopen(FIPS_ENABLED_PATH, "r")) == NULL) {

- +      dbgPrint(env, "getSystemFIPSEnabled: reading " FIPS_ENABLED_PATH);

- +      if ((fe = fopen(FIPS_ENABLED_PATH, "r")) == NULL) {

-          throwIOException(env, "Cannot open " FIPS_ENABLED_PATH);

-          return JNI_FALSE;

- -    }

- -    fips_enabled = fgetc(fe);

- -    fclose(fe);

- -    if (fips_enabled == EOF) {

- +      }

- +      fips_enabled = fgetc(fe);

- +      fclose(fe);

- +      if (fips_enabled == EOF) {

-          throwIOException(env, "Cannot read " FIPS_ENABLED_PATH);

-          return JNI_FALSE;

- -    }

- -    msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:" \

- -            " read character is '%c'", fips_enabled);

- -    if (msg_bytes > 0 && msg_bytes < MSG_MAX_SIZE) {

- -        dbgPrint(env, msg);

- -    } else {

- -        dbgPrint(env, "getSystemFIPSEnabled: cannot render" \

- -                " read character");

- -    }

- -    return (fips_enabled == '1' ? JNI_TRUE : JNI_FALSE);

- -

- -#endif // SYSCONF_NSS

- -}

- -

- -static void throwIOException(JNIEnv *env, const char *msg)

- -{

- -    jclass cls = (*env)->FindClass(env, "java/io/IOException");

- -    if (cls != 0)

- -        (*env)->ThrowNew(env, cls, msg);

- -}

- -

- -static void dbgPrint(JNIEnv *env, const char* msg)

- -{

- -    jstring jMsg;

- -    if (debugObj != NULL) {

- -        jMsg = (*env)->NewStringUTF(env, msg);

- -        CHECK_NULL(jMsg);

- -        (*env)->CallVoidMethod(env, debugObj, debugPrintlnMethodID, jMsg);

- +      }

- +      msg_bytes = snprintf(msg, MSG_MAX_SIZE, "getSystemFIPSEnabled:"   \

- +                           " read character is '%c'", fips_enabled);

- +      handle_msg(env, msg, msg_bytes);

- +      return (fips_enabled == '1' ? JNI_TRUE : JNI_FALSE);

-      }

-  }

  • RH2036462: sun.security.pkcs11.wrapper.PKCS11.getInstance breakage
  • RH2090378: Revert to disabling system security properties and FIPS mode support together

  • Rebase RH1648249 nss.cfg patch so it applies after the FIPS patch

  • Enable system security properties in the RPM (now disabled by default in the FIPS repo)
  • Improve security properties test to check both enabled and disabled behaviour
  • Run security properties test with property debugging on

PR just for build testing, not review. This is the same change as previously applied to java-17-openjdk and java-latest-openjdk (though system security property enablement follows the placement of https://src.fedoraproject.org/rpms/java-17-openjdk/pull-request/19).

Build succeeded.

Pull-Request has been merged by ahughes

2 years ago