diff --git a/.gitignore b/.gitignore
index 043c19a1b00..8945e729432 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,6 +21,7 @@
# exclude all source directories
/omr
/openj9
+/OpenJCEPlus
/openssl
# exclude optional eclipse project file
/.project
diff --git a/closed/GensrcJ9JCL.gmk b/closed/GensrcJ9JCL.gmk
index eaded1a21df..7715d441f36 100644
--- a/closed/GensrcJ9JCL.gmk
+++ b/closed/GensrcJ9JCL.gmk
@@ -46,6 +46,7 @@ $(eval $(call SetupCopyFiles,COPY_OVERLAY_FILES, \
src/java.base/share/classes/java/util/TimerTask.java \
src/java.base/share/classes/java/util/concurrent/ConcurrentHashMap.java \
src/java.base/share/classes/jdk/internal/misc/JavaNetInetAddressAccess.java \
+ src/java.base/share/classes/module-info.java \
src/java.base/share/classes/sun/security/jca/ProviderConfig.java \
src/java.base/share/classes/sun/security/jca/ProviderList.java \
src/java.base/unix/classes/java/lang/ProcessEnvironment.java \
diff --git a/closed/JPP.gmk b/closed/JPP.gmk
index d7ace87aadf..8bc3e332775 100644
--- a/closed/JPP.gmk
+++ b/closed/JPP.gmk
@@ -30,6 +30,10 @@ ifeq (true,$(OPENJ9_ENABLE_CRIU_SUPPORT))
JPP_TAGS += CRIU_SUPPORT
endif # OPENJ9_ENABLE_CRIU_SUPPORT
+ifeq (true,$(BUILD_OPENJCEPLUS))
+ JPP_TAGS += OPENJCEPLUS_SUPPORT
+endif # BUILD_OPENJCEPLUS
+
ifeq (true,$(OPENJ9_ENABLE_OPENJDK_METHODHANDLES))
JPP_TAGS += OPENJDK_METHODHANDLES
endif # OPENJ9_ENABLE_OPENJDK_METHODHANDLES
diff --git a/closed/autoconf/custom-hook.m4 b/closed/autoconf/custom-hook.m4
index d158e0ab84e..81381880352 100644
--- a/closed/autoconf/custom-hook.m4
+++ b/closed/autoconf/custom-hook.m4
@@ -52,6 +52,7 @@ AC_DEFUN_ONCE([CUSTOM_EARLY_HOOK],
OPENJ9_CONFIGURE_OPENJDK_METHODHANDLES
OPENJ9_THIRD_PARTY_REQUIREMENTS
OPENJ9_CHECK_NASM_VERSION
+ OPENJCEPLUS_SETUP
])
AC_DEFUN([OPENJ9_CONFIGURE_CMAKE],
@@ -826,3 +827,17 @@ AC_DEFUN([OPENJ9_GENERATE_TOOL_WRAPPERS],
OPENJ9_GENERATE_TOOL_WRAPPER([nasm], [$NASM])
OPENJ9_GENERATE_TOOL_WRAPPER([rc], [$RC])
])
+
+AC_DEFUN([OPENJCEPLUS_SETUP],
+[
+ AC_MSG_CHECKING([for OpenJCEPlus])
+ if test -d "$TOPDIR/OpenJCEPlus" ; then
+ BUILD_OPENJCEPLUS=true
+ AC_MSG_RESULT([yes])
+ else
+ BUILD_OPENJCEPLUS=false
+ AC_MSG_RESULT([no])
+ fi
+
+ AC_SUBST(BUILD_OPENJCEPLUS)
+])
diff --git a/closed/autoconf/custom-spec.gmk.in b/closed/autoconf/custom-spec.gmk.in
index 74d0107719b..198a98d23c8 100644
--- a/closed/autoconf/custom-spec.gmk.in
+++ b/closed/autoconf/custom-spec.gmk.in
@@ -179,3 +179,7 @@ ifeq (riscv64,$(OPENJDK_TARGET_CPU))
JAVA_FLAGS += -DserverStartupTimeout=36000
endif
endif
+
+# Required by OpenJCEPlus.
+BUILD_OPENJCEPLUS := @BUILD_OPENJCEPLUS@
+OPENJCEPLUS_TOPDIR := $(TOPDIR)/OpenJCEPlus
diff --git a/closed/custom/Images-pre.gmk b/closed/custom/Images-pre.gmk
index 6e343fd396b..1c7443d6d82 100644
--- a/closed/custom/Images-pre.gmk
+++ b/closed/custom/Images-pre.gmk
@@ -1,5 +1,5 @@
# ===========================================================================
-# (c) Copyright IBM Corp. 2020, 2021 All Rights Reserved
+# (c) Copyright IBM Corp. 2020, 2023 All Rights Reserved
# ===========================================================================
# 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
@@ -24,4 +24,5 @@ JRE_MODULES += \
openj9.dataaccess \
openj9.dtfj \
openj9.gpu \
+ $(if $(call equals, $(BUILD_OPENJCEPLUS), true), openjceplus) \
#
diff --git a/closed/custom/Main.gmk b/closed/custom/Main.gmk
index b086f61c5d1..d28a29282de 100644
--- a/closed/custom/Main.gmk
+++ b/closed/custom/Main.gmk
@@ -109,3 +109,28 @@ ifneq (,$(HEALTHCENTER_JAR))
# The content must be extracted before module-info can be compiled.
ibm.healthcenter-java : ibm.healthcenter-copy
endif # HEALTHCENTER_JAR
+
+ifeq (true,$(BUILD_OPENJCEPLUS))
+
+JGSKIT_MAKE := jgskit.mak
+ifeq ($(call isTargetOs, windows), true)
+ ifeq ($(call isTargetCpu, x86_64), true)
+ JGSKIT_MAKE := jgskit.win64.mak
+ endif
+endif
+
+openjceplus-copy : openjceplus-libs
+
+.PHONY : openjceplus-clean
+
+openjceplus-clean :
+ @$(ECHO) Cleaning OpenJCEPlus native
+ @$(RM) -f \
+ $(addprefix $(OPENJCEPLUS_TOPDIR)/src/main/native/, \
+ com_ibm_crypto_plus_provider_icc_FastJNIBuffer.h \
+ com_ibm_crypto_plus_provider_icc_NativeInterface.h)
+ $(MAKE) -C $(OPENJCEPLUS_TOPDIR)/src/main/native -f $(JGSKIT_MAKE) cleanAll
+
+clean : openjceplus-clean
+
+endif # BUILD_OPENJCEPLUS
diff --git a/closed/custom/common/Modules.gmk b/closed/custom/common/Modules.gmk
index fc0a05a0a67..394236b8885 100644
--- a/closed/custom/common/Modules.gmk
+++ b/closed/custom/common/Modules.gmk
@@ -1,5 +1,5 @@
# ===========================================================================
-# (c) Copyright IBM Corp. 2017, 2022 All Rights Reserved
+# (c) Copyright IBM Corp. 2017, 2023 All Rights Reserved
# ===========================================================================
# 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
@@ -56,6 +56,10 @@ TOP_SRC_DIRS += \
$(J9JCL_SOURCES_DIR) \
#
+ifeq (true,$(BUILD_OPENJCEPLUS))
+ TOP_SRC_DIRS += $(OPENJCEPLUS_TOPDIR)/src/main
+endif
+
.PHONY : generate-j9jcl-sources
generate-j9jcl-sources $(J9JCL_SOURCES_DONEFILE) :
diff --git a/closed/get_j9_source.sh b/closed/get_j9_source.sh
index c5754c82a79..ef0911da8b0 100644
--- a/closed/get_j9_source.sh
+++ b/closed/get_j9_source.sh
@@ -39,6 +39,13 @@ usage() {
echo " -omr-branch the OpenJ9/omr git branch: openj9"
echo " -omr-sha a commit SHA for the omr repository"
echo " -omr-reference a local repo to use as a clone reference"
+ echo " -openjceplus-repo the OpenJCEPlus repository url"
+ echo " -openjceplus-branch the OpenJCEPlus git branch"
+ echo " -openjceplus-sha a commit SHA for the OpenJCEPlus repository"
+ echo " -openjceplus-reference a local repo to use as a clone reference"
+ echo " -gskit-bin the GSKit binary url"
+ echo " -gskit-sdk-bin the GSKIT SDK binary url"
+ echo " -gskit-credential the credential for downloading the GSKit binaries"
echo " -parallel (boolean) if 'true' then the clone j9 repository commands run in parallel, default is false"
echo ""
exit 1
@@ -108,6 +115,34 @@ for i in "$@" ; do
references[omr]="${i#*=}"
;;
+ -openjceplus-repo=* )
+ git_urls[OpenJCEPlus]="${i#*=}"
+ ;;
+
+ -openjceplus-branch=* )
+ branches[OpenJCEPlus]="${i#*=}"
+ ;;
+
+ -openjceplus-sha=* )
+ shas[OpenJCEPlus]="${i#*=}"
+ ;;
+
+ -openjceplus-reference=* )
+ references[OpenJCEPlus]="${i#*=}"
+ ;;
+
+ -gskit-bin=* )
+ gskit_bin="${i#*=}"
+ ;;
+
+ -gskit-sdk-bin=* )
+ gskit_sdk_bin="${i#*=}"
+ ;;
+
+ -gskit-credential=* )
+ gskit_credential="${i#*=}"
+ ;;
+
-parallel=* )
pflag="${i#*=}"
;;
@@ -173,6 +208,38 @@ if [ ${pflag} = true ] ; then
wait
fi
+# Download OCK binaries and create Java module folder
+openjceplus_source=OpenJCEPlus
+if [ -n "${git_urls[$openjceplus_source]}" ] ; then
+
+ echo
+ echo "$openjceplus_source exists, download OCK binaries"
+ echo
+
+ cd $openjceplus_source
+ mkdir -p ock/jgsk_sdk/lib64
+
+ if [ $gskit_credential ]; then
+ # Download GSKit binaries from artifactory
+ curl -vk -u "$gskit_credential" -X GET $gskit_bin > ./ock/jgsk_crypto.tar
+ curl -vk -u "$gskit_credential" -X GET $gskit_sdk_bin > ./ock/jgsk_crypto_sdk.tar
+ else
+ echo
+ echo "GSKit binaries are needed for compiling $openjceplus_source"
+ echo "Please set -gskit-bin, -gskit-sdk-bin, and -gskit-credential"
+ exit 1
+ fi
+
+ tar -xf ./ock/jgsk_crypto_sdk.tar -C ./ock/
+ tar -xf ./ock/jgsk_crypto.tar -C ./ock/jgsk_sdk/lib64/
+
+ # Create OpenJCEPlus Java module folder
+ mkdir -p ./src/main/openjceplus/share/classes/
+ cp -r ./src/main/java/* ./src/main/openjceplus/share/classes/
+
+ cd ..
+fi
+
END_TIME=$(date +%s)
date "+[%F %T] OpenJ9 clone repositories finished in $(($END_TIME - $START_TIME)) seconds"
diff --git a/closed/make/copy/Copy-openjceplus.gmk b/closed/make/copy/Copy-openjceplus.gmk
new file mode 100644
index 00000000000..ec20171d3d0
--- /dev/null
+++ b/closed/make/copy/Copy-openjceplus.gmk
@@ -0,0 +1,49 @@
+# ===========================================================================
+# (c) Copyright IBM Corp. 2023, 2023 All Rights Reserved
+# ===========================================================================
+# 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.
+#
+# IBM designates this particular file as subject to the "Classpath" exception
+# as provided by IBM 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, see .
+# ===========================================================================
+
+include $(TOPDIR)/closed/CopySupport.gmk
+
+ifeq (true,$(BUILD_OPENJCEPLUS))
+ # Copy OpenJCEPlus native libraries.
+ $(eval $(call SetupCopyFiles, OPENJCEPLUS_JGSKIT_LIBS_COPY, \
+ SRC := $(OPENJCEPLUS_TOPDIR)/target, \
+ FILES := $(filter %.dll %.so %.x, $(call FindFiles, $(OPENJCEPLUS_TOPDIR)/target)), \
+ FLATTEN := true, \
+ DEST := $(LIB_DST_DIR), \
+ ))
+
+ TARGETS += $(OPENJCEPLUS_JGSKIT_LIBS_COPY)
+
+ # Bundle GSKIT library.
+ OPENJCEPLUS_OCK_DIR := $(TOPDIR)/OpenJCEPlus/ock/jgsk_sdk/lib64
+ ifeq ($(call isTargetOs, windows), true)
+ OPENJCEPLUS_OCK_SUB_DIR := modules_cmds
+ else
+ OPENJCEPLUS_OCK_SUB_DIR := modules_libs
+ endif
+
+ $(eval $(call SetupCopyFiles, OPENJCEPLUS_OCK_COPY, \
+ SRC := $(OPENJCEPLUS_OCK_DIR), \
+ DEST := $(SUPPORT_OUTPUTDIR)/$(OPENJCEPLUS_OCK_SUB_DIR)/$(MODULE), \
+ FILES := $(call FindFiles, $(OPENJCEPLUS_OCK_DIR)), \
+ ))
+
+ TARGETS += $(OPENJCEPLUS_OCK_COPY)
+endif # BUILD_OPENJCEPLUS
diff --git a/closed/make/lib/Lib-openjceplus.gmk b/closed/make/lib/Lib-openjceplus.gmk
new file mode 100644
index 00000000000..66eb3b209d4
--- /dev/null
+++ b/closed/make/lib/Lib-openjceplus.gmk
@@ -0,0 +1,68 @@
+# ===========================================================================
+# (c) Copyright IBM Corp. 2023, 2023 All Rights Reserved
+# ===========================================================================
+# 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.
+#
+# IBM designates this particular file as subject to the "Classpath" exception
+# as provided by IBM 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, see .
+# ===========================================================================
+
+include LibCommon.gmk
+
+ifeq (true,$(BUILD_OPENJCEPLUS))
+
+# Identify the desired JGSKIT target platform.
+GSKIT_HOME := $(OPENJCEPLUS_TOPDIR)/ock/jgsk_sdk
+JGSKIT_PLATFORM :=
+JGSKIT_MAKE := jgskit.mak
+JGSKIT_MAKE_PATH := $(OPENJCEPLUS_TOPDIR)/src/main/native
+JCE_CLASSPATH := $(JDK_OUTPUTDIR)/modules/openjceplus:$(JDK_OUTPUTDIR)/modules/java.base
+
+ifeq ($(call isTargetOs, aix), true)
+ JGSKIT_PLATFORM := ppc-aix64
+else ifeq ($(call isTargetOs, linux), true)
+ ifeq ($(call isTargetCpu, ppc64le), true)
+ JGSKIT_PLATFORM := ppcle-linux64
+ else ifeq ($(call isTargetCpu, x86_64), true)
+ JGSKIT_PLATFORM := x86-linux64
+ endif
+else ifeq ($(call isTargetOs, windows), true)
+ ifeq ($(call isTargetCpu, x86_64), true)
+ JGSKIT_PLATFORM := win64
+ JGSKIT_MAKE := jgskit.win64.mak
+ JCE_CLASSPATH := "$(call MixedPath,$(OPENJCEPLUS_TOPDIR)/src/main/java)\;$(call MixedPath,$(TOPDIR)/src/java.base/share/classes)"
+ GSKIT_HOME := $(call MixedPath,$(GSKIT_HOME))
+ BOOT_JDK := $(call MixedPath,$(BOOT_JDK))
+ endif
+endif
+
+ifeq (,$(JGSKIT_PLATFORM))
+ $(error Unsupported platform $(OPENJDK_TARGET_OS)-$(OPENJDK_TARGET_CPU))
+endif # JGSKIT_PLATFORM
+
+.PHONY : compile-libs
+
+compile-libs :
+ @$(ECHO) Compiling OpenJCEPlus native
+ export \
+ GSKIT_HOME=$(GSKIT_HOME) \
+ JAVA_HOME=$(BOOT_JDK) \
+ JCE_CLASSPATH=$(JCE_CLASSPATH) \
+ PLATFORM=$(JGSKIT_PLATFORM) \
+ && $(MAKE) -j1 -C $(JGSKIT_MAKE_PATH) -f $(JGSKIT_MAKE) all
+ @$(ECHO) OpenJCEplus compile complete
+
+TARGETS += compile-libs
+
+endif # BUILD_OPENJCEPLUS
diff --git a/get_source.sh b/get_source.sh
index 90756e803f2..7fcaec15b56 100644
--- a/get_source.sh
+++ b/get_source.sh
@@ -1,6 +1,6 @@
#!/bin/bash
# ===========================================================================
-# (c) Copyright IBM Corp. 2017, 2022 All Rights Reserved
+# (c) Copyright IBM Corp. 2017, 2023 All Rights Reserved
# ===========================================================================
#
# This code is free software; you can redistribute it and/or modify it
@@ -40,6 +40,13 @@ usage() {
echo " -omr-branch the OpenJ9/omr git branch: openj9"
echo " -omr-sha a commit SHA for the omr repository"
echo " -omr-reference a local repo to use as a clone reference"
+ echo " -openjceplus-repo the OpenJCEPlus repository url"
+ echo " -openjceplus-branch the OpenJCEPlus git branch"
+ echo " -openjceplus-sha a commit SHA for the OpenJCEPlus repository"
+ echo " -openjceplus-reference a local repo to use as a clone reference"
+ echo " -gskit-bin the GSKit binary url"
+ echo " -gskit-sdk-bin the GSKIT SDK binary url"
+ echo " -gskit-credential the credential for downloading the GSKit and GSKit SDK"
echo " -parallel (boolean) if 'true' then the clone j9 repository commands run in parallel, default is false"
echo " --openssl-repo Specify the OpenSSL repository to download from"
echo " --openssl-version Specify the version of OpenSSL source to download"
@@ -57,7 +64,23 @@ for i in "$@" ; do
usage
;;
- -openj9-repo=* | -openj9-branch=* | -openj9-sha=* | -openj9-reference=* | -omr-repo=* | -omr-branch=* | -omr-sha=* | -omr-reference=* | -parallel=* )
+ -gskit-bin=* \
+ | -gskit-credential=* \
+ | -gskit-sdk-bin=* \
+ | -omr-branch=* \
+ | -omr-reference=* \
+ | -omr-repo=* \
+ | -omr-sha=* \
+ | -openj9-branch=* \
+ | -openj9-reference=* \
+ | -openj9-repo=* \
+ | -openj9-sha=* \
+ | -openjceplus-branch=* \
+ | -openjceplus-reference=* \
+ | -openjceplus-repo=* \
+ | -openjceplus-sha=* \
+ | -parallel=* \
+ )
j9options="${j9options} ${i}"
;;
diff --git a/src/java.base/share/classes/module-info.java b/src/java.base/share/classes/module-info.java
index 6805f533c45..a1d079199d9 100644
--- a/src/java.base/share/classes/module-info.java
+++ b/src/java.base/share/classes/module-info.java
@@ -25,7 +25,7 @@
/*
* ===========================================================================
- * (c) Copyright IBM Corp. 2022, 2022 All Rights Reserved
+ * (c) Copyright IBM Corp. 2022, 2023 All Rights Reserved
* ===========================================================================
*/
@@ -160,6 +160,9 @@
jdk.compiler,
jdk.jlink;
exports jdk.internal.logger to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
java.logging;
exports jdk.internal.org.objectweb.asm to
jdk.jartool,
@@ -182,6 +185,9 @@
exports jdk.internal.org.xml.sax.helpers to
jdk.jfr;
exports jdk.internal.misc to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
java.desktop,
java.logging,
java.management,
@@ -252,7 +258,9 @@
jdk.jconsole,
jdk.sctp;
exports sun.net.www to
- java.desktop,
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
java.net.http,
jdk.jartool;
exports sun.net.www.protocol.http to
@@ -283,8 +291,14 @@
java.security.jgss,
jdk.crypto.ec;
exports sun.security.internal.interfaces to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
jdk.crypto.cryptoki;
exports sun.security.internal.spec to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
jdk.crypto.cryptoki;
exports sun.security.jca to
java.smartcardio,
@@ -292,6 +306,9 @@
jdk.crypto.cryptoki,
jdk.naming.dns;
exports sun.security.pkcs to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
jdk.crypto.ec,
jdk.jartool;
exports sun.security.provider to
@@ -311,6 +328,9 @@
exports sun.security.tools to
jdk.jartool;
exports sun.security.util to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
java.desktop,
java.naming,
java.rmi,
@@ -329,6 +349,9 @@
exports sun.security.util.math.intpoly to
jdk.crypto.ec
exports sun.security.x509 to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
jdk.crypto.ec,
jdk.crypto.cryptoki,
jdk.jartool;
@@ -341,6 +364,9 @@
jdk.jlink,
jdk.localedata;
exports sun.util.logging to
+/*[IF OPENJCEPLUS_SUPPORT]*/
+ openjceplus,
+/*[ENDIF] OPENJCEPLUS_SUPPORT */
java.desktop,
java.logging,
java.prefs;