import java-17-openjdk-17.0.2.0.8-6.el8
This commit is contained in:
		
							parent
							
								
									95c0495ad2
								
							
						
					
					
						commit
						307a568d57
					
				
							
								
								
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -1,2 +1,2 @@ | ||||
| SOURCES/openjdk-jdk17-jdk-17+33.tar.xz | ||||
| SOURCES/tapsets-icedtea-3.15.0.tar.xz | ||||
| SOURCES/openjdk-jdk17u-jdk-17.0.2+8.tar.xz | ||||
| SOURCES/tapsets-icedtea-6.0.0pre00-c848b93a8598.tar.xz | ||||
|  | ||||
| @ -1,2 +1,2 @@ | ||||
| e2edecf5fbb3d791367caf2a0e148d643ad7e9cf SOURCES/openjdk-jdk17-jdk-17+33.tar.xz | ||||
| 7ae2cba67467825b2c2a5fec7aea041865023002 SOURCES/tapsets-icedtea-3.15.0.tar.xz | ||||
| 47c1e3a97ba6f63908c2a9f55e1514b52f0b8333 SOURCES/openjdk-jdk17u-jdk-17.0.2+8.tar.xz | ||||
| c8281ee37b77d535c9c1af86609a531958ff7b34 SOURCES/tapsets-icedtea-6.0.0pre00-c848b93a8598.tar.xz | ||||
|  | ||||
							
								
								
									
										1082
									
								
								SOURCES/NEWS
									
									
									
									
									
								
							
							
						
						
									
										1082
									
								
								SOURCES/NEWS
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,8 +1,8 @@ | ||||
| [Desktop Entry] | ||||
| Name=OpenJDK @JAVA_MAJOR_VERSION@ Monitoring & Management Console @ARCH@ | ||||
| Comment=Monitor and manage OpenJDK @JAVA_MAJOR_VERSION@ applications for @ARCH@ | ||||
| Exec=@JAVA_HOME@/jconsole | ||||
| Icon=java-@JAVA_MAJOR_VERSION@-@JAVA_VENDOR@ | ||||
| Name=OpenJDK @JAVA_VER@ for @target_cpu@ Monitoring & Management Console (@OPENJDK_VER@) | ||||
| Comment=Monitor and manage OpenJDK applications | ||||
| Exec=_SDKBINDIR_/jconsole | ||||
| Icon=java-@JAVA_VER@-@JAVA_VENDOR@ | ||||
| Terminal=false | ||||
| Type=Application | ||||
| StartupWMClass=sun-tools-jconsole-JConsole | ||||
|  | ||||
							
								
								
									
										579
									
								
								SOURCES/rh1991003-enable_fips_keys_import.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										579
									
								
								SOURCES/rh1991003-enable_fips_keys_import.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,579 @@ | ||||
| commit abcd0954643eddbf826d96291d44a143038ab750 | ||||
| Author: Martin Balao <mbalao@redhat.com> | ||||
| Date:   Sun Oct 10 18:14:01 2021 +0100 | ||||
| 
 | ||||
|     RH1991003: Enable the import of plain keys into the NSS software token. | ||||
|      | ||||
|     This can be individually disabled using -Dcom.redhat.fips.plainKeySupport=false | ||||
| 
 | ||||
| diff --git openjdk.orig/src/java.base/share/classes/java/security/Security.java openjdk/src/java.base/share/classes/java/security/Security.java
 | ||||
| index ce32c939253..dc7020ce668 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 6aa1419dfd0..ecab722848e 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"; | ||||
|   | ||||
| @@ -150,6 +151,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) { | ||||
| @@ -177,6 +188,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/access/JavaSecuritySystemConfiguratorAccess.java openjdk/src/java.base/share/classes/jdk/internal/access/JavaSecuritySystemConfiguratorAccess.java
 | ||||
| index a31e93ec02e..3f3caac64dc 100644
 | ||||
| --- openjdk.orig/src/java.base/share/classes/jdk/internal/access/JavaSecuritySystemConfiguratorAccess.java
 | ||||
| +++ openjdk/src/java.base/share/classes/jdk/internal/access/JavaSecuritySystemConfiguratorAccess.java
 | ||||
| @@ -27,4 +27,5 @@ package jdk.internal.access;
 | ||||
|   | ||||
|  public interface JavaSecuritySystemConfiguratorAccess { | ||||
|      boolean isSystemFipsEnabled(); | ||||
| +    boolean isPlainKeySupportEnabled();
 | ||||
|  } | ||||
| 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 00000000000..bee3a1e1537
 | ||||
| --- /dev/null
 | ||||
| +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/FIPSKeyImporter.java
 | ||||
| @@ -0,0 +1,291 @@
 | ||||
| +/*
 | ||||
| + * 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 static sun.security.pkcs11.wrapper.PKCS11Exception.*;
 | ||||
| +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 5d3963ea893..42c72b393fd 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.*; | ||||
| @@ -66,6 +69,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"); | ||||
| @@ -324,10 +347,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); | ||||
| @@ -343,7 +371,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 5c0aacd1a67..4d80145cb91 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; | ||||
| @@ -152,16 +153,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 { | ||||
| @@ -1911,4 +1924,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;
 | ||||
| +    }
 | ||||
| +}
 | ||||
|  } | ||||
| diff --git openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
 | ||||
| index e2d6d371bec..dc5e7eefdd3 100644
 | ||||
| --- openjdk.orig/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
 | ||||
| +++ openjdk/src/jdk.crypto.cryptoki/share/classes/sun/security/pkcs11/wrapper/PKCS11Exception.java
 | ||||
| @@ -219,6 +219,14 @@ public class PKCS11Exception extends Exception {
 | ||||
|          return "0x" + Functions.toFullHexString((int)errorCode); | ||||
|      } | ||||
|   | ||||
| +    /**
 | ||||
| +     * Constructor taking the error code (the CKR_* constants in PKCS#11) with
 | ||||
| +     * no extra info for the error message.
 | ||||
| +     */
 | ||||
| +    public PKCS11Exception(long errorCode) {
 | ||||
| +        this(errorCode, null);
 | ||||
| +    }
 | ||||
| +
 | ||||
|      /** | ||||
|       * Constructor taking the error code (the CKR_* constants in PKCS#11) and | ||||
|       * extra info for error message. | ||||
| @ -1,18 +1,18 @@ | ||||
| diff --git openjdk/src/java.base/share/classes/module-info.java openjdk/src/java.base/share/classes/module-info.java
 | ||||
| index 9d4a794de1a..39e69362458 100644
 | ||||
| --- openjdk/src/java.base/share/classes/module-info.java
 | ||||
| diff --git openjdk.orig/src/java.base/share/classes/module-info.java openjdk/src/java.base/share/classes/module-info.java
 | ||||
| index 63bb580eb3a..238735c0c8c 100644
 | ||||
| --- openjdk.orig/src/java.base/share/classes/module-info.java
 | ||||
| +++ openjdk/src/java.base/share/classes/module-info.java
 | ||||
| @@ -151,6 +151,7 @@ module java.base {
 | ||||
|          java.management, | ||||
| @@ -152,6 +152,7 @@ module java.base {
 | ||||
|          java.naming, | ||||
|          java.rmi, | ||||
|          jdk.charsets, | ||||
| +        jdk.crypto.ec,
 | ||||
|          jdk.jartool, | ||||
|          jdk.jlink, | ||||
|          jdk.net, | ||||
| diff --git openjdk/src/java.base/share/classes/sun/security/provider/SunEntries.java openjdk/src/java.base/share/classes/sun/security/provider/SunEntries.java
 | ||||
| index 912cad59714..c5e13c98bd9 100644
 | ||||
| --- openjdk/src/java.base/share/classes/sun/security/provider/SunEntries.java
 | ||||
| diff --git openjdk.orig/src/java.base/share/classes/sun/security/provider/SunEntries.java openjdk/src/java.base/share/classes/sun/security/provider/SunEntries.java
 | ||||
| index 912cad59714..7cb5ebcde51 100644
 | ||||
| --- openjdk.orig/src/java.base/share/classes/sun/security/provider/SunEntries.java
 | ||||
| +++ openjdk/src/java.base/share/classes/sun/security/provider/SunEntries.java
 | ||||
| @@ -30,6 +30,7 @@ import java.net.*;
 | ||||
|  import java.util.*; | ||||
| @ -52,149 +52,7 @@ index 912cad59714..c5e13c98bd9 100644 | ||||
| -        if (NativePRNG.NonBlocking.isAvailable()) {
 | ||||
| -            add(p, "SecureRandom", "NativePRNGNonBlocking",
 | ||||
| -                    "sun.security.provider.NativePRNG$NonBlocking", attrs);
 | ||||
| +        if (!systemFipsEnabled) {
 | ||||
| +            /*
 | ||||
| +             * SecureRandom engines
 | ||||
| +             */
 | ||||
| +            attrs.put("ThreadSafe", "true");
 | ||||
| +            if (NativePRNG.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNG",
 | ||||
| +                        "sun.security.provider.NativePRNG", attrs);
 | ||||
| +            }
 | ||||
| +            if (NativePRNG.Blocking.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNGBlocking",
 | ||||
| +                        "sun.security.provider.NativePRNG$Blocking", attrs);
 | ||||
| +            }
 | ||||
| +            if (NativePRNG.NonBlocking.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNGNonBlocking",
 | ||||
| +                        "sun.security.provider.NativePRNG$NonBlocking", attrs);
 | ||||
| +            }
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +            add(p, "SecureRandom", "DRBG", "sun.security.provider.DRBG", attrs);
 | ||||
| +            add(p, "SecureRandom", "SHA1PRNG",
 | ||||
| +                    "sun.security.provider.SecureRandom", attrs);
 | ||||
| +
 | ||||
| +            /*
 | ||||
| +             * Signature engines
 | ||||
| +             */
 | ||||
| +            attrs.clear();
 | ||||
| +            String dsaKeyClasses = "java.security.interfaces.DSAPublicKey" +
 | ||||
| +                    "|java.security.interfaces.DSAPrivateKey";
 | ||||
| +            attrs.put("SupportedKeyClasses", dsaKeyClasses);
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +
 | ||||
| +            attrs.put("KeySize", "1024"); // for NONE and SHA1 DSA signatures
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA1withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA1withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "NONEwithDSA",
 | ||||
| +                    "sun.security.provider.DSA$RawDSA", attrs);
 | ||||
| +
 | ||||
| +            // for DSA signatures with 224/256-bit digests
 | ||||
| +            attrs.put("KeySize", "2048");
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA224withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA224withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA256withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA256withDSA", attrs);
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-224withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_224withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-256withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_256withDSA", attrs);
 | ||||
| +
 | ||||
| +            attrs.put("KeySize", "3072"); // for DSA sig using 384/512-bit digests
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA384withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA384withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA512withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA512withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-384withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_384withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-512withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_512withDSA", attrs);
 | ||||
| +
 | ||||
| +            attrs.remove("KeySize");
 | ||||
| +
 | ||||
| +            add(p, "Signature", "SHA1withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA1withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "NONEwithDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$RawDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA224withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA224withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA256withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA256withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA384withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA384withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA512withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA512withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-224withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_224withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-256withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_256withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-384withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_384withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-512withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_512withDSAinP1363Format");
 | ||||
| +            /*
 | ||||
| +             *  Key Pair Generator engines
 | ||||
| +             */
 | ||||
| +            attrs.clear();
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +            attrs.put("KeySize", "2048"); // for DSA KPG and APG only
 | ||||
| +
 | ||||
| +            String dsaKPGImplClass = "sun.security.provider.DSAKeyPairGenerator$";
 | ||||
| +            dsaKPGImplClass += (useLegacyDSA? "Legacy" : "Current");
 | ||||
| +            addWithAlias(p, "KeyPairGenerator", "DSA", dsaKPGImplClass, attrs);
 | ||||
| +
 | ||||
| +            /*
 | ||||
| +             * Algorithm Parameter Generator engines
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "AlgorithmParameterGenerator", "DSA",
 | ||||
| +                    "sun.security.provider.DSAParameterGenerator", attrs);
 | ||||
| +            attrs.remove("KeySize");
 | ||||
| +
 | ||||
| +            /*
 | ||||
| +             * Algorithm Parameter engines
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "AlgorithmParameters", "DSA",
 | ||||
| +                    "sun.security.provider.DSAParameters", attrs);
 | ||||
| +
 | ||||
| +            /*
 | ||||
| +             * Key factories
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "KeyFactory", "DSA",
 | ||||
| +                    "sun.security.provider.DSAKeyFactory", attrs);
 | ||||
| +
 | ||||
| +            /*
 | ||||
| +             * Digest engines
 | ||||
| +             */
 | ||||
| +            add(p, "MessageDigest", "MD2", "sun.security.provider.MD2", attrs);
 | ||||
| +            add(p, "MessageDigest", "MD5", "sun.security.provider.MD5", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-1", "sun.security.provider.SHA",
 | ||||
| +                    attrs);
 | ||||
| +
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-224",
 | ||||
| +                    "sun.security.provider.SHA2$SHA224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-256",
 | ||||
| +                    "sun.security.provider.SHA2$SHA256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-384",
 | ||||
| +                    "sun.security.provider.SHA5$SHA384", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512/224",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512_224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512/256",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512_256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-224",
 | ||||
| +                    "sun.security.provider.SHA3$SHA224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-256",
 | ||||
| +                    "sun.security.provider.SHA3$SHA256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-384",
 | ||||
| +                    "sun.security.provider.SHA3$SHA384", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-512",
 | ||||
| +                    "sun.security.provider.SHA3$SHA512", attrs);
 | ||||
|          } | ||||
| -        }
 | ||||
| -        attrs.put("ImplementedIn", "Software");
 | ||||
| -        add(p, "SecureRandom", "DRBG", "sun.security.provider.DRBG", attrs);
 | ||||
| -        add(p, "SecureRandom", "SHA1PRNG",
 | ||||
| @ -268,30 +126,133 @@ index 912cad59714..c5e13c98bd9 100644 | ||||
| -        attrs.clear();
 | ||||
| -        attrs.put("ImplementedIn", "Software");
 | ||||
| -        attrs.put("KeySize", "2048"); // for DSA KPG and APG only
 | ||||
| -
 | ||||
| +        if (!systemFipsEnabled) {
 | ||||
| +            /*
 | ||||
| +             * SecureRandom engines
 | ||||
| +             */
 | ||||
| +            attrs.put("ThreadSafe", "true");
 | ||||
| +            if (NativePRNG.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNG",
 | ||||
| +                        "sun.security.provider.NativePRNG", attrs);
 | ||||
| +            }
 | ||||
| +            if (NativePRNG.Blocking.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNGBlocking",
 | ||||
| +                        "sun.security.provider.NativePRNG$Blocking", attrs);
 | ||||
| +            }
 | ||||
| +            if (NativePRNG.NonBlocking.isAvailable()) {
 | ||||
| +                add(p, "SecureRandom", "NativePRNGNonBlocking",
 | ||||
| +                        "sun.security.provider.NativePRNG$NonBlocking", attrs);
 | ||||
| +            }
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +            add(p, "SecureRandom", "DRBG", "sun.security.provider.DRBG", attrs);
 | ||||
| +            add(p, "SecureRandom", "SHA1PRNG",
 | ||||
| +                    "sun.security.provider.SecureRandom", attrs);
 | ||||
|   | ||||
| -        String dsaKPGImplClass = "sun.security.provider.DSAKeyPairGenerator$";
 | ||||
| -        dsaKPGImplClass += (useLegacyDSA? "Legacy" : "Current");
 | ||||
| -        addWithAlias(p, "KeyPairGenerator", "DSA", dsaKPGImplClass, attrs);
 | ||||
| -
 | ||||
| +            /*
 | ||||
| +             * Signature engines
 | ||||
| +             */
 | ||||
| +            attrs.clear();
 | ||||
| +            String dsaKeyClasses = "java.security.interfaces.DSAPublicKey" +
 | ||||
| +                    "|java.security.interfaces.DSAPrivateKey";
 | ||||
| +            attrs.put("SupportedKeyClasses", dsaKeyClasses);
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +
 | ||||
| +            attrs.put("KeySize", "1024"); // for NONE and SHA1 DSA signatures
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA1withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA1withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "NONEwithDSA",
 | ||||
| +                    "sun.security.provider.DSA$RawDSA", attrs);
 | ||||
| +
 | ||||
| +            // for DSA signatures with 224/256-bit digests
 | ||||
| +            attrs.put("KeySize", "2048");
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA224withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA224withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA256withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA256withDSA", attrs);
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-224withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_224withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-256withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_256withDSA", attrs);
 | ||||
| +
 | ||||
| +            attrs.put("KeySize", "3072"); // for DSA sig using 384/512-bit digests
 | ||||
| +
 | ||||
| +            addWithAlias(p, "Signature", "SHA384withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA384withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA512withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA512withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-384withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_384withDSA", attrs);
 | ||||
| +            addWithAlias(p, "Signature", "SHA3-512withDSA",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_512withDSA", attrs);
 | ||||
| +
 | ||||
| +            attrs.remove("KeySize");
 | ||||
| +
 | ||||
| +            add(p, "Signature", "SHA1withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA1withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "NONEwithDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$RawDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA224withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA224withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA256withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA256withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA384withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA384withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA512withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA512withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-224withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_224withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-256withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_256withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-384withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_384withDSAinP1363Format");
 | ||||
| +            add(p, "Signature", "SHA3-512withDSAinP1363Format",
 | ||||
| +                    "sun.security.provider.DSA$SHA3_512withDSAinP1363Format");
 | ||||
| +            /*
 | ||||
| +             *  Key Pair Generator engines
 | ||||
| +             */
 | ||||
| +            attrs.clear();
 | ||||
| +            attrs.put("ImplementedIn", "Software");
 | ||||
| +            attrs.put("KeySize", "2048"); // for DSA KPG and APG only
 | ||||
|   | ||||
| -        /*
 | ||||
| -         * Algorithm Parameter Generator engines
 | ||||
| -         */
 | ||||
| -        addWithAlias(p, "AlgorithmParameterGenerator", "DSA",
 | ||||
| -                "sun.security.provider.DSAParameterGenerator", attrs);
 | ||||
| -        attrs.remove("KeySize");
 | ||||
| -
 | ||||
| +            String dsaKPGImplClass = "sun.security.provider.DSAKeyPairGenerator$";
 | ||||
| +            dsaKPGImplClass += (useLegacyDSA? "Legacy" : "Current");
 | ||||
| +            addWithAlias(p, "KeyPairGenerator", "DSA", dsaKPGImplClass, attrs);
 | ||||
|   | ||||
| -        /*
 | ||||
| -         * Algorithm Parameter engines
 | ||||
| -         */
 | ||||
| -        addWithAlias(p, "AlgorithmParameters", "DSA",
 | ||||
| -                "sun.security.provider.DSAParameters", attrs);
 | ||||
| -
 | ||||
| +            /*
 | ||||
| +             * Algorithm Parameter Generator engines
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "AlgorithmParameterGenerator", "DSA",
 | ||||
| +                    "sun.security.provider.DSAParameterGenerator", attrs);
 | ||||
| +            attrs.remove("KeySize");
 | ||||
|   | ||||
| -        /*
 | ||||
| -         * Key factories
 | ||||
| -         */
 | ||||
| -        addWithAlias(p, "KeyFactory", "DSA",
 | ||||
| -                "sun.security.provider.DSAKeyFactory", attrs);
 | ||||
| -
 | ||||
| +            /*
 | ||||
| +             * Algorithm Parameter engines
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "AlgorithmParameters", "DSA",
 | ||||
| +                    "sun.security.provider.DSAParameters", attrs);
 | ||||
|   | ||||
| -        /*
 | ||||
| -         * Digest engines
 | ||||
| -         */
 | ||||
| @ -299,7 +260,12 @@ index 912cad59714..c5e13c98bd9 100644 | ||||
| -        add(p, "MessageDigest", "MD5", "sun.security.provider.MD5", attrs);
 | ||||
| -        addWithAlias(p, "MessageDigest", "SHA-1", "sun.security.provider.SHA",
 | ||||
| -                attrs);
 | ||||
| -
 | ||||
| +            /*
 | ||||
| +             * Key factories
 | ||||
| +             */
 | ||||
| +            addWithAlias(p, "KeyFactory", "DSA",
 | ||||
| +                    "sun.security.provider.DSAKeyFactory", attrs);
 | ||||
|   | ||||
| -        addWithAlias(p, "MessageDigest", "SHA-224",
 | ||||
| -                "sun.security.provider.SHA2$SHA224", attrs);
 | ||||
| -        addWithAlias(p, "MessageDigest", "SHA-256",
 | ||||
| @ -320,12 +286,41 @@ index 912cad59714..c5e13c98bd9 100644 | ||||
| -                "sun.security.provider.SHA3$SHA384", attrs);
 | ||||
| -        addWithAlias(p, "MessageDigest", "SHA3-512",
 | ||||
| -                "sun.security.provider.SHA3$SHA512", attrs);
 | ||||
| +            /*
 | ||||
| +             * Digest engines
 | ||||
| +             */
 | ||||
| +            add(p, "MessageDigest", "MD2", "sun.security.provider.MD2", attrs);
 | ||||
| +            add(p, "MessageDigest", "MD5", "sun.security.provider.MD5", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-1", "sun.security.provider.SHA",
 | ||||
| +                    attrs);
 | ||||
| +
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-224",
 | ||||
| +                    "sun.security.provider.SHA2$SHA224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-256",
 | ||||
| +                    "sun.security.provider.SHA2$SHA256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-384",
 | ||||
| +                    "sun.security.provider.SHA5$SHA384", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512/224",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512_224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA-512/256",
 | ||||
| +                    "sun.security.provider.SHA5$SHA512_256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-224",
 | ||||
| +                    "sun.security.provider.SHA3$SHA224", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-256",
 | ||||
| +                    "sun.security.provider.SHA3$SHA256", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-384",
 | ||||
| +                    "sun.security.provider.SHA3$SHA384", attrs);
 | ||||
| +            addWithAlias(p, "MessageDigest", "SHA3-512",
 | ||||
| +                    "sun.security.provider.SHA3$SHA512", attrs);
 | ||||
| +        }
 | ||||
|   | ||||
|          /* | ||||
|           * Certificates | ||||
| diff --git openjdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java openjdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java
 | ||||
| index 8c9e4f9dbe6..9eeb3013e0d 100644
 | ||||
| --- openjdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java
 | ||||
| diff --git openjdk.orig/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java openjdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java
 | ||||
| index 8c9e4f9dbe6..883dc04758e 100644
 | ||||
| --- openjdk.orig/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java
 | ||||
| +++ openjdk/src/jdk.crypto.ec/share/classes/sun/security/ec/SunEC.java
 | ||||
| @@ -38,6 +38,7 @@ import java.util.HashMap;
 | ||||
|  import java.util.Iterator; | ||||
|  | ||||
| @ -5,13 +5,13 @@ Date:   Sat Aug 28 00:35:44 2021 +0100 | ||||
|     RH1996182: Login to the NSS Software Token in FIPS Mode | ||||
| 
 | ||||
| diff --git openjdk.orig/src/java.base/share/classes/module-info.java openjdk/src/java.base/share/classes/module-info.java
 | ||||
| index 39e69362458..aeb5fc2eb46 100644
 | ||||
| index 238735c0c8c..dbbf11bbb22 100644
 | ||||
| --- openjdk.orig/src/java.base/share/classes/module-info.java
 | ||||
| +++ openjdk/src/java.base/share/classes/module-info.java
 | ||||
| @@ -151,6 +151,7 @@ module java.base {
 | ||||
|          java.management, | ||||
| @@ -152,6 +152,7 @@ module java.base {
 | ||||
|          java.naming, | ||||
|          java.rmi, | ||||
|          jdk.charsets, | ||||
| +        jdk.crypto.cryptoki,
 | ||||
|          jdk.crypto.ec, | ||||
|          jdk.jartool, | ||||
|  | ||||
							
								
								
									
										28
									
								
								SOURCES/rh2021263-fips_ensure_security_initialised.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								SOURCES/rh2021263-fips_ensure_security_initialised.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| commit 4ac1a03b3ec73358988553fe9e200130847ea3b4 | ||||
| Author: Andrew Hughes <gnu.andrew@redhat.com> | ||||
| Date:   Mon Jan 10 20:19:40 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/access/SharedSecrets.java openjdk/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java
 | ||||
| index 5a2c9eb0c46..a1ee182d913 100644
 | ||||
| --- openjdk.orig/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java
 | ||||
| +++ openjdk/src/java.base/share/classes/jdk/internal/access/SharedSecrets.java
 | ||||
| @@ -39,6 +39,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 | ||||
| @@ -449,6 +450,9 @@ public class SharedSecrets {
 | ||||
|      } | ||||
|   | ||||
|      public static JavaSecuritySystemConfiguratorAccess getJavaSecuritySystemConfiguratorAccess() { | ||||
| +        if (javaSecuritySystemConfiguratorAccess == null) {
 | ||||
| +            ensureClassInitialized(Security.class);
 | ||||
| +        }
 | ||||
|          return javaSecuritySystemConfiguratorAccess; | ||||
|      } | ||||
|  } | ||||
							
								
								
									
										24
									
								
								SOURCES/rh2021263-fips_missing_native_returns.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								SOURCES/rh2021263-fips_missing_native_returns.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| commit 8f6e35dc9e9289aed290b36e260beeda76986bb5 | ||||
| Author: Fridrich Strba <fstrba@suse.com> | ||||
| Date:   Mon Jan 10 19:32:01 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 38919d6bb0f..caf678a7dd6 100644
 | ||||
| --- openjdk.orig/src/java.base/linux/native/libsystemconf/systemconf.c
 | ||||
| +++ openjdk/src/java.base/linux/native/libsystemconf/systemconf.c
 | ||||
| @@ -151,11 +151,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); | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user