Add X509_NAME_hash_ex() to be able to check if it failed due to unsupported SHA1
[openssl.git] / doc / man3 / OSSL_ENCODER_CTX.pod
1 =pod
2
3 =head1 NAME
4
5 OSSL_ENCODER_CTX,
6 OSSL_ENCODER_CTX_new,
7 OSSL_ENCODER_settable_ctx_params,
8 OSSL_ENCODER_CTX_set_params,
9 OSSL_ENCODER_CTX_free,
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,
23 OSSL_ENCODER_CLEANUP,
24 OSSL_ENCODER_CTX_set_construct,
25 OSSL_ENCODER_CTX_set_construct_data,
26 OSSL_ENCODER_CTX_set_cleanup
27 - Encoder context routines
28
29 =head1 SYNOPSIS
30
31  #include <openssl/encoder.h>
32
33  typedef struct ossl_encoder_ctx_st OSSL_ENCODER_CTX;
34
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);
40
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);
46
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);
51
52  typedef struct ossl_encoder_instance_st OSSL_ENCODER_INSTANCE;
53  OSSL_ENCODER *
54  OSSL_ENCODER_INSTANCE_get_encoder(OSSL_ENCODER_INSTANCE *encoder_inst);
55  void *
56  OSSL_ENCODER_INSTANCE_get_encoder_ctx(OSSL_ENCODER_INSTANCE *encoder_inst);
57  const char *
58  OSSL_ENCODER_INSTANCE_get_input_type(OSSL_ENCODER_INSTANCE *encoder_inst);
59  const char *
60  OSSL_ENCODER_INSTANCE_get_output_type(OSSL_ENCODER_INSTANCE *encoder_inst);
61  const char *
62  OSSL_ENCODER_INSTANCE_get_output_structure(OSSL_ENCODER_INSTANCE *encoder_inst);
63
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);
67
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);
74
75 =head1 DESCRIPTION
76
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.
82
83 The final output type must be given, and a chain of encoders must end with
84 an implementation that produces that output type.
85
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
88 to start with.
89 The constructor is set with OSSL_ENCODER_CTX_set_construct().
90
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.
95
96 =head2 Functions
97
98 OSSL_ENCODER_CTX_new() creates a B<OSSL_ENCODER_CTX>.
99
100 OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)>
101 array of parameter descriptors.
102
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.
106
107 OSSL_ENCODER_CTX_free() frees the given context I<ctx>.
108
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.
111
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
114 encoder chains.
115
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.
118
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
122 not be relevant.
123
124 OSSL_ENCODER_CTX_get_num_encoders() gets the number of encoders currently
125 added to the context I<ctx>.
126
127 OSSL_ENCODER_CTX_set_construct() sets the constructor I<construct>.
128
129 OSSL_ENCODER_CTX_set_construct_data() sets the constructor data that is
130 passed to the constructor every time it's called.
131
132 OSSL_ENCODER_CTX_set_cleanup() sets the constructor data I<cleanup>
133 function.  This is called by L<OSSL_ENCODER_CTX_free(3)>.
134
135 =head2 Constructor
136
137 A B<OSSL_ENCODER_CONSTRUCT> gets the following arguments:
138
139 =over 4
140
141 =item I<encoder_inst>
142
143 The B<OSSL_ENCODER_INSTANCE> for the encoder from which the constructor gets
144 its data.
145
146 =item I<construct_data>
147
148 The pointer that was set with OSSL_ENCODE_CTX_set_construct_data().
149
150 =back
151
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.
155
156 These utility functions may be used by a constructor:
157
158 OSSL_ENCODER_INSTANCE_get_encoder() can be used to get the encoder
159 implementation of the encoder instance I<encoder_inst>.
160
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>.
163
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>.
166 This may be NULL.
167
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.
171
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.
175
176 OSSL_ENCODER_INSTANCE_get_output_structure() can be used to get the output
177 structure for the encoder implementation of the encoder instance
178 I<encoder_inst>.
179 This may be NULL.
180
181 =head1 RETURN VALUES
182
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.
185
186 OSSL_ENCODER_settable_ctx_params() returns an L<OSSL_PARAM(3)> array, or
187 NULL if none is available.
188
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
191 implementation.
192
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.
196
197 OSSL_ENCODER_CTX_get_num_encoders() returns the current number of encoders.
198 It returns 0 if I<ctx> is NULL.
199
200 OSSL_ENCODER_INSTANCE_get_encoder() returns an B<OSSL_ENCODER> pointer on
201 success, or NULL on failure.
202
203 OSSL_ENCODER_INSTANCE_get_encoder_ctx() returns a provider context pointer on
204 success, or NULL on failure.
205
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.
208
209 OSSL_ENCODER_INSTANCE_get_output_type() returns a string with the name of the
210 output type.
211
212 OSSL_ENCODER_INSTANCE_get_output_structure() returns a string with the name
213 of the output structure.
214
215 =head1 SEE ALSO
216
217 L<provider(7)>, L<OSSL_ENCODER(3)>
218
219 =head1 HISTORY
220
221 The functions described here were added in OpenSSL 3.0.
222
223 =head1 COPYRIGHT
224
225 Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
226
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>.
231
232 =cut