=pod

=head1 NAME

provider-kdf - The KDF library E<lt>-E<gt> provider functions

=head1 SYNOPSIS

=for openssl multiple includes

 #include <openssl/core_dispatch.h>
 #include <openssl/core_names.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.
  */

 /* Context management */
 void *OSSL_FUNC_kdf_newctx(void *provctx);
 void OSSL_FUNC_kdf_freectx(void *kctx);
 void *OSSL_FUNC_kdf_dupctx(void *src);

 /* Encryption/decryption */
 int OSSL_FUNC_kdf_reset(void *kctx);
 int OSSL_FUNC_kdf_derive(void *kctx, unsigned char *key, size_t keylen,
                          const OSSL_PARAM params[]);

 /* KDF parameter descriptors */
 const OSSL_PARAM *OSSL_FUNC_kdf_gettable_params(void *provctx);
 const OSSL_PARAM *OSSL_FUNC_kdf_gettable_ctx_params(void *kcxt, void *provctx);
 const OSSL_PARAM *OSSL_FUNC_kdf_settable_ctx_params(void *kcxt, void *provctx);

 /* KDF parameters */
 int OSSL_FUNC_kdf_get_params(OSSL_PARAM params[]);
 int OSSL_FUNC_kdf_get_ctx_params(void *kctx, OSSL_PARAM params[]);
 int OSSL_FUNC_kdf_set_ctx_params(void *kctx, const OSSL_PARAM params[]);

=head1 DESCRIPTION

This documentation is primarily aimed at provider authors. See L<provider(7)>
for further information.

The KDF operation enables providers to implement KDF algorithms and make
them available to applications via the API functions L<EVP_KDF_CTX_reset(3)>,
and L<EVP_KDF_derive(3)>.

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 an B<OSSL_DISPATCH> element named
B<OSSL_FUNC_{name}>.
For example, the "function" OSSL_FUNC_kdf_newctx() has these:

 typedef void *(OSSL_OSSL_FUNC_kdf_newctx_fn)(void *provctx);
 static ossl_inline OSSL_OSSL_FUNC_kdf_newctx_fn
     OSSL_FUNC_kdf_newctx(const OSSL_DISPATCH *opf);

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

 OSSL_FUNC_kdf_newctx               OSSL_FUNC_KDF_NEWCTX
 OSSL_FUNC_kdf_freectx              OSSL_FUNC_KDF_FREECTX
 OSSL_FUNC_kdf_dupctx               OSSL_FUNC_KDF_DUPCTX

 OSSL_FUNC_kdf_reset                OSSL_FUNC_KDF_RESET
 OSSL_FUNC_kdf_derive               OSSL_FUNC_KDF_DERIVE

 OSSL_FUNC_kdf_get_params           OSSL_FUNC_KDF_GET_PARAMS
 OSSL_FUNC_kdf_get_ctx_params       OSSL_FUNC_KDF_GET_CTX_PARAMS
 OSSL_FUNC_kdf_set_ctx_params       OSSL_FUNC_KDF_SET_CTX_PARAMS

 OSSL_FUNC_kdf_gettable_params      OSSL_FUNC_KDF_GETTABLE_PARAMS
 OSSL_FUNC_kdf_gettable_ctx_params  OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS
 OSSL_FUNC_kdf_settable_ctx_params  OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS

A KDF algorithm implementation may not implement all of these functions.
In order to be a consistent set of functions, at least the following functions
must be implemented: OSSL_FUNC_kdf_newctx(), OSSL_FUNC_kdf_freectx(),
OSSL_FUNC_kdf_set_ctx_params(), OSSL_FUNC_kdf_derive().
All other functions are optional.

=head2 Context Management Functions

OSSL_FUNC_kdf_newctx() should create and return a pointer to a provider side
structure for holding context information during a KDF operation.
A pointer to this context will be passed back in a number of the other KDF
operation function calls.
The parameter I<provctx> is the provider context generated during provider
initialisation (see L<provider(7)>).

OSSL_FUNC_kdf_freectx() is passed a pointer to the provider side KDF context in
the I<kctx> parameter.
If it receives NULL as I<kctx> value, it should not do anything other than
return.
This function should free any resources associated with that context.

OSSL_FUNC_kdf_dupctx() should duplicate the provider side KDF context in the
I<kctx> parameter and return the duplicate copy.

=head2 Encryption/Decryption Functions

OSSL_FUNC_kdf_reset() initialises a KDF operation given a provider
side KDF context in the I<kctx> parameter.

OSSL_FUNC_kdf_derive() performs the KDF operation after processing the
I<params> as per OSSL_FUNC_kdf_set_ctx_params().
The I<kctx> parameter contains a pointer to the provider side context.
The resulting key of the desired I<keylen> should be written to I<key>.
If the algorithm does not support the requested I<keylen> the function must
return error.

=head2 KDF Parameters

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

OSSL_FUNC_kdf_get_params() gets details of parameter values associated with the
provider algorithm and stores them in I<params>.

OSSL_FUNC_kdf_set_ctx_params() sets KDF parameters associated with the given
provider side KDF context I<kctx> to I<params>.
Any parameter settings are additional to any that were previously set.
Passing NULL for I<params> should return true.

OSSL_FUNC_kdf_get_ctx_params() retrieves gettable parameter values associated
with the given provider side KDF context I<kctx> and stores them in I<params>.
Passing NULL for I<params> should return true.

OSSL_FUNC_kdf_gettable_params(), OSSL_FUNC_kdf_gettable_ctx_params(),
and OSSL_FUNC_kdf_settable_ctx_params() all return constant B<OSSL_PARAM>
arrays as descriptors of the parameters that OSSL_FUNC_kdf_get_params(),
OSSL_FUNC_kdf_get_ctx_params(), and OSSL_FUNC_kdf_set_ctx_params()
can handle, respectively.  OSSL_FUNC_kdf_gettable_ctx_params() and
OSSL_FUNC_kdf_settable_ctx_params() will return the parameters associated
with the provider side context I<kctx> in its current state if it is
not NULL.  Otherwise, they return the parameters associated with the
provider side algorithm I<provctx>.


Parameters currently recognised by built-in KDFs are as follows. Not all
parameters are relevant to, or are understood by all KDFs:

=over 4

=item "size" (B<OSSL_KDF_PARAM_SIZE>) <unsigned integer>

Gets the output size from the associated KDF ctx.
If the algorithm produces a variable amount of output, SIZE_MAX should be
returned.
If the input parameters required to calculate the fixed output size have not yet
been supplied, 0 should be returned indicating an error.

=item "key" (B<OSSL_KDF_PARAM_KEY>) <octet string>

Sets the key in the associated KDF ctx.

=item "secret" (B<OSSL_KDF_PARAM_SECRET>) <octet string>

Sets the secret in the associated KDF ctx.

=item "pass" (B<OSSL_KDF_PARAM_PASSWORD>) <octet string>

Sets the password in the associated KDF ctx.

=item "cipher" (B<OSSL_KDF_PARAM_CIPHER>) <UTF8 string>

=item "digest" (B<OSSL_KDF_PARAM_DIGEST>) <UTF8 string>

=item "mac" (B<OSSL_KDF_PARAM_MAC>) <UTF8 string>

Sets the name of the underlying cipher, digest or MAC to be used.
It must name a suitable algorithm for the KDF that's being used.

=item "maclen" (B<OSSL_KDF_PARAM_MAC_SIZE>) <octet string>

Sets the length of the MAC in the associated KDF ctx.

=item "properties" (B<OSSL_KDF_PARAM_PROPERTIES>) <UTF8 string>

Sets the properties to be queried when trying to fetch the underlying algorithm.
This must be given together with the algorithm naming parameter to be
considered valid.

=item "iter" (B<OSSL_KDF_PARAM_ITER>) <unsigned integer>

Sets the number of iterations in the associated KDF ctx.

=item "mode" (B<OSSL_KDF_PARAM_MODE>) <UTF8 string>

Sets the mode in the associated KDF ctx.

=item "pkcs5" (B<OSSL_KDF_PARAM_PKCS5>) <integer>

Enables or disables the SP800-132 compliance checks.
A mode of 0 enables the compliance checks.

The checks performed are:

=over 4

=item - the iteration count is at least 1000.

=item - the salt length is at least 128 bits.

=item - the derived key length is at least 112 bits.

=back

=item "ukm" (B<OSSL_KDF_PARAM_UKM>) <octet string>

Sets an optional random string that is provided by the sender called
"partyAInfo".  In CMS this is the user keying material.


=item "cekalg" (B<OSSL_KDF_PARAM_CEK_ALG>) <UTF8 string>

Sets the CEK wrapping algorithm name in the associated KDF ctx.

=item "n" (B<OSSL_KDF_PARAM_SCRYPT_N>) <unsigned integer>

Sets the scrypt work factor parameter N in the associated KDF ctx.

=item "r" (B<OSSL_KDF_PARAM_SCRYPT_R>) <unsigned integer>

Sets the scrypt work factor parameter r in the associated KDF ctx.

=item "p" (B<OSSL_KDF_PARAM_SCRYPT_P>) <unsigned integer>

Sets the scrypt work factor parameter p in the associated KDF ctx.

=item "maxmem_bytes" (B<OSSL_KDF_PARAM_SCRYPT_MAXMEM>) <unsigned integer>

Sets the scrypt work factor parameter maxmem in the associated KDF ctx.

=item "prefix" (B<OSSL_KDF_PARAM_PREFIX>) <octet string>

Sets the prefix string using by the TLS 1.3 version of HKDF in the
associated KDF ctx.

=item "label" (B<OSSL_KDF_PARAM_LABEL>) <octet string>

Sets the label string using by the TLS 1.3 version of HKDF in the
associated KDF ctx.

=item "data" (B<OSSL_KDF_PARAM_DATA>) <octet string>

Sets the context string using by the TLS 1.3 version of HKDF in the
associated KDF ctx.

=item "info" (B<OSSL_KDF_PARAM_INFO>) <octet string>

Sets the optional shared info in the associated KDF ctx.

=item "seed" (B<OSSL_KDF_PARAM_SEED>) <octet string>

Sets the IV in the associated KDF ctx.

=item "xcghash" (B<OSSL_KDF_PARAM_SSHKDF_XCGHASH>) <octet string>

Sets the xcghash in the associated KDF ctx.

=item "session_id" (B<OSSL_KDF_PARAM_SSHKDF_SESSION_ID>) <octet string>

Sets the session ID in the associated KDF ctx.

=item "type" (B<OSSL_KDF_PARAM_SSHKDF_TYPE>) <UTF8 string>

Sets the SSH KDF type parameter in the associated KDF ctx.
There are six supported types:

=over 4

=item EVP_KDF_SSHKDF_TYPE_INITIAL_IV_CLI_TO_SRV

The Initial IV from client to server.
A single char of value 65 (ASCII char 'A').

=item EVP_KDF_SSHKDF_TYPE_INITIAL_IV_SRV_TO_CLI

The Initial IV from server to client
A single char of value 66 (ASCII char 'B').

=item EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_CLI_TO_SRV

The Encryption Key from client to server
A single char of value 67 (ASCII char 'C').

=item EVP_KDF_SSHKDF_TYPE_ENCRYPTION_KEY_SRV_TO_CLI

The Encryption Key from server to client
A single char of value 68 (ASCII char 'D').

=item EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_CLI_TO_SRV

The Integrity Key from client to server
A single char of value 69 (ASCII char 'E').

=item EVP_KDF_SSHKDF_TYPE_INTEGRITY_KEY_SRV_TO_CLI

The Integrity Key from client to server
A single char of value 70 (ASCII char 'F').

=back

=item "constant" (B<OSSL_KDF_PARAM_CONSTANT>) <octet string>

Sets the constant value in the associated KDF ctx.

=item "id" (B<OSSL_KDF_PARAM_PKCS12_ID>) <integer>

Sets the intended usage of the output bits in the associated KDF ctx.
It is defined as per RFC 7292 section B.3.

=back

=head1 RETURN VALUES

OSSL_FUNC_kdf_newctx() and OSSL_FUNC_kdf_dupctx() should return the newly created
provider side KDF context, or NULL on failure.

OSSL_FUNC_kdf_derive(), OSSL_FUNC_kdf_get_params(),
OSSL_FUNC_kdf_get_ctx_params() and OSSL_FUNC_kdf_set_ctx_params() should return 1 for
success or 0 on error.

OSSL_FUNC_kdf_gettable_params(), OSSL_FUNC_kdf_gettable_ctx_params() and
OSSL_FUNC_kdf_settable_ctx_params() should return a constant B<OSSL_PARAM>
array, or NULL if none is offered.

=head1 NOTES

The KDF life-cycle is described in L<life_cycle-kdf(7)>.  Providers should
ensure that the various transitions listed there are supported.  At some point
the EVP layer will begin enforcing the listed transitions.

=head1 SEE ALSO

L<provider(7)>, L<life_cycle-kdf(7)>, L<EVP_KDF(3)>.

=head1 HISTORY

The provider KDF interface was introduced in OpenSSL 3.0.

=head1 COPYRIGHT

Copyright 2020-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
