1*b077aed3SPierre Pronchery=pod 2*b077aed3SPierre Pronchery 3*b077aed3SPierre Pronchery=head1 NAME 4*b077aed3SPierre Pronchery 5*b077aed3SPierre ProncheryOSSL_DECODER_CTX, 6*b077aed3SPierre ProncheryOSSL_DECODER_CTX_new, 7*b077aed3SPierre ProncheryOSSL_DECODER_settable_ctx_params, 8*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_params, 9*b077aed3SPierre ProncheryOSSL_DECODER_CTX_free, 10*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_selection, 11*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_input_type, 12*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_input_structure, 13*b077aed3SPierre ProncheryOSSL_DECODER_CTX_add_decoder, 14*b077aed3SPierre ProncheryOSSL_DECODER_CTX_add_extra, 15*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_num_decoders, 16*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE, 17*b077aed3SPierre ProncheryOSSL_DECODER_CONSTRUCT, 18*b077aed3SPierre ProncheryOSSL_DECODER_CLEANUP, 19*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct, 20*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct_data, 21*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_cleanup, 22*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_construct, 23*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_construct_data, 24*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_cleanup, 25*b077aed3SPierre ProncheryOSSL_DECODER_export, 26*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_decoder, 27*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_decoder_ctx, 28*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_input_type, 29*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_input_structure 30*b077aed3SPierre Pronchery- Decoder context routines 31*b077aed3SPierre Pronchery 32*b077aed3SPierre Pronchery=head1 SYNOPSIS 33*b077aed3SPierre Pronchery 34*b077aed3SPierre Pronchery #include <openssl/decoder.h> 35*b077aed3SPierre Pronchery 36*b077aed3SPierre Pronchery typedef struct ossl_decoder_ctx_st OSSL_DECODER_CTX; 37*b077aed3SPierre Pronchery 38*b077aed3SPierre Pronchery OSSL_DECODER_CTX *OSSL_DECODER_CTX_new(void); 39*b077aed3SPierre Pronchery const OSSL_PARAM *OSSL_DECODER_settable_ctx_params(OSSL_DECODER *decoder); 40*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_params(OSSL_DECODER_CTX *ctx, 41*b077aed3SPierre Pronchery const OSSL_PARAM params[]); 42*b077aed3SPierre Pronchery void OSSL_DECODER_CTX_free(OSSL_DECODER_CTX *ctx); 43*b077aed3SPierre Pronchery 44*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_selection(OSSL_DECODER_CTX *ctx, int selection); 45*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_input_type(OSSL_DECODER_CTX *ctx, 46*b077aed3SPierre Pronchery const char *input_type); 47*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_input_structure(OSSL_DECODER_CTX *ctx, 48*b077aed3SPierre Pronchery const char *input_structure); 49*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_add_decoder(OSSL_DECODER_CTX *ctx, OSSL_DECODER *decoder); 50*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_add_extra(OSSL_DECODER_CTX *ctx, 51*b077aed3SPierre Pronchery OSSL_LIB_CTX *libctx, 52*b077aed3SPierre Pronchery const char *propq); 53*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_get_num_decoders(OSSL_DECODER_CTX *ctx); 54*b077aed3SPierre Pronchery 55*b077aed3SPierre Pronchery typedef struct ossl_decoder_instance_st OSSL_DECODER_INSTANCE; 56*b077aed3SPierre Pronchery OSSL_DECODER * 57*b077aed3SPierre Pronchery OSSL_DECODER_INSTANCE_get_decoder(OSSL_DECODER_INSTANCE *decoder_inst); 58*b077aed3SPierre Pronchery void * 59*b077aed3SPierre Pronchery OSSL_DECODER_INSTANCE_get_decoder_ctx(OSSL_DECODER_INSTANCE *decoder_inst); 60*b077aed3SPierre Pronchery const char * 61*b077aed3SPierre Pronchery OSSL_DECODER_INSTANCE_get_input_type(OSSL_DECODER_INSTANCE *decoder_inst); 62*b077aed3SPierre Pronchery OSSL_DECODER_INSTANCE_get_input_structure(OSSL_DECODER_INSTANCE *decoder_inst, 63*b077aed3SPierre Pronchery int *was_set); 64*b077aed3SPierre Pronchery 65*b077aed3SPierre Pronchery typedef int OSSL_DECODER_CONSTRUCT(OSSL_DECODER_INSTANCE *decoder_inst, 66*b077aed3SPierre Pronchery const OSSL_PARAM *object, 67*b077aed3SPierre Pronchery void *construct_data); 68*b077aed3SPierre Pronchery typedef void OSSL_DECODER_CLEANUP(void *construct_data); 69*b077aed3SPierre Pronchery 70*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_construct(OSSL_DECODER_CTX *ctx, 71*b077aed3SPierre Pronchery OSSL_DECODER_CONSTRUCT *construct); 72*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_construct_data(OSSL_DECODER_CTX *ctx, 73*b077aed3SPierre Pronchery void *construct_data); 74*b077aed3SPierre Pronchery int OSSL_DECODER_CTX_set_cleanup(OSSL_DECODER_CTX *ctx, 75*b077aed3SPierre Pronchery OSSL_DECODER_CLEANUP *cleanup); 76*b077aed3SPierre Pronchery OSSL_DECODER_CONSTRUCT *OSSL_DECODER_CTX_get_construct(OSSL_DECODER_CTX *ctx); 77*b077aed3SPierre Pronchery void *OSSL_DECODER_CTX_get_construct_data(OSSL_DECODER_CTX *ctx); 78*b077aed3SPierre Pronchery OSSL_DECODER_CLEANUP *OSSL_DECODER_CTX_get_cleanup(OSSL_DECODER_CTX *ctx); 79*b077aed3SPierre Pronchery 80*b077aed3SPierre Pronchery int OSSL_DECODER_export(OSSL_DECODER_INSTANCE *decoder_inst, 81*b077aed3SPierre Pronchery void *reference, size_t reference_sz, 82*b077aed3SPierre Pronchery OSSL_CALLBACK *export_cb, void *export_cbarg); 83*b077aed3SPierre Pronchery 84*b077aed3SPierre Pronchery=head1 DESCRIPTION 85*b077aed3SPierre Pronchery 86*b077aed3SPierre ProncheryThe B<OSSL_DECODER_CTX> holds data about multiple decoders, as needed to 87*b077aed3SPierre Proncheryfigure out what the input data is and to attempt to unpack it into one of 88*b077aed3SPierre Proncheryseveral possible related results. This also includes chaining decoders, so 89*b077aed3SPierre Proncherythe output from one can become the input for another. This allows having 90*b077aed3SPierre Proncherygeneric format decoders such as PEM to DER, as well as more specialized 91*b077aed3SPierre Proncherydecoders like DER to RSA. 92*b077aed3SPierre Pronchery 93*b077aed3SPierre ProncheryThe chains may be limited by specifying an input type, which is considered a 94*b077aed3SPierre Proncherystarting point. This is both considered by OSSL_DECODER_CTX_add_extra(), 95*b077aed3SPierre Proncherywhich will stop adding one more decoder implementations when it has already 96*b077aed3SPierre Proncheryadded those that take the specified input type, and functions like 97*b077aed3SPierre ProncheryL<OSSL_DECODER_from_bio(3)>, which will only start the decoding process with 98*b077aed3SPierre Proncherythe decoder implementations that take that input type. For example, if the 99*b077aed3SPierre Proncheryinput type is set to C<DER>, a PEM to DER decoder will be ignored. 100*b077aed3SPierre Pronchery 101*b077aed3SPierre ProncheryThe input type can also be NULL, which means that the caller doesn't know 102*b077aed3SPierre Proncherywhat type of input they have. In this case, OSSL_DECODER_from_bio() will 103*b077aed3SPierre Proncherysimply try with one decoder implementation after the other, and thereby 104*b077aed3SPierre Proncherydiscover what kind of input the caller gave it. 105*b077aed3SPierre Pronchery 106*b077aed3SPierre ProncheryFor every decoding done, even an intermediary one, a constructor provided by 107*b077aed3SPierre Proncherythe caller is called to attempt to construct an appropriate type / structure 108*b077aed3SPierre Proncherythat the caller knows how to handle from the current decoding result. 109*b077aed3SPierre ProncheryThe constructor is set with OSSL_DECODER_CTX_set_construct(). 110*b077aed3SPierre Pronchery 111*b077aed3SPierre ProncheryB<OSSL_DECODER_INSTANCE> is an opaque structure that contains data about the 112*b077aed3SPierre Proncherydecoder that was just used, and that may be useful for the constructor. 113*b077aed3SPierre ProncheryThere are some functions to extract data from this type, described further 114*b077aed3SPierre Proncherydown. 115*b077aed3SPierre Pronchery 116*b077aed3SPierre Pronchery=head2 Functions 117*b077aed3SPierre Pronchery 118*b077aed3SPierre ProncheryOSSL_DECODER_CTX_new() creates a new empty B<OSSL_DECODER_CTX>. 119*b077aed3SPierre Pronchery 120*b077aed3SPierre ProncheryOSSL_DECODER_settable_ctx_params() returns an L<OSSL_PARAM(3)> array of 121*b077aed3SPierre Proncheryparameter descriptors. 122*b077aed3SPierre Pronchery 123*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_params() attempts to set parameters specified with an 124*b077aed3SPierre ProncheryL<OSSL_PARAM(3)> array I<params>. These parameters are passed to all 125*b077aed3SPierre Proncherydecoders that have been added to the I<ctx> so far. Parameters that an 126*b077aed3SPierre Proncheryimplementation doesn't recognise should be ignored by it. 127*b077aed3SPierre Pronchery 128*b077aed3SPierre ProncheryOSSL_DECODER_CTX_free() frees the given context I<ctx>. 129*b077aed3SPierre Pronchery 130*b077aed3SPierre ProncheryOSSL_DECODER_CTX_add_decoder() populates the B<OSSL_DECODER_CTX> I<ctx> with 131*b077aed3SPierre Proncherya decoder, to be used to attempt to decode some encoded input. 132*b077aed3SPierre Pronchery 133*b077aed3SPierre ProncheryOSSL_DECODER_CTX_add_extra() finds decoders that generate input for already 134*b077aed3SPierre Proncheryadded decoders, and adds them as well. This is used to build decoder 135*b077aed3SPierre Proncherychains. 136*b077aed3SPierre Pronchery 137*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_input_type() sets the starting input type. This limits 138*b077aed3SPierre Proncherythe decoder chains to be considered, as explained in the general description 139*b077aed3SPierre Proncheryabove. 140*b077aed3SPierre Pronchery 141*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_input_structure() sets the name of the structure that 142*b077aed3SPierre Proncherythe input is expected to have. This may be used to determines what decoder 143*b077aed3SPierre Proncheryimplementations may be used. NULL is a valid input structure, when it's not 144*b077aed3SPierre Proncheryrelevant, or when the decoder implementations are expected to figure it out. 145*b077aed3SPierre Pronchery 146*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_num_decoders() gets the number of decoders currently 147*b077aed3SPierre Proncheryadded to the context I<ctx>. 148*b077aed3SPierre Pronchery 149*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct() sets the constructor I<construct>. 150*b077aed3SPierre Pronchery 151*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct_data() sets the constructor data that is 152*b077aed3SPierre Proncherypassed to the constructor every time it's called. 153*b077aed3SPierre Pronchery 154*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_cleanup() sets the constructor data I<cleanup> 155*b077aed3SPierre Proncheryfunction. This is called by L<OSSL_DECODER_CTX_free(3)>. 156*b077aed3SPierre Pronchery 157*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_construct(), OSSL_DECODER_CTX_get_construct_data() and 158*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_cleanup() return the values that have been set by 159*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct(), OSSL_DECODER_CTX_set_construct_data() and 160*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_cleanup() respectively. 161*b077aed3SPierre Pronchery 162*b077aed3SPierre ProncheryOSSL_DECODER_export() is a fallback function for constructors that cannot 163*b077aed3SPierre Proncheryuse the data they get directly for diverse reasons. It takes the same 164*b077aed3SPierre Proncherydecode instance I<decoder_inst> that the constructor got and an object 165*b077aed3SPierre ProncheryI<reference>, unpacks the object which it refers to, and exports it by 166*b077aed3SPierre Proncherycreating an L<OSSL_PARAM(3)> array that it then passes to I<export_cb>, 167*b077aed3SPierre Proncheryalong with I<export_arg>. 168*b077aed3SPierre Pronchery 169*b077aed3SPierre Pronchery=head2 Constructor 170*b077aed3SPierre Pronchery 171*b077aed3SPierre ProncheryA B<OSSL_DECODER_CONSTRUCT> gets the following arguments: 172*b077aed3SPierre Pronchery 173*b077aed3SPierre Pronchery=over 4 174*b077aed3SPierre Pronchery 175*b077aed3SPierre Pronchery=item I<decoder_inst> 176*b077aed3SPierre Pronchery 177*b077aed3SPierre ProncheryThe B<OSSL_DECODER_INSTANCE> for the decoder from which the constructor gets 178*b077aed3SPierre Proncheryits data. 179*b077aed3SPierre Pronchery 180*b077aed3SPierre Pronchery=item I<object> 181*b077aed3SPierre Pronchery 182*b077aed3SPierre ProncheryA provider-native object abstraction produced by the decoder. Further 183*b077aed3SPierre Proncheryinformation on the provider-native object abstraction can be found in 184*b077aed3SPierre ProncheryL<provider-object(7)>. 185*b077aed3SPierre Pronchery 186*b077aed3SPierre Pronchery=item I<construct_data> 187*b077aed3SPierre Pronchery 188*b077aed3SPierre ProncheryThe pointer that was set with OSSL_DECODE_CTX_set_construct_data(). 189*b077aed3SPierre Pronchery 190*b077aed3SPierre Pronchery=back 191*b077aed3SPierre Pronchery 192*b077aed3SPierre ProncheryThe constructor is expected to return 1 when the data it receives can be 193*b077aed3SPierre Proncheryconstructed, otherwise 0. 194*b077aed3SPierre Pronchery 195*b077aed3SPierre ProncheryThese utility functions may be used by a constructor: 196*b077aed3SPierre Pronchery 197*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_decoder() can be used to get the decoder 198*b077aed3SPierre Proncheryimplementation from a decoder instance I<decoder_inst>. 199*b077aed3SPierre Pronchery 200*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_decoder_ctx() can be used to get the decoder 201*b077aed3SPierre Proncheryimplementation's provider context from a decoder instance I<decoder_inst>. 202*b077aed3SPierre Pronchery 203*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_input_type() can be used to get the decoder 204*b077aed3SPierre Proncheryimplementation's input type from a decoder instance I<decoder_inst>. 205*b077aed3SPierre Pronchery 206*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_get_input_structure() can be used to get the input 207*b077aed3SPierre Proncherystructure for the decoder implementation from a decoder instance 208*b077aed3SPierre ProncheryI<decoder_inst>. 209*b077aed3SPierre ProncheryThis may be NULL. 210*b077aed3SPierre Pronchery 211*b077aed3SPierre Pronchery=head1 RETURN VALUES 212*b077aed3SPierre Pronchery 213*b077aed3SPierre ProncheryOSSL_DECODER_CTX_new() returns a pointer to a B<OSSL_DECODER_CTX>, or NULL 214*b077aed3SPierre Proncheryif the context structure couldn't be allocated. 215*b077aed3SPierre Pronchery 216*b077aed3SPierre ProncheryOSSL_DECODER_settable_ctx_params() returns an L<OSSL_PARAM(3)> array, or 217*b077aed3SPierre ProncheryNULL if none is available. 218*b077aed3SPierre Pronchery 219*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_params() returns 1 if all recognised parameters were 220*b077aed3SPierre Proncheryvalid, or 0 if one of them was invalid or caused some other failure in the 221*b077aed3SPierre Proncheryimplementation. 222*b077aed3SPierre Pronchery 223*b077aed3SPierre ProncheryOSSL_DECODER_CTX_add_decoder(), OSSL_DECODER_CTX_add_extra(), 224*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_construct(), OSSL_DECODER_CTX_set_construct_data() and 225*b077aed3SPierre ProncheryOSSL_DECODER_CTX_set_cleanup() return 1 on success, or 0 on failure. 226*b077aed3SPierre Pronchery 227*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_construct(), OSSL_DECODER_CTX_get_construct_data() and 228*b077aed3SPierre ProncheryOSSL_DECODER_CTX_get_cleanup() return the current pointers to the 229*b077aed3SPierre Proncheryconstructor, the constructor data and the cleanup functions, respectively. 230*b077aed3SPierre Pronchery 231*b077aed3SPierre ProncheryOSSL_DECODER_CTX_num_decoders() returns the current number of decoders. It 232*b077aed3SPierre Proncheryreturns 0 if I<ctx> is NULL. 233*b077aed3SPierre Pronchery 234*b077aed3SPierre ProncheryOSSL_DECODER_export() returns 1 on success, or 0 on failure. 235*b077aed3SPierre Pronchery 236*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_decoder() returns an B<OSSL_DECODER> pointer on 237*b077aed3SPierre Proncherysuccess, or NULL on failure. 238*b077aed3SPierre Pronchery 239*b077aed3SPierre ProncheryOSSL_DECODER_INSTANCE_decoder_ctx() returns a provider context pointer on 240*b077aed3SPierre Proncherysuccess, or NULL on failure. 241*b077aed3SPierre Pronchery 242*b077aed3SPierre Pronchery=head1 SEE ALSO 243*b077aed3SPierre Pronchery 244*b077aed3SPierre ProncheryL<provider(7)>, L<OSSL_DECODER(3)>, L<OSSL_DECODER_from_bio(3)> 245*b077aed3SPierre Pronchery 246*b077aed3SPierre Pronchery=head1 HISTORY 247*b077aed3SPierre Pronchery 248*b077aed3SPierre ProncheryThe functions described here were added in OpenSSL 3.0. 249*b077aed3SPierre Pronchery 250*b077aed3SPierre Pronchery=head1 COPYRIGHT 251*b077aed3SPierre Pronchery 252*b077aed3SPierre ProncheryCopyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. 253*b077aed3SPierre Pronchery 254*b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 255*b077aed3SPierre Proncherythis file except in compliance with the License. You can obtain a copy 256*b077aed3SPierre Proncheryin the file LICENSE in the source distribution or at 257*b077aed3SPierre ProncheryL<https://www.openssl.org/source/license.html>. 258*b077aed3SPierre Pronchery 259*b077aed3SPierre Pronchery=cut 260