1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | ossl_provider_find, ossl_provider_new, ossl_provider_up_ref,
|
---|
6 | ossl_provider_free,
|
---|
7 | ossl_provider_set_fallback, ossl_provider_set_module_path,
|
---|
8 | ossl_provider_add_parameter, ossl_provider_set_child, ossl_provider_get_parent,
|
---|
9 | ossl_provider_up_ref_parent, ossl_provider_free_parent,
|
---|
10 | ossl_provider_default_props_update, ossl_provider_get0_dispatch,
|
---|
11 | ossl_provider_init_as_child, ossl_provider_deinit_child,
|
---|
12 | ossl_provider_activate, ossl_provider_deactivate, ossl_provider_add_to_store,
|
---|
13 | ossl_provider_ctx,
|
---|
14 | ossl_provider_doall_activated,
|
---|
15 | ossl_provider_name, ossl_provider_dso,
|
---|
16 | ossl_provider_module_name, ossl_provider_module_path,
|
---|
17 | ossl_provider_libctx,
|
---|
18 | ossl_provider_teardown, ossl_provider_gettable_params,
|
---|
19 | ossl_provider_get_params,
|
---|
20 | ossl_provider_query_operation, ossl_provider_unquery_operation,
|
---|
21 | ossl_provider_set_operation_bit, ossl_provider_test_operation_bit,
|
---|
22 | ossl_provider_get_capabilities
|
---|
23 | - internal provider routines
|
---|
24 |
|
---|
25 | =head1 SYNOPSIS
|
---|
26 |
|
---|
27 | #include "internal/provider.h"
|
---|
28 |
|
---|
29 | OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
|
---|
30 | int noconfig);
|
---|
31 | OSSL_PROVIDER *ossl_provider_new(OSSL_LIB_CTX *libctx, const char *name,
|
---|
32 | ossl_provider_init_fn *init_function
|
---|
33 | int noconfig);
|
---|
34 | int ossl_provider_up_ref(OSSL_PROVIDER *prov);
|
---|
35 | void ossl_provider_free(OSSL_PROVIDER *prov);
|
---|
36 |
|
---|
37 | /* Setters */
|
---|
38 | int ossl_provider_set_fallback(OSSL_PROVIDER *prov);
|
---|
39 | int ossl_provider_set_module_path(OSSL_PROVIDER *prov, const char *path);
|
---|
40 | int ossl_provider_add_parameter(OSSL_PROVIDER *prov, const char *name,
|
---|
41 | const char *value);
|
---|
42 |
|
---|
43 | /* Child Providers */
|
---|
44 | int ossl_provider_set_child(OSSL_PROVIDER *prov,
|
---|
45 | const OSSL_CORE_HANDLE *handle);
|
---|
46 | const OSSL_CORE_HANDLE *ossl_provider_get_parent(OSSL_PROVIDER *prov);
|
---|
47 | int ossl_provider_up_ref_parent(OSSL_PROVIDER *prov, int activate);
|
---|
48 | int ossl_provider_free_parent(OSSL_PROVIDER *prov, int deactivate);
|
---|
49 | int ossl_provider_default_props_update(OSSL_LIB_CTX *libctx,
|
---|
50 | const char *props);
|
---|
51 |
|
---|
52 | /*
|
---|
53 | * Activate the Provider
|
---|
54 | * If the Provider is a module, the module will be loaded
|
---|
55 | */
|
---|
56 | int ossl_provider_activate(OSSL_PROVIDER *prov, int upcalls, int aschild);
|
---|
57 | int ossl_provider_deactivate(OSSL_PROVIDER *prov, int removechildren);
|
---|
58 | int ossl_provider_add_to_store(OSSL_PROVIDER *prov, OSSL_PROVIDER **actualprov,
|
---|
59 | int retain_fallbacks);
|
---|
60 |
|
---|
61 | /* Return pointer to the provider's context */
|
---|
62 | void *ossl_provider_ctx(const OSSL_PROVIDER *prov);
|
---|
63 |
|
---|
64 | const OSSL_DISPATCH *ossl_provider_get0_dispatch(const OSSL_PROVIDER *prov);
|
---|
65 |
|
---|
66 | /* Iterate over all loaded providers */
|
---|
67 | int ossl_provider_doall_activated(OSSL_LIB_CTX *,
|
---|
68 | int (*cb)(OSSL_PROVIDER *provider,
|
---|
69 | void *cbdata),
|
---|
70 | void *cbdata);
|
---|
71 |
|
---|
72 | /* Getters for other library functions */
|
---|
73 | const char *ossl_provider_name(OSSL_PROVIDER *prov);
|
---|
74 | const DSO *ossl_provider_dso(OSSL_PROVIDER *prov);
|
---|
75 | const char *ossl_provider_module_name(OSSL_PROVIDER *prov);
|
---|
76 | const char *ossl_provider_module_path(OSSL_PROVIDER *prov);
|
---|
77 | OSSL_LIB_CTX *ossl_provider_libctx(const OSSL_PROVIDER *prov);
|
---|
78 |
|
---|
79 | /* Thin wrappers around calls to the provider */
|
---|
80 | void ossl_provider_teardown(const OSSL_PROVIDER *prov);
|
---|
81 | const OSSL_PARAM *ossl_provider_gettable_params(const OSSL_PROVIDER *prov);
|
---|
82 | int ossl_provider_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[]);
|
---|
83 | int ossl_provider_get_capabilities(const OSSL_PROVIDER *prov,
|
---|
84 | const char *capability,
|
---|
85 | OSSL_CALLBACK *cb,
|
---|
86 | void *arg);
|
---|
87 | const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
|
---|
88 | int operation_id,
|
---|
89 | int *no_cache);
|
---|
90 | void ossl_provider_unquery_operation(const OSSL_PROVIDER *prov,
|
---|
91 | int operation_id,
|
---|
92 | const OSSL_ALGORITHM *algs);
|
---|
93 |
|
---|
94 | int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum);
|
---|
95 | int ossl_provider_test_operation_bit(OSSL_PROVIDER *provider, size_t bitnum,
|
---|
96 | int *result);
|
---|
97 |
|
---|
98 | int ossl_provider_init_as_child(OSSL_LIB_CTX *ctx,
|
---|
99 | const OSSL_CORE_HANDLE *handle,
|
---|
100 | const OSSL_DISPATCH *in);
|
---|
101 | void ossl_provider_deinit_child(OSSL_LIB_CTX *ctx);
|
---|
102 |
|
---|
103 | =head1 DESCRIPTION
|
---|
104 |
|
---|
105 | I<OSSL_PROVIDER> is a type that holds all the necessary information
|
---|
106 | to handle a provider, regardless of if it's built in to the
|
---|
107 | application or the OpenSSL libraries, or if it's a loadable provider
|
---|
108 | module.
|
---|
109 | Instances of this type are commonly referred to as "provider objects".
|
---|
110 |
|
---|
111 | A provider object is always stored in a set of provider objects
|
---|
112 | in the library context.
|
---|
113 |
|
---|
114 | Provider objects are reference counted.
|
---|
115 |
|
---|
116 | Provider objects are initially inactive, i.e. they are only recorded
|
---|
117 | in the store, but are not used.
|
---|
118 | They are activated with the first call to ossl_provider_activate(),
|
---|
119 | and are deactivated with the last call to ossl_provider_deactivate().
|
---|
120 | Activation affects a separate counter.
|
---|
121 |
|
---|
122 | =head2 Functions
|
---|
123 |
|
---|
124 | ossl_provider_find() finds an existing provider object in the provider
|
---|
125 | object store by I<name>.
|
---|
126 | The config file will be automatically loaded unless I<noconfig> is set.
|
---|
127 | Typically I<noconfig> should be 0.
|
---|
128 | We set I<noconfig> to 1 only when calling these functions while processing a
|
---|
129 | config file in order to avoid recursively attempting to load the file.
|
---|
130 | The provider object it finds has its reference count incremented.
|
---|
131 |
|
---|
132 | ossl_provider_new() creates a new provider object named I<name> and
|
---|
133 | stores it in the provider object store, unless there already is one
|
---|
134 | there with the same name.
|
---|
135 | If there already is one with the same name, it's returned with its
|
---|
136 | reference count incremented.
|
---|
137 | The config file will be automatically loaded unless I<noconfig> is set.
|
---|
138 | Typically I<noconfig> should be 0.
|
---|
139 | We set I<noconfig> to 1 only when calling these functions while processing a
|
---|
140 | config file in order to avoid recursively attempting to load the file.
|
---|
141 | The reference count of a newly created provider object will always
|
---|
142 | be 2; one for being added to the store, and one for the returned
|
---|
143 | reference.
|
---|
144 | If I<init_function> is NULL, the provider is assumed to be a
|
---|
145 | dynamically loadable module, with the symbol B<OSSL_provider_init> as
|
---|
146 | its initialisation function.
|
---|
147 | If I<init_function> isn't NULL, the provider is assumed to be built
|
---|
148 | in, with I<init_function> being the pointer to its initialisation
|
---|
149 | function.
|
---|
150 | For further description of the initialisation function, see the
|
---|
151 | description of ossl_provider_activate() below.
|
---|
152 |
|
---|
153 | ossl_provider_up_ref() increments the provider object I<prov>'s
|
---|
154 | reference count.
|
---|
155 |
|
---|
156 | ossl_provider_free() decrements the provider object I<prov>'s
|
---|
157 | reference count; when it drops to zero, the provider object is assumed
|
---|
158 | to have fallen out of use and will be deinitialized (its I<teardown>
|
---|
159 | function is called), and the associated module will be unloaded if one
|
---|
160 | was loaded, and I<prov> itself will be freed.
|
---|
161 |
|
---|
162 | ossl_provider_set_fallback() marks an available provider I<prov> as
|
---|
163 | fallback.
|
---|
164 | Note that after this call, the provider object pointer that was
|
---|
165 | used can simply be dropped, but not freed.
|
---|
166 |
|
---|
167 | ossl_provider_set_module_path() sets the module path to load the
|
---|
168 | provider module given the provider object I<prov>.
|
---|
169 | This will be used in preference to automatically trying to figure out
|
---|
170 | the path from the provider name and the default module directory (more
|
---|
171 | on this in L</NOTES>).
|
---|
172 |
|
---|
173 | ossl_provider_libctx() returns the library context the given
|
---|
174 | provider I<prov> is registered in.
|
---|
175 |
|
---|
176 | ossl_provider_add_parameter() adds a global parameter for the provider
|
---|
177 | to retrieve as it sees fit.
|
---|
178 | The parameters are a combination of I<name> and I<value>, and the
|
---|
179 | provider will use the name to find the value it wants.
|
---|
180 | Only text parameters can be given, and it's up to the provider to
|
---|
181 | interpret them.
|
---|
182 |
|
---|
183 | ossl_provider_set_child() marks this provider as a child of a provider in the
|
---|
184 | parent library context. I<handle> is the B<OSSL_CORE_HANDLE> object passed to
|
---|
185 | the provider's B<OSSL_provider_init> function.
|
---|
186 |
|
---|
187 | ossl_provider_get_parent() obtains the handle on the parent provider.
|
---|
188 |
|
---|
189 | ossl_provider_up_ref_parent() increases the reference count on the parent
|
---|
190 | provider. If I<activate> is nonzero then the parent provider is also activated.
|
---|
191 |
|
---|
192 | ossl_provider_free_parent() decreases the reference count on the parent
|
---|
193 | provider. If I<deactivate> is nonzero then the parent provider is also
|
---|
194 | deactivated.
|
---|
195 |
|
---|
196 | ossl_provider_default_props_update() is responsible for informing any child
|
---|
197 | providers of an update to the default properties. The new properties are
|
---|
198 | supplied in the I<props> string.
|
---|
199 |
|
---|
200 | ossl_provider_activate() "activates" the provider for the given
|
---|
201 | provider object I<prov> by incrementing its activation count, flagging
|
---|
202 | it as activated, and initializing it if it isn't already initialized.
|
---|
203 | Initializing means one of the following:
|
---|
204 |
|
---|
205 | =over 4
|
---|
206 |
|
---|
207 | =item *
|
---|
208 |
|
---|
209 | If an initialization function was given with ossl_provider_new(), that
|
---|
210 | function will get called.
|
---|
211 |
|
---|
212 | =item *
|
---|
213 |
|
---|
214 | If no initialization function was given with ossl_provider_new(), a
|
---|
215 | loadable module with the I<name> that was given to ossl_provider_new()
|
---|
216 | will be located and loaded, then the symbol B<OSSL_provider_init> will
|
---|
217 | be located in that module, and called.
|
---|
218 |
|
---|
219 | =back
|
---|
220 |
|
---|
221 | If I<upcalls> is nonzero then, if this is a child provider, upcalls to the
|
---|
222 | parent libctx will be made to inform it of an up-ref. If I<aschild> is nonzero
|
---|
223 | then the provider will only be activated if it is a child provider. Otherwise
|
---|
224 | no action is taken and ossl_provider_activate() returns success.
|
---|
225 |
|
---|
226 | ossl_provider_deactivate() "deactivates" the provider for the given
|
---|
227 | provider object I<prov> by decrementing its activation count. When
|
---|
228 | that count reaches zero, the activation flag is cleared. If the
|
---|
229 | I<removechildren> parameter is 0 then no attempt is made to remove any
|
---|
230 | associated child providers.
|
---|
231 |
|
---|
232 | ossl_provider_add_to_store() adds the provider I<prov> to the provider store and
|
---|
233 | makes it available to other threads. This will prevent future automatic loading
|
---|
234 | of fallback providers, unless I<retain_fallbacks> is true. If a provider of the
|
---|
235 | same name already exists in the store then it is not added but this function
|
---|
236 | still returns success. On success the I<actualprov> value is populated with a
|
---|
237 | pointer to the provider of the given name that is now in the store. The
|
---|
238 | reference passed in the I<prov> argument is consumed by this function. A
|
---|
239 | reference to the provider that should be used is passed back in the
|
---|
240 | I<actualprov> argument.
|
---|
241 |
|
---|
242 | ossl_provider_ctx() returns a context created by the provider.
|
---|
243 | Outside of the provider, it's completely opaque, but it needs to be
|
---|
244 | passed back to some of the provider functions.
|
---|
245 |
|
---|
246 | ossl_provider_get0_dispatch() returns the dispatch table that the provider
|
---|
247 | initially returned in the I<out> parameter of its B<OSSL_provider_init>
|
---|
248 | function.
|
---|
249 |
|
---|
250 | ossl_provider_doall_activated() iterates over all the currently
|
---|
251 | "activated" providers, and calls I<cb> for each of them.
|
---|
252 | If no providers have been "activated" yet, it tries to activate all
|
---|
253 | available fallback providers before iterating over them.
|
---|
254 |
|
---|
255 | ossl_provider_name() returns the name that was given with
|
---|
256 | ossl_provider_new().
|
---|
257 |
|
---|
258 | ossl_provider_dso() returns a reference to the module, for providers
|
---|
259 | that come in the form of loadable modules.
|
---|
260 |
|
---|
261 | ossl_provider_module_name() returns the filename of the module, for
|
---|
262 | providers that come in the form of loadable modules.
|
---|
263 |
|
---|
264 | ossl_provider_module_path() returns the full path of the module file,
|
---|
265 | for providers that come in the form of loadable modules.
|
---|
266 |
|
---|
267 | ossl_provider_teardown() calls the provider's I<teardown> function, if
|
---|
268 | the provider has one.
|
---|
269 |
|
---|
270 | ossl_provider_gettable_params() calls the provider's I<gettable_params>
|
---|
271 | function, if the provider has one.
|
---|
272 | It should return an array of I<OSSL_PARAM> to describe all the
|
---|
273 | parameters that the provider has for the provider object.
|
---|
274 |
|
---|
275 | ossl_provider_get_params() calls the provider's parameter request
|
---|
276 | responder.
|
---|
277 | It should treat the given I<OSSL_PARAM> array as described in
|
---|
278 | L<OSSL_PARAM(3)>.
|
---|
279 |
|
---|
280 | ossl_provider_get_capabilities() calls the provider's I<get_capabilities> function,
|
---|
281 | if the provider has one. It provides the name of the I<capability> and a
|
---|
282 | callback I<cb> parameter to call for each capability that has a matching name in
|
---|
283 | the provider. The callback gets passed OSSL_PARAM details about the capability as
|
---|
284 | well as the caller supplied argument I<arg>.
|
---|
285 |
|
---|
286 | ossl_provider_query_operation() calls the provider's
|
---|
287 | I<query_operation> function, if the provider has one.
|
---|
288 | It should return an array of I<OSSL_ALGORITHM> for the given
|
---|
289 | I<operation_id>.
|
---|
290 |
|
---|
291 | ossl_provider_unquery_operation() informs the provider that the result of
|
---|
292 | ossl_provider_query_operation() is no longer going to be directly accessed and
|
---|
293 | that all relevant information has been copied.
|
---|
294 |
|
---|
295 | ossl_provider_set_operation_bit() registers a 1 for operation I<bitnum>
|
---|
296 | in a bitstring that's internal to I<provider>.
|
---|
297 |
|
---|
298 | ossl_provider_test_operation_bit() checks if the bit operation I<bitnum>
|
---|
299 | is set (1) or not (0) in the internal I<provider> bitstring, and sets
|
---|
300 | I<*result> to 1 or 0 accorddingly.
|
---|
301 |
|
---|
302 | ossl_provider_init_as_child() stores in the library context I<ctx> references to
|
---|
303 | the necessary upcalls for managing child providers. The I<handle> and I<in>
|
---|
304 | parameters are the B<OSSL_CORE_HANDLE> and B<OSSL_DISPATCH> pointers that were
|
---|
305 | passed to the provider's B<OSSL_provider_init> function.
|
---|
306 |
|
---|
307 | ossl_provider_deinit_child() deregisters callbacks from the parent library
|
---|
308 | context about provider creation or removal events for the child library context
|
---|
309 | I<ctx>. Must only be called if I<ctx> is a child library context.
|
---|
310 |
|
---|
311 | =head1 NOTES
|
---|
312 |
|
---|
313 | Locating a provider module happens as follows:
|
---|
314 |
|
---|
315 | =over 4
|
---|
316 |
|
---|
317 | =item 1.
|
---|
318 |
|
---|
319 | If a path was given with ossl_provider_set_module_path(), use that as
|
---|
320 | module path.
|
---|
321 | Otherwise, use the provider object's name as module path, with
|
---|
322 | platform specific standard extensions added.
|
---|
323 |
|
---|
324 | =item 2.
|
---|
325 |
|
---|
326 | If the environment variable B<OPENSSL_MODULES> is defined, assume its
|
---|
327 | value is a directory specification and merge it with the module path.
|
---|
328 | Otherwise, merge the value of the OpenSSL built in macro B<MODULESDIR>
|
---|
329 | with the module path.
|
---|
330 |
|
---|
331 | =back
|
---|
332 |
|
---|
333 | When this process is done, the result is used when trying to load the
|
---|
334 | provider module.
|
---|
335 |
|
---|
336 | The command C<openssl version -m> can be used to find out the value
|
---|
337 | of the built in macro B<MODULESDIR>.
|
---|
338 |
|
---|
339 | =head1 RETURN VALUES
|
---|
340 |
|
---|
341 | ossl_provider_find() and ossl_provider_new() return a pointer to a
|
---|
342 | provider object (I<OSSL_PROVIDER>) on success, or NULL on error.
|
---|
343 |
|
---|
344 | ossl_provider_up_ref() returns the value of the reference count after
|
---|
345 | it has been incremented.
|
---|
346 |
|
---|
347 | ossl_provider_free() doesn't return any value.
|
---|
348 |
|
---|
349 | ossl_provider_doall_activated() returns 1 if the callback was called for all
|
---|
350 | activated providers. A return value of 0 means that the callback was not
|
---|
351 | called for any activated providers.
|
---|
352 |
|
---|
353 | ossl_provider_set_module_path(), ossl_provider_set_fallback(),
|
---|
354 | ossl_provider_activate(), ossl_provider_activate_leave_fallbacks() and
|
---|
355 | ossl_provider_deactivate(), ossl_provider_add_to_store(),
|
---|
356 | ossl_provider_default_props_update() return 1 on success, or 0 on error.
|
---|
357 |
|
---|
358 | ossl_provider_name(), ossl_provider_dso(),
|
---|
359 | ossl_provider_module_name(), and ossl_provider_module_path() return a
|
---|
360 | pointer to their respective data if it's available, otherwise NULL
|
---|
361 | is returned.
|
---|
362 |
|
---|
363 | ossl_provider_libctx() return a pointer to the library context.
|
---|
364 | This may be NULL, and is perfectly valid, as it denotes the default
|
---|
365 | global library context.
|
---|
366 |
|
---|
367 | ossl_provider_teardown() doesn't return any value.
|
---|
368 |
|
---|
369 | ossl_provider_gettable_params() returns a pointer to a constant
|
---|
370 | I<OSSL_PARAM> array if this function is available in the provider,
|
---|
371 | otherwise NULL.
|
---|
372 |
|
---|
373 | ossl_provider_get_params() returns 1 on success, or 0 on error.
|
---|
374 | If this function isn't available in the provider, 0 is returned.
|
---|
375 |
|
---|
376 | ossl_provider_set_operation_bit() and ossl_provider_test_operation_bit()
|
---|
377 | return 1 on success, or 0 on error.
|
---|
378 |
|
---|
379 | ossl_provider_get_capabilities() returns 1 on success, or 0 on error.
|
---|
380 | If this function isn't available in the provider or the provider does not
|
---|
381 | support the requested capability then 0 is returned.
|
---|
382 |
|
---|
383 | =head1 SEE ALSO
|
---|
384 |
|
---|
385 | L<OSSL_PROVIDER(3)>, L<provider(7)>, L<openssl(1)>
|
---|
386 |
|
---|
387 | =head1 HISTORY
|
---|
388 |
|
---|
389 | The functions described here were all added in OpenSSL 3.0.
|
---|
390 |
|
---|
391 | =head1 COPYRIGHT
|
---|
392 |
|
---|
393 | Copyright 2019-2022 The OpenSSL Project Authors. All Rights Reserved.
|
---|
394 |
|
---|
395 | Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
396 | this file except in compliance with the License. You can obtain a copy
|
---|
397 | in the file LICENSE in the source distribution or at
|
---|
398 | L<https://www.openssl.org/source/license.html>.
|
---|
399 |
|
---|
400 | =cut
|
---|