| =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 |