=pod

=head1 NAME

provider-keymgmt - The KEYMGMT library E<lt>-E<gt> provider functions

=head1 SYNOPSIS

 #include <openssl/core_dispatch.h>

 /*
  * None of these are actual functions, but are displayed like this for
  * the function signatures for functions that are offered as function
  * pointers in OSSL_DISPATCH arrays.
  */

 /* Key object (keydata) creation and destruction */
 void *OSSL_FUNC_keymgmt_new(void *provctx);
 void OSSL_FUNC_keymgmt_free(void *keydata);

 /* Generation, a more complex constructor */
 void *OSSL_FUNC_keymgmt_gen_init(void *provctx, int selection,
                                  const OSSL_PARAM params[]);
 int OSSL_FUNC_keymgmt_gen_set_template(void *genctx, void *template);
 int OSSL_FUNC_keymgmt_gen_set_params(void *genctx, const OSSL_PARAM params[]);
 const OSSL_PARAM *OSSL_FUNC_keymgmt_gen_settable_params(void *genctx,
                                                         void *provctx);
 void *OSSL_FUNC_keymgmt_gen(void *genctx, OSSL_CALLBACK *cb, void *cbarg);
 void OSSL_FUNC_keymgmt_gen_cleanup(void *genctx);

 /* Key loading by object reference, also a constructor */
 void *OSSL_FUNC_keymgmt_load(const void *reference, size_t *reference_sz);

 /* Key object information */
 int OSSL_FUNC_keymgmt_get_params(void *keydata, OSSL_PARAM params[]);
 const OSSL_PARAM *OSSL_FUNC_keymgmt_gettable_params(void *provctx);
 int OSSL_FUNC_keymgmt_set_params(void *keydata, const OSSL_PARAM params[]);
 const OSSL_PARAM *OSSL_FUNC_keymgmt_settable_params(void *provctx);

 /* Key object content checks */
 int OSSL_FUNC_keymgmt_has(const void *keydata, int selection);
 int OSSL_FUNC_keymgmt_match(const void *keydata1, const void *keydata2,
                             int selection);

 /* Discovery of supported operations */
 const char *OSSL_FUNC_keymgmt_query_operation_name(int operation_id);

 /* Key object import and export functions */
 int OSSL_FUNC_keymgmt_import(int selection, void *keydata, const OSSL_PARAM params[]);
 const OSSL_PARAM *OSSL_FUNC_keymgmt_import_types(int selection);
 int OSSL_FUNC_keymgmt_export(int selection, void *keydata,
                              OSSL_CALLBACK *param_cb, void *cbarg);
 const OSSL_PARAM *OSSL_FUNC_keymgmt_export_types(int selection);

 /* Key object duplication, a constructor */
 void *OSSL_FUNC_keymgmt_dup(const void *keydata_from, int selection);

 /* Key object validation */
 int OSSL_FUNC_keymgmt_validate(const void *keydata, int selection, int checktype);

=head1 DESCRIPTION

The KEYMGMT operation doesn't have much public visibility in OpenSSL
libraries, it's rather an internal operation that's designed to work
in tandem with operations that use private/public key pairs.

Because the KEYMGMT operation shares knowledge with the operations it
works with in tandem, they must belong to the same provider.
The OpenSSL libraries will ensure that they do.

The primary responsibility of the KEYMGMT operation is to hold the
provider side key data for the OpenSSL library EVP_PKEY structure.

All "functions" mentioned here are passed as function pointers between
F<libcrypto> and the provider in B<OSSL_DISPATCH> arrays via
B<OSSL_ALGORITHM> arrays that are returned by the provider's
provider_query_operation() function
(see L<provider-base(7)/Provider Functions>).

All these "functions" have a corresponding function type definition
named B<OSSL_FUNC_{name}_fn>, and a helper function to retrieve the
function pointer from a B<OSSL_DISPATCH> element named
B<OSSL_FUNC_{name}>.
For example, the "function" OSSL_FUNC_keymgmt_new() has these:

 typedef void *(OSSL_FUNC_keymgmt_new_fn)(void *provctx);
 static ossl_inline OSSL_FUNC_keymgmt_new_fn
     OSSL_FUNC_keymgmt_new(const OSSL_DISPATCH *opf);

B<OSSL_DISPATCH> arrays are indexed by numbers that are provided as
macros in L<openssl-core_dispatch.h(7)>, as follows:

 OSSL_FUNC_keymgmt_new                  OSSL_FUNC_KEYMGMT_NEW
 OSSL_FUNC_keymgmt_free                 OSSL_FUNC_KEYMGMT_FREE

 OSSL_FUNC_keymgmt_gen_init             OSSL_FUNC_KEYMGMT_GEN_INIT
 OSSL_FUNC_keymgmt_gen_set_template     OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE
 OSSL_FUNC_keymgmt_gen_set_params       OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS
 OSSL_FUNC_keymgmt_gen_settable_params  OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS
 OSSL_FUNC_keymgmt_gen                  OSSL_FUNC_KEYMGMT_GEN
 OSSL_FUNC_keymgmt_gen_cleanup          OSSL_FUNC_KEYMGMT_GEN_CLEANUP

 OSSL_FUNC_keymgmt_load                 OSSL_FUNC_KEYMGMT_LOAD

 OSSL_FUNC_keymgmt_get_params           OSSL_FUNC_KEYMGMT_GET_PARAMS
 OSSL_FUNC_keymgmt_gettable_params      OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS
 OSSL_FUNC_keymgmt_set_params           OSSL_FUNC_KEYMGMT_SET_PARAMS
 OSSL_FUNC_keymgmt_settable_params      OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS

 OSSL_FUNC_keymgmt_query_operation_name OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME

 OSSL_FUNC_keymgmt_has                  OSSL_FUNC_KEYMGMT_HAS
 OSSL_FUNC_keymgmt_validate             OSSL_FUNC_KEYMGMT_VALIDATE
 OSSL_FUNC_keymgmt_match                OSSL_FUNC_KEYMGMT_MATCH

 OSSL_FUNC_keymgmt_import               OSSL_FUNC_KEYMGMT_IMPORT
 OSSL_FUNC_keymgmt_import_types         OSSL_FUNC_KEYMGMT_IMPORT_TYPES
 OSSL_FUNC_keymgmt_export               OSSL_FUNC_KEYMGMT_EXPORT
 OSSL_FUNC_keymgmt_export_types         OSSL_FUNC_KEYMGMT_EXPORT_TYPES

 OSSL_FUNC_keymgmt_dup                  OSSL_FUNC_KEYMGMT_DUP

=head2 Key Objects

A key object is a collection of data for an asymmetric key, and is
represented as I<keydata> in this manual.

The exact contents of a key object are defined by the provider, and it
is assumed that different operations in one and the same provider use
the exact same structure to represent this collection of data, so that
for example, a key object that has been created using the KEYMGMT
interface that we document here can be passed as is to other provider
operations, such as OP_signature_sign_init() (see
L<provider-signature(7)>).

With some of the KEYMGMT functions, it's possible to select a specific
subset of data to handle, governed by the bits in a I<selection>
indicator.  The bits are:

=over 4

=item B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY>

Indicating that the private key data in a key object should be
considered.

=item B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY>

Indicating that the public key data in a key object should be
considered.

=item B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS>

Indicating that the domain parameters in a key object should be
considered.

=item B<OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS>

Indicating that other parameters in a key object should be
considered.

Other parameters are key parameters that don't fit any other
classification.  In other words, this particular selector bit works as
a last resort bit bucket selector.

=back

Some selector bits have also been combined for easier use:

=over 4

=item B<OSSL_KEYMGMT_SELECT_ALL_PARAMETERS>

Indicating that all key object parameters should be considered,
regardless of their more granular classification.

=for comment This should used by EVP functions such as
EVP_PKEY_copy_parameters() and EVP_PKEY_parameters_eq()

This is a combination of B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS> and
B<OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS>.

=for comment If more parameter categories are added, they should be
mentioned here too.

=item B<OSSL_KEYMGMT_SELECT_KEYPAIR>

Indicating that both the whole key pair in a key object should be
considered, i.e. the combination of public and private key.

This is a combination of B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY> and
B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY>.

=item B<OSSL_KEYMGMT_SELECT_ALL>

Indicating that everything in a key object should be considered.

=back

The exact interpretation of those bits or how they combine is left to
each function where you can specify a selector.

It's left to the provider implementation to decide what is reasonable
to do with regards to received selector bits and how to do it.
Among others, an implementation of OSSL_FUNC_keymgmt_match() might opt
to not compare the private half if it has compared the public half,
since a match of one half implies a match of the other half.

=head2 Constructing and Destructing Functions

OSSL_FUNC_keymgmt_new() should create a provider side key object.  The
provider context I<provctx> is passed and may be incorporated in the
key object, but that is not mandatory.

OSSL_FUNC_keymgmt_free() should free the passed I<keydata>.

OSSL_FUNC_keymgmt_gen_init(), OSSL_FUNC_keymgmt_gen_set_template(),
OSSL_FUNC_keymgmt_gen_set_params(), OSSL_FUNC_keymgmt_gen_settable_params(),
OSSL_FUNC_keymgmt_gen() and OSSL_FUNC_keymgmt_gen_cleanup() work together as a
more elaborate context based key object constructor.

OSSL_FUNC_keymgmt_gen_init() should create the key object generation context
and initialize it with I<selections>, which will determine what kind
of contents the key object to be generated should get.
The I<params>, if not NULL, should be set on the context in a manner similar to
using OSSL_FUNC_keymgmt_set_params().

OSSL_FUNC_keymgmt_gen_set_template() should add I<template> to the context
I<genctx>.  The I<template> is assumed to be a key object constructed
with the same KEYMGMT, and from which content that the implementation
chooses can be used as a template for the key object to be generated.
Typically, the generation of a DSA or DH key would get the domain
parameters from this I<template>.

OSSL_FUNC_keymgmt_gen_set_params() should set additional parameters from
I<params> in the key object generation context I<genctx>.

OSSL_FUNC_keymgmt_gen_settable_params() should return a constant array of
descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_gen_set_params()
can handle.

OSSL_FUNC_keymgmt_gen() should perform the key object generation itself, and
return the result.  The callback I<cb> should be called at regular
intervals with indications on how the key object generation
progresses.

OSSL_FUNC_keymgmt_gen_cleanup() should clean up and free the key object
generation context I<genctx>

OSSL_FUNC_keymgmt_load() creates a provider side key object based on a
I<reference> object with a size of I<reference_sz> bytes, that only the
provider knows how to interpret, but that may come from other operations.
Outside the provider, this reference is simply an array of bytes.

At least one of OSSL_FUNC_keymgmt_new(), OSSL_FUNC_keymgmt_gen() and
OSSL_FUNC_keymgmt_load() are mandatory, as well as OSSL_FUNC_keymgmt_free() and
OSSL_FUNC_keymgmt_has(). Additionally, if OSSL_FUNC_keymgmt_gen() is present,
OSSL_FUNC_keymgmt_gen_init() and OSSL_FUNC_keymgmt_gen_cleanup() must be
present as well.

=head2 Key Object Information Functions

OSSL_FUNC_keymgmt_get_params() should extract information data associated
with the given I<keydata>, see L</Common Information Parameters>.

OSSL_FUNC_keymgmt_gettable_params() should return a constant array of
descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_get_params()
can handle.

If OSSL_FUNC_keymgmt_gettable_params() is present, OSSL_FUNC_keymgmt_get_params()
must also be present, and vice versa.

OSSL_FUNC_keymgmt_set_params() should update information data associated
with the given I<keydata>, see L</Common Information Parameters>.

OSSL_FUNC_keymgmt_settable_params() should return a constant array of
descriptor B<OSSL_PARAM>, for parameters that OSSL_FUNC_keymgmt_set_params()
can handle.

If OSSL_FUNC_keymgmt_settable_params() is present, OSSL_FUNC_keymgmt_set_params()
must also be present, and vice versa.

=head2 Key Object Checking Functions

OSSL_FUNC_keymgmt_query_operation_name() should return the name of the
supported algorithm for the operation I<operation_id>.  This is
similar to provider_query_operation() (see L<provider-base(7)>),
but only works as an advisory.  If this function is not present, or
returns NULL, the caller is free to assume that there's an algorithm
from the same provider, of the same name as the one used to fetch the
keymgmt and try to use that.

OSSL_FUNC_keymgmt_has() should check whether the given I<keydata> contains the subsets
of data indicated by the I<selector>.  A combination of several
selector bits must consider all those subsets, not just one.  An
implementation is, however, free to consider an empty subset of data
to still be a valid subset. For algorithms where some selection is
not meaningful such as B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS> for
RSA keys the function should just return 1 as the selected subset
is not really missing in the key.

OSSL_FUNC_keymgmt_validate() should check if the I<keydata> contains valid
data subsets indicated by I<selection>.  Some combined selections of
data subsets may cause validation of the combined data.
For example, the combination of B<OSSL_KEYMGMT_SELECT_PRIVATE_KEY> and
B<OSSL_KEYMGMT_SELECT_PUBLIC_KEY> (or B<OSSL_KEYMGMT_SELECT_KEYPAIR>
for short) is expected to check that the pairwise consistency of
I<keydata> is valid. The I<checktype> parameter controls what type of check is
performed on the subset of data. Two types of check are defined:
B<OSSL_KEYMGMT_VALIDATE_FULL_CHECK> and B<OSSL_KEYMGMT_VALIDATE_QUICK_CHECK>.
The interpretation of how much checking is performed in a full check versus a
quick check is key type specific. Some providers may have no distinction
between a full check and a quick check. For algorithms where some selection is
not meaningful such as B<OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS> for
RSA keys the function should just return 1 as there is nothing to validate for
that selection.

OSSL_FUNC_keymgmt_match() should check if the data subset indicated by
I<selection> in I<keydata1> and I<keydata2> match.  It is assumed that
the caller has ensured that I<keydata1> and I<keydata2> are both owned
by the implementation of this function.

=head2 Key Object Import, Export and Duplication Functions

OSSL_FUNC_keymgmt_import() should import data indicated by I<selection> into
I<keydata> with values taken from the B<OSSL_PARAM> array I<params>.

OSSL_FUNC_keymgmt_export() should extract values indicated by I<selection>
from I<keydata>, create an B<OSSL_PARAM> array with them and call
I<param_cb> with that array as well as the given I<cbarg>.

OSSL_FUNC_keymgmt_import_types() should return a constant array of descriptor
B<OSSL_PARAM> for data indicated by I<selection>, for parameters that
OSSL_FUNC_keymgmt_import() can handle.

OSSL_FUNC_keymgmt_export_types() should return a constant array of descriptor
B<OSSL_PARAM> for data indicated by I<selection>, that the
OSSL_FUNC_keymgmt_export() callback can expect to receive.

OSSL_FUNC_keymgmt_dup() should duplicate data subsets indicated by
I<selection> or the whole key data I<keydata_from> and create a new
provider side key object with the data.

=head2 Common Information Parameters

See L<OSSL_PARAM(3)> for further details on the parameters structure.

Common information parameters currently recognised by all built-in
keymgmt algorithms are as follows:

=over 4

=item "bits" (B<OSSL_PKEY_PARAM_BITS>) <integer>

The value should be the cryptographic length of the cryptosystem to
which the key belongs, in bits.  The definition of cryptographic
length is specific to the key cryptosystem.

=item "max-size" (B<OSSL_PKEY_PARAM_MAX_SIZE>) <integer>

The value should be the maximum size that a caller should allocate to
safely store a signature (called I<sig> in L<provider-signature(7)>),
the result of asymmmetric encryption / decryption (I<out> in
L<provider-asym_cipher(7)>, a derived secret (I<secret> in
L<provider-keyexch(7)>, and similar data).

Because an EVP_KEYMGMT method is always tightly bound to another method
(signature, asymmetric cipher, key exchange, ...) and must be of the
same provider, this number only needs to be synchronised with the
dimensions handled in the rest of the same provider.

=item "security-bits" (B<OSSL_PKEY_PARAM_SECURITY_BITS>) <integer>

The value should be the number of security bits of the given key.
Bits of security is defined in SP800-57.

=back

=head1 RETURN VALUES

OSSL_FUNC_keymgmt_new() and OSSL_FUNC_keymgmt_dup() should return a valid
reference to the newly created provider side key object, or NULL on failure.

OSSL_FUNC_keymgmt_import(), OSSL_FUNC_keymgmt_export(), OSSL_FUNC_keymgmt_get_params() and
OSSL_FUNC_keymgmt_set_params() should return 1 for success or 0 on error.

OSSL_FUNC_keymgmt_validate() should return 1 on successful validation, or 0 on
failure.

OSSL_FUNC_keymgmt_has() should return 1 if all the selected data subsets are contained
in the given I<keydata> or 0 otherwise.

OSSL_FUNC_keymgmt_query_operation_name() should return a pointer to a string matching
the requested operation, or NULL if the same name used to fetch the keymgmt
applies.

OSSL_FUNC_keymgmt_gettable_params() and OSSL_FUNC_keymgmt_settable_params()
OSSL_FUNC_keymgmt_import_types(), OSSL_FUNC_keymgmt_export_types()
should
always return a constant B<OSSL_PARAM> array.

=head1 SEE ALSO

L<provider(7)>,
L<EVP_PKEY-X25519(7)>, L<EVP_PKEY-X448(7)>, L<EVP_PKEY-ED25519(7)>,
L<EVP_PKEY-ED448(7)>, L<EVP_PKEY-EC(7)>, L<EVP_PKEY-RSA(7)>,
L<EVP_PKEY-DSA(7)>, L<EVP_PKEY-DH(7)>

=head1 HISTORY

The KEYMGMT interface was introduced in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.

Licensed under the Apache License 2.0 (the "License").  You may not use
this file except in compliance with the License.  You can obtain a copy
in the file LICENSE in the source distribution or at
L<https://www.openssl.org/source/license.html>.

=cut
