=pod

=head1 NAME

EVP_KDF_HKDF - The HKDF EVP_KDF implementation

=head1 DESCRIPTION

Support for computing the B<HKDF> KDF through the B<EVP_KDF> API.

The EVP_KDF_HKDF algorithm implements the HKDF key derivation function.
HKDF follows the "extract-then-expand" paradigm, where the KDF logically
consists of two modules. The first stage takes the input keying material
and "extracts" from it a fixed-length pseudorandom key K. The second stage
"expands" the key K into several additional pseudorandom keys (the output
of the KDF).

=head2 Numeric identity

B<EVP_KDF_HKDF> is the numeric identity for this implementation; it
can be used with the EVP_KDF_CTX_new_id() function.

=head2 Supported controls

The supported controls are:

=over 4

=item B<EVP_KDF_CTRL_SET_SALT>

=item B<EVP_KDF_CTRL_SET_MD>

=item B<EVP_KDF_CTRL_SET_KEY>

These controls work as described in L<EVP_KDF_CTX(3)/CONTROLS>.

=item B<EVP_KDF_CTRL_RESET_HKDF_INFO>

This control does not expect any arguments.

Resets the context info buffer to zero length.

=item B<EVP_KDF_CTRL_ADD_HKDF_INFO>

This control expects two arguments: C<unsigned char *info>, C<size_t infolen>

Sets the info value to the first B<infolen> bytes of the buffer B<info>.  If a
value is already set, the contents of the buffer are appended to the existing
value.

The total length of the context info buffer cannot exceed 1024 bytes;
this should be more than enough for any normal use of HKDF.

EVP_KDF_ctrl_str() takes two type strings for this control:

=over 4

=item "info"

The value string is used as is.

=item "hexinfo"

The value string is expected to be a hexadecimal number, which will be
decoded before being passed on as the control value.

=back

=item B<EVP_KDF_CTRL_SET_HKDF_MODE>

This control expects one argument: C<int mode>

Sets the mode for the HKDF operation. There are three modes that are currently
defined:

=over 4

=item EVP_KDF_HKDF_MODE_EXTRACT_AND_EXPAND

This is the default mode.  Calling L<EVP_KDF_derive(3)> on an EVP_KDF_CTX set
up for HKDF will perform an extract followed by an expand operation in one go.
The derived key returned will be the result after the expand operation. The
intermediate fixed-length pseudorandom key K is not returned.

In this mode the digest, key, salt and info values must be set before a key is
derived otherwise an error will occur.

=item EVP_KDF_HKDF_MODE_EXTRACT_ONLY

In this mode calling L<EVP_KDF_derive(3)> will just perform the extract
operation. The value returned will be the intermediate fixed-length pseudorandom
key K.  The C<keylen> parameter must match the size of K, which can be looked
up by calling EVP_KDF_size() after setting the mode and digest.

The digest, key and salt values must be set before a key is derived otherwise
an error will occur.

=item EVP_KDF_HKDF_MODE_EXPAND_ONLY

In this mode calling L<EVP_KDF_derive(3)> will just perform the expand
operation. The input key should be set to the intermediate fixed-length
pseudorandom key K returned from a previous extract operation.

The digest, key and info values must be set before a key is derived otherwise
an error will occur.

=back

EVP_KDF_ctrl_str() type string: "mode"

The value string is expected to be one of: "EXTRACT_AND_EXPAND", "EXTRACT_ONLY"
or "EXPAND_ONLY".

=back

=head1 NOTES

A context for HKDF can be obtained by calling:

 EVP_KDF_CTX *kctx = EVP_KDF_CTX_new_id(EVP_KDF_HKDF);

The output length of an HKDF expand operation is specified via the C<keylen>
parameter to the L<EVP_KDF_derive(3)> function.  When using
EVP_KDF_HKDF_MODE_EXTRACT_ONLY the C<keylen> parameter must equal the size of
the intermediate fixed-length pseudorandom key otherwise an error will occur.
For that mode, the fixed output size can be looked up by calling EVP_KDF_size()
after setting the mode and digest on the C<EVP_KDF_CTX>.

=head1 EXAMPLE

This example derives 10 bytes using SHA-256 with the secret key "secret",
salt value "salt" and info value "label":

 EVP_KDF_CTX *kctx;
 unsigned char out[10];

 kctx = EVP_KDF_CTX_new_id(EVP_KDF_HKDF);

 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_MD, EVP_sha256()) <= 0) {
     error("EVP_KDF_CTRL_SET_MD");
 }
 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_SALT, "salt", (size_t)4) <= 0) {
     error("EVP_KDF_CTRL_SET_SALT");
 }
 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_SET_KEY, "secret", (size_t)6) <= 0) {
     error("EVP_KDF_CTRL_SET_KEY");
 }
 if (EVP_KDF_ctrl(kctx, EVP_KDF_CTRL_ADD_HKDF_INFO, "label", (size_t)5) <= 0) {
     error("EVP_KDF_CTRL_ADD_HKDF_INFO");
 }
 if (EVP_KDF_derive(kctx, out, sizeof(out)) <= 0) {
     error("EVP_KDF_derive");
 }

 EVP_KDF_CTX_free(kctx);

=head1 CONFORMING TO

RFC 5869

=head1 SEE ALSO

L<EVP_KDF_CTX>,
L<EVP_KDF_CTX_new_id(3)>,
L<EVP_KDF_CTX_free(3)>,
L<EVP_KDF_ctrl(3)>,
L<EVP_KDF_size(3)>,
L<EVP_KDF_derive(3)>,
L<EVP_KDF_CTX(3)/CONTROLS>

=head1 COPYRIGHT

Copyright 2016-2018 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
