Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package openssl-ibmca for openSUSE:Factory checked in at 2023-10-13 23:15:52 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/openssl-ibmca (Old) and /work/SRC/openSUSE:Factory/.openssl-ibmca.new.20540 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "openssl-ibmca" Fri Oct 13 23:15:52 2023 rev:48 rq:1117655 version:2.4.1 Changes: -------- --- /work/SRC/openSUSE:Factory/openssl-ibmca/openssl-ibmca.changes 2023-05-02 16:22:08.122916627 +0200 +++ /work/SRC/openSUSE:Factory/.openssl-ibmca.new.20540/openssl-ibmca.changes 2023-10-13 23:16:47.135632398 +0200 @@ -1,0 +2,19 @@ +Fri Oct 13 10:39:42 UTC 2023 - Nikolay Gueorguiev <nikolay.gueorgu...@suse.com> + +- Removed an obsolete patch (implemented in the version 2.4.1) + * openssl-ibmca-engine-noregister.patch + +------------------------------------------------------------------- +Fri Oct 6 06:35:00 UTC 2023 - Nikolay Gueorguiev <nikolay.gueorgu...@suse.com> + +- Upgrade to version 2.4.1 (jsc#PED-5422) + * Provider: Change the default log directory to /tmp + * Bug fixes + +------------------------------------------------------------------- +Mon May 22 07:20:32 UTC 2023 - Nikolay Gueorguiev <nikolay.gueorgu...@suse.com> + +- Updated the .spec file, amended to use libica4 instead of libica + * Requires: libica4 >= 4 + +------------------------------------------------------------------- Old: ---- openssl-ibmca-2.4.0.tar.gz openssl-ibmca-engine-noregister.patch New: ---- openssl-ibmca-2.4.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ openssl-ibmca.spec ++++++ --- /var/tmp/diff_new_pack.86Ojid/_old 2023-10-13 23:16:47.615650491 +0200 +++ /var/tmp/diff_new_pack.86Ojid/_new 2023-10-13 23:16:47.619650642 +0200 @@ -21,7 +21,7 @@ %global enginesdir %(pkg-config --variable=enginesdir libcrypto) Name: openssl-ibmca -Version: 2.4.0 +Version: 2.4.1 Release: 0 Summary: The IBMCA OpenSSL dynamic engine License: Apache-2.0 @@ -30,15 +30,12 @@ Source: https://github.com/opencryptoki/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz Source1: engine_section.txt ### -Patch001: openssl-ibmca-engine-noregister.patch -### BuildRequires: autoconf BuildRequires: automake -BuildRequires: libica >= 4.0.0 BuildRequires: libica-devel >= 4.0.0 BuildRequires: libica-tools >= 4.0.0 BuildRequires: libtool -Requires: libica >= 4.0.0 +Requires: libica4 >= 4 %if %{openssl3} BuildRequires: openssl-devel > 3.0.0 Requires: openssl > 3.0.0 ++++++ openssl-ibmca-2.4.0.tar.gz -> openssl-ibmca-2.4.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/ChangeLog new/openssl-ibmca-2.4.1/ChangeLog --- old/openssl-ibmca-2.4.0/ChangeLog 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/ChangeLog 2023-09-21 08:52:43.000000000 +0200 @@ -1,3 +1,7 @@ +* openssl-ibmca 2.4.1 +- Provider: Change the default log directory to /tmp +- Bug fixes + * openssl-ibmca 2.4.0 - Provider: Adjustments for OpenSSL versions 3.1 and 3.2 - Provider: Support RSA blinding diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/bootstrap.sh new/openssl-ibmca-2.4.1/bootstrap.sh --- old/openssl-ibmca-2.4.0/bootstrap.sh 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/bootstrap.sh 2023-09-21 08:52:43.000000000 +0200 @@ -15,4 +15,4 @@ # limitations under the License. # -autoreconf -iv +autoreconf --force --install --verbose --warnings=all diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/configure.ac new/openssl-ibmca-2.4.1/configure.ac --- old/openssl-ibmca-2.4.0/configure.ac 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/configure.ac 2023-09-21 08:52:43.000000000 +0200 @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. # See autoconf and autoscan online documentation for details. -AC_INIT([openssl-ibmca], [2.4.0], [https://github.com/opencryptoki/openssl-ibmca/issues],[],[https://github.com/opencryptoki/openssl-ibmca]) +AC_INIT([openssl-ibmca], [2.4.1], [https://github.com/opencryptoki/openssl-ibmca/issues],[],[https://github.com/opencryptoki/openssl-ibmca]) AC_CONFIG_SRCDIR([src/engine/e_ibmca.c]) # sanity check AC_CONFIG_MACRO_DIR([m4]) AC_CONFIG_AUX_DIR([build-aux]) @@ -10,7 +10,7 @@ AC_PATH_PROG([CHMOD], [chmod], [/bin/chmod]) -logdir=$localstatedir/log/ibmca +logdir=/tmp AC_SUBST(logdir) # Cmdline arguments. @@ -48,6 +48,20 @@ AC_PROG_CC LT_INIT +dnl --- check for perl +AC_PATH_PROG(PERL, perl) +if test -z "$PERL" ; then + AC_MSG_ERROR([Please install perl]) +fi + +AC_MSG_CHECKING([if perl module 'FindBin' is installed]) +(echo "use FindBin;" ; echo "exit(0);") | $PERL > /dev/null 2>&1 +if test $? != 0 ; then + AC_MSG_RESULT(no) + AC_MSG_ERROR([Please install perl-FindBin]) +fi +AC_MSG_RESULT(yes) + # Checks for libraries. AC_CHECK_LIB([crypto], [RAND_add], [], AC_MSG_ERROR([*** openssl >= 1.1.1 is required ***])) AC_CHECK_LIB([crypto], [OSSL_LIB_CTX_new], [openssl_3_0="yes"], [openssl_3_0="no"]) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/openssl-ibmca-provider.spec new/openssl-ibmca-2.4.1/openssl-ibmca-provider.spec --- old/openssl-ibmca-2.4.0/openssl-ibmca-provider.spec 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/openssl-ibmca-provider.spec 2023-09-21 08:52:43.000000000 +0200 @@ -5,7 +5,7 @@ # %global modulesdir %(pkg-config --variable=modulesdir libcrypto) Name: openssl-ibmca -Version: 2.4.0 +Version: 2.4.1 Release: 1%{?dist} Summary: An IBMCA OpenSSL dynamic provider diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/openssl-ibmca.spec new/openssl-ibmca-2.4.1/openssl-ibmca.spec --- old/openssl-ibmca-2.4.0/openssl-ibmca.spec 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/openssl-ibmca.spec 2023-09-21 08:52:43.000000000 +0200 @@ -1,7 +1,7 @@ %global enginesdir %(pkg-config --variable=enginesdir libcrypto) Name: openssl-ibmca -Version: 2.4.0 +Version: 2.4.1 Release: 1%{?dist} Summary: An IBMCA OpenSSL dynamic engine diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/engine/Makefile.am new/openssl-ibmca-2.4.1/src/engine/Makefile.am --- old/openssl-ibmca-2.4.0/src/engine/Makefile.am 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/engine/Makefile.am 2023-09-21 08:52:43.000000000 +0200 @@ -1,4 +1,4 @@ -VERSION = 2:4:0 +VERSION = 2:4:1 lib_LTLIBRARIES=ibmca.la @@ -16,8 +16,8 @@ ibmca_la_LDFLAGS=-module -version-number ${VERSION} -shared -no-undefined \ -avoid-version -Wl,--version-script=${srcdir}/ibmca.map -dist_ibmca_la_SOURCES=ibmca.h e_ibmca_err.h -EXTRA_DIST = openssl.cnf.sample +dist_ibmca_la_SOURCES=ibmca.h e_ibmca_err.h openssl-compat.h +EXTRA_DIST = openssl.cnf.sample ibmca.map test/ibmca_mechaList_test.c ACLOCAL_AMFLAGS = -I m4 SUBDIRS = doc @@ -29,3 +29,5 @@ noinst_SCRIPTS = ibmca-engine-opensslconfig EXTRA_DIST += ibmca-engine-opensslconfig.in + +CLEANFILES = ibmca-engine-opensslconfig diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/engine/e_ibmca.c new/openssl-ibmca-2.4.1/src/engine/e_ibmca.c --- old/openssl-ibmca-2.4.0/src/engine/e_ibmca.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/engine/e_ibmca.c 2023-09-21 08:52:43.000000000 +0200 @@ -642,6 +642,9 @@ if (!ENGINE_set_pkey_meths(e, ibmca_engine_pkey_meths)) goto out; + if (!ENGINE_set_flags(e, ENGINE_FLAGS_NO_REGISTER_ALL)) + goto out; + rc = 1; out: free(pmech_list); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/Makefile.am new/openssl-ibmca-2.4.1/src/provider/Makefile.am --- old/openssl-ibmca-2.4.0/src/provider/Makefile.am 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/Makefile.am 2023-09-21 08:52:43.000000000 +0200 @@ -1,5 +1,5 @@ -VERSION = 2:4:0 -VERSION_STR = 2.4.0 +VERSION = 2:4:1 +VERSION_STR = 2.4.1 lib_LTLIBRARIES=ibmca-provider.la @@ -8,6 +8,8 @@ rsa_signature.c ec_keymgmt.c ec_signature.c ec_keyexch.c \ dh_keymgmt.c dh_keyexch.c rsa_blinding.c rsa_sup_mul.c +dist_ibmca_provider_la_SOURCES=p_ibmca.h constant_time.h + ibmca_provider_la_CFLAGS=-DIBMCA_VERSION=\"${VERSION_STR}\" -DIBMCA_LOGDIR=\"$(logdir)\" if PROVIDER_FULL_LIBICA @@ -18,14 +20,11 @@ ibmca_provider_la_LDFLAGS=-module -version-number ${VERSION} -shared -no-undefined \ -avoid-version -Wl,--version-script=${srcdir}/ibmca-provider.map -EXTRA_DIST = openssl.cnf.provider.sample ibmca-provider-opensslconfig +EXTRA_DIST = openssl.cnf.provider.sample ibmca-provider-opensslconfig \ + ibmca-provider.map ACLOCAL_AMFLAGS = -I m4 SUBDIRS = doc noinst_SCRIPTS = ibmca-provider-opensslconfig - -install-data-hook: - $(MKDIR_P) $(DESTDIR)$(logdir) - $(CHMOD) 0777 $(DESTDIR)$(logdir) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/doc/ibmca-provider.man new/openssl-ibmca-2.4.1/src/provider/doc/ibmca-provider.man --- old/openssl-ibmca-2.4.0/src/provider/doc/ibmca-provider.man 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/doc/ibmca-provider.man 2023-09-21 08:52:43.000000000 +0200 @@ -94,13 +94,25 @@ .IP "debug = yes | no | stderr" .RS Enables debug output for the IBMCA provider. If this option is not specified, -no debuging output is produced. If \fBdebug = stderr\fP is specified, +no debugging output is produced. If \fBdebug = stderr\fP is specified, debugging messages are printed to stderr. Otherwise the debug output is written -into a trace file in \fB[/usr/local]/var/log/ibmca/trace-<provider-name>.<pid>\fP, -where <provider-name> is the name of the IBMCA provider from the identity -option, and <pid> is the process ID of the current process. You can also -enable debugging by setting the environment variable \fBIBMCA_DEBUG\fP to -\fBon\fP or \fBstderr\fP. +into a trace file in \fB<debug-path>/trace-<provider-name>.<pid>\fP, +where <debug-path> is the path name of a directory to where the debug files are +written (default: \fB/tmp\fP), <provider-name> is the name of the IBMCA provider +from the identity option, and <pid> is the process ID of the current process. +You can also enable debugging by setting the environment variable +\fBIBMCA_DEBUG\fP to \fBon\fP or \fBstderr\fP. +.RE +.PP +.IP "debug-path = /dir/to/debug/directory" +.RS +Sets the directory path to where debug files are written when debug is enabled +via \fBdebug = yes\fP or via environment variable \fBIBMCA_DEBUG=on\fP. +You can also set the debug path by setting the environment variable +\fBIBMCA_DEBUG_PATH\fP to the directory path. It must be ensured that the user +under which the application that uses the IBMCA provider runs has write access +to that directory. If this option is not specified, the default debug path is +\fB/tmp\fP. .RE .PP .IP "fips = yes | no" @@ -153,8 +165,18 @@ .B $IBMCA_DEBUG is set to \fBstderr\fP debug output to stderr for the IBMCA provider is enabled. If it is set to \fBon\fP the debug output is written into a trace file in -\fB[/usr/local]/var/log/ibmca/trace-<provider-name>.<pid>\fP, where <pid> is -the process ID of the current process. +\fB<debug-path>/trace-<provider-name>.<pid>\fP, where <debug-path> is the path +name of a directory to where the debug files are written (default: \fB/tmp\fP), +<provider-name> is the name of the IBMCA provider from the identity option, +and <pid> is the process ID of the current process. +.PP +.TP +.BR IBMCA_DEBUG_PATH +Sets the directory path to where debug files are written when debug is enabled +via \fBdebug = yes\fP configuration option or via environment variable +\fBIBMCA_DEBUG=on\fP. It must be ensured that the user under which the +application that uses the IBMCA provider runs has write access to that +directory. .PP .SH SEE ALSO .B provider(1) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/p_ibmca.c new/openssl-ibmca-2.4.1/src/provider/p_ibmca.c --- old/openssl-ibmca-2.4.0/src/provider/p_ibmca.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/p_ibmca.c 2023-09-21 08:52:43.000000000 +0200 @@ -19,6 +19,7 @@ #include <stdio.h> #include <stdarg.h> #include <stddef.h> +#include <stdlib.h> #include <err.h> #include <strings.h> #include <string.h> @@ -58,6 +59,8 @@ static int ibmca_config_debug(struct ibmca_prov_ctx *provctx, const char *key, const char *value); +static int ibmca_config_debug_path(struct ibmca_prov_ctx *provctx, + const char *key, const char *value); static int ibmca_config_fips(struct ibmca_prov_ctx *provctx, const char *key, const char *value); static int ibmca_config_algorithms(struct ibmca_prov_ctx *provctx, @@ -70,6 +73,7 @@ const char *key, const char *value); static const struct ibmca_config_item config_items[] = { + { IBMCA_CONF_DEBUG_PATH, ibmca_config_debug_path }, { IBMCA_CONF_DEBUG, ibmca_config_debug }, { IBMCA_CONF_FIPS, ibmca_config_fips }, { IBMCA_CONF_ALGORITHMS, ibmca_config_algorithms }, @@ -881,7 +885,9 @@ *p = '_'; if (snprintf(debug_file, sizeof(debug_file), "%s/trace-%s.%d", - IBMCA_LOGDIR, prov_name, provctx->debug_pid) + provctx->debug_path != NULL ? provctx->debug_path : + IBMCA_LOGDIR, + prov_name, provctx->debug_pid) >= (int)sizeof(debug_file)) { put_error_ctx(provctx, IBMCA_ERR_INTERNAL_ERROR, "IBMCA_LOGDIR too long: '%s'", IBMCA_LOGDIR); @@ -904,6 +910,20 @@ return 1; } +static int ibmca_config_debug_path(struct ibmca_prov_ctx *provctx, + const char *key, const char *value) +{ + /* + * If the debug path is already set (e.g. due to IBMCA_DEBUG_PATH + * environment variable) do not override the setting. + */ + if (provctx->debug_path != NULL) + return 1; + + return ibmca_config_const_string(provctx, key, value, + &provctx->debug_path); +} + static int ibmca_config_fips(struct ibmca_prov_ctx *provctx, const char *key, const char *value) { @@ -1302,6 +1322,9 @@ ctx->c_free = c_free; ctx->ica_adapter = DRIVER_NOT_LOADED; + val = secure_getenv(IBMCA_DEBUG_PATH_ENVVAR); + if (val != NULL) + ibmca_config_debug_path(ctx, IBMCA_CONF_DEBUG_PATH, val); val = getenv(IBMCA_DEBUG_ENVVAR); if (val != NULL) ibmca_config_debug(ctx, IBMCA_CONF_DEBUG, val); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/p_ibmca.h new/openssl-ibmca-2.4.1/src/provider/p_ibmca.h --- old/openssl-ibmca-2.4.0/src/provider/p_ibmca.h 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/p_ibmca.h 2023-09-21 08:52:43.000000000 +0200 @@ -27,9 +27,11 @@ /* Environment variable name to enable debug */ #define IBMCA_DEBUG_ENVVAR "IBMCA_DEBUG" +#define IBMCA_DEBUG_PATH_ENVVAR "IBMCA_DEBUG_PATH" /* IBMCA provider configuration key words */ #define IBMCA_CONF_DEBUG "debug" +#define IBMCA_CONF_DEBUG_PATH "debug-path" #define IBMCA_CONF_ALGORITHMS "algorithms" #define IBMCA_CONF_FIPS "fips" #define IBMCA_CONF_FALLBACK_PROPS "fallback-properties" @@ -64,6 +66,7 @@ OSSL_FUNC_CRYPTO_secure_clear_free_fn *c_secure_clear_free; OSSL_FUNC_OPENSSL_cleanse_fn *c_cleanse; bool debug; + const char *debug_path; FILE *debug_file; pid_t debug_pid; pthread_mutex_t debug_mutex; @@ -124,7 +127,9 @@ union { struct { size_t bits; - ica_rsa_key_crt_t private; + size_t keylength; + ica_rsa_key_crt_t private_crt; + ica_rsa_key_mod_expo_t private_me; ica_rsa_key_mod_expo_t public; struct ibmca_pss_params pss; /* For type EVP_PKEY_RSA_PSS only */ BN_BLINDING *blinding; @@ -176,6 +181,9 @@ int (*dup_cb) (const struct ibmca_op_ctx *ctx, struct ibmca_op_ctx *new_ctx)); +bool ibmca_keymgmt_rsa_pub_valid(const ica_rsa_key_mod_expo_t *public); +bool ibmca_keymgmt_rsa_priv_crt_valid(const ica_rsa_key_crt_t *private_crt); +bool ibmca_keymgmt_rsa_priv_me_valid(const ica_rsa_key_mod_expo_t *private_me); OSSL_FUNC_keymgmt_free_fn ibmca_keymgmt_free; OSSL_FUNC_keymgmt_dup_fn ibmca_keymgmt_dup; @@ -519,8 +527,8 @@ int ibmca_keymgmt_rsa_pub_as_bn(struct ibmca_key *key, BIGNUM **n, BIGNUM **e); -int ibmca_rsa_crt_with_blinding(struct ibmca_key *key, const unsigned char *in, - unsigned char *out, size_t rsa_size); +int ibmca_rsa_priv_with_blinding(struct ibmca_key *key, const unsigned char *in, + unsigned char *out, size_t rsa_size); int ossl_bn_rsa_do_unblind(const unsigned char *intermediate, const BIGNUM *unblind, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/rsa_asym_cipher.c new/openssl-ibmca-2.4.1/src/provider/rsa_asym_cipher.c --- old/openssl-ibmca-2.4.0/src/provider/rsa_asym_cipher.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/rsa_asym_cipher.c 2023-09-21 08:52:43.000000000 +0200 @@ -844,7 +844,7 @@ } /* Perform private key decrypt */ - rc = ibmca_rsa_crt_with_blinding(ctx->key, in, dec_data, rsa_size); + rc = ibmca_rsa_priv_with_blinding(ctx->key, in, dec_data, rsa_size); if (rc != 1) { ibmca_debug_op_ctx(ctx, "ibmca_asym_cipher_rsa_with_blinding failed"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/rsa_blinding.c new/openssl-ibmca-2.4.1/src/provider/rsa_blinding.c --- old/openssl-ibmca-2.4.0/src/provider/rsa_blinding.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/rsa_blinding.c 2023-09-21 08:52:43.000000000 +0200 @@ -392,8 +392,8 @@ return rc; } -int ibmca_rsa_crt_with_blinding(struct ibmca_key *key, const unsigned char *in, - unsigned char *out, size_t rsa_size) +int ibmca_rsa_priv_with_blinding(struct ibmca_key *key, const unsigned char *in, + unsigned char *out, size_t rsa_size) { BN_BLINDING *blinding; bool local_blinding = false; @@ -404,7 +404,7 @@ ibmca_debug_key(key, "key: %p rsa_size: %lu", key, rsa_size); - if (rsa_size != key->rsa.private.key_length) { + if (rsa_size != key->rsa.keylength) { put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "rsa_size is not modulus size"); goto out; @@ -445,11 +445,26 @@ goto out; } - rc = ica_rsa_crt(key->provctx->ica_adapter, buf, - &key->rsa.private, buf + rsa_size); - if (rc != 0) { - ibmca_debug_key(key, "ERROR: ica_rsa_crt failed with: %s", - strerror(rc)); + if (ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt)) { + rc = ica_rsa_crt(key->provctx->ica_adapter, buf, + &key->rsa.private_crt, buf + rsa_size); + if (rc != 0) { + ibmca_debug_key(key, "ERROR: ica_rsa_crt failed with: %s", + strerror(rc)); + rc = 0; + goto out; + } + } else if (ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)) { + rc = ica_rsa_mod_expo(key->provctx->ica_adapter, buf, + &key->rsa.private_me, buf + rsa_size); + if (rc != 0) { + ibmca_debug_key(key, "ERROR: ica_rsa_mod_expo failed with: %s", + strerror(rc)); + rc = 0; + goto out; + } + } else { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "No private key"); rc = 0; goto out; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/rsa_keymgmt.c new/openssl-ibmca-2.4.1/src/provider/rsa_keymgmt.c --- old/openssl-ibmca-2.4.0/src/provider/rsa_keymgmt.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/rsa_keymgmt.c 2023-09-21 08:52:43.000000000 +0200 @@ -241,25 +241,14 @@ return 1; } -static int ibmca_keymgmt_rsa_priv_key_from_data( +static int ibmca_keymgmt_rsa_priv_crt_key_from_data( const struct ibmca_prov_ctx *provctx, - const OSSL_PARAM params[], - BIGNUM **d, BIGNUM **p, + const OSSL_PARAM params[], BIGNUM **p, BIGNUM **q, BIGNUM **dp, BIGNUM **dq, BIGNUM **qinv) { int rc; - /* OSSL_PKEY_PARAM_RSA_D */ - *d = BN_secure_new(); - if (*d == NULL) { - put_error_ctx(provctx, IBMCA_ERR_MALLOC_FAILED, "BN_secure_new failed"); - goto error; - } - rc = ibmca_param_get_bn(provctx, params, OSSL_PKEY_PARAM_RSA_D, d); - if (rc <= 0) - goto error; - /* OSSL_PKEY_PARAM_RSA_FACTOR1 */ *p = BN_secure_new(); if (*p == NULL) { @@ -316,8 +305,6 @@ return 1; error: - BN_clear_free(*d); - *d = NULL; BN_clear_free(*p); *p = NULL; BN_clear_free(*dp); @@ -330,6 +317,31 @@ return 0; } +static int ibmca_keymgmt_rsa_priv_me_key_from_data( + const struct ibmca_prov_ctx *provctx, + const OSSL_PARAM params[], BIGNUM **d) +{ + int rc; + + /* OSSL_PKEY_PARAM_RSA_D */ + *d = BN_secure_new(); + if (*d == NULL) { + put_error_ctx(provctx, IBMCA_ERR_MALLOC_FAILED, "BN_secure_new failed"); + goto error; + } + rc = ibmca_param_get_bn(provctx, params, OSSL_PKEY_PARAM_RSA_D, d); + if (rc <= 0) + goto error; + + return 1; + +error: + BN_clear_free(*d); + *d = NULL; + + return 0; +} + static int ibmca_keymgmt_rsa_priv_key_to_data( const struct ibmca_prov_ctx *provctx, OSSL_PARAM_BLD *bld, @@ -451,13 +463,14 @@ static int ibmca_keymgmt_rsa_alloc_pub(struct ibmca_key *key) { - key->rsa.public.key_length = (key->rsa.bits + 7) / 8; + key->rsa.public.key_length = key->rsa.keylength; key->rsa.public.modulus = P_ZALLOC(key->provctx, key->rsa.public.key_length); key->rsa.public.exponent = P_ZALLOC(key->provctx, key->rsa.public.key_length); - if (key->rsa.public.modulus == NULL || key->rsa.public.exponent == NULL) { + + if (!ibmca_keymgmt_rsa_pub_valid(&key->rsa.public)) { put_error_key(key, IBMCA_ERR_MALLOC_FAILED, "Failed to allocate libica public RSA key"); return 0; @@ -466,24 +479,42 @@ return 1; } -static int ibmca_keymgmt_rsa_alloc_priv(struct ibmca_key *key) +static int ibmca_keymgmt_rsa_alloc_priv_crt(struct ibmca_key *key) { - key->rsa.private.key_length = (key->rsa.bits + 7) / 8; - key->rsa.private.p = P_SECURE_ZALLOC(key->provctx, - ICA_P_LEN(key->rsa.private.key_length)); - key->rsa.private.q = P_SECURE_ZALLOC(key->provctx, - ICA_Q_LEN(key->rsa.private.key_length)); - key->rsa.private.dp = P_SECURE_ZALLOC(key->provctx, - ICA_DP_LEN(key->rsa.private.key_length)); - key->rsa.private.dq = P_SECURE_ZALLOC(key->provctx, - ICA_DQ_LEN(key->rsa.private.key_length)); - key->rsa.private.qInverse = P_SECURE_ZALLOC(key->provctx, - ICA_QINV_LEN(key->rsa.private.key_length)); - if (key->rsa.private.p == NULL || key->rsa.private.q == NULL || - key->rsa.private.dp == NULL || key->rsa.private.dq == NULL || - key->rsa.private.qInverse == NULL ) { + key->rsa.private_crt.key_length = key->rsa.keylength; + + key->rsa.private_crt.p = P_SECURE_ZALLOC(key->provctx, + ICA_P_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.q = P_SECURE_ZALLOC(key->provctx, + ICA_Q_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.dp = P_SECURE_ZALLOC(key->provctx, + ICA_DP_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.dq = P_SECURE_ZALLOC(key->provctx, + ICA_DQ_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.qInverse = P_SECURE_ZALLOC(key->provctx, + ICA_QINV_LEN(key->rsa.private_crt.key_length)); + + if (!ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt)) { put_error_key(key, IBMCA_ERR_MALLOC_FAILED, - "Failed to allocate libica private RSA key"); + "Failed to allocate libica private RSA CRT key"); + return 0; + } + + return 1; +} + +static int ibmca_keymgmt_rsa_alloc_priv_me(struct ibmca_key *key) +{ + key->rsa.private_me.key_length = key->rsa.keylength; + + key->rsa.private_me.modulus = P_ZALLOC(key->provctx, + key->rsa.private_me.key_length); + key->rsa.private_me.exponent = P_ZALLOC(key->provctx, + key->rsa.private_me.key_length); + + if (!ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)) { + put_error_key(key, IBMCA_ERR_MALLOC_FAILED, + "Failed to allocate libica private RSA ME key"); return 0; } @@ -503,29 +534,42 @@ key->rsa.public.key_length = 0; } -static void ibmca_keymgmt_rsa_free_priv(struct ibmca_key *key) +static void ibmca_keymgmt_rsa_free_priv_crt(struct ibmca_key *key) { - if (key->rsa.private.p != NULL) - P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private.p, - ICA_P_LEN(key->rsa.private.key_length)); - key->rsa.private.p = NULL; - if (key->rsa.private.q != NULL) - P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private.q, - ICA_Q_LEN(key->rsa.private.key_length)); - key->rsa.private.q = NULL; - if (key->rsa.private.dp != NULL) - P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private.dp, - ICA_DP_LEN(key->rsa.private.key_length)); - key->rsa.private.dp = NULL; - if (key->rsa.private.dq != NULL) - P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private.dq, - ICA_DQ_LEN(key->rsa.private.key_length)); - key->rsa.private.dq = NULL; - if (key->rsa.private.qInverse != NULL) - P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private.qInverse, - ICA_QINV_LEN(key->rsa.private.key_length)); - key->rsa.private.qInverse = NULL; - key->rsa.private.key_length = 0; + if (key->rsa.private_crt.p != NULL) + P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private_crt.p, + ICA_P_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.p = NULL; + if (key->rsa.private_crt.q != NULL) + P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private_crt.q, + ICA_Q_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.q = NULL; + if (key->rsa.private_crt.dp != NULL) + P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private_crt.dp, + ICA_DP_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.dp = NULL; + if (key->rsa.private_crt.dq != NULL) + P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private_crt.dq, + ICA_DQ_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.dq = NULL; + if (key->rsa.private_crt.qInverse != NULL) + P_SECURE_CLEAR_FREE(key->provctx, key->rsa.private_crt.qInverse, + ICA_QINV_LEN(key->rsa.private_crt.key_length)); + key->rsa.private_crt.qInverse = NULL; + key->rsa.private_crt.key_length = 0; +} + +static void ibmca_keymgmt_rsa_free_priv_me(struct ibmca_key *key) +{ + if (key->rsa.private_me.modulus != NULL) + P_CLEAR_FREE(key->provctx, key->rsa.private_me.modulus, + key->rsa.private_me.key_length); + key->rsa.private_me.modulus = NULL; + if (key->rsa.private_me.exponent != NULL) + P_CLEAR_FREE(key->provctx, key->rsa.private_me.exponent, + key->rsa.private_me.key_length); + key->rsa.private_me.exponent = NULL; + key->rsa.private_me.key_length = 0; } static void ibmca_keymgmt_rsa_clean(struct ibmca_key *key) @@ -535,7 +579,8 @@ ibmca_debug_key(key, "key: %p", key); - ibmca_keymgmt_rsa_free_priv(key); + ibmca_keymgmt_rsa_free_priv_crt(key); + ibmca_keymgmt_rsa_free_priv_me(key); ibmca_keymgmt_rsa_free_pub(key); if (key->type == EVP_PKEY_RSA_PSS) @@ -572,6 +617,30 @@ pthread_rwlock_destroy(&key->rsa.blinding_lock); } +bool ibmca_keymgmt_rsa_pub_valid(const ica_rsa_key_mod_expo_t *public) +{ + return public->key_length != 0 && + public->modulus != NULL && + public->exponent != NULL; +} + +bool ibmca_keymgmt_rsa_priv_crt_valid(const ica_rsa_key_crt_t *private_crt) +{ + return private_crt->key_length != 0 && + private_crt->p != NULL && + private_crt->q != NULL && + private_crt->dp != NULL && + private_crt->dq != NULL && + private_crt->qInverse != NULL; +} + +bool ibmca_keymgmt_rsa_priv_me_valid(const ica_rsa_key_mod_expo_t *private_me) +{ + return private_me->key_length != 0 && + private_me->modulus != NULL && + private_me->exponent != NULL; +} + static int ibmca_keymgmt_rsa_dup_pub(const struct ibmca_key *key, struct ibmca_key *new_key) { @@ -583,8 +652,8 @@ new_key->rsa.public.exponent = P_MEMDUP(key->provctx, key->rsa.public.exponent, key->rsa.public.key_length); - if (new_key->rsa.public.modulus == NULL || - new_key->rsa.public.exponent == NULL) { + + if (!ibmca_keymgmt_rsa_pub_valid(&new_key->rsa.public)) { put_error_key(key, IBMCA_ERR_MALLOC_FAILED, "Failed to allocate libica RSA key"); return 0; @@ -593,29 +662,46 @@ return 1; } -static int ibmca_keymgmt_rsa_dup_priv(const struct ibmca_key *key, - struct ibmca_key *new_key) +static int ibmca_keymgmt_rsa_dup_priv_crt(const struct ibmca_key *key, + struct ibmca_key *new_key) { - new_key->rsa.private.key_length = key->rsa.private.key_length; + new_key->rsa.private_crt.key_length = key->rsa.private_crt.key_length; - new_key->rsa.private.p = P_SECURE_MEMDUP(key->provctx, key->rsa.private.p, - ICA_P_LEN(key->rsa.private.key_length)); - new_key->rsa.private.q = P_SECURE_MEMDUP(key->provctx, key->rsa.private.q, - ICA_Q_LEN(key->rsa.private.key_length)); - new_key->rsa.private.dp = P_SECURE_MEMDUP(key->provctx, key->rsa.private.dp, - ICA_DP_LEN(key->rsa.private.key_length)); - new_key->rsa.private.dq = P_SECURE_MEMDUP(key->provctx, key->rsa.private.dq, - ICA_DQ_LEN(key->rsa.private.key_length)); - new_key->rsa.private.qInverse = P_SECURE_MEMDUP(key->provctx, - key->rsa.private.qInverse, + new_key->rsa.private_crt.p = P_SECURE_MEMDUP(key->provctx, key->rsa.private_crt.p, + ICA_P_LEN(key->rsa.private_crt.key_length)); + new_key->rsa.private_crt.q = P_SECURE_MEMDUP(key->provctx, key->rsa.private_crt.q, + ICA_Q_LEN(key->rsa.private_crt.key_length)); + new_key->rsa.private_crt.dp = P_SECURE_MEMDUP(key->provctx, key->rsa.private_crt.dp, + ICA_DP_LEN(key->rsa.private_crt.key_length)); + new_key->rsa.private_crt.dq = P_SECURE_MEMDUP(key->provctx, key->rsa.private_crt.dq, + ICA_DQ_LEN(key->rsa.private_crt.key_length)); + new_key->rsa.private_crt.qInverse = P_SECURE_MEMDUP(key->provctx, + key->rsa.private_crt.qInverse, ICA_QINV_LEN( - key->rsa.private.key_length)); + key->rsa.private_crt.key_length)); - if (new_key->rsa.private.p == NULL || - new_key->rsa.private.q == NULL || - new_key->rsa.private.dp == NULL || - new_key->rsa.private.dq == NULL || - new_key->rsa.private.qInverse == NULL) { + if (!ibmca_keymgmt_rsa_priv_crt_valid(&new_key->rsa.private_crt)) { + put_error_key(key, IBMCA_ERR_MALLOC_FAILED, + "Failed to allocate libica RSA key"); + return 0; + } + + return 1; +} + +static int ibmca_keymgmt_rsa_dup_priv_me(const struct ibmca_key *key, + struct ibmca_key *new_key) +{ + new_key->rsa.private_me.key_length = key->rsa.private_me.key_length; + + new_key->rsa.private_me.modulus = P_MEMDUP(key->provctx, + key->rsa.private_me.modulus, + key->rsa.private_me.key_length); + new_key->rsa.private_me.exponent = P_MEMDUP(key->provctx, + key->rsa.private_me.exponent, + key->rsa.private_me.key_length); + + if (!ibmca_keymgmt_rsa_priv_me_valid(&new_key->rsa.private_me)) { put_error_key(key, IBMCA_ERR_MALLOC_FAILED, "Failed to allocate libica RSA key"); return 0; @@ -639,14 +725,20 @@ } new_key->rsa.bits = key->rsa.bits; + new_key->rsa.keylength = key->rsa.keylength; - if (key->rsa.public.key_length != 0) { + if (ibmca_keymgmt_rsa_pub_valid(&key->rsa.public)) { if (ibmca_keymgmt_rsa_dup_pub(key, new_key) == 0) return 0; } - if (key->rsa.private.key_length != 0) { - if (ibmca_keymgmt_rsa_dup_priv(key, new_key) == 0) + if (ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt)) { + if (ibmca_keymgmt_rsa_dup_priv_crt(key, new_key) == 0) + return 0; + } + + if (ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)) { + if (ibmca_keymgmt_rsa_dup_priv_me(key, new_key) == 0) return 0; } @@ -667,21 +759,56 @@ ibmca_debug_key(key, "key: %p selection: 0x%x", key, selection); if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) - ok = ok && (key->rsa.public.key_length != 0 && - key->rsa.public.modulus != NULL && - key->rsa.public.exponent != NULL); + ok = ok && ibmca_keymgmt_rsa_pub_valid(&key->rsa.public); if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) - ok = ok && (key->rsa.private.key_length != 0 && - key->rsa.private.p != NULL && - key->rsa.private.q != NULL && - key->rsa.private.dp != NULL && - key->rsa.private.dq != NULL && - key->rsa.private.qInverse != NULL); + ok = ok && (ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt) || + ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)); ibmca_debug_key(key, "ok: %d", ok); return ok; } +static bool ibmca_keymgmt_rsa_pub_equal(const ica_rsa_key_mod_expo_t *public1, + const ica_rsa_key_mod_expo_t *public2) +{ + return public1->key_length > 0 && + public1->key_length == public2-> key_length && + memcmp(public1->exponent, public2->exponent, + public1->key_length) == 0 && + memcmp(public1->modulus, public2->modulus, + public1->key_length) == 0; +} + +static bool ibmca_keymgmt_rsa_priv_crt_equal( + const ica_rsa_key_crt_t *private_crt1, + const ica_rsa_key_crt_t *private_crt2) +{ + return private_crt1->key_length > 0 && + private_crt1->key_length == private_crt2->key_length && + CRYPTO_memcmp(private_crt1->p, private_crt2->p, + ICA_P_LEN(private_crt1->key_length)) == 0 && + CRYPTO_memcmp(private_crt1->q, private_crt2->q, + ICA_Q_LEN(private_crt1->key_length)) == 0 && + CRYPTO_memcmp(private_crt1->dp, private_crt2->dp, + ICA_DP_LEN(private_crt1->key_length)) == 0 && + CRYPTO_memcmp(private_crt1->dq, private_crt2->dq, + ICA_DQ_LEN(private_crt1->key_length)) == 0 && + CRYPTO_memcmp(private_crt1->qInverse, private_crt2->qInverse, + ICA_QINV_LEN(private_crt1->key_length)) == 0; +} + +static bool ibmca_keymgmt_rsa_priv_me_equal( + const ica_rsa_key_mod_expo_t *private_me1, + const ica_rsa_key_mod_expo_t *private_me2) +{ + return private_me1->key_length > 0 && + private_me1->key_length == private_me2-> key_length && + CRYPTO_memcmp(private_me1->exponent, private_me2->exponent, + private_me2->key_length) == 0 && + CRYPTO_memcmp(private_me1->modulus, private_me2->modulus, + private_me1->key_length) == 0; +} + static int ibmca_keymgmt_rsa_match(const void *vkey1, const void *vkey2, int selection) { @@ -699,35 +826,16 @@ return 0; if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) { - ok = ok && (key1->rsa.public.key_length == - key2->rsa.public.key_length && - memcmp(key1->rsa.public.exponent, - key2->rsa.public.exponent, - key1->rsa.public.key_length) == 0 && - memcmp(key1->rsa.public.modulus, - key2->rsa.public.modulus, - key1->rsa.public.key_length) == 0); + ok = ok && ibmca_keymgmt_rsa_pub_equal(&key1->rsa.public, + &key2->rsa.public); checked = 1; } if (!checked && (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) - ok = ok && (key1->rsa.private.key_length == - key2->rsa.private.key_length && - CRYPTO_memcmp(key1->rsa.private.p, - key2->rsa.private.p, - ICA_P_LEN(key1->rsa.private.key_length)) == 0 && - CRYPTO_memcmp(key1->rsa.private.q, - key2->rsa.private.q, - ICA_Q_LEN(key1->rsa.private.key_length)) == 0 && - CRYPTO_memcmp(key1->rsa.private.dp, - key2->rsa.private.dp, - ICA_DP_LEN(key1->rsa.private.key_length)) == 0 && - CRYPTO_memcmp(key1->rsa.private.dq, - key2->rsa.private.dq, - ICA_DQ_LEN(key1->rsa.private.key_length)) == 0 && - CRYPTO_memcmp(key1->rsa.private.qInverse, - key2->rsa.private.qInverse, - ICA_QINV_LEN(key1->rsa.private.key_length)) == 0); + ok = ok && (ibmca_keymgmt_rsa_priv_crt_equal(&key1->rsa.private_crt, + &key2->rsa.private_crt) || + ibmca_keymgmt_rsa_priv_me_equal(&key1->rsa.private_me, + &key2->rsa.private_me)); ibmca_debug_key(key1, "ok: %d", ok); return ok; @@ -922,7 +1030,7 @@ ibmca_keymgmt_rsa_gen_free_cb(genctx); genctx->rsa.gen.bits = templ->rsa.bits; - if (templ->rsa.public.exponent != NULL) { + if (ibmca_keymgmt_rsa_pub_valid(&templ->rsa.public)) { genctx->rsa.gen.pub_exp = BN_bin2bn(templ->rsa.public.exponent, templ->rsa.public.key_length, NULL); @@ -1153,6 +1261,7 @@ } key->rsa.bits = genctx->rsa.gen.bits; + key->rsa.keylength = (key->rsa.bits + 7) / 8; ibmca_debug_op_ctx(genctx, "bits: %lu", key->rsa.bits); if (ibmca_keymgmt_rsa_alloc_pub(key) == 0) { @@ -1160,7 +1269,7 @@ return NULL; } - if (ibmca_keymgmt_rsa_alloc_priv(key) == 0) { + if (ibmca_keymgmt_rsa_alloc_priv_crt(key) == 0) { ibmca_keymgmt_free(key); return NULL; } @@ -1189,7 +1298,7 @@ } rc = ica_rsa_key_generate_crt(genctx->provctx->ica_adapter, key->rsa.bits, - &key->rsa.public, &key->rsa.private); + &key->rsa.public, &key->rsa.private_crt); if (rc != 0) { ibmca_debug_op_ctx(genctx, "ica_rsa_key_generate_crt failed with: %s", strerror(rc)); @@ -1203,6 +1312,15 @@ } } + /* If p < q, swap and recalculate now */ + rc = ica_rsa_crt_key_check(&key->rsa.private_crt); + if (rc > 1) { + put_error_op_ctx(genctx, IBMCA_ERR_INTERNAL_ERROR, + "ica_rsa_crt_key_check failed"); + ibmca_keymgmt_free(key); + return NULL; + } + p = 3; n = 0; if (osslcb != NULL && osslcb(cb_params, cbarg) == 0) { @@ -1247,7 +1365,7 @@ int ibmca_keymgmt_rsa_pub_as_bn(struct ibmca_key *key, BIGNUM **n, BIGNUM **e) { - if (key->rsa.public.modulus == NULL || key->rsa.public.exponent == NULL) + if (!ibmca_keymgmt_rsa_pub_valid(&key->rsa.public)) return 0; *n = BN_bin2bn(key->rsa.public.modulus, key->rsa.public.key_length, NULL); @@ -1268,14 +1386,11 @@ return 0; } - -static int ibmca_keymgmt_rsa_priv_as_bn(struct ibmca_key *key, BIGNUM **p, - BIGNUM **q, BIGNUM **dp, BIGNUM **dq, - BIGNUM **qinv) -{ - if (key->rsa.private.p == NULL || key->rsa.private.q == NULL || - key->rsa.private.dp == NULL || key->rsa.private.dq == NULL || - key->rsa.private.qInverse == NULL) +static int ibmca_keymgmt_rsa_priv_crt_as_bn(struct ibmca_key *key, BIGNUM **p, + BIGNUM **q, BIGNUM **dp, + BIGNUM **dq, BIGNUM **qinv) +{ + if (!ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt)) return 0; *p = BN_secure_new(); @@ -1289,17 +1404,17 @@ goto error; } - *p = BN_bin2bn(key->rsa.private.p, - ICA_P_LEN(key->rsa.private.key_length), *p); - *q = BN_bin2bn(key->rsa.private.q, - ICA_Q_LEN(key->rsa.private.key_length), *q); - *dp = BN_bin2bn(key->rsa.private.dp, - ICA_DP_LEN(key->rsa.private.key_length), + *p = BN_bin2bn(key->rsa.private_crt.p, + ICA_P_LEN(key->rsa.private_crt.key_length), *p); + *q = BN_bin2bn(key->rsa.private_crt.q, + ICA_Q_LEN(key->rsa.private_crt.key_length), *q); + *dp = BN_bin2bn(key->rsa.private_crt.dp, + ICA_DP_LEN(key->rsa.private_crt.key_length), *dp); - *dq = BN_bin2bn(key->rsa.private.dq, - ICA_DQ_LEN(key->rsa.private.key_length), *dq); - *qinv = BN_bin2bn(key->rsa.private.qInverse, - ICA_QINV_LEN(key->rsa.private.key_length), *qinv); + *dq = BN_bin2bn(key->rsa.private_crt.dq, + ICA_DQ_LEN(key->rsa.private_crt.key_length), *dq); + *qinv = BN_bin2bn(key->rsa.private_crt.qInverse, + ICA_QINV_LEN(key->rsa.private_crt.key_length), *qinv); if (*p == NULL || *q == NULL || *dp == NULL || *dq == NULL || *qinv == NULL) { put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "BN_bin2bn failed"); @@ -1323,6 +1438,33 @@ return 0; } +int ibmca_keymgmt_rsa_priv_me_as_bn(struct ibmca_key *key, BIGNUM **d) +{ + if (!ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)) + return 0; + + *d = BN_secure_new(); + if (*d == NULL) { + put_error_key(key, IBMCA_ERR_MALLOC_FAILED, "BN_secure_new failed"); + goto error; + } + + *d = BN_bin2bn(key->rsa.private_me.exponent, key->rsa.private_me.key_length, + *d); + if (*d == NULL) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "BN_bin2bn failed"); + goto error; + } + + return 1; + +error: + BN_clear_free(*d); + *d = NULL; + + return 0; +} + static int ibmca_keymgmt_rsa_calc_priv_d(struct ibmca_key *key, BIGNUM *n, BIGNUM *e, BIGNUM *p, BIGNUM *q, BIGNUM **d) @@ -1370,8 +1512,9 @@ for (parm = params; parm != NULL && parm->key != NULL; parm++) ibmca_debug_key(key, "param: %s", parm->key); - empty = (key->rsa.public.key_length == 0 || - key->rsa.private.key_length == 0); + empty = (!ibmca_keymgmt_rsa_pub_valid(&key->rsa.public) && + !ibmca_keymgmt_rsa_priv_crt_valid(&key->rsa.private_crt) && + !ibmca_keymgmt_rsa_priv_me_valid(&key->rsa.private_me)); if (!empty) { /* OSSL_PKEY_PARAM_BITS */ @@ -1430,16 +1573,30 @@ } /* Private key parts */ - rc = ibmca_keymgmt_rsa_priv_as_bn(key, &p, &q, &dp, &dq, &qinv); + rc = ibmca_keymgmt_rsa_priv_crt_as_bn(key, &p, &q, &dp, &dq, &qinv); if (rc == 1) { - rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); - if (rc == 0) - goto out; + /* CRT format */ + rc = ibmca_keymgmt_rsa_priv_me_as_bn(key, &d); + if (rc == 0) { + rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); + if (rc == 0) + goto out; + } rc = ibmca_keymgmt_rsa_priv_key_to_data(key->provctx, NULL, params, d, p, q, dp, dq, qinv); if (rc == 0) goto out; + } else { + rc = ibmca_keymgmt_rsa_priv_me_as_bn(key, &d); + if (rc == 1) { + /* ME format */ + rc = ibmca_keymgmt_rsa_priv_key_to_data(key->provctx, NULL, params, + d, NULL, NULL, NULL, NULL, + NULL); + if (rc == 0) + goto out; + } } /* Return RSA-PSS parameters only for restricted RSA-PSS keys */ @@ -1675,16 +1832,30 @@ if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) { /* Private key parts */ - rc = ibmca_keymgmt_rsa_priv_as_bn(key, &p, &q, &dp, &dq, &qinv); + rc = ibmca_keymgmt_rsa_priv_crt_as_bn(key, &p, &q, &dp, &dq, &qinv); if (rc == 1) { - rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); - if (rc == 0) - goto error; + /* CRT format */ + rc = ibmca_keymgmt_rsa_priv_me_as_bn(key, &d); + if (rc == 0) { + rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); + if (rc == 0) + goto error; + } rc = ibmca_keymgmt_rsa_priv_key_to_data(key->provctx, bld, NULL, d, p, q, dp, dq, qinv); if (rc == 0) goto error; + } else { + rc = ibmca_keymgmt_rsa_priv_me_as_bn(key, &d); + if (rc == 1) { + /* ME format */ + rc = ibmca_keymgmt_rsa_priv_key_to_data(key->provctx, bld, NULL, + d, NULL, NULL, NULL, + NULL, NULL); + if (rc == 0) + goto error; + } } } @@ -1764,6 +1935,7 @@ return 0; key->rsa.bits = BN_num_bits(n); + key->rsa.keylength = (key->rsa.bits + 7) / 8; ibmca_debug_key(key, "key: %p bits: %u", key, key->rsa.bits); if (ibmca_keymgmt_rsa_alloc_pub(key) == 0) @@ -1785,43 +1957,73 @@ if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) { /* Import private key parts */ - if (ibmca_keymgmt_rsa_alloc_priv(key) == 0) - goto out; - - rc = ibmca_keymgmt_rsa_priv_key_from_data(key->provctx, params, &d, - &p, &q, &dp, &dq, &qinv); - if (rc == 0) - goto out; - - if (BN_bn2binpad(p, key->rsa.private.p, - ICA_P_LEN(key->rsa.private.key_length)) <= 0) { - put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, - "BN_bn2binpad failed for private p"); - goto out; - } - if (BN_bn2binpad(q, key->rsa.private.q, - ICA_Q_LEN(key->rsa.private.key_length)) <= 0) { - put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, - "BN_bn2binpad failed for private q"); - goto out; - } - if (BN_bn2binpad(dp, key->rsa.private.dp, - ICA_DP_LEN(key->rsa.private.key_length)) <= 0) { - put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, - "BN_bn2binpad failed for private dp"); - goto out; - } - if (BN_bn2binpad(dq, key->rsa.private.dq, - ICA_DQ_LEN(key->rsa.private.key_length)) <= 0) { - put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, - "BN_bn2binpad failed for private dq"); - goto out; + rc = ibmca_keymgmt_rsa_priv_crt_key_from_data(key->provctx, params, + &p, &q, &dp, &dq, &qinv); + if (rc == 1) { + /* CRT components */ + if (ibmca_keymgmt_rsa_alloc_priv_crt(key) == 0) + goto out; + + if (BN_bn2binpad(p, key->rsa.private_crt.p, + ICA_P_LEN(key->rsa.private_crt.key_length)) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private p"); + goto out; + } + if (BN_bn2binpad(q, key->rsa.private_crt.q, + ICA_Q_LEN(key->rsa.private_crt.key_length)) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private q"); + goto out; + } + if (BN_bn2binpad(dp, key->rsa.private_crt.dp, + ICA_DP_LEN(key->rsa.private_crt.key_length)) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private dp"); + goto out; + } + if (BN_bn2binpad(dq, key->rsa.private_crt.dq, + ICA_DQ_LEN(key->rsa.private_crt.key_length)) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private dq"); + goto out; + } + if (BN_bn2binpad(qinv, key->rsa.private_crt.qInverse, + ICA_QINV_LEN(key->rsa.private_crt.key_length)) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private qinv"); + goto out; + } + + /* If p < q, swap and recalculate now */ + rc = ica_rsa_crt_key_check(&key->rsa.private_crt); + if (rc > 1) { + rc = 0; + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "ica_rsa_crt_key_check failed"); + goto out; + } } - if (BN_bn2binpad(qinv, key->rsa.private.qInverse, - ICA_QINV_LEN(key->rsa.private.key_length)) <= 0) { - put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, - "BN_bn2binpad failed for private qinv"); - goto out; + + rc = ibmca_keymgmt_rsa_priv_me_key_from_data(key->provctx, params, &d); + if (rc == 1) { + /* ME components */ + if (ibmca_keymgmt_rsa_alloc_priv_me(key) == 0) + goto out; + + if (BN_bn2binpad(n, key->rsa.private_me.modulus, + key->rsa.private_me.key_length) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for modulus"); + goto out; + } + + if (BN_bn2binpad(d, key->rsa.private_me.exponent, + key->rsa.private_me.key_length) <= 0) { + put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, + "BN_bn2binpad failed for private d"); + goto out; + } } } @@ -1884,19 +2086,22 @@ return 0; } - rc = ibmca_keymgmt_rsa_priv_as_bn(key, &p, &q, &dp, &dq, &qinv); - if (rc == 0) - goto out; + rc = ibmca_keymgmt_rsa_priv_me_as_bn(key, &d); + if (rc == 0) { + rc = ibmca_keymgmt_rsa_priv_crt_as_bn(key, &p, &q, &dp, &dq, &qinv); + if (rc == 0) + goto out; - rc = ibmca_keymgmt_rsa_pub_as_bn(key, &n, &e); - if (rc == 0) - goto out; + rc = ibmca_keymgmt_rsa_pub_as_bn(key, &n, &e); + if (rc == 0) + goto out; - rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); - if (rc == 0) - goto out; + rc = ibmca_keymgmt_rsa_calc_priv_d(key, n, e, p, q, &d); + if (rc == 0) + goto out; + } - buf = P_SECURE_ZALLOC(key->provctx, key->rsa.private.key_length); + buf = P_SECURE_ZALLOC(key->provctx, key->rsa.keylength); if (buf == NULL) { put_error_key(key, IBMCA_ERR_MALLOC_FAILED, "Failed to allocate buffer for private key"); @@ -1904,7 +2109,7 @@ } BN_set_flags(d, BN_FLG_CONSTTIME); - if (BN_bn2binpad(d, buf, key->rsa.private.key_length) < 0) { + if (BN_bn2binpad(d, buf, key->rsa.keylength) < 0) { put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "BN_bn2binpad failed"); goto out; @@ -1924,8 +2129,7 @@ goto out; } - if (EVP_Digest(buf, key->rsa.private.key_length, d_hash, NULL, md, NULL) - <= 0) { + if (EVP_Digest(buf, key->rsa.keylength, d_hash, NULL, md, NULL) <= 0) { put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "EVP_Digest failed"); goto out; } @@ -1953,10 +2157,9 @@ goto out; } - if (inlen < key->rsa.private.key_length) { - memset(buf, 0, key->rsa.private.key_length - inlen); - if (EVP_MAC_update(ctx, buf, key->rsa.private.key_length - inlen) - != 1) { + if (inlen < key->rsa.keylength) { + memset(buf, 0, key->rsa.keylength - inlen); + if (EVP_MAC_update(ctx, buf, key->rsa.keylength - inlen) != 1) { put_error_key(key, IBMCA_ERR_INTERNAL_ERROR, "EVP_MAC_update failed"); goto out; @@ -1985,7 +2188,7 @@ BN_free(dq); BN_free(qinv); if (buf != NULL) - P_SECURE_CLEAR_FREE(key->provctx, buf, key->rsa.private.key_length); + P_SECURE_CLEAR_FREE(key->provctx, buf, key->rsa.keylength); EVP_MAC_free(hmac); EVP_MAC_CTX_free(ctx); EVP_MD_free(md); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/src/provider/rsa_signature.c new/openssl-ibmca-2.4.1/src/provider/rsa_signature.c --- old/openssl-ibmca-2.4.0/src/provider/rsa_signature.c 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/src/provider/rsa_signature.c 2023-09-21 08:52:43.000000000 +0200 @@ -719,7 +719,7 @@ goto out; /* Perform private key encrypt */ - rc = ibmca_rsa_crt_with_blinding(ctx->key, enc_data, sig, rsa_size); + rc = ibmca_rsa_priv_with_blinding(ctx->key, enc_data, sig, rsa_size); if (rc != 1) { ibmca_debug_op_ctx(ctx, "ibmca_asym_cipher_rsa_with_blinding failed"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/test/engine/Makefile.am new/openssl-ibmca-2.4.1/test/engine/Makefile.am --- old/openssl-ibmca-2.4.0/test/engine/Makefile.am 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/test/engine/Makefile.am 2023-09-21 08:52:43.000000000 +0200 @@ -62,9 +62,11 @@ enginectrl_LDADD = -lcrypto -ldl AM_TESTS_ENVIRONMENT = export IBMCA_TEST_PATH=${top_builddir}/src/engine/.libs/ibmca.so IBMCA_OPENSSL_TEST_CONF=${srcdir}/openssl-test.cnf IBMCA_OPENSSL_TEST_NOINIT_CONF=${srcdir}/openssl-test-noinit.cnf PERL5LIB=${srcdir}; -EXTRA_DIST = ${TESTS_PERL} ${TESTS_CIPHERS} test.pm openssl-test.cnf \ -dsa2k.key dsa2k_pub.key dsa4k.key dsa4k_pub.key dsa8k.key \ -dsa8k_pub.key dsamax.key dsamax_pub.key rsa2k.key rsa4k.key rsa8k.key +EXTRA_DIST = ${TESTS_PERL} ${TESTS_CIPHERS} test.pm openssl-test.cnf \ + openssl-test-noinit.cnf dsa2k.key dsa2k_pub.key dsa4k.key \ + dsa4k_pub.key dsa8k.key dsa8k_pub.key dsamax.key dsamax_pub.key \ + rsa2k.key rsa4k.key rsa8k.key rsa16k.key dsaparam2k.key \ + dsaparam4k.key dsaparam8k.key dsaparammax.key libica-link.sh: @echo '#!/bin/bash' > libica-link.sh @@ -77,3 +79,5 @@ @echo "fi" >> libica-link.sh @echo "exit 0" >> libica-link.sh @chmod u+x libica-link.sh + +CLEANFILES = *.out *.dec libica-link.sh diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/test/provider/Makefile.am new/openssl-ibmca-2.4.1/test/provider/Makefile.am --- old/openssl-ibmca-2.4.0/test/provider/Makefile.am 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/test/provider/Makefile.am 2023-09-21 08:52:43.000000000 +0200 @@ -48,4 +48,12 @@ threadtest_LDADD = -lcrypto -lpthread AM_TESTS_ENVIRONMENT = export IBMCA_TEST_PATH=${top_builddir}/src/provider/.libs/ IBMCA_OPENSSL_TEST_CONF=${srcdir}/openssl-test.cnf PERL5LIB=${srcdir}; -EXTRA_DIST = ${TESTS_PERL} test.pm openssl-test.cnf server-cert-rsa.pem server-key-rsa.pem server-cert-ec.pem server-key-ec.pem +EXTRA_DIST = ${TESTS_PERL} test.pm openssl-test.cnf server-cert-rsa.pem \ + server-key-rsa.pem server-cert-ec.pem server-key-ec.pem \ + rsa-implrej-bad-empty-in.bin rsa-implrej-bad-empty-out.bin \ + rsa-implrej-bad-max-in.bin rsa-implrej-bad-max-out.bin \ + rsa-implrej-bad-prf-in.bin rsa-implrej-bad-prf-out.bin \ + rsa-implrej-good-in.bin rsa-implrej-good-out.bin \ + rsa-implrej-key.pem rsa16k.pl + +CLEANFILES = *.out *.dec *.pub *.key diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/openssl-ibmca-2.4.0/test/provider/openssl-test.cnf new/openssl-ibmca-2.4.1/test/provider/openssl-test.cnf --- old/openssl-ibmca-2.4.0/test/provider/openssl-test.cnf 2023-03-30 11:12:40.000000000 +0200 +++ new/openssl-ibmca-2.4.1/test/provider/openssl-test.cnf 2023-09-21 08:52:43.000000000 +0200 @@ -16,6 +16,7 @@ module = ibmca-provider.so activate = 1 #debug = yes +#debug-path = /dir/to/debug/directory #fips=yes #algorithms = RSA,EC,DH algorithms = ALL