deps: upgrade openssl sources to openssl-3.5.2 · nodejs/node@33b06df
@@ -222,15 +222,21 @@ struct collect_data_st {
222222int total; /* number of matching results */
223223char error_occurred;
224224char keytype_resolved;
225+OSSL_PROPERTY_LIST *pq;
225226226227STACK_OF(EVP_KEYMGMT) *keymgmts;
227228};
228229229-static void collect_decoder_keymgmt(EVP_KEYMGMT *keymgmt, OSSL_DECODER *decoder,
230-void *provctx, struct collect_data_st *data)
230+/*
231+ * Add decoder instance to the decoder context if it is compatible. Returns 1
232+ * if a decoder was added, 0 otherwise.
233+ */
234+static int collect_decoder_keymgmt(EVP_KEYMGMT *keymgmt, OSSL_DECODER *decoder,
235+void *provctx, struct collect_data_st *data)
231236{
232237void *decoderctx = NULL;
233238OSSL_DECODER_INSTANCE *di = NULL;
239+const OSSL_PROPERTY_LIST *props;
234240235241/*
236242 * We already checked the EVP_KEYMGMT is applicable in check_keymgmt so we
@@ -239,17 +245,17 @@ static void collect_decoder_keymgmt(EVP_KEYMGMT *keymgmt, OSSL_DECODER *decoder,
239245240246if (keymgmt->name_id != decoder->base.id)
241247/* Mismatch is not an error, continue. */
242-return;
248+return 0;
243249244250if ((decoderctx = decoder->newctx(provctx)) == NULL) {
245251data->error_occurred = 1;
246-return;
252+return 0;
247253 }
248254249255if ((di = ossl_decoder_instance_new(decoder, decoderctx)) == NULL) {
250256decoder->freectx(decoderctx);
251257data->error_occurred = 1;
252-return;
258+return 0;
253259 }
254260255261/*
@@ -263,7 +269,7 @@ static void collect_decoder_keymgmt(EVP_KEYMGMT *keymgmt, OSSL_DECODER *decoder,
263269|| OPENSSL_strcasecmp(data->ctx->start_input_type, "PEM") != 0)) {
264270/* Mismatch is not an error, continue. */
265271ossl_decoder_instance_free(di);
266-return;
272+return 0;
267273 }
268274269275OSSL_TRACE_BEGIN(DECODER) {
@@ -275,13 +281,30 @@ static void collect_decoder_keymgmt(EVP_KEYMGMT *keymgmt, OSSL_DECODER *decoder,
275281OSSL_DECODER_get0_properties(decoder));
276282 } OSSL_TRACE_END(DECODER);
277283284+/*
285+ * Get the property match score so the decoders can be prioritized later.
286+ */
287+props = ossl_decoder_parsed_properties(decoder);
288+if (data->pq != NULL && props != NULL) {
289+di->score = ossl_property_match_count(data->pq, props);
290+/*
291+ * Mismatch of mandatory properties is not an error, the decoder is just
292+ * ignored, continue.
293+ */
294+if (di->score < 0) {
295+ossl_decoder_instance_free(di);
296+return 0;
297+ }
298+ }
299+278300if (!ossl_decoder_ctx_add_decoder_inst(data->ctx, di)) {
279301ossl_decoder_instance_free(di);
280302data->error_occurred = 1;
281-return;
303+return 0;
282304 }
283305284306++data->total;
307+return 1;
285308}
286309287310static void collect_decoder(OSSL_DECODER *decoder, void *arg)
@@ -321,7 +344,9 @@ static void collect_decoder(OSSL_DECODER *decoder, void *arg)
321344for (i = 0; i < end_i; ++i) {
322345keymgmt = sk_EVP_KEYMGMT_value(keymgmts, i);
323346324-collect_decoder_keymgmt(keymgmt, decoder, provctx, data);
347+/* Only add this decoder once */
348+if (collect_decoder_keymgmt(keymgmt, decoder, provctx, data))
349+break;
325350if (data->error_occurred)
326351return;
327352 }
@@ -407,6 +432,8 @@ static int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
407432struct decoder_pkey_data_st *process_data = NULL;
408433struct collect_data_st collect_data = { NULL };
409434STACK_OF(EVP_KEYMGMT) *keymgmts = NULL;
435+OSSL_PROPERTY_LIST **plp;
436+OSSL_PROPERTY_LIST *pq = NULL, *p2 = NULL;
410437411438OSSL_TRACE_BEGIN(DECODER) {
412439const char *input_type = ctx->start_input_type;
@@ -442,6 +469,25 @@ static int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
442469process_data->selection = ctx->selection;
443470process_data->keymgmts = keymgmts;
444471472+/*
473+ * Collect passed and default properties to prioritize the decoders.
474+ */
475+if (propquery != NULL)
476+p2 = pq = ossl_parse_query(libctx, propquery, 1);
477+478+plp = ossl_ctx_global_properties(libctx, 0);
479+if (plp != NULL && *plp != NULL) {
480+if (pq == NULL) {
481+pq = *plp;
482+ } else {
483+p2 = ossl_property_merge(pq, *plp);
484+ossl_property_free(pq);
485+if (p2 == NULL)
486+ goto err;
487+pq = p2;
488+ }
489+ }
490+445491/*
446492 * Enumerate all keymgmts into a stack.
447493 *
@@ -457,10 +503,11 @@ static int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
457503 * upfront, as this ensures that the names for all loaded providers have
458504 * been registered by the time we try to resolve the keytype string.
459505 */
460-collect_data.ctx = ctx;
461-collect_data.libctx = libctx;
462-collect_data.keymgmts = keymgmts;
463-collect_data.keytype = keytype;
506+collect_data.ctx = ctx;
507+collect_data.libctx = libctx;
508+collect_data.keymgmts = keymgmts;
509+collect_data.keytype = keytype;
510+collect_data.pq = pq;
464511EVP_KEYMGMT_do_all_provided(libctx, collect_keymgmt, &collect_data);
465512466513if (collect_data.error_occurred)
@@ -496,6 +543,7 @@ static int ossl_decoder_ctx_setup_for_pkey(OSSL_DECODER_CTX *ctx,
496543ok = 1;
497544err:
498545decoder_clean_pkey_construct_arg(process_data);
546+ossl_property_free(p2);
499547return ok;
500548}
501549