7 OSSL_ENCODER_settable_ctx_params,
8 OSSL_ENCODER_CTX_set_params,
10 OSSL_ENCODER_CTX_set_selection,
11 OSSL_ENCODER_CTX_set_output_type,
12 OSSL_ENCODER_CTX_set_output_structure,
13 OSSL_ENCODER_CTX_add_encoder,
14 OSSL_ENCODER_CTX_add_extra,
15 OSSL_ENCODER_CTX_get_num_encoders,
16 OSSL_ENCODER_INSTANCE,
17 OSSL_ENCODER_INSTANCE_get_encoder,
18 OSSL_ENCODER_INSTANCE_get_encoder_ctx,
19 OSSL_ENCODER_INSTANCE_get_input_type,
20 OSSL_ENCODER_INSTANCE_get_output_type,
21 OSSL_ENCODER_INSTANCE_get_output_structure,
22 OSSL_ENCODER_CONSTRUCT,
24 OSSL_ENCODER_CTX_set_construct,
25 OSSL_ENCODER_CTX_set_construct_data,
26 OSSL_ENCODER_CTX_set_cleanup
27 - Encoder context routines
31 #include <openssl/encoder.h>
33 typedef struct ossl_encoder_ctx_st OSSL_ENCODER_CTX;
35 OSSL_ENCODER_CTX *OSSL_ENCODER_CTX_new();
36 const OSSL_PARAM *OSSL_ENCODER_settable_ctx_params(OSSL_ENCODER *encoder);
37 int OSSL_ENCODER_CTX_set_params(OSSL_ENCODER_CTX *ctx,
38 const OSSL_PARAM params[]);
39 void OSSL_ENCODER_CTX_free(OSSL_ENCODER_CTX *ctx);
41 int OSSL_ENCODER_CTX_set_selection(OSSL_ENCODER_CTX *ctx, int selection);
42 int OSSL_ENCODER_CTX_set_output_type(OSSL_ENCODER_CTX *ctx,
43 const char *output_type);
44 int OSSL_ENCODER_CTX_set_output_structure(OSSL_ENCODER_CTX *ctx,
45 const char *output_structure);
47 int OSSL_ENCODER_CTX_add_encoder(OSSL_ENCODER_CTX *ctx, OSSL_ENCODER *encoder);
48 int OSSL_ENCODER_CTX_add_extra(OSSL_ENCODER_CTX *ctx,
49 OSSL_LIB_CTX *libctx, const char *propq);
50 int OSSL_ENCODER_CTX_get_num_encoders(OSSL_ENCODER_CTX *ctx);
52 typedef struct ossl_encoder_instance_st OSSL_ENCODER_INSTANCE;
54 OSSL_ENCODER_INSTANCE_get_encoder(OSSL_ENCODER_INSTANCE *encoder_inst);
56 OSSL_ENCODER_INSTANCE_get_encoder_ctx(OSSL_ENCODER_INSTANCE *encoder_inst);
58 OSSL_ENCODER_INSTANCE_get_input_type(OSSL_ENCODER_INSTANCE *encoder_inst);
60 OSSL_ENCODER_INSTANCE_get_output_type(OSSL_ENCODER_INSTANCE *encoder_inst);
62 OSSL_ENCODER_INSTANCE_get_output_structure(OSSL_ENCODER_INSTANCE *encoder_inst);
64 typedef const void *OSSL_ENCODER_CONSTRUCT(OSSL_ENCODER_INSTANCE *encoder_inst,
65 void *construct_data);
66 typedef void OSSL_ENCODER_CLEANUP(void *construct_data);
68 int OSSL_ENCODER_CTX_set_construct(OSSL_ENCODER_CTX *ctx,
69 OSSL_ENCODER_CONSTRUCT *construct);
70 int OSSL_ENCODER_CTX_set_construct_data(OSSL_ENCODER_CTX *ctx,
71 void *construct_data);
72 int OSSL_ENCODER_CTX_set_cleanup(OSSL_ENCODER_CTX *ctx,
73 OSSL_ENCODER_CLEANUP *cleanup);
77 Encoding an input object to the desired encoding may be done with a chain of
78 encoder implementations, which means that the output from one encoder may be
79 the input for the next in the chain. The B<OSSL_ENCODER_CTX> holds all the
80 data about these encoders. This allows having generic format encoders such
81 as DER to PEM, as well as more specialized encoders like RSA to DER.
83 The final output type must be given, and a chain of encoders must end with
84 an implementation that produces that output type.
86 At the beginning of the encoding process, a contructor provided by the
87 caller is called to ensure that there is an appropriate provider-side object
89 The constructor is set with OSSL_ENCODER_CTX_set_construct().
91 B<OSSL_ENCODER_INSTANCE> is an opaque structure that contains data about the
92 encoder that is going to be used, and that may be useful for the
93 constructor. There are some functions to extract data from this type,
94 described in L</Constructor> below.
98 OSSL_ENCODER_CTX_new() creates a B<OSSL_ENCODER_CTX>.
100 OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)>
101 array of parameter descriptors.
103 OSSL_ENCODER_CTX_set_params() attempts to set parameters specified
104 with an L<OSSL_PARAM(3)> array I<params>. Parameters that the
105 implementation doesn't recognise should be ignored.
107 OSSL_ENCODER_CTX_free() frees the given context I<ctx>.
109 OSSL_ENCODER_CTX_add_encoder() populates the B<OSSL_ENCODER_CTX>
110 I<ctx> with a encoder, to be used to encode an input object.
112 OSSL_ENCODER_CTX_add_extra() finds encoders that further encodes output
113 from already added encoders, and adds them as well. This is used to build
116 OSSL_ENCODER_CTX_set_output_type() sets the ending output type. This must
117 be specified, and determines if a complete encoder chain is available.
119 OSSL_ENCODER_CTX_set_output_structure() sets the desired output structure.
120 This may be used to determines what encoder implementations may be used.
121 Depending on the type of object being encoded, the output structure may
124 OSSL_ENCODER_CTX_get_num_encoders() gets the number of encoders currently
125 added to the context I<ctx>.
127 OSSL_ENCODER_CTX_set_construct() sets the constructor I<construct>.
129 OSSL_ENCODER_CTX_set_construct_data() sets the constructor data that is
130 passed to the constructor every time it's called.
132 OSSL_ENCODER_CTX_set_cleanup() sets the constructor data I<cleanup>
133 function. This is called by L<OSSL_ENCODER_CTX_free(3)>.
137 A B<OSSL_ENCODER_CONSTRUCT> gets the following arguments:
141 =item I<encoder_inst>
143 The B<OSSL_ENCODER_INSTANCE> for the encoder from which the constructor gets
146 =item I<construct_data>
148 The pointer that was set with OSSL_ENCODE_CTX_set_construct_data().
152 The constructor is expected to return a valid (non-NULL) pointer to a
153 provider-native object that can be used as first input of an encoding chain,
154 or NULL to indicate that an error has occured.
156 These utility functions may be used by a constructor:
158 OSSL_ENCODER_INSTANCE_get_encoder() can be used to get the encoder
159 implementation of the encoder instance I<encoder_inst>.
161 OSSL_ENCODER_INSTANCE_get_encoder_ctx() can be used to get the encoder
162 implementation's provider context of the encoder instance I<encoder_inst>.
164 OSSL_ENCODER_INSTANCE_get_input_type() can be used to get the input type for
165 the encoder implementation of the encoder instance I<encoder_inst>.
168 OSSL_ENCODER_INSTANCE_get_output_type() can be used to get the output type
169 for the encoder implementation of the encoder instance I<encoder_inst>.
170 This will never be NULL.
172 OSSL_ENCODER_INSTANCE_get_output_type() can be used to get the output type
173 for the encoder implementation of the encoder instance I<encoder_inst>.
174 This will never be NULL.
176 OSSL_ENCODER_INSTANCE_get_output_structure() can be used to get the output
177 structure for the encoder implementation of the encoder instance
183 OSSL_ENCODER_CTX_new() returns a pointer to a B<OSSL_ENCODER_CTX>, or NULL
184 if the context structure couldn't be allocated.
186 OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)> array, or
187 NULL if none is available.
189 OSSL_ENCODER_CTX_set_params() returns 1 if all recognised parameters were
190 valid, or 0 if one of them was invalid or caused some other failure in the
193 OSSL_ENCODER_CTX_add_encoder(), OSSL_ENCODER_CTX_add_extra(),
194 OSSL_ENCODER_CTX_set_construct(), OSSL_ENCODER_CTX_set_construct_data() and
195 OSSL_ENCODER_CTX_set_cleanup() return 1 on success, or 0 on failure.
197 OSSL_ENCODER_CTX_get_num_encoders() returns the current number of encoders.
198 It returns 0 if I<ctx> is NULL.
200 OSSL_ENCODER_INSTANCE_get_encoder() returns an B<OSSL_ENCODER> pointer on
201 success, or NULL on failure.
203 OSSL_ENCODER_INSTANCE_get_encoder_ctx() returns a provider context pointer on
204 success, or NULL on failure.
206 OSSL_ENCODER_INSTANCE_get_output_type() returns a string with the name of the
207 input type, if relevant. NULL is a valid returned value.
209 OSSL_ENCODER_INSTANCE_get_output_type() returns a string with the name of the
212 OSSL_ENCODER_INSTANCE_get_output_structure() returns a string with the name
213 of the output structure.
217 L<provider(7)>, L<OSSL_ENCODER(3)>
221 The functions described here were added in OpenSSL 3.0.
225 Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
227 Licensed under the Apache License 2.0 (the "License"). You may not use
228 this file except in compliance with the License. You can obtain a copy
229 in the file LICENSE in the source distribution or at
230 L<https://www.openssl.org/source/license.html>.