OSSL_DECODER(3SSL)
β¨ OSSL_DECODER β the decoder method routines (from the OpenSSL manuals, section 3SSL) β¨
okay bestie, gather round π you know OSSL_DECODER, OSSL_DECODER_fetch, OSSL_DECODER_up_ref, OSSL_DECODER_free, OSSL_DECODER_get0_provider, OSSL_DECODER_get0_properties, OSSL_DECODER_is_a, OSSL_DECODER_get0_name, OSSL_DECODER_get0_description, OSSL_DECODER_do_all_provided, OSSL_DECODER_names_do_all, OSSL_DECODER_gettable_params, and OSSL_DECODER_get_params? yeah. those. the decoder method routines. let's get into it π
πΈ SYNOPSIS πΈ
#include <openssl/decoder.h>
typedef struct ossl_decoder_st OSSL_DECODER;
OSSL_DECODER *OSSL_DECODER_fetch(OSSL_LIB_CTX *ctx, const char *name,
const char *properties);
int OSSL_DECODER_up_ref(OSSL_DECODER *decoder);
void OSSL_DECODER_free(OSSL_DECODER *decoder);
const OSSL_PROVIDER *OSSL_DECODER_get0_provider(const OSSL_DECODER *decoder);
const char *OSSL_DECODER_get0_properties(const OSSL_DECODER *decoder);
int OSSL_DECODER_is_a(const OSSL_DECODER *decoder, const char *name);
const char *OSSL_DECODER_get0_name(const OSSL_DECODER *decoder);
const char *OSSL_DECODER_get0_description(const OSSL_DECODER *decoder);
void OSSL_DECODER_do_all_provided(OSSL_LIB_CTX *libctx,
void (*fn)(OSSL_DECODER *decoder, void *arg),
void *arg);
int OSSL_DECODER_names_do_all(const OSSL_DECODER *decoder,
void (*fn)(const char *name, void *data),
void *data);
const OSSL_PARAM *OSSL_DECODER_gettable_params(OSSL_DECODER *decoder);
int OSSL_DECODER_get_params(OSSL_DECODER_CTX *ctx, const OSSL_PARAM params[]);
π DESCRIPTION π
OSSL_DECODER is a method for decoders, and decoders are literally the ones who know how to turn encoded data into an object of some type that the rest of OpenSSL actually knows how to handle. it's giving translator energy, no cap π¦
OSSL_DECODER_fetch()β hunts for an algorithm inside the provider that's been loaded into theOSSL_LIB_CTXyou passed asctx, matching thenameyou gave and thepropertiesyou gave. thenameis what decides which type of object the fetched decoder method is supposed to be able to decode, and the properties are what determine the expected output type. for the known properties and the values they can have, go peek at "Names and properties" inprovider-encoder(7)πOSSL_DECODER_up_ref()β bumps the reference count on the givendecoderβ¬οΈOSSL_DECODER_free()β drops the reference count on the givendecoder, and the second it hits zero, it frees it. if the argument isNULL, nothing happens. she's chill like that πOSSL_DECODER_get0_provider()β hands you back the provider of the givendecoderπ«ΆOSSL_DECODER_get0_properties()β hands you back the property definition associated with the givendecoderβ¨OSSL_DECODER_is_a()β checks whetherdecoderis an implementation of an algorithm that's identifiable withnameπOSSL_DECODER_get0_name()β returns the name that was used to fetch the givendecoderπ·οΈOSSL_DECODER_get0_description()β returns a description of the decoder, meant for display and for human consumption. the description is entirely at the discretion of the decoder implementation, so don't come for her if it's weird πOSSL_DECODER_names_do_all()β walks through all the names for the givendecoder, and callsfnwith each name anddataas arguments πΆβοΈOSSL_DECODER_do_all_provided()β walks through all decoder implementations from all activated providers in the library contextlibctx, and for every single implementation, callsfnwith the implementation method andargas arguments πOSSL_DECODER_gettable_params()β returns anOSSL_PARAM(3)array of parameter descriptors πOSSL_DECODER_get_params()β attempts to get parameters specified with anOSSL_PARAM(3)arrayparams. any parameters the implementation doesn't recognise should just be ignored, we're not forcing anything π
π RETURN VALUES π
OSSL_DECODER_fetch()β returns a pointer to anOSSL_DECODERobject, orNULLon error.OSSL_DECODER_up_ref()β returns1on success, or0on error.OSSL_DECODER_free()β doesn't return any value. queen of saying nothing β¨OSSL_DECODER_get0_provider()β returns a pointer to a provider object, orNULLon error.OSSL_DECODER_get0_properties()β returns a pointer to a property definition string, orNULLon error.OSSL_DECODER_is_a()β returns1ifdecoderwas identifiable, otherwise0.OSSL_DECODER_get0_name()β returns the algorithm name from the provided implementation for the givendecoder. note that the decoder may have multiple synonyms associated with it π« in that case, the first name from the algorithm definition is returned. ownership of the returned string is retained by the decoder object and should not be freed by the caller β do not touch, she is not yours πOSSL_DECODER_get0_description()β returns a pointer to a description, orNULLif there isn't one.OSSL_DECODER_names_do_all()β returns1if the callback was called for all names. a return value of0means the callback was not called for any names.
π¦ NOTES π¦
OSSL_DECODER_fetch() may be called implicitly by other fetching functions, using the same library context and properties. any other API that uses keys will typically do this. so likeβ¦ she shows up uninvited but it's fine, it's always fine π«Ά
π EXAMPLES π
to list all decoders in a provider to a bio_out:
static void collect_decoders(OSSL_DECODER *decoder, void *stack)
{
STACK_OF(OSSL_DECODER) *decoder_stack = stack;
sk_OSSL_DECODER_push(decoder_stack, decoder);
OSSL_DECODER_up_ref(decoder);
}
void print_name(const char *name, void *vdata)
{
BIO *bio = vdata;
BIO_printf(bio, "%s ", name);
}
STACK_OF(OSSL_DECODER) *decoders;
int i;
decoders = sk_OSSL_DECODER_new_null();
BIO_printf(bio_out, "DECODERs provided by %s:\n", provider);
OSSL_DECODER_do_all_provided(NULL, collect_decoders,
decoders);
for (i = 0; i < sk_OSSL_DECODER_num(decoders); i++) {
OSSL_DECODER *decoder = sk_OSSL_DECODER_value(decoders, i);
if (strcmp(OSSL_PROVIDER_get0_name(OSSL_DECODER_get0_provider(decoder)),
provider) != 0)
continue;
if (OSSL_DECODER_names_do_all(decoder, print_name, bio_out))
BIO_printf(bio_out, "\n");
}
sk_OSSL_DECODER_pop_free(decoders, OSSL_DECODER_free);
fr fr, copy it, run it, it works π
π SEE ALSO π
provider(7), OSSL_DECODER_CTX(3), OSSL_DECODER_from_bio(3), OSSL_DECODER_CTX_new_for_pkey(3), OSSL_LIB_CTX(3)
π HISTORY π
the functions described here were added in OpenSSL 3.0 β
π COPYRIGHT π
Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the Apache License 2.0 (the "License"). You may not use this file except in compliance with the License. You can obtain a copy in the file LICENSE in the source distribution or at <https://www.openssl.org/source/license.html>.
okay that's the whole thing, bestie, no notes π and for the record: this is from OpenSSL 4.0.3, dated 2026-09-29. icon behavior, honestly. mwah π
π¦ where this page comes from
- ubuntu stonking: libssl-doc 4.0.3-1ubuntu1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms