xref: /third_party/openssl/crypto/evp/dh_ctrl.c (revision e1051a39)
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