1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2020-2021 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#include "internal/deprecated.h" 11e1051a39Sopenharmony_ci 12e1051a39Sopenharmony_ci#include <openssl/core_names.h> 13e1051a39Sopenharmony_ci#include <openssl/params.h> 14e1051a39Sopenharmony_ci#include <openssl/err.h> 15e1051a39Sopenharmony_ci#include <openssl/dh.h> 16e1051a39Sopenharmony_ci#include "crypto/dh.h" 17e1051a39Sopenharmony_ci#include "crypto/evp.h" 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_cistatic int dh_paramgen_check(EVP_PKEY_CTX *ctx) 20e1051a39Sopenharmony_ci{ 21e1051a39Sopenharmony_ci if (ctx == NULL || !EVP_PKEY_CTX_IS_GEN_OP(ctx)) { 22e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 23e1051a39Sopenharmony_ci /* Uses the same return values as EVP_PKEY_CTX_ctrl */ 24e1051a39Sopenharmony_ci return -2; 25e1051a39Sopenharmony_ci } 26e1051a39Sopenharmony_ci /* If key type not DH return error */ 27e1051a39Sopenharmony_ci if (evp_pkey_ctx_is_legacy(ctx) 28e1051a39Sopenharmony_ci && ctx->pmeth->pkey_id != EVP_PKEY_DH 29e1051a39Sopenharmony_ci && ctx->pmeth->pkey_id != EVP_PKEY_DHX) 30e1051a39Sopenharmony_ci return -1; 31e1051a39Sopenharmony_ci return 1; 32e1051a39Sopenharmony_ci} 33e1051a39Sopenharmony_ci 34e1051a39Sopenharmony_cistatic int dh_param_derive_check(EVP_PKEY_CTX *ctx) 35e1051a39Sopenharmony_ci{ 36e1051a39Sopenharmony_ci if (ctx == NULL || !EVP_PKEY_CTX_IS_DERIVE_OP(ctx)) { 37e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 38e1051a39Sopenharmony_ci /* Uses the same return values as EVP_PKEY_CTX_ctrl */ 39e1051a39Sopenharmony_ci return -2; 40e1051a39Sopenharmony_ci } 41e1051a39Sopenharmony_ci /* If key type not DH return error */ 42e1051a39Sopenharmony_ci if (evp_pkey_ctx_is_legacy(ctx) 43e1051a39Sopenharmony_ci && ctx->pmeth->pkey_id != EVP_PKEY_DH 44e1051a39Sopenharmony_ci && ctx->pmeth->pkey_id != EVP_PKEY_DHX) 45e1051a39Sopenharmony_ci return -1; 46e1051a39Sopenharmony_ci return 1; 47e1051a39Sopenharmony_ci} 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_gindex(EVP_PKEY_CTX *ctx, int gindex) 50e1051a39Sopenharmony_ci{ 51e1051a39Sopenharmony_ci int ret; 52e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 53e1051a39Sopenharmony_ci 54e1051a39Sopenharmony_ci if ((ret = dh_paramgen_check(ctx)) <= 0) 55e1051a39Sopenharmony_ci return ret; 56e1051a39Sopenharmony_ci 57e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_FFC_GINDEX, &gindex); 58e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, params); 61e1051a39Sopenharmony_ci} 62e1051a39Sopenharmony_ci 63e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_seed(EVP_PKEY_CTX *ctx, 64e1051a39Sopenharmony_ci const unsigned char *seed, 65e1051a39Sopenharmony_ci size_t seedlen) 66e1051a39Sopenharmony_ci{ 67e1051a39Sopenharmony_ci int ret; 68e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 69e1051a39Sopenharmony_ci 70e1051a39Sopenharmony_ci if ((ret = dh_paramgen_check(ctx)) <= 0) 71e1051a39Sopenharmony_ci return ret; 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_octet_string(OSSL_PKEY_PARAM_FFC_SEED, 74e1051a39Sopenharmony_ci (void *)seed, seedlen); 75e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 76e1051a39Sopenharmony_ci 77e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, params); 78e1051a39Sopenharmony_ci} 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ci/* 81e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 82e1051a39Sopenharmony_ci * simply because that's easier. 83e1051a39Sopenharmony_ci */ 84e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_type(EVP_PKEY_CTX *ctx, int typ) 85e1051a39Sopenharmony_ci{ 86e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, EVP_PKEY_OP_PARAMGEN, 87e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_PARAMGEN_TYPE, typ, NULL); 88e1051a39Sopenharmony_ci} 89e1051a39Sopenharmony_ci 90e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_prime_len(EVP_PKEY_CTX *ctx, int pbits) 91e1051a39Sopenharmony_ci{ 92e1051a39Sopenharmony_ci int ret; 93e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 94e1051a39Sopenharmony_ci size_t bits = pbits; 95e1051a39Sopenharmony_ci 96e1051a39Sopenharmony_ci if ((ret = dh_paramgen_check(ctx)) <= 0) 97e1051a39Sopenharmony_ci return ret; 98e1051a39Sopenharmony_ci 99e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_size_t(OSSL_PKEY_PARAM_FFC_PBITS, &bits); 100e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 101e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, params); 102e1051a39Sopenharmony_ci} 103e1051a39Sopenharmony_ci 104e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_subprime_len(EVP_PKEY_CTX *ctx, int qbits) 105e1051a39Sopenharmony_ci{ 106e1051a39Sopenharmony_ci int ret; 107e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 108e1051a39Sopenharmony_ci size_t bits2 = qbits; 109e1051a39Sopenharmony_ci 110e1051a39Sopenharmony_ci if ((ret = dh_paramgen_check(ctx)) <= 0) 111e1051a39Sopenharmony_ci return ret; 112e1051a39Sopenharmony_ci 113e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_size_t(OSSL_PKEY_PARAM_FFC_QBITS, &bits2); 114e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 115e1051a39Sopenharmony_ci 116e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, params); 117e1051a39Sopenharmony_ci} 118e1051a39Sopenharmony_ci 119e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_paramgen_generator(EVP_PKEY_CTX *ctx, int gen) 120e1051a39Sopenharmony_ci{ 121e1051a39Sopenharmony_ci int ret; 122e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 123e1051a39Sopenharmony_ci 124e1051a39Sopenharmony_ci if ((ret = dh_paramgen_check(ctx)) <= 0) 125e1051a39Sopenharmony_ci return ret; 126e1051a39Sopenharmony_ci 127e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_int(OSSL_PKEY_PARAM_DH_GENERATOR, &gen); 128e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 129e1051a39Sopenharmony_ci 130e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, params); 131e1051a39Sopenharmony_ci} 132e1051a39Sopenharmony_ci 133e1051a39Sopenharmony_ci/* 134e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 135e1051a39Sopenharmony_ci * simply because that's easier. 136e1051a39Sopenharmony_ci */ 137e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_rfc5114(EVP_PKEY_CTX *ctx, int gen) 138e1051a39Sopenharmony_ci{ 139e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_PARAMGEN, 140e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_RFC5114, gen, NULL); 141e1051a39Sopenharmony_ci} 142e1051a39Sopenharmony_ci 143e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dhx_rfc5114(EVP_PKEY_CTX *ctx, int gen) 144e1051a39Sopenharmony_ci{ 145e1051a39Sopenharmony_ci return EVP_PKEY_CTX_set_dh_rfc5114(ctx, gen); 146e1051a39Sopenharmony_ci} 147e1051a39Sopenharmony_ci 148e1051a39Sopenharmony_ci/* 149e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 150e1051a39Sopenharmony_ci * simply because that's easier. 151e1051a39Sopenharmony_ci */ 152e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_nid(EVP_PKEY_CTX *ctx, int nid) 153e1051a39Sopenharmony_ci{ 154e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DH, 155e1051a39Sopenharmony_ci EVP_PKEY_OP_PARAMGEN | EVP_PKEY_OP_KEYGEN, 156e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_NID, nid, NULL); 157e1051a39Sopenharmony_ci} 158e1051a39Sopenharmony_ci 159e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_pad(EVP_PKEY_CTX *ctx, int pad) 160e1051a39Sopenharmony_ci{ 161e1051a39Sopenharmony_ci OSSL_PARAM dh_pad_params[2]; 162e1051a39Sopenharmony_ci unsigned int upad = pad; 163e1051a39Sopenharmony_ci 164e1051a39Sopenharmony_ci /* We use EVP_PKEY_CTX_ctrl return values */ 165e1051a39Sopenharmony_ci if (ctx == NULL || !EVP_PKEY_CTX_IS_DERIVE_OP(ctx)) { 166e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 167e1051a39Sopenharmony_ci return -2; 168e1051a39Sopenharmony_ci } 169e1051a39Sopenharmony_ci 170e1051a39Sopenharmony_ci dh_pad_params[0] = OSSL_PARAM_construct_uint(OSSL_EXCHANGE_PARAM_PAD, &upad); 171e1051a39Sopenharmony_ci dh_pad_params[1] = OSSL_PARAM_construct_end(); 172e1051a39Sopenharmony_ci 173e1051a39Sopenharmony_ci return evp_pkey_ctx_set_params_strict(ctx, dh_pad_params); 174e1051a39Sopenharmony_ci} 175e1051a39Sopenharmony_ci 176e1051a39Sopenharmony_ci/* 177e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 178e1051a39Sopenharmony_ci * simply because that's easier. 179e1051a39Sopenharmony_ci */ 180e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_kdf_type(EVP_PKEY_CTX *ctx, int kdf) 181e1051a39Sopenharmony_ci{ 182e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 183e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_KDF_TYPE, kdf, NULL); 184e1051a39Sopenharmony_ci} 185e1051a39Sopenharmony_ci 186e1051a39Sopenharmony_ci/* 187e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 188e1051a39Sopenharmony_ci * simply because that's easier. 189e1051a39Sopenharmony_ci */ 190e1051a39Sopenharmony_ciint EVP_PKEY_CTX_get_dh_kdf_type(EVP_PKEY_CTX *ctx) 191e1051a39Sopenharmony_ci{ 192e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 193e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_KDF_TYPE, -2, NULL); 194e1051a39Sopenharmony_ci} 195e1051a39Sopenharmony_ci 196e1051a39Sopenharmony_ci/* 197e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 198e1051a39Sopenharmony_ci * simply because that's easier. 199e1051a39Sopenharmony_ci */ 200e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT *oid) 201e1051a39Sopenharmony_ci{ 202e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 203e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_KDF_OID, 0, (void *)(oid)); 204e1051a39Sopenharmony_ci} 205e1051a39Sopenharmony_ci 206e1051a39Sopenharmony_ci/* 207e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 208e1051a39Sopenharmony_ci * simply because that's easier. 209e1051a39Sopenharmony_ci */ 210e1051a39Sopenharmony_ciint EVP_PKEY_CTX_get0_dh_kdf_oid(EVP_PKEY_CTX *ctx, ASN1_OBJECT **oid) 211e1051a39Sopenharmony_ci{ 212e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 213e1051a39Sopenharmony_ci EVP_PKEY_CTRL_GET_DH_KDF_OID, 0, (void *)(oid)); 214e1051a39Sopenharmony_ci} 215e1051a39Sopenharmony_ci 216e1051a39Sopenharmony_ci/* 217e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 218e1051a39Sopenharmony_ci * simply because that's easier. 219e1051a39Sopenharmony_ci */ 220e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD *md) 221e1051a39Sopenharmony_ci{ 222e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 223e1051a39Sopenharmony_ci EVP_PKEY_CTRL_DH_KDF_MD, 0, (void *)(md)); 224e1051a39Sopenharmony_ci} 225e1051a39Sopenharmony_ci 226e1051a39Sopenharmony_ci/* 227e1051a39Sopenharmony_ci * This one is currently implemented as an EVP_PKEY_CTX_ctrl() wrapper, 228e1051a39Sopenharmony_ci * simply because that's easier. 229e1051a39Sopenharmony_ci */ 230e1051a39Sopenharmony_ciint EVP_PKEY_CTX_get_dh_kdf_md(EVP_PKEY_CTX *ctx, const EVP_MD **pmd) 231e1051a39Sopenharmony_ci{ 232e1051a39Sopenharmony_ci return EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DHX, EVP_PKEY_OP_DERIVE, 233e1051a39Sopenharmony_ci EVP_PKEY_CTRL_GET_DH_KDF_MD, 0, (void *)(pmd)); 234e1051a39Sopenharmony_ci} 235e1051a39Sopenharmony_ci 236e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int outlen) 237e1051a39Sopenharmony_ci{ 238e1051a39Sopenharmony_ci int ret; 239e1051a39Sopenharmony_ci size_t len = outlen; 240e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 241e1051a39Sopenharmony_ci 242e1051a39Sopenharmony_ci ret = dh_param_derive_check(ctx); 243e1051a39Sopenharmony_ci if (ret != 1) 244e1051a39Sopenharmony_ci return ret; 245e1051a39Sopenharmony_ci 246e1051a39Sopenharmony_ci if (outlen <= 0) { 247e1051a39Sopenharmony_ci /* 248e1051a39Sopenharmony_ci * This would ideally be -1 or 0, but we have to retain compatibility 249e1051a39Sopenharmony_ci * with legacy behaviour of EVP_PKEY_CTX_ctrl() which returned -2 if 250e1051a39Sopenharmony_ci * inlen <= 0 251e1051a39Sopenharmony_ci */ 252e1051a39Sopenharmony_ci return -2; 253e1051a39Sopenharmony_ci } 254e1051a39Sopenharmony_ci 255e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN, 256e1051a39Sopenharmony_ci &len); 257e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 258e1051a39Sopenharmony_ci 259e1051a39Sopenharmony_ci ret = evp_pkey_ctx_set_params_strict(ctx, params); 260e1051a39Sopenharmony_ci if (ret == -2) 261e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 262e1051a39Sopenharmony_ci return ret; 263e1051a39Sopenharmony_ci} 264e1051a39Sopenharmony_ci 265e1051a39Sopenharmony_ciint EVP_PKEY_CTX_get_dh_kdf_outlen(EVP_PKEY_CTX *ctx, int *plen) 266e1051a39Sopenharmony_ci{ 267e1051a39Sopenharmony_ci int ret; 268e1051a39Sopenharmony_ci size_t len = UINT_MAX; 269e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 270e1051a39Sopenharmony_ci 271e1051a39Sopenharmony_ci ret = dh_param_derive_check(ctx); 272e1051a39Sopenharmony_ci if (ret != 1) 273e1051a39Sopenharmony_ci return ret; 274e1051a39Sopenharmony_ci 275e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_size_t(OSSL_EXCHANGE_PARAM_KDF_OUTLEN, 276e1051a39Sopenharmony_ci &len); 277e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 278e1051a39Sopenharmony_ci 279e1051a39Sopenharmony_ci ret = evp_pkey_ctx_get_params_strict(ctx, params); 280e1051a39Sopenharmony_ci if (ret == -2) 281e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 282e1051a39Sopenharmony_ci if (ret != 1 || len > INT_MAX) 283e1051a39Sopenharmony_ci return -1; 284e1051a39Sopenharmony_ci 285e1051a39Sopenharmony_ci *plen = (int)len; 286e1051a39Sopenharmony_ci 287e1051a39Sopenharmony_ci return 1; 288e1051a39Sopenharmony_ci} 289e1051a39Sopenharmony_ci 290e1051a39Sopenharmony_ciint EVP_PKEY_CTX_set0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char *ukm, int len) 291e1051a39Sopenharmony_ci{ 292e1051a39Sopenharmony_ci int ret; 293e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 294e1051a39Sopenharmony_ci 295e1051a39Sopenharmony_ci if (len < 0) 296e1051a39Sopenharmony_ci return -1; 297e1051a39Sopenharmony_ci 298e1051a39Sopenharmony_ci ret = dh_param_derive_check(ctx); 299e1051a39Sopenharmony_ci if (ret != 1) 300e1051a39Sopenharmony_ci return ret; 301e1051a39Sopenharmony_ci 302e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_octet_string(OSSL_EXCHANGE_PARAM_KDF_UKM, 303e1051a39Sopenharmony_ci /* 304e1051a39Sopenharmony_ci * Cast away the const. This is read 305e1051a39Sopenharmony_ci * only so should be safe 306e1051a39Sopenharmony_ci */ 307e1051a39Sopenharmony_ci (void *)ukm, 308e1051a39Sopenharmony_ci (size_t)len); 309e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 310e1051a39Sopenharmony_ci 311e1051a39Sopenharmony_ci ret = evp_pkey_ctx_set_params_strict(ctx, params); 312e1051a39Sopenharmony_ci if (ret == -2) 313e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 314e1051a39Sopenharmony_ci if (ret == 1) 315e1051a39Sopenharmony_ci OPENSSL_free(ukm); 316e1051a39Sopenharmony_ci return ret; 317e1051a39Sopenharmony_ci} 318e1051a39Sopenharmony_ci 319e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_3_0 320e1051a39Sopenharmony_ciint EVP_PKEY_CTX_get0_dh_kdf_ukm(EVP_PKEY_CTX *ctx, unsigned char **pukm) 321e1051a39Sopenharmony_ci{ 322e1051a39Sopenharmony_ci int ret; 323e1051a39Sopenharmony_ci size_t ukmlen; 324e1051a39Sopenharmony_ci OSSL_PARAM params[2], *p = params; 325e1051a39Sopenharmony_ci 326e1051a39Sopenharmony_ci ret = dh_param_derive_check(ctx); 327e1051a39Sopenharmony_ci if (ret != 1) 328e1051a39Sopenharmony_ci return ret; 329e1051a39Sopenharmony_ci 330e1051a39Sopenharmony_ci *p++ = OSSL_PARAM_construct_octet_ptr(OSSL_EXCHANGE_PARAM_KDF_UKM, 331e1051a39Sopenharmony_ci (void **)pukm, 0); 332e1051a39Sopenharmony_ci *p = OSSL_PARAM_construct_end(); 333e1051a39Sopenharmony_ci 334e1051a39Sopenharmony_ci ret = evp_pkey_ctx_get_params_strict(ctx, params); 335e1051a39Sopenharmony_ci if (ret == -2) 336e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_EVP, EVP_R_COMMAND_NOT_SUPPORTED); 337e1051a39Sopenharmony_ci if (ret != 1) 338e1051a39Sopenharmony_ci return -1; 339e1051a39Sopenharmony_ci 340e1051a39Sopenharmony_ci ukmlen = params[0].return_size; 341e1051a39Sopenharmony_ci if (ukmlen > INT_MAX) 342e1051a39Sopenharmony_ci return -1; 343e1051a39Sopenharmony_ci 344e1051a39Sopenharmony_ci return (int)ukmlen; 345e1051a39Sopenharmony_ci} 346e1051a39Sopenharmony_ci#endif 347