2 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
4 * Licensed under the Apache License 2.0 (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
11 * DH low level APIs are deprecated for public use, but still ok for
14 #include "internal/deprecated.h"
16 #include <string.h> /* strcmp */
17 #include <openssl/core_numbers.h>
18 #include <openssl/core_names.h>
19 #include <openssl/bn.h>
20 #include <openssl/err.h>
21 #include "prov/implementations.h"
22 #include "prov/providercommon.h"
23 #include "prov/provider_ctx.h"
24 #include "crypto/dh.h"
25 #include "internal/sizes.h"
26 #include "internal/nelem.h"
27 #include "internal/param_build_set.h"
29 static OSSL_OP_keymgmt_new_fn dh_newdata
;
30 static OSSL_OP_keymgmt_free_fn dh_freedata
;
31 static OSSL_OP_keymgmt_gen_init_fn dh_gen_init
;
32 static OSSL_OP_keymgmt_gen_set_template_fn dh_gen_set_template
;
33 static OSSL_OP_keymgmt_gen_set_params_fn dh_gen_set_params
;
34 static OSSL_OP_keymgmt_gen_settable_params_fn dh_gen_settable_params
;
35 static OSSL_OP_keymgmt_gen_fn dh_gen
;
36 static OSSL_OP_keymgmt_gen_cleanup_fn dh_gen_cleanup
;
37 static OSSL_OP_keymgmt_get_params_fn dh_get_params
;
38 static OSSL_OP_keymgmt_gettable_params_fn dh_gettable_params
;
39 static OSSL_OP_keymgmt_has_fn dh_has
;
40 static OSSL_OP_keymgmt_match_fn dh_match
;
41 static OSSL_OP_keymgmt_validate_fn dh_validate
;
42 static OSSL_OP_keymgmt_import_fn dh_import
;
43 static OSSL_OP_keymgmt_import_types_fn dh_import_types
;
44 static OSSL_OP_keymgmt_export_fn dh_export
;
45 static OSSL_OP_keymgmt_export_types_fn dh_export_types
;
47 #define DH_POSSIBLE_SELECTIONS \
48 (OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS)
53 FFC_PARAMS
*ffc_params
;
55 /* All these parameters are used for parameter generation only */
56 /* If there is a group name then the remaining parameters are not needed */
61 unsigned char *seed
; /* optional FIPS186-4 param for testing */
63 int gindex
; /* optional FIPS186-4 generator index (ignored if -1) */
64 int gen_type
; /* see dhtype2id */
65 int generator
; /* Used by DH_PARAMGEN_TYPE_GENERATOR in non fips mode only */
73 typedef struct dh_name2id_st
{
78 static const DH_GENTYPE_NAME2ID dhtype2id
[]=
80 { "default", DH_PARAMGEN_TYPE_FIPS_186_4
},
81 { "fips186_4", DH_PARAMGEN_TYPE_FIPS_186_4
},
82 { "fips186_2", DH_PARAMGEN_TYPE_FIPS_186_2
},
83 { "group", DH_PARAMGEN_TYPE_GROUP
},
84 { "generator", DH_PARAMGEN_TYPE_GENERATOR
}
87 const char *dh_gen_type_id2name(int id
)
91 for (i
= 0; i
< OSSL_NELEM(dhtype2id
); ++i
) {
92 if (dhtype2id
[i
].id
== id
)
93 return dhtype2id
[i
].name
;
98 static int dh_gen_type_name2id(const char *name
)
102 for (i
= 0; i
< OSSL_NELEM(dhtype2id
); ++i
) {
103 if (strcmp(dhtype2id
[i
].name
, name
) == 0)
104 return dhtype2id
[i
].id
;
109 static int dh_key_todata(DH
*dh
, OSSL_PARAM_BLD
*bld
, OSSL_PARAM params
[])
111 const BIGNUM
*priv
= NULL
, *pub
= NULL
;
116 DH_get0_key(dh
, &pub
, &priv
);
118 && !ossl_param_build_set_bn(bld
, params
, OSSL_PKEY_PARAM_PRIV_KEY
, priv
))
121 && !ossl_param_build_set_bn(bld
, params
, OSSL_PKEY_PARAM_PUB_KEY
, pub
))
127 static void *dh_newdata(void *provctx
)
129 return dh_new_with_libctx(PROV_LIBRARY_CONTEXT_OF(provctx
));
132 static void dh_freedata(void *keydata
)
137 static int dh_has(void *keydata
, int selection
)
143 if ((selection
& DH_POSSIBLE_SELECTIONS
) != 0)
146 if ((selection
& OSSL_KEYMGMT_SELECT_PUBLIC_KEY
) != 0)
147 ok
= ok
&& (DH_get0_pub_key(dh
) != NULL
);
148 if ((selection
& OSSL_KEYMGMT_SELECT_PRIVATE_KEY
) != 0)
149 ok
= ok
&& (DH_get0_priv_key(dh
) != NULL
);
150 if ((selection
& OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
) != 0)
151 ok
= ok
&& (DH_get0_p(dh
) != NULL
&& DH_get0_g(dh
) != NULL
);
156 static int dh_match(const void *keydata1
, const void *keydata2
, int selection
)
158 const DH
*dh1
= keydata1
;
159 const DH
*dh2
= keydata2
;
162 if ((selection
& OSSL_KEYMGMT_SELECT_PUBLIC_KEY
) != 0)
163 ok
= ok
&& BN_cmp(DH_get0_pub_key(dh1
), DH_get0_pub_key(dh2
)) == 0;
164 if ((selection
& OSSL_KEYMGMT_SELECT_PRIVATE_KEY
) != 0)
165 ok
= ok
&& BN_cmp(DH_get0_priv_key(dh1
), DH_get0_priv_key(dh2
)) == 0;
166 if ((selection
& OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
) != 0) {
167 FFC_PARAMS
*dhparams1
= dh_get0_params((DH
*)dh1
);
168 FFC_PARAMS
*dhparams2
= dh_get0_params((DH
*)dh2
);
170 ok
= ok
&& ffc_params_cmp(dhparams1
, dhparams2
, 1);
175 static int dh_import(void *keydata
, int selection
, const OSSL_PARAM params
[])
183 if ((selection
& DH_POSSIBLE_SELECTIONS
) == 0)
186 if ((selection
& OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
) != 0)
187 ok
= ok
&& dh_ffc_params_fromdata(dh
, params
);
189 if ((selection
& OSSL_KEYMGMT_SELECT_KEYPAIR
) != 0)
190 ok
= ok
&& dh_key_fromdata(dh
, params
);
195 static int dh_export(void *keydata
, int selection
, OSSL_CALLBACK
*param_cb
,
199 OSSL_PARAM_BLD
*tmpl
= NULL
;
200 OSSL_PARAM
*params
= NULL
;
206 tmpl
= OSSL_PARAM_BLD_new();
210 if ((selection
& OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
) != 0)
211 ok
= ok
&& ffc_params_todata(dh_get0_params(dh
), tmpl
, NULL
);
212 if ((selection
& OSSL_KEYMGMT_SELECT_KEYPAIR
) != 0)
213 ok
= ok
&& dh_key_todata(dh
, tmpl
, NULL
);
216 || (params
= OSSL_PARAM_BLD_to_param(tmpl
)) == NULL
) {
220 ok
= param_cb(params
, cbarg
);
221 OSSL_PARAM_BLD_free_params(params
);
223 OSSL_PARAM_BLD_free(tmpl
);
227 /* IMEXPORT = IMPORT + EXPORT */
229 # define DH_IMEXPORTABLE_PARAMETERS \
230 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, NULL, 0), \
231 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_Q, NULL, 0), \
232 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, NULL, 0), \
233 OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_COFACTOR, NULL, 0), \
234 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GINDEX, NULL), \
235 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, NULL), \
236 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_H, NULL), \
237 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_GROUP, NULL, 0), \
238 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_FFC_SEED, NULL, 0)
239 # define DH_IMEXPORTABLE_PUBLIC_KEY \
240 OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0)
241 # define DH_IMEXPORTABLE_PRIVATE_KEY \
242 OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0)
243 static const OSSL_PARAM dh_all_types
[] = {
244 DH_IMEXPORTABLE_PARAMETERS
,
245 DH_IMEXPORTABLE_PUBLIC_KEY
,
246 DH_IMEXPORTABLE_PRIVATE_KEY
,
249 static const OSSL_PARAM dh_parameter_types
[] = {
250 DH_IMEXPORTABLE_PARAMETERS
,
253 static const OSSL_PARAM dh_key_types
[] = {
254 DH_IMEXPORTABLE_PUBLIC_KEY
,
255 DH_IMEXPORTABLE_PRIVATE_KEY
,
258 static const OSSL_PARAM
*dh_types
[] = {
259 NULL
, /* Index 0 = none of them */
260 dh_parameter_types
, /* Index 1 = parameter types */
261 dh_key_types
, /* Index 2 = key types */
262 dh_all_types
/* Index 3 = 1 + 2 */
265 static const OSSL_PARAM
*dh_imexport_types(int selection
)
269 if ((selection
& OSSL_KEYMGMT_SELECT_ALL_PARAMETERS
) != 0)
271 if ((selection
& OSSL_KEYMGMT_SELECT_KEYPAIR
) != 0)
273 return dh_types
[type_select
];
276 static const OSSL_PARAM
*dh_import_types(int selection
)
278 return dh_imexport_types(selection
);
281 static const OSSL_PARAM
*dh_export_types(int selection
)
283 return dh_imexport_types(selection
);
286 static ossl_inline
int dh_get_params(void *key
, OSSL_PARAM params
[])
291 if ((p
= OSSL_PARAM_locate(params
, OSSL_PKEY_PARAM_BITS
)) != NULL
292 && !OSSL_PARAM_set_int(p
, DH_bits(dh
)))
294 if ((p
= OSSL_PARAM_locate(params
, OSSL_PKEY_PARAM_SECURITY_BITS
)) != NULL
295 && !OSSL_PARAM_set_int(p
, DH_security_bits(dh
)))
297 if ((p
= OSSL_PARAM_locate(params
, OSSL_PKEY_PARAM_MAX_SIZE
)) != NULL
298 && !OSSL_PARAM_set_int(p
, DH_size(dh
)))
300 return ffc_params_todata(dh_get0_params(dh
), NULL
, params
)
301 && dh_key_todata(dh
, NULL
, params
);
304 static const OSSL_PARAM dh_params
[] = {
305 OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS
, NULL
),
306 OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS
, NULL
),
307 OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE
, NULL
),
308 DH_IMEXPORTABLE_PARAMETERS
,
309 DH_IMEXPORTABLE_PUBLIC_KEY
,
310 DH_IMEXPORTABLE_PRIVATE_KEY
,
314 static const OSSL_PARAM
*dh_gettable_params(void)
319 static int dh_validate_public(DH
*dh
)
321 const BIGNUM
*pub_key
= NULL
;
323 DH_get0_key(dh
, &pub_key
, NULL
);
324 return DH_check_pub_key_ex(dh
, pub_key
);
327 static int dh_validate_private(DH
*dh
)
330 const BIGNUM
*priv_key
= NULL
;
332 DH_get0_key(dh
, NULL
, &priv_key
);
333 return dh_check_priv_key(dh
, priv_key
, &status
);;
336 static int dh_validate(void *keydata
, int selection
)
341 if ((selection
& DH_POSSIBLE_SELECTIONS
) != 0)
344 if ((selection
& OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
) != 0)
345 ok
= ok
&& DH_check_params_ex(dh
);
347 if ((selection
& OSSL_KEYMGMT_SELECT_PUBLIC_KEY
) != 0)
348 ok
= ok
&& dh_validate_public(dh
);
350 if ((selection
& OSSL_KEYMGMT_SELECT_PRIVATE_KEY
) != 0)
351 ok
= ok
&& dh_validate_private(dh
);
353 if ((selection
& OSSL_KEYMGMT_SELECT_KEYPAIR
)
354 == OSSL_KEYMGMT_SELECT_KEYPAIR
)
355 ok
= ok
&& dh_check_pairwise(dh
);
359 static void *dh_gen_init(void *provctx
, int selection
)
361 OPENSSL_CTX
*libctx
= PROV_LIBRARY_CONTEXT_OF(provctx
);
362 struct dh_gen_ctx
*gctx
= NULL
;
364 if ((selection
& (OSSL_KEYMGMT_SELECT_KEYPAIR
365 | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
)) == 0)
368 if ((gctx
= OPENSSL_zalloc(sizeof(*gctx
))) != NULL
) {
369 gctx
->selection
= selection
;
370 gctx
->libctx
= libctx
;
374 gctx
->gen_type
= DH_PARAMGEN_TYPE_FIPS_186_4
;
378 gctx
->generator
= DH_GENERATOR_2
;
383 static int dh_gen_set_template(void *genctx
, void *templ
)
385 struct dh_gen_ctx
*gctx
= genctx
;
388 if (gctx
== NULL
|| dh
== NULL
)
390 gctx
->ffc_params
= dh_get0_params(dh
);
394 static int dh_set_gen_seed(struct dh_gen_ctx
*gctx
, unsigned char *seed
,
397 OPENSSL_clear_free(gctx
->seed
, gctx
->seedlen
);
400 if (seed
!= NULL
&& seedlen
> 0) {
401 gctx
->seed
= OPENSSL_memdup(seed
, seedlen
);
402 if (gctx
->seed
== NULL
)
404 gctx
->seedlen
= seedlen
;
409 static int dh_gen_set_params(void *genctx
, const OSSL_PARAM params
[])
411 struct dh_gen_ctx
*gctx
= genctx
;
417 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_TYPE
);
419 if (p
->data_type
!= OSSL_PARAM_UTF8_STRING
420 || ((gctx
->gen_type
= dh_gen_type_name2id(p
->data
)) == -1)) {
421 ERR_raise(ERR_LIB_PROV
, ERR_R_PASSED_INVALID_ARGUMENT
);
425 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_GROUP
);
427 if (p
->data_type
!= OSSL_PARAM_UTF8_STRING
428 || ((gctx
->group_nid
= ffc_named_group_to_uid(p
->data
)) == NID_undef
)) {
429 ERR_raise(ERR_LIB_PROV
, ERR_R_PASSED_INVALID_ARGUMENT
);
432 gctx
->gen_type
= DH_PARAMGEN_TYPE_GROUP
;
434 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_GENERATOR
);
436 && !OSSL_PARAM_get_int(p
, &gctx
->generator
))
438 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_GINDEX
);
440 && !OSSL_PARAM_get_int(p
, &gctx
->gindex
))
442 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_PCOUNTER
);
444 && !OSSL_PARAM_get_int(p
, &gctx
->pcounter
))
446 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_H
);
448 && !OSSL_PARAM_get_int(p
, &gctx
->hindex
))
450 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_SEED
);
452 && (p
->data_type
!= OSSL_PARAM_OCTET_STRING
453 || !dh_set_gen_seed(gctx
, p
->data
, p
->data_size
)))
456 if ((p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_PBITS
)) != NULL
457 && !OSSL_PARAM_get_size_t(p
, &gctx
->pbits
))
459 if ((p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_QBITS
)) != NULL
460 && !OSSL_PARAM_get_size_t(p
, &gctx
->qbits
))
462 p
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_DIGEST
);
464 const OSSL_PARAM
*p1
;
465 char mdprops
[OSSL_MAX_PROPQUERY_SIZE
] = { '\0' };
468 if (p
->data_type
!= OSSL_PARAM_UTF8_STRING
)
470 p1
= OSSL_PARAM_locate_const(params
, OSSL_PKEY_PARAM_FFC_DIGEST_PROPS
);
472 && !OSSL_PARAM_get_utf8_string(p1
, &str
, sizeof(mdprops
)))
474 EVP_MD_free(gctx
->md
);
475 gctx
->md
= EVP_MD_fetch(gctx
->libctx
, p
->data
, mdprops
);
476 if (gctx
->md
== NULL
)
482 static const OSSL_PARAM
*dh_gen_settable_params(void *provctx
)
484 static OSSL_PARAM settable
[] = {
485 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_GROUP
, NULL
, 0),
486 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE
, NULL
, 0),
487 OSSL_PARAM_size_t(OSSL_PKEY_PARAM_FFC_PBITS
, NULL
),
488 OSSL_PARAM_size_t(OSSL_PKEY_PARAM_FFC_QBITS
, NULL
),
489 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST
, NULL
, 0),
490 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST_PROPS
, NULL
, 0),
491 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GINDEX
, NULL
),
492 OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_FFC_SEED
, NULL
, 0),
493 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GENERATOR
, NULL
),
494 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_PCOUNTER
, NULL
),
495 OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_H
, NULL
),
501 static int dh_gencb(int p
, int n
, BN_GENCB
*cb
)
503 struct dh_gen_ctx
*gctx
= BN_GENCB_get_arg(cb
);
504 OSSL_PARAM params
[] = { OSSL_PARAM_END
, OSSL_PARAM_END
, OSSL_PARAM_END
};
506 params
[0] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_POTENTIAL
, &p
);
507 params
[1] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_ITERATION
, &n
);
509 return gctx
->cb(params
, gctx
->cbarg
);
512 static void *dh_gen(void *genctx
, OSSL_CALLBACK
*osslcb
, void *cbarg
)
515 struct dh_gen_ctx
*gctx
= genctx
;
517 BN_GENCB
*gencb
= NULL
;
523 /* For parameter generation - If there is a group name just create it */
524 if (gctx
->gen_type
== DH_PARAMGEN_TYPE_GROUP
) {
525 /* Select a named group if there is not one already */
526 if (gctx
->group_nid
== NID_undef
)
527 gctx
->group_nid
= dh_get_named_group_uid_from_size(gctx
->pbits
);
528 if (gctx
->group_nid
== NID_undef
)
530 dh
= dh_new_by_nid_with_libctx(gctx
->libctx
, gctx
->group_nid
);
533 ffc
= dh_get0_params(dh
);
535 dh
= dh_new_with_libctx(gctx
->libctx
);
538 ffc
= dh_get0_params(dh
);
540 /* Copy the template value if one was passed */
541 if (gctx
->ffc_params
!= NULL
542 && !ffc_params_copy(ffc
, gctx
->ffc_params
))
545 if (!ffc_params_set_seed(ffc
, gctx
->seed
, gctx
->seedlen
))
547 if (gctx
->gindex
!= -1) {
548 ffc_params_set_gindex(ffc
, gctx
->gindex
);
549 if (gctx
->pcounter
!= -1)
550 ffc_params_set_pcounter(ffc
, gctx
->pcounter
);
551 } else if (gctx
->hindex
!= 0) {
552 ffc_params_set_h(ffc
, gctx
->hindex
);
556 gencb
= BN_GENCB_new();
558 BN_GENCB_set(gencb
, dh_gencb
, genctx
);
560 if ((gctx
->selection
& OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS
) != 0) {
562 * NOTE: The old safe prime generator code is not used in fips mode,
563 * (i.e internally it ignores the generator and chooses a named
564 * group based on pbits.
566 if (gctx
->gen_type
== DH_PARAMGEN_TYPE_GENERATOR
)
567 ret
= DH_generate_parameters_ex(dh
, gctx
->pbits
,
568 gctx
->generator
, gencb
);
570 ret
= dh_generate_ffc_parameters(dh
, gctx
->gen_type
, gctx
->pbits
,
571 gctx
->qbits
, gctx
->md
, gencb
);
577 if ((gctx
->selection
& OSSL_KEYMGMT_SELECT_KEYPAIR
) != 0) {
578 if (ffc
->p
== NULL
|| ffc
->g
== NULL
)
580 if (DH_generate_key(dh
) <= 0)
589 BN_GENCB_free(gencb
);
593 static void dh_gen_cleanup(void *genctx
)
595 struct dh_gen_ctx
*gctx
= genctx
;
600 OPENSSL_clear_free(gctx
->seed
, gctx
->seedlen
);
601 EVP_MD_free(gctx
->md
);
605 const OSSL_DISPATCH dh_keymgmt_functions
[] = {
606 { OSSL_FUNC_KEYMGMT_NEW
, (void (*)(void))dh_newdata
},
607 { OSSL_FUNC_KEYMGMT_GEN_INIT
, (void (*)(void))dh_gen_init
},
608 { OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE
, (void (*)(void))dh_gen_set_template
},
609 { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS
, (void (*)(void))dh_gen_set_params
},
610 { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS
,
611 (void (*)(void))dh_gen_settable_params
},
612 { OSSL_FUNC_KEYMGMT_GEN
, (void (*)(void))dh_gen
},
613 { OSSL_FUNC_KEYMGMT_GEN_CLEANUP
, (void (*)(void))dh_gen_cleanup
},
614 { OSSL_FUNC_KEYMGMT_FREE
, (void (*)(void))dh_freedata
},
615 { OSSL_FUNC_KEYMGMT_GET_PARAMS
, (void (*) (void))dh_get_params
},
616 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS
, (void (*) (void))dh_gettable_params
},
617 { OSSL_FUNC_KEYMGMT_HAS
, (void (*)(void))dh_has
},
618 { OSSL_FUNC_KEYMGMT_MATCH
, (void (*)(void))dh_match
},
619 { OSSL_FUNC_KEYMGMT_VALIDATE
, (void (*)(void))dh_validate
},
620 { OSSL_FUNC_KEYMGMT_IMPORT
, (void (*)(void))dh_import
},
621 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES
, (void (*)(void))dh_import_types
},
622 { OSSL_FUNC_KEYMGMT_EXPORT
, (void (*)(void))dh_export
},
623 { OSSL_FUNC_KEYMGMT_EXPORT_TYPES
, (void (*)(void))dh_export_types
},