Skip to content

Commit ccf3c77

Browse files
committed
Document a nontrivial workaround
Also implement error checking.
1 parent 947f6cc commit ccf3c77

File tree

1 file changed

+23
-6
lines changed

1 file changed

+23
-6
lines changed

src/eng_front.c

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)