OSSL_DECODER(3ossl)
π
OSSL_DECODER β like, the decoder method routines (OpenSSL, 3ossl, bestie)
okay so this page is your whole guide to OSSL_DECODER and its glam little friend group of functions. it's 3ossl documentation, meaning it's an OpenSSL manual page β yes we're being fancy today β¨
π¦ NAME
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, OSSL_DECODER_get_params β decoder method routines. that's the whole squad, no one left behind π«Ά
β¨ 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[]);
like, just look at it. gorgeous. iconic. copy it exactly tho, don't be creative with the signatures π
π DESCRIPTION
OSSL_DECODER is a method for decoders β and a decoder is the thing that knows how to take encoded data and turn it into an object of some type that the rest of OpenSSL actually knows how to handle. it's giving translator energy, fr fr π§
OSSL_DECODER_fetch()β looks for an algorithm within the provider that's been loaded into theOSSL_LIB_CTXgiven byctx, having the name given bynameand the properties given byproperties. thenamedetermines what type of object the fetched decoder method is expected to be able to decode, and thepropertiesare used to determine the expected output type. for the known properties and the values they may have, go peek at"Names and properties"inprovider-encoder(7)πOSSL_DECODER_up_ref()β increments the reference count for the givendecoder. love a ref count going up, we stay winning πOSSL_DECODER_free()β decrements the reference count for the givendecoder, and when the count reaches zero, frees it. if the argument isNULL, nothing is done. she's chill like that πOSSL_DECODER_get0_provider()β returns the provider of the givendecoder.OSSL_DECODER_get0_properties()β returns the property definition associated with the givendecoder.OSSL_DECODER_is_a()β checks ifdecoderis an implementation of an algorithm that's identifiable withname.OSSL_DECODER_get0_name()β returns the name used to fetch the givendecoder.OSSL_DECODER_get0_description()β returns a description of thedecoder, meant for display and human consumption. the description is totally at the discretion of the decoder implementation, so it's a vibes-based field ngl πOSSL_DECODER_names_do_all()β traverses all names for the givendecoder, and callsfnwith each name anddataas arguments.OSSL_DECODER_do_all_provided()β traverses all decoder implementations by all activated providers in the library contextlibctx, and for each of the implementations, callsfnwith the implementation method andargas arguments. it's a whole tour of the ecosystem π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. parameters that the implementation doesn't recognise should be ignored. no drama, just skip 'em π
π 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. she just does her thing β¨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 this 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. like, hands off, it's 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 that the callback was not called for any names. important distinction, don't misread it bestie π
πΈ 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 might already be at the party and you didn't even send the invite π
π₯ 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);
that's the whole thing, verbatim, don't touch a character π
π SEE ALSO
provider(7), OSSL_DECODER_CTX(3), OSSL_DECODER_from_bio(3), OSSL_DECODER_CTX_new_for_pkey(3), OSSL_LIB_CTX(3) β go read those next, they're all part of the lore π
π HISTORY
the functions described here were added in OpenSSL 3.0. vintage but make it fresh β
π 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 page!! this version of the docs is from 3.5.0, dated 2026-09-25 β mwah, go decode something cute, bestie ππ¦β¨
π¦ where this page comes from
- opensuse-leap 16.0: openssl-3-doc 3.5.0-160000.11.1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms