1*8fb009dcSAndroid Build Coastguard Worker /* Copyright (c) 2022, Google Inc. 2*8fb009dcSAndroid Build Coastguard Worker * 3*8fb009dcSAndroid Build Coastguard Worker * Permission to use, copy, modify, and/or distribute this software for any 4*8fb009dcSAndroid Build Coastguard Worker * purpose with or without fee is hereby granted, provided that the above 5*8fb009dcSAndroid Build Coastguard Worker * copyright notice and this permission notice appear in all copies. 6*8fb009dcSAndroid Build Coastguard Worker * 7*8fb009dcSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 8*8fb009dcSAndroid Build Coastguard Worker * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 9*8fb009dcSAndroid Build Coastguard Worker * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 10*8fb009dcSAndroid Build Coastguard Worker * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 11*8fb009dcSAndroid Build Coastguard Worker * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 12*8fb009dcSAndroid Build Coastguard Worker * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 13*8fb009dcSAndroid Build Coastguard Worker * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 14*8fb009dcSAndroid Build Coastguard Worker 15*8fb009dcSAndroid Build Coastguard Worker #ifndef OPENSSL_HEADER_KDF_H 16*8fb009dcSAndroid Build Coastguard Worker #define OPENSSL_HEADER_KDF_H 17*8fb009dcSAndroid Build Coastguard Worker 18*8fb009dcSAndroid Build Coastguard Worker #include <openssl/base.h> 19*8fb009dcSAndroid Build Coastguard Worker 20*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 21*8fb009dcSAndroid Build Coastguard Worker extern "C" { 22*8fb009dcSAndroid Build Coastguard Worker #endif 23*8fb009dcSAndroid Build Coastguard Worker 24*8fb009dcSAndroid Build Coastguard Worker 25*8fb009dcSAndroid Build Coastguard Worker // KDF support for EVP. 26*8fb009dcSAndroid Build Coastguard Worker 27*8fb009dcSAndroid Build Coastguard Worker 28*8fb009dcSAndroid Build Coastguard Worker // HKDF-specific functions. 29*8fb009dcSAndroid Build Coastguard Worker // 30*8fb009dcSAndroid Build Coastguard Worker // The following functions are provided for OpenSSL compatibility. Prefer the 31*8fb009dcSAndroid Build Coastguard Worker // HKDF functions in <openssl/hkdf.h>. In each, |ctx| must be created with 32*8fb009dcSAndroid Build Coastguard Worker // |EVP_PKEY_CTX_new_id| with |EVP_PKEY_HKDF| and then initialized with 33*8fb009dcSAndroid Build Coastguard Worker // |EVP_PKEY_derive_init|. 34*8fb009dcSAndroid Build Coastguard Worker 35*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_HKDEF_MODE_* define "modes" for use with |EVP_PKEY_CTX_hkdf_mode|. 36*8fb009dcSAndroid Build Coastguard Worker // The mispelling of "HKDF" as "HKDEF" is intentional for OpenSSL compatibility. 37*8fb009dcSAndroid Build Coastguard Worker #define EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND 0 38*8fb009dcSAndroid Build Coastguard Worker #define EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY 1 39*8fb009dcSAndroid Build Coastguard Worker #define EVP_PKEY_HKDEF_MODE_EXPAND_ONLY 2 40*8fb009dcSAndroid Build Coastguard Worker 41*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_CTX_hkdf_mode configures which HKDF operation to run. It returns one 42*8fb009dcSAndroid Build Coastguard Worker // on success and zero on error. |mode| must be one of |EVP_PKEY_HKDEF_MODE_*|. 43*8fb009dcSAndroid Build Coastguard Worker // By default, the mode is |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND|. 44*8fb009dcSAndroid Build Coastguard Worker // 45*8fb009dcSAndroid Build Coastguard Worker // If |mode| is |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND| or 46*8fb009dcSAndroid Build Coastguard Worker // |EVP_PKEY_HKDEF_MODE_EXPAND_ONLY|, the output is variable-length. 47*8fb009dcSAndroid Build Coastguard Worker // |EVP_PKEY_derive| uses the size of the output buffer as the output length for 48*8fb009dcSAndroid Build Coastguard Worker // HKDF-Expand. 49*8fb009dcSAndroid Build Coastguard Worker // 50*8fb009dcSAndroid Build Coastguard Worker // WARNING: Although this API calls it a "mode", HKDF-Extract and HKDF-Expand 51*8fb009dcSAndroid Build Coastguard Worker // are distinct operations with distinct inputs and distinct kinds of keys. 52*8fb009dcSAndroid Build Coastguard Worker // Callers should not pass input secrets for one operation into the other. 53*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_PKEY_CTX_hkdf_mode(EVP_PKEY_CTX *ctx, int mode); 54*8fb009dcSAndroid Build Coastguard Worker 55*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_CTX_set_hkdf_md sets |md| as the digest to use with HKDF. It returns 56*8fb009dcSAndroid Build Coastguard Worker // one on success and zero on error. 57*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_PKEY_CTX_set_hkdf_md(EVP_PKEY_CTX *ctx, 58*8fb009dcSAndroid Build Coastguard Worker const EVP_MD *md); 59*8fb009dcSAndroid Build Coastguard Worker 60*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_CTX_set1_hkdf_key configures HKDF to use |key_len| bytes from |key| 61*8fb009dcSAndroid Build Coastguard Worker // as the "key", described below. It returns one on success and zero on error. 62*8fb009dcSAndroid Build Coastguard Worker // 63*8fb009dcSAndroid Build Coastguard Worker // Which input is the key depends on the "mode" (see |EVP_PKEY_CTX_hkdf_mode|). 64*8fb009dcSAndroid Build Coastguard Worker // If |EVP_PKEY_HKDEF_MODE_EXTRACT_AND_EXPAND| or 65*8fb009dcSAndroid Build Coastguard Worker // |EVP_PKEY_HKDEF_MODE_EXTRACT_ONLY|, this function specifies the input keying 66*8fb009dcSAndroid Build Coastguard Worker // material (IKM) for HKDF-Extract. If |EVP_PKEY_HKDEF_MODE_EXPAND_ONLY|, it 67*8fb009dcSAndroid Build Coastguard Worker // instead specifies the pseudorandom key (PRK) for HKDF-Expand. 68*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_PKEY_CTX_set1_hkdf_key(EVP_PKEY_CTX *ctx, 69*8fb009dcSAndroid Build Coastguard Worker const uint8_t *key, 70*8fb009dcSAndroid Build Coastguard Worker size_t key_len); 71*8fb009dcSAndroid Build Coastguard Worker 72*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_CTX_set1_hkdf_salt configures HKDF to use |salt_len| bytes from 73*8fb009dcSAndroid Build Coastguard Worker // |salt| as the salt parameter to HKDF-Extract. It returns one on success and 74*8fb009dcSAndroid Build Coastguard Worker // zero on error. If performing HKDF-Expand only, this parameter is ignored. 75*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_PKEY_CTX_set1_hkdf_salt(EVP_PKEY_CTX *ctx, 76*8fb009dcSAndroid Build Coastguard Worker const uint8_t *salt, 77*8fb009dcSAndroid Build Coastguard Worker size_t salt_len); 78*8fb009dcSAndroid Build Coastguard Worker 79*8fb009dcSAndroid Build Coastguard Worker // EVP_PKEY_CTX_add1_hkdf_info appends |info_len| bytes from |info| to the info 80*8fb009dcSAndroid Build Coastguard Worker // parameter used with HKDF-Expand. It returns one on success and zero on error. 81*8fb009dcSAndroid Build Coastguard Worker // If performing HKDF-Extract only, this parameter is ignored. 82*8fb009dcSAndroid Build Coastguard Worker OPENSSL_EXPORT int EVP_PKEY_CTX_add1_hkdf_info(EVP_PKEY_CTX *ctx, 83*8fb009dcSAndroid Build Coastguard Worker const uint8_t *info, 84*8fb009dcSAndroid Build Coastguard Worker size_t info_len); 85*8fb009dcSAndroid Build Coastguard Worker 86*8fb009dcSAndroid Build Coastguard Worker 87*8fb009dcSAndroid Build Coastguard Worker #if defined(__cplusplus) 88*8fb009dcSAndroid Build Coastguard Worker } // extern C 89*8fb009dcSAndroid Build Coastguard Worker #endif 90*8fb009dcSAndroid Build Coastguard Worker 91*8fb009dcSAndroid Build Coastguard Worker #endif // OPENSSL_HEADER_KDF_H 92