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