@@ -175,12 +175,29 @@ static EVP_PKEY *load_privkey(ENGINE *engine, const char *s_key_id,
175175 return 0 ;
176176 bind_helper_methods (engine );
177177#if OPENSSL_VERSION_NUMBER >= 0x30000000L
178- if (OpenSSL_version_num () == 0x300000c0L || OpenSSL_version_num () == 0x300000d0L
179- || OpenSSL_version_num () == 0x30100040L || OpenSSL_version_num () == 0x30100050L
180- || OpenSSL_version_num () == 0x30200000L || OpenSSL_version_num () == 0x30200010L ) {
181- printf ("Workaround for %s enabled\n" ,
182- OpenSSL_version (OPENSSL_VERSION ));
183- ENGINE_set_default_string (engine , "PKEY_CRYPTO" );
178+ /*
179+ * A workaround for an OpenSSL bug affecting the handling of foreign
180+ * EVP_PKEY objects: https://github.com/openssl/openssl/pull/23063
181+ * Affected OpenSSL versions:
182+ * - 3.0.12 (0x300000c0L) - 3.0.13 (0x300000d0L)
183+ * - 3.1.4 (0x30100040L) - 3.1.5 (0x30100050L)
184+ * - 3.2.0 (0x30200000L) - 3.2.1 (0x30200010L)
185+ * This workaround may disrupt rare deployments
186+ * that use foreign keys from multiple engines.
187+ */
188+ {
189+ unsigned long ver = OpenSSL_version_num ();
190+
191+ if ((ver >= 0x300000c0L && ver <= 0x300000d0L ) ||
192+ (ver >= 0x30100040L && ver <= 0x30100050L ) ||
193+ (ver >= 0x30200000L && ver <= 0x30200010L )) {
194+ if (ENGINE_set_default_string (engine , "PKEY_CRYPTO" )) {
195+ fprintf (stderr , "Workaround for %s enabled\n" ,
196+ OpenSSL_version (OPENSSL_VERSION ));
197+ } else {
198+ fprintf (stderr , "Failed to set PKEY_CRYPTO default engine\n" );
199+ }
200+ }
184201 }
185202#endif
186203 pkey = ctx_load_privkey (ctx , s_key_id , ui_method , callback_data );
0 commit comments