xref: /freebsd/crypto/openssl/doc/man3/OSSL_DECODER_CTX.pod (revision b077aed33b7b6aefca7b17ddb250cf521f938613)
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