1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2013-2022 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci/* 11e1051a39Sopenharmony_ci * DH low level APIs are deprecated for public use, but still ok for 12e1051a39Sopenharmony_ci * internal use. 13e1051a39Sopenharmony_ci */ 14e1051a39Sopenharmony_ci#include "internal/deprecated.h" 15e1051a39Sopenharmony_ci 16e1051a39Sopenharmony_ci#include "e_os.h" 17e1051a39Sopenharmony_ci#include "e_os.h" 18e1051a39Sopenharmony_ci#include <string.h> 19e1051a39Sopenharmony_ci#include <openssl/core_names.h> 20e1051a39Sopenharmony_ci#include <openssl/dh.h> 21e1051a39Sopenharmony_ci#include <openssl/evp.h> 22e1051a39Sopenharmony_ci#include <openssl/asn1.h> 23e1051a39Sopenharmony_ci#include <openssl/kdf.h> 24e1051a39Sopenharmony_ci#include "internal/provider.h" 25e1051a39Sopenharmony_ci#include "crypto/dh.h" 26e1051a39Sopenharmony_ci 27e1051a39Sopenharmony_ci/* Key derivation function from X9.63/SECG */ 28e1051a39Sopenharmony_ciint ossl_dh_kdf_X9_42_asn1(unsigned char *out, size_t outlen, 29e1051a39Sopenharmony_ci const unsigned char *Z, size_t Zlen, 30e1051a39Sopenharmony_ci const char *cek_alg, 31e1051a39Sopenharmony_ci const unsigned char *ukm, size_t ukmlen, 32e1051a39Sopenharmony_ci const EVP_MD *md, 33e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx, const char *propq) 34e1051a39Sopenharmony_ci{ 35e1051a39Sopenharmony_ci int ret = 0; 36e1051a39Sopenharmony_ci EVP_KDF_CTX *kctx = NULL; 37e1051a39Sopenharmony_ci EVP_KDF *kdf = NULL; 38e1051a39Sopenharmony_ci OSSL_PARAM params[5], *p = params; 39e1051a39Sopenharmony_ci const char *mdname = EVP_MD_get0_name(md); 40e1051a39Sopenharmony_ci 41e1051a39Sopenharmony_ci kdf = EVP_KDF_fetch(libctx, OSSL_KDF_NAME_X942KDF_ASN1, propq); 42e1051a39Sopenharmony_ci if (kdf == NULL) 43e1051a39Sopenharmony_ci return 0; 44e1051a39Sopenharmony_ci kctx = EVP_KDF_CTX_new(kdf); 45e1051a39Sopenharmony_ci if (kctx == NULL) 46e1051a39Sopenharmony_ci goto err; 47e1051a39Sopenharmony_ci 48e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_DIGEST, 49e1051a39Sopenharmony_ci (char *)mdname, 0); 50e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_KEY, 51e1051a39Sopenharmony_ci (unsigned char *)Z, Zlen); 52e1051a39Sopenharmony_ci if (ukm != NULL) 53e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_octet_string(OSSL_KDF_PARAM_UKM, 54e1051a39Sopenharmony_ci (unsigned char *)ukm, ukmlen); 55e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_utf8_string(OSSL_KDF_PARAM_CEK_ALG, 56e1051a39Sopenharmony_ci (char *)cek_alg, 0); 57e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 58e1051a39Sopenharmony_ci ret = EVP_KDF_derive(kctx, out, outlen, params) > 0; 59e1051a39Sopenharmony_cierr: 60e1051a39Sopenharmony_ci EVP_KDF_CTX_free(kctx); 61e1051a39Sopenharmony_ci EVP_KDF_free(kdf); 62e1051a39Sopenharmony_ci return ret; 63e1051a39Sopenharmony_ci} 64e1051a39Sopenharmony_ci 65e1051a39Sopenharmony_ci#if !defined(FIPS_MODULE) 66e1051a39Sopenharmony_ciint DH_KDF_X9_42(unsigned char *out, size_t outlen, 67e1051a39Sopenharmony_ci const unsigned char *Z, size_t Zlen, 68e1051a39Sopenharmony_ci ASN1_OBJECT *key_oid, 69e1051a39Sopenharmony_ci const unsigned char *ukm, size_t ukmlen, const EVP_MD *md) 70e1051a39Sopenharmony_ci{ 71e1051a39Sopenharmony_ci char key_alg[OSSL_MAX_NAME_SIZE]; 72e1051a39Sopenharmony_ci const OSSL_PROVIDER *prov = EVP_MD_get0_provider(md); 73e1051a39Sopenharmony_ci OSSL_LIB_CTX *libctx = ossl_provider_libctx(prov); 74e1051a39Sopenharmony_ci 75e1051a39Sopenharmony_ci if (OBJ_obj2txt(key_alg, sizeof(key_alg), key_oid, 0) <= 0) 76e1051a39Sopenharmony_ci return 0; 77e1051a39Sopenharmony_ci 78e1051a39Sopenharmony_ci return ossl_dh_kdf_X9_42_asn1(out, outlen, Z, Zlen, key_alg, 79e1051a39Sopenharmony_ci ukm, ukmlen, md, libctx, NULL); 80e1051a39Sopenharmony_ci} 81e1051a39Sopenharmony_ci#endif /* !defined(FIPS_MODULE) */ 82