From 67c91ca23eae175a08f0f0c60be6e6957334d25e Mon Sep 17 00:00:00 2001 From: Richard Levitte Date: Mon, 26 Oct 2020 13:08:54 +0100 Subject: [PATCH] DECODER: Add support for OSSL_FUNC_decoder_does_selection() OSSL_FUNC_decoder_does_selection() is a dispatchable decoder implementation function that should return 1 if the given |selection| is supported by an decoder implementation and 0 if not. This can be used by libcrypto functionality to figure out if an encoder implementation should be considered or not. Reviewed-by: Shane Lontis (Merged from https://github.com/openssl/openssl/pull/13248) --- crypto/encode_decode/decoder_meth.c | 5 +++++ crypto/encode_decode/encoder_local.h | 1 + include/openssl/core_dispatch.h | 9 ++++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/crypto/encode_decode/decoder_meth.c b/crypto/encode_decode/decoder_meth.c index edbb140c44..0d389ac5a6 100644 --- a/crypto/encode_decode/decoder_meth.c +++ b/crypto/encode_decode/decoder_meth.c @@ -198,6 +198,11 @@ void *ossl_decoder_from_dispatch(int id, const OSSL_ALGORITHM *algodef, decoder->settable_ctx_params = OSSL_FUNC_decoder_settable_ctx_params(fns); break; + case OSSL_FUNC_DECODER_DOES_SELECTION: + if (decoder->does_selection == NULL) + decoder->does_selection = + OSSL_FUNC_decoder_does_selection(fns); + break; case OSSL_FUNC_DECODER_DECODE: if (decoder->decode == NULL) decoder->decode = OSSL_FUNC_decoder_decode(fns); diff --git a/crypto/encode_decode/encoder_local.h b/crypto/encode_decode/encoder_local.h index 9378393a42..18cddf50fb 100644 --- a/crypto/encode_decode/encoder_local.h +++ b/crypto/encode_decode/encoder_local.h @@ -46,6 +46,7 @@ struct ossl_decoder_st { OSSL_FUNC_decoder_gettable_params_fn *gettable_params; OSSL_FUNC_decoder_set_ctx_params_fn *set_ctx_params; OSSL_FUNC_decoder_settable_ctx_params_fn *settable_ctx_params; + OSSL_FUNC_decoder_does_selection_fn *does_selection; OSSL_FUNC_decoder_decode_fn *decode; OSSL_FUNC_decoder_export_object_fn *export_object; }; diff --git a/include/openssl/core_dispatch.h b/include/openssl/core_dispatch.h index 3b0cf3d3ed..cc8e6712ed 100644 --- a/include/openssl/core_dispatch.h +++ b/include/openssl/core_dispatch.h @@ -789,8 +789,9 @@ OSSL_CORE_MAKE_FUNC(void, encoder_free_object, (void *obj)) # define OSSL_FUNC_DECODER_GETTABLE_PARAMS 4 # define OSSL_FUNC_DECODER_SET_CTX_PARAMS 5 # define OSSL_FUNC_DECODER_SETTABLE_CTX_PARAMS 6 -# define OSSL_FUNC_DECODER_DECODE 10 -# define OSSL_FUNC_DECODER_EXPORT_OBJECT 11 +# define OSSL_FUNC_DECODER_DOES_SELECTION 10 +# define OSSL_FUNC_DECODER_DECODE 11 +# define OSSL_FUNC_DECODER_EXPORT_OBJECT 20 OSSL_CORE_MAKE_FUNC(void *, decoder_newctx, (void *provctx)) OSSL_CORE_MAKE_FUNC(void, decoder_freectx, (void *ctx)) OSSL_CORE_MAKE_FUNC(int, decoder_get_params, (OSSL_PARAM params[])) @@ -801,8 +802,10 @@ OSSL_CORE_MAKE_FUNC(int, decoder_set_ctx_params, OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, decoder_settable_ctx_params, (void *provctx)) +OSSL_CORE_MAKE_FUNC(int, decoder_does_selection, + (void *provctx, int selection)) OSSL_CORE_MAKE_FUNC(int, decoder_decode, - (void *ctx, OSSL_CORE_BIO *in, + (void *ctx, OSSL_CORE_BIO *in, int selection, OSSL_CALLBACK *metadata_cb, void *metadata_cbarg, OSSL_PASSPHRASE_CALLBACK *pw_cb, void *pw_cbarg)) OSSL_CORE_MAKE_FUNC(int, decoder_export_object,