Add EVP_KDF-X942 to the fips module
[openssl.git] / doc / man7 / provider-keymgmt.pod
1 =pod
2
3 =head1 NAME
4
5 provider-keymgmt - The KEYMGMT library E<lt>-E<gt> provider functions
6
7 =head1 SYNOPSIS
8
9  #include <openssl/core_dispatch.h>
10
11  /*
12   * None of these are actual functions, but are displayed like this for
13   * the function signatures for functions that are offered as function
14   * pointers in OSSL_DISPATCH arrays.
15   */
16
17  /* Key object (keydata) creation and destruction */
18  void *OSSL_FUNC_keymgmt_new(void *provctx);
19  void OSSL_FUNC_keymgmt_free(void *keydata);
20
21  /* Generation, a more complex constructor */
22  void *OSSL_FUNC_keymgmt_gen_init(void *provctx, int selection);
23  int OSSL_FUNC_keymgmt_gen_set_template(void *genctx, void *template);
24  int OSSL_FUNC_keymgmt_gen_set_params(void *genctx, const OSSL_PARAM params[]);
25  const OSSL_PARAM *OSSL_FUNC_keymgmt_gen_settable_params(void *provctx);
26  void *OSSL_FUNC_keymgmt_gen(void *genctx, OSSL_CALLBACK *cb, void *cbarg);
27  void OSSL_FUNC_keymgmt_gen_cleanup(void *genctx);
28
29  /* Key loading by object reference, also a constructor */
30  void *OSSL_FUNC_keymgmt_load(const void *reference, size_t *reference_sz);
31
32  /* Key object information */
33  int OSSL_FUNC_keymgmt_get_params(void *keydata, OSSL_PARAM params[]);
34  const OSSL_PARAM *OSSL_FUNC_keymgmt_gettable_params(void *provctx);
35  int OSSL_FUNC_keymgmt_set_params(void *keydata, const OSSL_PARAM params[]);
36  const OSSL_PARAM *OSSL_FUNC_keymgmt_settable_params(void *provctx);
37
38  /* Key object content checks */
39  int OSSL_FUNC_keymgmt_has(const void *keydata, int selection);
40  int OSSL_FUNC_keymgmt_match(const void *keydata1, const void *keydata2,
41                              int selection);
42
43  /* Discovery of supported operations */
44  const char *OSSL_FUNC_keymgmt_query_operation_name(int operation_id);
45
46  /* Key object import and export functions */
47  int OSSL_FUNC_keymgmt_import(int selection, void *keydata, const OSSL_PARAM params[]);
48  const OSSL_PARAM *OSSL_FUNC_keymgmt_import_types(int selection);
49  int OSSL_FUNC_keymgmt_export(int selection, void *keydata,
50                               OSSL_CALLBACK *param_cb, void *cbarg);
51  const OSSL_PARAM *OSSL_FUNC_keymgmt_export_types(int selection);
52
53  /* Key object copy */
54  int OSSL_FUNC_keymgmt_copy(void *keydata_to, const void *keydata_from, int selection);
55
56  /* Key object validation */
57  int OSSL_FUNC_keymgmt_validate(const void *keydata, int selection);
58
59 =head1 DESCRIPTION
60
61 The KEYMGMT operation doesn't have much public visibility in OpenSSL
62 libraries, it's rather an internal operation that's designed to work
63 in tandem with operations that use private/public key pairs.
64
65 Because the KEYMGMT operation shares knowledge with the operations it
66 works with in tandem, they must belong to the same provider.
67 The OpenSSL libraries will ensure that they do.
68
69 The primary responsibility of the KEYMGMT operation is to hold the
70 provider side key data for the OpenSSL library EVP_PKEY structure.
71
72 All "functions" mentioned here are passed as function pointers between
73 F<libcrypto> and the provider in B<OSSL_DISPATCH> arrays via
74 B<OSSL_ALGORITHM> arrays that are returned by the provider's
75 provider_query_operation() function
76 (see L<provider-base(7)/Provider Functions>).
77
78 All these "functions" have a corresponding function type definition
79 named B<OSSL_{name}_fn>, and a helper function to retrieve the
80 function pointer from a B<OSSL_DISPATCH> element named
81 B<OSSL_FUNC_{name}>.
82 For example, the "function" OSSL_FUNC_keymgmt_new() has these:
83
84  typedef void *(OSSL_FUNC_keymgmt_new_fn)(void *provctx);
85  static ossl_inline OSSL_FUNC_keymgmt_new_fn
86      OSSL_FUNC_keymgmt_new(const OSSL_DISPATCH *opf);
87
88 B<OSSL_DISPATCH> arrays are indexed by numbers that are provided as
89 macros in L<openssl-core_dispatch.h(7)>, as follows:
90
91  OSSL_FUNC_keymgmt_new                  OSSL_FUNC_KEYMGMT_NEW
92  OSSL_FUNC_keymgmt_free                 OSSL_FUNC_KEYMGMT_FREE
93
94  OSSL_FUNC_keymgmt_gen_init             OSSL_FUNC_KEYMGMT_GEN_INIT
95  OSSL_FUNC_keymgmt_gen_set_template     OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE
96  OSSL_FUNC_keymgmt_gen_set_params       OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS
97  OSSL_FUNC_keymgmt_gen_settable_params  OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS
98  OSSL_FUNC_keymgmt_gen                  OSSL_FUNC_KEYMGMT_GEN
99  OSSL_FUNC_keymgmt_gen_cleanup          OSSL_FUNC_KEYMGMT_GEN_CLEANUP
100
101  OSSL_FUNC_keymgmt_load                 OSSL_FUNC_KEYMGMT_LOAD
102
103  OSSL_FUNC_keymgmt_get_params           OSSL_FUNC_KEYMGMT_GET_PARAMS
104  OSSL_FUNC_keymgmt_gettable_params      OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS
105  OSSL_FUNC_keymgmt_set_params           OSSL_FUNC_KEYMGMT_SET_PARAMS
106  OSSL_FUNC_keymgmt_settable_params      OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS
107
108  OSSL_FUNC_keymgmt_query_operation_name OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME
109
110  OSSL_FUNC_keymgmt_has                  OSSL_FUNC_KEYMGMT_HAS
111  OSSL_FUNC_keymgmt_validate             OSSL_FUNC_KEYMGMT_VALIDATE
112  OSSL_FUNC_keymgmt_match                OSSL_FUNC_KEYMGMT_MATCH
113
114  OSSL_FUNC_keymgmt_import               OSSL_FUNC_KEYMGMT_IMPORT
115  OSSL_FUNC_keymgmt_import_types         OSSL_FUNC_KEYMGMT_IMPORT_TYPES
116  OSSL_FUNC_keymgmt_export               OSSL_FUNC_KEYMGMT_EXPORT
117  OSSL_FUNC_keymgmt_export_types         OSSL_FUNC_KEYMGMT_EXPORT_TYPES
118
119  OSSL_FUNC_keymgmt_copy                 OSSL_FUNC_KEYMGMT_COPY
120
121 =head2 Key Objects
122
123 A key object is a collection of data for an asymmetric key, and is
124 represented as I<keydata> in this manual.
125
126 The exact contents of a key object are defined by the provider, and it
127 is assumed that different operations in one and the same provider use
128 the exact same structure to represent this collection of data, so that
129 for example, a key object that has been created using the KEYMGMT
130 interface that we document here can be passed as is to other provider
131 operations, such as OP_signature_sign_init() (see
132 L<provider-signature(7)>).
133
134 With some of the KEYMGMT functions, it's possible to select a specific
135 subset of data to handle, governed by the bits in a I<selection>
136 indicator.  The bits are:
137
138 =over 4
139
140 =item B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY>
141
142 Indicating that the private key data in a key object should be
143 considered.
144
145 =item B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY>
146
147 Indicating that the public key data in a key object should be
148 considered.
149
150 =item B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS>
151
152 Indicating that the domain parameters in a key object should be
153 considered.
154
155 =item B<OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS>
156
157 Indicating that other parameters in a key object should be
158 considered.
159
160 Other parameters are key parameters that don't fit any other
161 classification.  In other words, this particular selector bit works as
162 a last resort bit bucket selector.
163
164 =back
165
166 Some selector bits have also been combined for easier use:
167
168 =over 4
169
170 =item B<OSSL_KEYMGMT_SELECT_ALL_PARAMETERS>
171
172 Indicating that all key object parameters should be considered,
173 regardless of their more granular classification.
174
175 =for comment This should used by EVP functions such as
176 EVP_PKEY_copy_parameters() and EVP_PKEY_cmp_parameters()
177
178 This is a combination of B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS> and
179 B<OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS>.
180
181 =for comment If more parameter categories are added, they should be
182 mentioned here too.
183
184 =item B<OSSL_KEYMGMT_SELECT_KEYPAIR>
185
186 Indicating that both the whole key pair in a key object should be
187 considered, i.e. the combination of public and private key.
188
189 This is a combination of B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY> and
190 B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY>.
191
192 =item B<OSSL_KEYMGMT_SELECT_ALL>
193
194 Indicating that everything in a key object should be considered.
195
196 =back
197
198 The exact interpretation of those bits or how they combine is left to
199 each function where you can specify a selector.
200
201 =for comment One might think that a combination of bits means that all
202 the selected data subsets must be considered, but then you have to
203 consider that when comparing key objects (future function), an
204 implementation might opt to not compare the private key if it has
205 compared the public key, since a match of one half implies a match of
206 the other half.
207
208 =head2 Constructing and Destructing Functions
209
210 OSSL_FUNC_keymgmt_new() should create a provider side key object.  The
211 provider context I<provctx> is passed and may be incorporated in the
212 key object, but that is not mandatory.
213
214 OSSL_FUNC_keymgmt_free() should free the passed I<keydata>.
215
216 OSSL_FUNC_keymgmt_gen_init(), OSSL_FUNC_keymgmt_gen_set_template(),
217 OSSL_FUNC_keymgmt_gen_set_params(), OSSL_FUNC_keymgmt_gen_settable_params(),
218 OSSL_FUNC_keymgmt_gen() and OSSL_FUNC_keymgmt_gen_cleanup() work together as a
219 more elaborate context based key object constructor.
220
221 OSSL_FUNC_keymgmt_gen_init() should create the key object generation context
222 and initialize it with I<selections>, which will determine what kind
223 of contents the key object to be generated should get.
224
225 OSSL_FUNC_keymgmt_gen_set_template() should add I<template> to the context
226 I<genctx>.  The I<template> is assumed to be a key object constructed
227 with the same KEYMGMT, and from which content that the implementation
228 chooses can be used as a template for the key object to be generated.
229 Typically, the generation of a DSA or DH key would get the domain
230 parameters from this I<template>.
231
232 OSSL_FUNC_keymgmt_gen_set_params() should set additional parameters from
233 I<params> in the key object generation context I<genctx>.
234
235 OSSL_FUNC_keymgmt_gen_settable_params() should return a constant array of
236 descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_gen_set_params() 
237 can handle.
238
239 OSSL_FUNC_keymgmt_gen() should perform the key object generation itself, and
240 return the result.  The callback I<cb> should be called at regular
241 intervals with indications on how the key object generation
242 progresses.
243
244 OSSL_FUNC_keymgmt_gen_cleanup() should clean up and free the key object
245 generation context I<genctx>
246
247 OSSL_FUNC_keymgmt_load() creates a provider side key object based on a
248 I<reference> object with a size of I<reference_sz> bytes, that only the
249 provider knows how to interpret, but that may come from other operations.
250 Outside the provider, this reference is simply an array of bytes.
251
252 At least one of OSSL_FUNC_keymgmt_new(), OSSL_FUNC_keymgmt_gen() and
253 OSSL_FUNC_keymgmt_load() are mandatory, as well as OSSL_FUNC_keymgmt_free().
254 Additionally, if OSSL_FUNC_keymgmt_gen() is present, OSSL_FUNC_keymgmt_gen_init()
255 and OSSL_FUNC_keymgmt_gen_cleanup() must be present as well.
256
257 =head2 Key Object Information Functions
258
259 OSSL_FUNC_keymgmt_get_params() should extract information data associated
260 with the given I<keydata>, see L</Common Information Parameters>.
261
262 OSSL_FUNC_keymgmt_gettable_params() should return a constant array of
263 descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_get_params()
264 can handle.
265
266 If OSSL_FUNC_keymgmt_gettable_params() is present, OSSL_FUNC_keymgmt_get_params()
267 must also be present, and vice versa.
268
269 OSSL_FUNC_keymgmt_set_params() should update information data associated
270 with the given I<keydata>, see L</Common Information Parameters>.
271
272 OSSL_FUNC_keymgmt_settable_params() should return a constant array of
273 descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_set_params()
274 can handle.
275
276 If OSSL_FUNC_keymgmt_settable_params() is present, OSSL_FUNC_keymgmt_set_params()
277 must also be present, and vice versa.
278
279 =head2 Key Object Checking Functions
280
281 OSSL_FUNC_keymgmt_query_operation_name() should return the name of the
282 supported algorithm for the operation I<operation_id>.  This is
283 similar to provider_query_operation() (see L<provider-base(7)>),
284 but only works as an advisory.  If this function is not present, or
285 returns NULL, the caller is free to assume that there's an algorithm
286 from the same provider, of the same name as the one used to fetch the
287 keymgmt and try to use that.
288
289 OSSL_FUNC_keymgmt_has() should check whether the given I<keydata> contains the subsets
290 of data indicated by the I<selector>.  A combination of several
291 selector bits must consider all those subsets, not just one.  An
292 implementation is, however, free to consider an empty subset of data
293 to still be a valid subset.
294
295 OSSL_FUNC_keymgmt_validate() should check if the I<keydata> contains valid
296 data subsets indicated by I<selection>.  Some combined selections of
297 data subsets may cause validation of the combined data.
298 For example, the combination of B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY> and
299 B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY> (or B<OSSL_KEYMGMT_SELECT_KEYPAIR>
300 for short) is expected to check that the pairwise consistency of
301 I<keydata> is valid.
302
303 OSSL_FUNC_keymgmt_match() should check if the data subset indicated by
304 I<selection> in I<keydata1> and I<keydata2> match.  It is assumed that
305 the caller has ensured that I<keydata1> and I<keydata2> are both owned
306 by the implementation of this function.
307
308 =head2 Key Object Import, Export and Copy Functions
309
310 OSSL_FUNC_keymgmt_import() should import data indicated by I<selection> into
311 I<keydata> with values taken from the B<OSSL_PARAM> array I<params>.
312
313 OSSL_FUNC_keymgmt_export() should extract values indicated by I<selection>
314 from I<keydata>, create an B<OSSL_PARAM> array with them and call
315 I<param_cb> with that array as well as the given I<cbarg>.
316
317 OSSL_FUNC_keymgmt_import_types() should return a constant array of descriptor
318 B<OSSL_PARAM> for data indicated by I<selection>, for parameters that
319 OSSL_FUNC_keymgmt_import() can handle.
320
321 OSSL_FUNC_keymgmt_export_types() should return a constant array of descriptor
322 B<OSSL_PARAM> for data indicated by I<selection>, that the
323 OSSL_FUNC_keymgmt_export() callback can expect to receive.
324
325 OSSL_FUNC_keymgmt_copy() should copy data subsets indicated by I<selection>
326 from I<keydata_from> to I<keydata_to>.  It is assumed that the caller
327 has ensured that I<keydata_to> and I<keydata_from> are both owned by
328 the implementation of this function.
329
330 =head2 Common Information Parameters
331
332 See L<OSSL_PARAM(3)> for further details on the parameters structure.
333
334 Common information parameters currently recognised by all built-in
335 keymgmt algorithms are as follows:
336
337 =over 4
338
339 =item "bits" (B<OSSL_PKEY_PARAM_BITS>) <integer>
340
341 The value should be the cryptographic length of the cryptosystem to
342 which the key belongs, in bits.  The definition of cryptographic
343 length is specific to the key cryptosystem.
344
345 =item "max-size" (B<OSSL_PKEY_PARAM_MAX_SIZE>) <integer>
346
347 The value should be the maximum size that a caller should allocate to
348 safely store a signature (called I<sig> in L<provider-signature(7)>),
349 the result of asymmmetric encryption / decryption (I<out> in
350 L<provider-asym_cipher(7)>, a derived secret (I<secret> in
351 L<provider-keyexch(7)>, and similar data).
352
353 Because an EVP_KEYMGMT method is always tightly bound to another method
354 (signature, asymmetric cipher, key exchange, ...) and must be of the
355 same provider, this number only needs to be synchronised with the
356 dimensions handled in the rest of the same provider.
357
358 =item "security-bits" (B<OSSL_PKEY_PARAM_SECURITY_BITS>) <integer>
359
360 The value should be the number of security bits of the given key.
361 Bits of security is defined in SP800-57.
362
363 =back
364
365 =head1 RETURN VALUES
366
367 OSSL_FUNC_keymgmt_new() should return a valid reference to the newly created provider
368 side key object, or NULL on failure.
369
370 OSSL_FUNC_keymgmt_import(), OSSL_FUNC_keymgmt_export(), OSSL_FUNC_keymgmt_get_params() and
371 OSSL_FUNC_keymgmt_set_params() should return 1 for success or 0 on error.
372
373 OSSL_FUNC_keymgmt_validate() should return 1 on successful validation, or 0 on
374 failure.
375
376 OSSL_FUNC_keymgmt_has() should return 1 if all the selected data subsets are contained
377 in the given I<keydata> or 0 otherwise.
378
379 OSSL_FUNC_keymgmt_query_operation_name() should return a pointer to a string matching
380 the requested operation, or NULL if the same name used to fetch the keymgmt
381 applies.
382
383 OSSL_FUNC_keymgmt_gettable_params() and OSSL_FUNC_keymgmt_settable_params()
384 OSSL_FUNC_keymgmt_import_types(), OSSL_FUNC_keymgmt_export_types()
385 should
386 always return a constant B<OSSL_PARAM> array.
387
388 =head1 SEE ALSO
389
390 L<provider(7)>,
391 L<EVP_PKEY-X25519(7)>, L<EVP_PKEY-X448(7)>, L<EVP_PKEY-ED25519(7)>,
392 L<EVP_PKEY-ED448(7)>, L<EVP_PKEY-EC(7)>, L<EVP_PKEY-RSA(7)>,
393 L<EVP_PKEY-DSA(7)>, L<EVP_PKEY-DH(7)>
394
395 =head1 HISTORY
396
397 The KEYMGMT interface was introduced in OpenSSL 3.0.
398
399 =head1 COPYRIGHT
400
401 Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
402
403 Licensed under the Apache License 2.0 (the "License").  You may not use
404 this file except in compliance with the License.  You can obtain a copy
405 in the file LICENSE in the source distribution or at
406 L<https://www.openssl.org/source/license.html>.
407
408 =cut