Coverage Report

Created: 2025-10-10 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/providers/implementations/keymgmt/dh_kmgmt.c
Line
Count
Source
1
/*
2
 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 *
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
8
 */
9
10
11
/*
12
 * DH low level APIs are deprecated for public use, but still ok for
13
 * internal use.
14
 */
15
#include "internal/deprecated.h"
16
#include "internal/common.h"
17
18
#include <string.h> /* strcmp */
19
#include <openssl/core_dispatch.h>
20
#include <openssl/core_names.h>
21
#include <openssl/bn.h>
22
#include <openssl/err.h>
23
#include <openssl/self_test.h>
24
#include <openssl/proverr.h>
25
#include "prov/implementations.h"
26
#include "prov/providercommon.h"
27
#include "prov/provider_ctx.h"
28
#include "crypto/dh.h"
29
#include "internal/fips.h"
30
#include "internal/sizes.h"
31
32
static OSSL_FUNC_keymgmt_new_fn dh_newdata;
33
static OSSL_FUNC_keymgmt_free_fn dh_freedata;
34
static OSSL_FUNC_keymgmt_gen_init_fn dh_gen_init;
35
static OSSL_FUNC_keymgmt_gen_init_fn dhx_gen_init;
36
static OSSL_FUNC_keymgmt_gen_set_template_fn dh_gen_set_template;
37
static OSSL_FUNC_keymgmt_gen_set_params_fn dh_gen_set_params;
38
static OSSL_FUNC_keymgmt_gen_settable_params_fn dh_gen_settable_params;
39
static OSSL_FUNC_keymgmt_gen_fn dh_gen;
40
static OSSL_FUNC_keymgmt_gen_cleanup_fn dh_gen_cleanup;
41
static OSSL_FUNC_keymgmt_load_fn dh_load;
42
static OSSL_FUNC_keymgmt_get_params_fn dh_get_params;
43
static OSSL_FUNC_keymgmt_gettable_params_fn dh_gettable_params;
44
static OSSL_FUNC_keymgmt_set_params_fn dh_set_params;
45
static OSSL_FUNC_keymgmt_settable_params_fn dh_settable_params;
46
static OSSL_FUNC_keymgmt_has_fn dh_has;
47
static OSSL_FUNC_keymgmt_match_fn dh_match;
48
static OSSL_FUNC_keymgmt_validate_fn dh_validate;
49
static OSSL_FUNC_keymgmt_import_fn dh_import;
50
static OSSL_FUNC_keymgmt_import_types_fn dh_import_types;
51
static OSSL_FUNC_keymgmt_export_fn dh_export;
52
static OSSL_FUNC_keymgmt_export_types_fn dh_export_types;
53
static OSSL_FUNC_keymgmt_dup_fn dh_dup;
54
55
#define DH_POSSIBLE_SELECTIONS                                                 \
56
0
    (OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS)
57
58
struct dh_gen_ctx {
59
    OSSL_LIB_CTX *libctx;
60
61
    FFC_PARAMS *ffc_params;
62
    int selection;
63
    /* All these parameters are used for parameter generation only */
64
    /* If there is a group name then the remaining parameters are not needed */
65
    int group_nid;
66
    size_t pbits;
67
    size_t qbits;
68
    unsigned char *seed; /* optional FIPS186-4 param for testing */
69
    size_t seedlen;
70
    int gindex; /* optional  FIPS186-4 generator index (ignored if -1) */
71
    int gen_type; /* see dhtype2id */
72
    int generator; /* Used by DH_PARAMGEN_TYPE_GENERATOR in non fips mode only */
73
    int pcounter;
74
    int hindex;
75
    int priv_len;
76
77
    char *mdname;
78
    char *mdprops;
79
    OSSL_CALLBACK *cb;
80
    void *cbarg;
81
    int dh_type;
82
};
83
84
static int dh_gen_type_name2id_w_default(const char *name, int type)
85
0
{
86
0
    if (strcmp(name, "default") == 0) {
87
#ifdef FIPS_MODULE
88
        if (type == DH_FLAG_TYPE_DHX)
89
            return DH_PARAMGEN_TYPE_FIPS_186_4;
90
91
        return DH_PARAMGEN_TYPE_GROUP;
92
#else
93
0
        if (type == DH_FLAG_TYPE_DHX)
94
0
            return DH_PARAMGEN_TYPE_FIPS_186_2;
95
96
0
        return DH_PARAMGEN_TYPE_GENERATOR;
97
0
#endif
98
0
    }
99
100
0
    return ossl_dh_gen_type_name2id(name, type);
101
0
}
102
103
static void *dh_newdata(void *provctx)
104
0
{
105
0
    DH *dh = NULL;
106
107
0
    if (ossl_prov_is_running()) {
108
0
        dh = ossl_dh_new_ex(PROV_LIBCTX_OF(provctx));
109
0
        if (dh != NULL) {
110
0
            DH_clear_flags(dh, DH_FLAG_TYPE_MASK);
111
0
            DH_set_flags(dh, DH_FLAG_TYPE_DH);
112
0
        }
113
0
    }
114
0
    return dh;
115
0
}
116
117
static void *dhx_newdata(void *provctx)
118
0
{
119
0
    DH *dh = NULL;
120
121
0
    dh = ossl_dh_new_ex(PROV_LIBCTX_OF(provctx));
122
0
    if (dh != NULL) {
123
0
        DH_clear_flags(dh, DH_FLAG_TYPE_MASK);
124
0
        DH_set_flags(dh, DH_FLAG_TYPE_DHX);
125
0
    }
126
0
    return dh;
127
0
}
128
129
static void dh_freedata(void *keydata)
130
0
{
131
0
    DH_free(keydata);
132
0
}
133
134
static int dh_has(const void *keydata, int selection)
135
0
{
136
0
    const DH *dh = keydata;
137
0
    int ok = 1;
138
139
0
    if (!ossl_prov_is_running() || dh == NULL)
140
0
        return 0;
141
0
    if ((selection & DH_POSSIBLE_SELECTIONS) == 0)
142
0
        return 1; /* the selection is not missing */
143
144
0
    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
145
0
        ok = ok && (DH_get0_pub_key(dh) != NULL);
146
0
    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
147
0
        ok = ok && (DH_get0_priv_key(dh) != NULL);
148
0
    if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0)
149
0
        ok = ok && (DH_get0_p(dh) != NULL && DH_get0_g(dh) != NULL);
150
0
    return ok;
151
0
}
152
153
static int dh_match(const void *keydata1, const void *keydata2, int selection)
154
0
{
155
0
    const DH *dh1 = keydata1;
156
0
    const DH *dh2 = keydata2;
157
0
    int ok = 1;
158
159
0
    if (!ossl_prov_is_running())
160
0
        return 0;
161
162
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
163
0
        int key_checked = 0;
164
165
0
        if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
166
0
            const BIGNUM *pa = DH_get0_pub_key(dh1);
167
0
            const BIGNUM *pb = DH_get0_pub_key(dh2);
168
169
0
            if (pa != NULL && pb != NULL) {
170
0
                ok = ok && BN_cmp(pa, pb) == 0;
171
0
                key_checked = 1;
172
0
            }
173
0
        }
174
0
        if (!key_checked
175
0
            && (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
176
0
            const BIGNUM *pa = DH_get0_priv_key(dh1);
177
0
            const BIGNUM *pb = DH_get0_priv_key(dh2);
178
179
0
            if (pa != NULL && pb != NULL) {
180
0
                ok = ok && BN_cmp(pa, pb) == 0;
181
0
                key_checked = 1;
182
0
            }
183
0
        }
184
0
        ok = ok && key_checked;
185
0
    }
186
0
    if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) {
187
0
        FFC_PARAMS *dhparams1 = ossl_dh_get0_params((DH *)dh1);
188
0
        FFC_PARAMS *dhparams2 = ossl_dh_get0_params((DH *)dh2);
189
190
0
        ok = ok && ossl_ffc_params_cmp(dhparams1, dhparams2, 1);
191
0
    }
192
0
    return ok;
193
0
}
194
195
static int dh_import(void *keydata, int selection, const OSSL_PARAM params[])
196
0
{
197
0
    DH *dh = keydata;
198
0
    int ok = 1;
199
200
0
    if (!ossl_prov_is_running() || dh == NULL)
201
0
        return 0;
202
203
0
    if ((selection & DH_POSSIBLE_SELECTIONS) == 0)
204
0
        return 0;
205
206
    /* a key without parameters is meaningless */
207
0
    ok = ok && ossl_dh_params_fromdata(dh, params);
208
209
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
210
0
        int include_private =
211
0
            selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
212
213
0
        ok = ok && ossl_dh_key_fromdata(dh, params, include_private);
214
0
    }
215
216
0
    return ok;
217
0
}
218
219
static int dh_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
220
                     void *cbarg)
221
0
{
222
0
    DH *dh = keydata;
223
0
    OSSL_PARAM_BLD *tmpl = NULL;
224
0
    OSSL_PARAM *params = NULL;
225
0
    int ok = 1;
226
227
0
    if (!ossl_prov_is_running() || dh == NULL)
228
0
        return 0;
229
230
0
    if ((selection & DH_POSSIBLE_SELECTIONS) == 0)
231
0
        return 0;
232
233
0
    tmpl = OSSL_PARAM_BLD_new();
234
0
    if (tmpl == NULL)
235
0
        return 0;
236
237
0
    if ((selection & OSSL_KEYMGMT_SELECT_ALL_PARAMETERS) != 0)
238
0
        ok = ok && ossl_dh_params_todata(dh, tmpl, NULL, NULL);
239
240
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
241
0
        int include_private =
242
0
            selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
243
244
0
        ok = ok && ossl_dh_key_todata(dh, tmpl, NULL, NULL, include_private);
245
0
    }
246
247
0
    if (!ok || (params = OSSL_PARAM_BLD_to_param(tmpl)) == NULL) {
248
0
        ok = 0;
249
0
        goto err;
250
0
    }
251
252
0
    ok = param_cb(params, cbarg);
253
0
    OSSL_PARAM_free(params);
254
0
err:
255
0
    OSSL_PARAM_BLD_free(tmpl);
256
0
    return ok;
257
0
}
258
259
/* IMEXPORT = IMPORT + EXPORT */
260
261
/* These must be kept in sync with the dh_get_params ones below */
262
# define DH_IMEXPORTABLE_PARAMETERS                                            \
263
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, NULL, 0),                             \
264
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_Q, NULL, 0),                             \
265
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, NULL, 0),                             \
266
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_COFACTOR, NULL, 0),                      \
267
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GINDEX, NULL),                          \
268
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, NULL),                        \
269
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_H, NULL),                               \
270
    OSSL_PARAM_int(OSSL_PKEY_PARAM_DH_PRIV_LEN, NULL),                         \
271
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_FFC_SEED, NULL, 0),                \
272
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, NULL, 0)
273
# define DH_IMEXPORTABLE_PUBLIC_KEY                                            \
274
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0)
275
# define DH_IMEXPORTABLE_PRIVATE_KEY                                           \
276
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0)
277
static const OSSL_PARAM dh_all_types[] = {
278
    DH_IMEXPORTABLE_PARAMETERS,
279
    DH_IMEXPORTABLE_PUBLIC_KEY,
280
    DH_IMEXPORTABLE_PRIVATE_KEY,
281
    OSSL_PARAM_END
282
};
283
static const OSSL_PARAM dh_parameter_types[] = {
284
    DH_IMEXPORTABLE_PARAMETERS,
285
    OSSL_PARAM_END
286
};
287
static const OSSL_PARAM dh_key_types[] = {
288
    DH_IMEXPORTABLE_PUBLIC_KEY,
289
    DH_IMEXPORTABLE_PRIVATE_KEY,
290
    OSSL_PARAM_END
291
};
292
static const OSSL_PARAM *dh_types[] = {
293
    NULL,                        /* Index 0 = none of them */
294
    dh_parameter_types,          /* Index 1 = parameter types */
295
    dh_key_types,                /* Index 2 = key types */
296
    dh_all_types                 /* Index 3 = 1 + 2 */
297
};
298
299
static const OSSL_PARAM *dh_imexport_types(int selection)
300
0
{
301
0
    int type_select = 0;
302
303
0
    if ((selection & OSSL_KEYMGMT_SELECT_ALL_PARAMETERS) != 0)
304
0
        type_select += 1;
305
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
306
0
        type_select += 2;
307
0
    return dh_types[type_select];
308
0
}
309
310
static const OSSL_PARAM *dh_import_types(int selection)
311
0
{
312
0
    return dh_imexport_types(selection);
313
0
}
314
315
static const OSSL_PARAM *dh_export_types(int selection)
316
0
{
317
0
    return dh_imexport_types(selection);
318
0
}
319
320
struct dh_params_st {
321
    FFC_OSSL_PARAMS ffp;
322
    OSSL_PARAM *bits;
323
    OSSL_PARAM *secbits;
324
    OSSL_PARAM *maxsize;
325
    OSSL_PARAM *seccat;
326
    OSSL_PARAM *privkey;
327
    OSSL_PARAM *privlen;
328
    OSSL_PARAM *pubkey;
329
    OSSL_PARAM *encpubkey;
330
};
331
332
#define dh_get_params_st dh_params_st
333
334
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
335
#ifndef dh_get_params_list
336
static const OSSL_PARAM dh_get_params_list[] = {
337
    OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL),
338
    OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL),
339
    OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL),
340
    OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_CATEGORY, NULL),
341
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY, NULL, 0),
342
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_P, NULL, 0),
343
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_Q, NULL, 0),
344
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_G, NULL, 0),
345
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_FFC_COFACTOR, NULL, 0),
346
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GINDEX, NULL),
347
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, NULL),
348
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_H, NULL),
349
    OSSL_PARAM_int(OSSL_PKEY_PARAM_DH_PRIV_LEN, NULL),
350
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_FFC_SEED, NULL, 0),
351
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, NULL, 0),
352
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0),
353
    OSSL_PARAM_BN(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0),
354
    OSSL_PARAM_END
355
};
356
#endif
357
358
#ifndef dh_get_params_st
359
struct dh_get_params_st {
360
    OSSL_PARAM *bits;
361
    OSSL_PARAM *encpubkey;
362
    OSSL_PARAM *ffp.cofactor;
363
    OSSL_PARAM *ffp.g;
364
    OSSL_PARAM *ffp.g_index;
365
    OSSL_PARAM *ffp.group_name;
366
    OSSL_PARAM *ffp.h;
367
    OSSL_PARAM *ffp.p;
368
    OSSL_PARAM *ffp.p_counter;
369
    OSSL_PARAM *ffp.q;
370
    OSSL_PARAM *ffp.seed;
371
    OSSL_PARAM *maxsize;
372
    OSSL_PARAM *privkey;
373
    OSSL_PARAM *privlen;
374
    OSSL_PARAM *pubkey;
375
    OSSL_PARAM *secbits;
376
    OSSL_PARAM *seccat;
377
};
378
#endif
379
380
#ifndef dh_get_params_decoder
381
static int dh_get_params_decoder
382
    (const OSSL_PARAM *p, struct dh_get_params_st *r)
383
0
{
384
0
    const char *s;
385
386
0
    memset(r, 0, sizeof(*r));
387
0
    if (p != NULL)
388
0
        for (; (s = p->key) != NULL; p++)
389
0
            switch(s[0]) {
390
0
            default:
391
0
                break;
392
0
            case 'b':
393
0
                if (ossl_likely(strcmp("its", s + 1) == 0)) {
394
                    /* OSSL_PKEY_PARAM_BITS */
395
0
                    if (ossl_unlikely(r->bits != NULL)) {
396
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
397
0
                                       "param %s is repeated", s);
398
0
                        return 0;
399
0
                    }
400
0
                    r->bits = (OSSL_PARAM *)p;
401
0
                }
402
0
                break;
403
0
            case 'e':
404
0
                if (ossl_likely(strcmp("ncoded-pub-key", s + 1) == 0)) {
405
                    /* OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY */
406
0
                    if (ossl_unlikely(r->encpubkey != NULL)) {
407
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
408
0
                                       "param %s is repeated", s);
409
0
                        return 0;
410
0
                    }
411
0
                    r->encpubkey = (OSSL_PARAM *)p;
412
0
                }
413
0
                break;
414
0
            case 'g':
415
0
                switch(s[1]) {
416
0
                default:
417
0
                    break;
418
0
                case 'i':
419
0
                    if (ossl_likely(strcmp("ndex", s + 2) == 0)) {
420
                        /* OSSL_PKEY_PARAM_FFC_GINDEX */
421
0
                        if (ossl_unlikely(r->ffp.g_index != NULL)) {
422
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
423
0
                                           "param %s is repeated", s);
424
0
                            return 0;
425
0
                        }
426
0
                        r->ffp.g_index = (OSSL_PARAM *)p;
427
0
                    }
428
0
                    break;
429
0
                case 'r':
430
0
                    if (ossl_likely(strcmp("oup", s + 2) == 0)) {
431
                        /* OSSL_PKEY_PARAM_GROUP_NAME */
432
0
                        if (ossl_unlikely(r->ffp.group_name != NULL)) {
433
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
434
0
                                           "param %s is repeated", s);
435
0
                            return 0;
436
0
                        }
437
0
                        r->ffp.group_name = (OSSL_PARAM *)p;
438
0
                    }
439
0
                    break;
440
0
                case '\0':
441
0
                    if (ossl_unlikely(r->ffp.g != NULL)) {
442
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
443
0
                                       "param %s is repeated", s);
444
0
                        return 0;
445
0
                    }
446
0
                    r->ffp.g = (OSSL_PARAM *)p;
447
0
                }
448
0
                break;
449
0
            case 'h':
450
0
                if (ossl_likely(strcmp("index", s + 1) == 0)) {
451
                    /* OSSL_PKEY_PARAM_FFC_H */
452
0
                    if (ossl_unlikely(r->ffp.h != NULL)) {
453
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
454
0
                                       "param %s is repeated", s);
455
0
                        return 0;
456
0
                    }
457
0
                    r->ffp.h = (OSSL_PARAM *)p;
458
0
                }
459
0
                break;
460
0
            case 'j':
461
0
                switch(s[1]) {
462
0
                default:
463
0
                    break;
464
0
                case '\0':
465
0
                    if (ossl_unlikely(r->ffp.cofactor != NULL)) {
466
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
467
0
                                       "param %s is repeated", s);
468
0
                        return 0;
469
0
                    }
470
0
                    r->ffp.cofactor = (OSSL_PARAM *)p;
471
0
                }
472
0
                break;
473
0
            case 'm':
474
0
                if (ossl_likely(strcmp("ax-size", s + 1) == 0)) {
475
                    /* OSSL_PKEY_PARAM_MAX_SIZE */
476
0
                    if (ossl_unlikely(r->maxsize != NULL)) {
477
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
478
0
                                       "param %s is repeated", s);
479
0
                        return 0;
480
0
                    }
481
0
                    r->maxsize = (OSSL_PARAM *)p;
482
0
                }
483
0
                break;
484
0
            case 'p':
485
0
                switch(s[1]) {
486
0
                default:
487
0
                    break;
488
0
                case 'c':
489
0
                    if (ossl_likely(strcmp("ounter", s + 2) == 0)) {
490
                        /* OSSL_PKEY_PARAM_FFC_PCOUNTER */
491
0
                        if (ossl_unlikely(r->ffp.p_counter != NULL)) {
492
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
493
0
                                           "param %s is repeated", s);
494
0
                            return 0;
495
0
                        }
496
0
                        r->ffp.p_counter = (OSSL_PARAM *)p;
497
0
                    }
498
0
                    break;
499
0
                case 'r':
500
0
                    switch(s[2]) {
501
0
                    default:
502
0
                        break;
503
0
                    case 'i':
504
0
                        switch(s[3]) {
505
0
                        default:
506
0
                            break;
507
0
                        case 'v':
508
0
                            switch(s[4]) {
509
0
                            default:
510
0
                                break;
511
0
                            case '_':
512
0
                                if (ossl_likely(strcmp("len", s + 5) == 0)) {
513
                                    /* OSSL_PKEY_PARAM_DH_PRIV_LEN */
514
0
                                    if (ossl_unlikely(r->privlen != NULL)) {
515
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
516
0
                                                       "param %s is repeated", s);
517
0
                                        return 0;
518
0
                                    }
519
0
                                    r->privlen = (OSSL_PARAM *)p;
520
0
                                }
521
0
                                break;
522
0
                            case '\0':
523
0
                                if (ossl_unlikely(r->privkey != NULL)) {
524
0
                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
525
0
                                                   "param %s is repeated", s);
526
0
                                    return 0;
527
0
                                }
528
0
                                r->privkey = (OSSL_PARAM *)p;
529
0
                            }
530
0
                        }
531
0
                    }
532
0
                    break;
533
0
                case 'u':
534
0
                    if (ossl_likely(strcmp("b", s + 2) == 0)) {
535
                        /* OSSL_PKEY_PARAM_PUB_KEY */
536
0
                        if (ossl_unlikely(r->pubkey != NULL)) {
537
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
538
0
                                           "param %s is repeated", s);
539
0
                            return 0;
540
0
                        }
541
0
                        r->pubkey = (OSSL_PARAM *)p;
542
0
                    }
543
0
                    break;
544
0
                case '\0':
545
0
                    if (ossl_unlikely(r->ffp.p != NULL)) {
546
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
547
0
                                       "param %s is repeated", s);
548
0
                        return 0;
549
0
                    }
550
0
                    r->ffp.p = (OSSL_PARAM *)p;
551
0
                }
552
0
                break;
553
0
            case 'q':
554
0
                switch(s[1]) {
555
0
                default:
556
0
                    break;
557
0
                case '\0':
558
0
                    if (ossl_unlikely(r->ffp.q != NULL)) {
559
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
560
0
                                       "param %s is repeated", s);
561
0
                        return 0;
562
0
                    }
563
0
                    r->ffp.q = (OSSL_PARAM *)p;
564
0
                }
565
0
                break;
566
0
            case 's':
567
0
                switch(s[1]) {
568
0
                default:
569
0
                    break;
570
0
                case 'e':
571
0
                    switch(s[2]) {
572
0
                    default:
573
0
                        break;
574
0
                    case 'c':
575
0
                        switch(s[3]) {
576
0
                        default:
577
0
                            break;
578
0
                        case 'u':
579
0
                            switch(s[4]) {
580
0
                            default:
581
0
                                break;
582
0
                            case 'r':
583
0
                                switch(s[5]) {
584
0
                                default:
585
0
                                    break;
586
0
                                case 'i':
587
0
                                    switch(s[6]) {
588
0
                                    default:
589
0
                                        break;
590
0
                                    case 't':
591
0
                                        switch(s[7]) {
592
0
                                        default:
593
0
                                            break;
594
0
                                        case 'y':
595
0
                                            switch(s[8]) {
596
0
                                            default:
597
0
                                                break;
598
0
                                            case '-':
599
0
                                                switch(s[9]) {
600
0
                                                default:
601
0
                                                    break;
602
0
                                                case 'b':
603
0
                                                    if (ossl_likely(strcmp("its", s + 10) == 0)) {
604
                                                        /* OSSL_PKEY_PARAM_SECURITY_BITS */
605
0
                                                        if (ossl_unlikely(r->secbits != NULL)) {
606
0
                                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
607
0
                                                                           "param %s is repeated", s);
608
0
                                                            return 0;
609
0
                                                        }
610
0
                                                        r->secbits = (OSSL_PARAM *)p;
611
0
                                                    }
612
0
                                                    break;
613
0
                                                case 'c':
614
0
                                                    if (ossl_likely(strcmp("ategory", s + 10) == 0)) {
615
                                                        /* OSSL_PKEY_PARAM_SECURITY_CATEGORY */
616
0
                                                        if (ossl_unlikely(r->seccat != NULL)) {
617
0
                                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
618
0
                                                                           "param %s is repeated", s);
619
0
                                                            return 0;
620
0
                                                        }
621
0
                                                        r->seccat = (OSSL_PARAM *)p;
622
0
                                                    }
623
0
                                                }
624
0
                                            }
625
0
                                        }
626
0
                                    }
627
0
                                }
628
0
                            }
629
0
                        }
630
0
                        break;
631
0
                    case 'e':
632
0
                        if (ossl_likely(strcmp("d", s + 3) == 0)) {
633
                            /* OSSL_PKEY_PARAM_FFC_SEED */
634
0
                            if (ossl_unlikely(r->ffp.seed != NULL)) {
635
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
636
0
                                               "param %s is repeated", s);
637
0
                                return 0;
638
0
                            }
639
0
                            r->ffp.seed = (OSSL_PARAM *)p;
640
0
                        }
641
0
                    }
642
0
                }
643
0
            }
644
0
    return 1;
645
0
}
646
#endif
647
/* End of machine generated */
648
649
static int dh_get_params(void *key, OSSL_PARAM params[])
650
0
{
651
0
    DH *dh = key;
652
0
    struct dh_params_st p;
653
654
0
    if (key == NULL || !dh_get_params_decoder(params, &p))
655
0
        return 0;
656
657
0
    if (p.bits != NULL && !OSSL_PARAM_set_int(p.bits, DH_bits(dh)))
658
0
        return 0;
659
660
0
    if (p.secbits != NULL && !OSSL_PARAM_set_int(p.secbits, DH_security_bits(dh)))
661
0
        return 0;
662
663
0
    if (p.maxsize != NULL && !OSSL_PARAM_set_int(p.maxsize, DH_size(dh)))
664
0
        return 0;
665
666
0
    if (p.encpubkey != NULL) {
667
0
        if (p.encpubkey->data_type != OSSL_PARAM_OCTET_STRING)
668
0
            return 0;
669
0
        p.encpubkey->return_size = ossl_dh_key2buf(dh, (unsigned char **)&p.encpubkey->data,
670
0
                                                   p.encpubkey->data_size, 0);
671
0
        if (p.encpubkey->return_size == 0)
672
0
            return 0;
673
0
    }
674
675
0
    if (p.seccat != NULL)
676
0
        if (!OSSL_PARAM_set_int(p.seccat, 0))
677
0
            return 0;
678
679
0
    return ossl_dh_params_todata(dh, NULL, p.privlen, &p.ffp)
680
0
        && ossl_dh_key_todata(dh, NULL, p.pubkey, p.privkey, 1);
681
0
}
682
683
static const OSSL_PARAM *dh_gettable_params(void *provctx)
684
0
{
685
0
    return dh_get_params_list;
686
0
}
687
688
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
689
#ifndef dh_set_params_list
690
static const OSSL_PARAM dh_set_params_list[] = {
691
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY, NULL, 0),
692
    OSSL_PARAM_END
693
};
694
#endif
695
696
#ifndef dh_set_params_st
697
struct dh_set_params_st {
698
    OSSL_PARAM *encpubkey;
699
};
700
#endif
701
702
#ifndef dh_set_params_decoder
703
static int dh_set_params_decoder
704
    (const OSSL_PARAM *p, struct dh_set_params_st *r)
705
0
{
706
0
    const char *s;
707
708
0
    memset(r, 0, sizeof(*r));
709
0
    if (p != NULL)
710
0
        for (; (s = p->key) != NULL; p++)
711
0
            if (ossl_likely(strcmp("encoded-pub-key", s + 0) == 0)) {
712
                /* OSSL_PKEY_PARAM_ENCODED_PUBLIC_KEY */
713
0
                if (ossl_unlikely(r->encpubkey != NULL)) {
714
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
715
0
                                   "param %s is repeated", s);
716
0
                    return 0;
717
0
                }
718
0
                r->encpubkey = (OSSL_PARAM *)p;
719
0
            }
720
0
    return 1;
721
0
}
722
#endif
723
/* End of machine generated */
724
725
static const OSSL_PARAM *dh_settable_params(void *provctx)
726
0
{
727
0
    return dh_set_params_list;
728
0
}
729
730
static int dh_set_params(void *key, const OSSL_PARAM params[])
731
0
{
732
0
    DH *dh = key;
733
0
    struct dh_set_params_st p;
734
735
0
    if (key == NULL || !dh_set_params_decoder(params, &p))
736
0
        return 0;
737
738
0
    if (p.encpubkey != NULL
739
0
            && (p.encpubkey->data_type != OSSL_PARAM_OCTET_STRING
740
0
                || !ossl_dh_buf2key(dh, p.encpubkey->data,
741
0
                                    p.encpubkey->data_size)))
742
0
        return 0;
743
744
0
    return 1;
745
0
}
746
747
static int dh_validate_public(const DH *dh, int checktype)
748
0
{
749
0
    const BIGNUM *pub_key = NULL;
750
0
    int res = 0;
751
752
0
    DH_get0_key(dh, &pub_key, NULL);
753
0
    if (pub_key == NULL)
754
0
        return 0;
755
756
    /*
757
     * The partial test is only valid for named group's with q = (p - 1) / 2
758
     * but for that case it is also fully sufficient to check the key validity.
759
     */
760
0
    if (ossl_dh_is_named_safe_prime_group(dh))
761
0
        return ossl_dh_check_pub_key_partial(dh, pub_key, &res);
762
763
0
    return DH_check_pub_key_ex(dh, pub_key);
764
0
}
765
766
static int dh_validate_private(const DH *dh)
767
0
{
768
0
    int status = 0;
769
0
    const BIGNUM *priv_key = NULL;
770
771
0
    DH_get0_key(dh, NULL, &priv_key);
772
0
    if (priv_key == NULL)
773
0
        return 0;
774
0
    return ossl_dh_check_priv_key(dh, priv_key, &status);
775
0
}
776
777
static int dh_validate(const void *keydata, int selection, int checktype)
778
0
{
779
0
    const DH *dh = keydata;
780
0
    int ok = 1;
781
782
0
    if (!ossl_prov_is_running())
783
0
        return 0;
784
785
0
    if ((selection & DH_POSSIBLE_SELECTIONS) == 0)
786
0
        return 1; /* nothing to validate */
787
788
0
    if ((selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) {
789
        /*
790
         * Both of these functions check parameters. DH_check_params_ex()
791
         * performs a lightweight check (e.g. it does not check that p is a
792
         * safe prime)
793
         */
794
0
        if (checktype == OSSL_KEYMGMT_VALIDATE_QUICK_CHECK)
795
0
            ok = ok && DH_check_params_ex(dh);
796
0
        else
797
0
            ok = ok && DH_check_ex(dh);
798
0
    }
799
800
0
    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
801
0
        ok = ok && dh_validate_public(dh, checktype);
802
803
0
    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
804
0
        ok = ok && dh_validate_private(dh);
805
806
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR)
807
0
            == OSSL_KEYMGMT_SELECT_KEYPAIR)
808
0
        ok = ok && ossl_dh_check_pairwise(dh, 0);
809
0
    return ok;
810
0
}
811
812
static void *dh_gen_init_base(void *provctx, int selection,
813
                              const OSSL_PARAM params[], int type)
814
0
{
815
0
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
816
0
    struct dh_gen_ctx *gctx = NULL;
817
818
0
    if (!ossl_prov_is_running())
819
0
        return NULL;
820
821
0
    if ((selection & (OSSL_KEYMGMT_SELECT_KEYPAIR
822
0
                      | OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS)) == 0)
823
0
        return NULL;
824
825
0
    if ((gctx = OPENSSL_zalloc(sizeof(*gctx))) != NULL) {
826
0
        gctx->selection = selection;
827
0
        gctx->libctx = libctx;
828
0
        gctx->pbits = 2048;
829
0
        gctx->qbits = 224;
830
0
        gctx->mdname = NULL;
831
#ifdef FIPS_MODULE
832
        gctx->gen_type = (type == DH_FLAG_TYPE_DHX)
833
                         ? DH_PARAMGEN_TYPE_FIPS_186_4
834
                         : DH_PARAMGEN_TYPE_GROUP;
835
#else
836
0
        gctx->gen_type = (type == DH_FLAG_TYPE_DHX)
837
0
                         ? DH_PARAMGEN_TYPE_FIPS_186_2
838
0
                         : DH_PARAMGEN_TYPE_GENERATOR;
839
0
#endif
840
0
        gctx->gindex = -1;
841
0
        gctx->hindex = 0;
842
0
        gctx->pcounter = -1;
843
0
        gctx->generator = DH_GENERATOR_2;
844
0
        gctx->dh_type = type;
845
0
    }
846
0
    if (!dh_gen_set_params(gctx, params)) {
847
0
        OPENSSL_free(gctx);
848
0
        gctx = NULL;
849
0
    }
850
0
    return gctx;
851
0
}
852
853
static void *dh_gen_init(void *provctx, int selection,
854
                         const OSSL_PARAM params[])
855
0
{
856
0
    return dh_gen_init_base(provctx, selection, params, DH_FLAG_TYPE_DH);
857
0
}
858
859
static void *dhx_gen_init(void *provctx, int selection,
860
                          const OSSL_PARAM params[])
861
0
{
862
0
   return dh_gen_init_base(provctx, selection, params, DH_FLAG_TYPE_DHX);
863
0
}
864
865
static int dh_gen_set_template(void *genctx, void *templ)
866
0
{
867
0
    struct dh_gen_ctx *gctx = genctx;
868
0
    DH *dh = templ;
869
870
0
    if (!ossl_prov_is_running() || gctx == NULL || dh == NULL)
871
0
        return 0;
872
0
    gctx->ffc_params = ossl_dh_get0_params(dh);
873
0
    return 1;
874
0
}
875
876
static int dh_set_gen_seed(struct dh_gen_ctx *gctx, unsigned char *seed,
877
                           size_t seedlen)
878
0
{
879
0
    OPENSSL_clear_free(gctx->seed, gctx->seedlen);
880
0
    gctx->seed = NULL;
881
0
    gctx->seedlen = 0;
882
0
    if (seed != NULL && seedlen > 0) {
883
0
        gctx->seed = OPENSSL_memdup(seed, seedlen);
884
0
        if (gctx->seed == NULL)
885
0
            return 0;
886
0
        gctx->seedlen = seedlen;
887
0
    }
888
0
    return 1;
889
0
}
890
891
struct dh_gen_set_params_st {
892
    OSSL_PARAM *type;
893
    OSSL_PARAM *group_name;
894
    OSSL_PARAM *privlen;
895
    OSSL_PARAM *pbits;
896
    OSSL_PARAM *qbits;      /* DHX only */
897
    OSSL_PARAM *digest;     /* DHX only */
898
    OSSL_PARAM *propq;      /* DHX only */
899
    OSSL_PARAM *g_index;    /* DHX only */
900
    OSSL_PARAM *seed;       /* DHX only */
901
    OSSL_PARAM *p_counter;  /* DHX only */
902
    OSSL_PARAM *h;          /* DHX only */
903
    OSSL_PARAM *generator;  /* DH only */
904
};
905
906
#define dhx_gen_set_params_st dh_gen_set_params_st
907
908
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
909
#ifndef dhx_gen_set_params_list
910
static const OSSL_PARAM dhx_gen_set_params_list[] = {
911
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE, NULL, 0),
912
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, NULL, 0),
913
    OSSL_PARAM_int(OSSL_PKEY_PARAM_DH_PRIV_LEN, NULL),
914
    OSSL_PARAM_size_t(OSSL_PKEY_PARAM_FFC_PBITS, NULL),
915
    OSSL_PARAM_size_t(OSSL_PKEY_PARAM_FFC_QBITS, NULL),
916
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST, NULL, 0),
917
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_DIGEST_PROPS, NULL, 0),
918
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_GINDEX, NULL),
919
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_FFC_SEED, NULL, 0),
920
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_PCOUNTER, NULL),
921
    OSSL_PARAM_int(OSSL_PKEY_PARAM_FFC_H, NULL),
922
    OSSL_PARAM_END
923
};
924
#endif
925
926
#ifndef dhx_gen_set_params_st
927
struct dhx_gen_set_params_st {
928
    OSSL_PARAM *digest;
929
    OSSL_PARAM *g_index;
930
    OSSL_PARAM *group_name;
931
    OSSL_PARAM *h;
932
    OSSL_PARAM *p_counter;
933
    OSSL_PARAM *pbits;
934
    OSSL_PARAM *privlen;
935
    OSSL_PARAM *propq;
936
    OSSL_PARAM *qbits;
937
    OSSL_PARAM *seed;
938
    OSSL_PARAM *type;
939
};
940
#endif
941
942
#ifndef dhx_gen_set_params_decoder
943
static int dhx_gen_set_params_decoder
944
    (const OSSL_PARAM *p, struct dhx_gen_set_params_st *r)
945
0
{
946
0
    const char *s;
947
948
0
    memset(r, 0, sizeof(*r));
949
0
    if (p != NULL)
950
0
        for (; (s = p->key) != NULL; p++)
951
0
            switch(s[0]) {
952
0
            default:
953
0
                break;
954
0
            case 'd':
955
0
                if (ossl_likely(strcmp("igest", s + 1) == 0)) {
956
                    /* OSSL_PKEY_PARAM_FFC_DIGEST */
957
0
                    if (ossl_unlikely(r->digest != NULL)) {
958
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
959
0
                                       "param %s is repeated", s);
960
0
                        return 0;
961
0
                    }
962
0
                    r->digest = (OSSL_PARAM *)p;
963
0
                }
964
0
                break;
965
0
            case 'g':
966
0
                switch(s[1]) {
967
0
                default:
968
0
                    break;
969
0
                case 'i':
970
0
                    if (ossl_likely(strcmp("ndex", s + 2) == 0)) {
971
                        /* OSSL_PKEY_PARAM_FFC_GINDEX */
972
0
                        if (ossl_unlikely(r->g_index != NULL)) {
973
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
974
0
                                           "param %s is repeated", s);
975
0
                            return 0;
976
0
                        }
977
0
                        r->g_index = (OSSL_PARAM *)p;
978
0
                    }
979
0
                    break;
980
0
                case 'r':
981
0
                    if (ossl_likely(strcmp("oup", s + 2) == 0)) {
982
                        /* OSSL_PKEY_PARAM_GROUP_NAME */
983
0
                        if (ossl_unlikely(r->group_name != NULL)) {
984
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
985
0
                                           "param %s is repeated", s);
986
0
                            return 0;
987
0
                        }
988
0
                        r->group_name = (OSSL_PARAM *)p;
989
0
                    }
990
0
                }
991
0
                break;
992
0
            case 'h':
993
0
                if (ossl_likely(strcmp("index", s + 1) == 0)) {
994
                    /* OSSL_PKEY_PARAM_FFC_H */
995
0
                    if (ossl_unlikely(r->h != NULL)) {
996
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
997
0
                                       "param %s is repeated", s);
998
0
                        return 0;
999
0
                    }
1000
0
                    r->h = (OSSL_PARAM *)p;
1001
0
                }
1002
0
                break;
1003
0
            case 'p':
1004
0
                switch(s[1]) {
1005
0
                default:
1006
0
                    break;
1007
0
                case 'b':
1008
0
                    if (ossl_likely(strcmp("its", s + 2) == 0)) {
1009
                        /* OSSL_PKEY_PARAM_FFC_PBITS */
1010
0
                        if (ossl_unlikely(r->pbits != NULL)) {
1011
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1012
0
                                           "param %s is repeated", s);
1013
0
                            return 0;
1014
0
                        }
1015
0
                        r->pbits = (OSSL_PARAM *)p;
1016
0
                    }
1017
0
                    break;
1018
0
                case 'c':
1019
0
                    if (ossl_likely(strcmp("ounter", s + 2) == 0)) {
1020
                        /* OSSL_PKEY_PARAM_FFC_PCOUNTER */
1021
0
                        if (ossl_unlikely(r->p_counter != NULL)) {
1022
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1023
0
                                           "param %s is repeated", s);
1024
0
                            return 0;
1025
0
                        }
1026
0
                        r->p_counter = (OSSL_PARAM *)p;
1027
0
                    }
1028
0
                    break;
1029
0
                case 'r':
1030
0
                    switch(s[2]) {
1031
0
                    default:
1032
0
                        break;
1033
0
                    case 'i':
1034
0
                        if (ossl_likely(strcmp("v_len", s + 3) == 0)) {
1035
                            /* OSSL_PKEY_PARAM_DH_PRIV_LEN */
1036
0
                            if (ossl_unlikely(r->privlen != NULL)) {
1037
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1038
0
                                               "param %s is repeated", s);
1039
0
                                return 0;
1040
0
                            }
1041
0
                            r->privlen = (OSSL_PARAM *)p;
1042
0
                        }
1043
0
                        break;
1044
0
                    case 'o':
1045
0
                        if (ossl_likely(strcmp("perties", s + 3) == 0)) {
1046
                            /* OSSL_PKEY_PARAM_FFC_DIGEST_PROPS */
1047
0
                            if (ossl_unlikely(r->propq != NULL)) {
1048
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1049
0
                                               "param %s is repeated", s);
1050
0
                                return 0;
1051
0
                            }
1052
0
                            r->propq = (OSSL_PARAM *)p;
1053
0
                        }
1054
0
                    }
1055
0
                }
1056
0
                break;
1057
0
            case 'q':
1058
0
                if (ossl_likely(strcmp("bits", s + 1) == 0)) {
1059
                    /* OSSL_PKEY_PARAM_FFC_QBITS */
1060
0
                    if (ossl_unlikely(r->qbits != NULL)) {
1061
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1062
0
                                       "param %s is repeated", s);
1063
0
                        return 0;
1064
0
                    }
1065
0
                    r->qbits = (OSSL_PARAM *)p;
1066
0
                }
1067
0
                break;
1068
0
            case 's':
1069
0
                switch(s[1]) {
1070
0
                default:
1071
0
                    break;
1072
0
                case 'a':
1073
0
                    if (ossl_likely(strcmp("feprime-generator", s + 2) == 0)) {
1074
                        /* OSSL_PKEY_PARAM_DH_GENERATOR */
1075
0
                        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1076
0
                                       "param %s is unsupported", s);
1077
0
                        return 0;
1078
0
                    }
1079
0
                    break;
1080
0
                case 'e':
1081
0
                    if (ossl_likely(strcmp("ed", s + 2) == 0)) {
1082
                        /* OSSL_PKEY_PARAM_FFC_SEED */
1083
0
                        if (ossl_unlikely(r->seed != NULL)) {
1084
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1085
0
                                           "param %s is repeated", s);
1086
0
                            return 0;
1087
0
                        }
1088
0
                        r->seed = (OSSL_PARAM *)p;
1089
0
                    }
1090
0
                }
1091
0
                break;
1092
0
            case 't':
1093
0
                if (ossl_likely(strcmp("ype", s + 1) == 0)) {
1094
                    /* OSSL_PKEY_PARAM_FFC_TYPE */
1095
0
                    if (ossl_unlikely(r->type != NULL)) {
1096
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1097
0
                                       "param %s is repeated", s);
1098
0
                        return 0;
1099
0
                    }
1100
0
                    r->type = (OSSL_PARAM *)p;
1101
0
                }
1102
0
            }
1103
0
    return 1;
1104
0
}
1105
#endif
1106
/* End of machine generated */
1107
1108
#define dh_gen_set_params_st dh_gen_set_params_st
1109
1110
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1111
#ifndef dh_gen_set_params_list
1112
static const OSSL_PARAM dh_gen_set_params_list[] = {
1113
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_FFC_TYPE, NULL, 0),
1114
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_GROUP_NAME, NULL, 0),
1115
    OSSL_PARAM_int(OSSL_PKEY_PARAM_DH_PRIV_LEN, NULL),
1116
    OSSL_PARAM_size_t(OSSL_PKEY_PARAM_FFC_PBITS, NULL),
1117
    OSSL_PARAM_int(OSSL_PKEY_PARAM_DH_GENERATOR, NULL),
1118
    OSSL_PARAM_END
1119
};
1120
#endif
1121
1122
#ifndef dh_gen_set_params_st
1123
struct dh_gen_set_params_st {
1124
    OSSL_PARAM *generator;
1125
    OSSL_PARAM *group_name;
1126
    OSSL_PARAM *pbits;
1127
    OSSL_PARAM *privlen;
1128
    OSSL_PARAM *type;
1129
};
1130
#endif
1131
1132
#ifndef dh_gen_set_params_decoder
1133
static int dh_gen_set_params_decoder
1134
    (const OSSL_PARAM *p, struct dh_gen_set_params_st *r)
1135
0
{
1136
0
    const char *s;
1137
1138
0
    memset(r, 0, sizeof(*r));
1139
0
    if (p != NULL)
1140
0
        for (; (s = p->key) != NULL; p++)
1141
0
            switch(s[0]) {
1142
0
            default:
1143
0
                break;
1144
0
            case 'd':
1145
0
                if (ossl_likely(strcmp("igest", s + 1) == 0)) {
1146
                    /* OSSL_PKEY_PARAM_FFC_DIGEST */
1147
0
                    ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1148
0
                                   "param %s is unsupported", s);
1149
0
                    return 0;
1150
0
                }
1151
0
                break;
1152
0
            case 'g':
1153
0
                switch(s[1]) {
1154
0
                default:
1155
0
                    break;
1156
0
                case 'i':
1157
0
                    if (ossl_likely(strcmp("ndex", s + 2) == 0)) {
1158
                        /* OSSL_PKEY_PARAM_FFC_GINDEX */
1159
0
                        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1160
0
                                       "param %s is unsupported", s);
1161
0
                        return 0;
1162
0
                    }
1163
0
                    break;
1164
0
                case 'r':
1165
0
                    if (ossl_likely(strcmp("oup", s + 2) == 0)) {
1166
                        /* OSSL_PKEY_PARAM_GROUP_NAME */
1167
0
                        if (ossl_unlikely(r->group_name != NULL)) {
1168
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1169
0
                                           "param %s is repeated", s);
1170
0
                            return 0;
1171
0
                        }
1172
0
                        r->group_name = (OSSL_PARAM *)p;
1173
0
                    }
1174
0
                }
1175
0
                break;
1176
0
            case 'h':
1177
0
                if (ossl_likely(strcmp("index", s + 1) == 0)) {
1178
                    /* OSSL_PKEY_PARAM_FFC_H */
1179
0
                    ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1180
0
                                   "param %s is unsupported", s);
1181
0
                    return 0;
1182
0
                }
1183
0
                break;
1184
0
            case 'p':
1185
0
                switch(s[1]) {
1186
0
                default:
1187
0
                    break;
1188
0
                case 'b':
1189
0
                    if (ossl_likely(strcmp("its", s + 2) == 0)) {
1190
                        /* OSSL_PKEY_PARAM_FFC_PBITS */
1191
0
                        if (ossl_unlikely(r->pbits != NULL)) {
1192
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1193
0
                                           "param %s is repeated", s);
1194
0
                            return 0;
1195
0
                        }
1196
0
                        r->pbits = (OSSL_PARAM *)p;
1197
0
                    }
1198
0
                    break;
1199
0
                case 'c':
1200
0
                    if (ossl_likely(strcmp("ounter", s + 2) == 0)) {
1201
                        /* OSSL_PKEY_PARAM_FFC_PCOUNTER */
1202
0
                        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1203
0
                                       "param %s is unsupported", s);
1204
0
                        return 0;
1205
0
                    }
1206
0
                    break;
1207
0
                case 'r':
1208
0
                    switch(s[2]) {
1209
0
                    default:
1210
0
                        break;
1211
0
                    case 'i':
1212
0
                        if (ossl_likely(strcmp("v_len", s + 3) == 0)) {
1213
                            /* OSSL_PKEY_PARAM_DH_PRIV_LEN */
1214
0
                            if (ossl_unlikely(r->privlen != NULL)) {
1215
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1216
0
                                               "param %s is repeated", s);
1217
0
                                return 0;
1218
0
                            }
1219
0
                            r->privlen = (OSSL_PARAM *)p;
1220
0
                        }
1221
0
                        break;
1222
0
                    case 'o':
1223
0
                        if (ossl_likely(strcmp("perties", s + 3) == 0)) {
1224
                            /* OSSL_PKEY_PARAM_FFC_DIGEST_PROPS */
1225
0
                            ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1226
0
                                           "param %s is unsupported", s);
1227
0
                            return 0;
1228
0
                        }
1229
0
                    }
1230
0
                }
1231
0
                break;
1232
0
            case 'q':
1233
0
                if (ossl_likely(strcmp("bits", s + 1) == 0)) {
1234
                    /* OSSL_PKEY_PARAM_FFC_QBITS */
1235
0
                    ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1236
0
                                   "param %s is unsupported", s);
1237
0
                    return 0;
1238
0
                }
1239
0
                break;
1240
0
            case 's':
1241
0
                switch(s[1]) {
1242
0
                default:
1243
0
                    break;
1244
0
                case 'a':
1245
0
                    if (ossl_likely(strcmp("feprime-generator", s + 2) == 0)) {
1246
                        /* OSSL_PKEY_PARAM_DH_GENERATOR */
1247
0
                        if (ossl_unlikely(r->generator != NULL)) {
1248
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1249
0
                                           "param %s is repeated", s);
1250
0
                            return 0;
1251
0
                        }
1252
0
                        r->generator = (OSSL_PARAM *)p;
1253
0
                    }
1254
0
                    break;
1255
0
                case 'e':
1256
0
                    if (ossl_likely(strcmp("ed", s + 2) == 0)) {
1257
                        /* OSSL_PKEY_PARAM_FFC_SEED */
1258
0
                        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
1259
0
                                       "param %s is unsupported", s);
1260
0
                        return 0;
1261
0
                    }
1262
0
                }
1263
0
                break;
1264
0
            case 't':
1265
0
                if (ossl_likely(strcmp("ype", s + 1) == 0)) {
1266
                    /* OSSL_PKEY_PARAM_FFC_TYPE */
1267
0
                    if (ossl_unlikely(r->type != NULL)) {
1268
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1269
0
                                       "param %s is repeated", s);
1270
0
                        return 0;
1271
0
                    }
1272
0
                    r->type = (OSSL_PARAM *)p;
1273
0
                }
1274
0
            }
1275
0
    return 1;
1276
0
}
1277
#endif
1278
/* End of machine generated */
1279
1280
static int dh_gen_common_set_params(struct dh_gen_ctx *gctx,
1281
                                    const struct dhx_gen_set_params_st *p)
1282
0
{
1283
0
    int gen_type = -1;
1284
1285
0
    if (p->type != NULL) {
1286
0
        if (p->type->data_type != OSSL_PARAM_UTF8_STRING
1287
0
            || ((gen_type =
1288
0
                 dh_gen_type_name2id_w_default(p->type->data, gctx->dh_type)) == -1)) {
1289
0
            ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);
1290
0
            return 0;
1291
0
        }
1292
0
        if (gen_type != -1)
1293
0
            gctx->gen_type = gen_type;
1294
0
    }
1295
1296
0
    if (p->group_name != NULL) {
1297
0
        const DH_NAMED_GROUP *group = NULL;
1298
1299
0
        if (p->group_name->data_type != OSSL_PARAM_UTF8_STRING
1300
0
            || p->group_name->data == NULL
1301
0
            || (group = ossl_ffc_name_to_dh_named_group(p->group_name->data)) == NULL
1302
0
            || ((gctx->group_nid =
1303
0
                 ossl_ffc_named_group_get_uid(group)) == NID_undef)) {
1304
0
            ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);
1305
0
            return 0;
1306
0
        }
1307
0
    }
1308
1309
0
    if (p->pbits != NULL && !OSSL_PARAM_get_size_t(p->pbits, &gctx->pbits))
1310
0
        return 0;
1311
1312
0
    if (p->privlen != NULL && !OSSL_PARAM_get_int(p->privlen, &gctx->priv_len))
1313
0
        return 0;
1314
0
    return 1;
1315
0
}
1316
1317
static const OSSL_PARAM *dh_gen_settable_params(ossl_unused void *genctx,
1318
                                                ossl_unused void *provctx)
1319
0
{
1320
0
    return dh_gen_set_params_list;
1321
0
}
1322
1323
static const OSSL_PARAM *dhx_gen_settable_params(ossl_unused void *genctx,
1324
                                                 ossl_unused void *provctx)
1325
0
{
1326
0
    return dhx_gen_set_params_list;
1327
0
}
1328
1329
static int dhx_gen_set_params(void *genctx, const OSSL_PARAM params[])
1330
0
{
1331
0
    struct dh_gen_ctx *gctx = genctx;
1332
0
    struct dhx_gen_set_params_st p;
1333
1334
0
    if (gctx == NULL || !dhx_gen_set_params_decoder(params, &p))
1335
0
        return 0;
1336
1337
0
    if (!dh_gen_common_set_params(gctx, &p))
1338
0
        return 0;
1339
1340
    /* Parameters related to fips186-4 and fips186-2 */
1341
0
    if (p.g_index != NULL && !OSSL_PARAM_get_int(p.g_index, &gctx->gindex))
1342
0
        return 0;
1343
1344
0
    if (p.p_counter != NULL && !OSSL_PARAM_get_int(p.p_counter, &gctx->pcounter))
1345
0
        return 0;
1346
1347
0
    if (p.h != NULL && !OSSL_PARAM_get_int(p.h, &gctx->hindex))
1348
0
        return 0;
1349
1350
0
    if (p.seed != NULL
1351
0
        && (p.seed->data_type != OSSL_PARAM_OCTET_STRING
1352
0
            || !dh_set_gen_seed(gctx, p.seed->data, p.seed->data_size)))
1353
0
            return 0;
1354
1355
0
    if (p.qbits != NULL && !OSSL_PARAM_get_size_t(p.qbits, &gctx->qbits))
1356
0
        return 0;
1357
1358
0
    if (p.digest != NULL) {
1359
0
        if (p.digest->data_type != OSSL_PARAM_UTF8_STRING)
1360
0
            return 0;
1361
0
        OPENSSL_free(gctx->mdname);
1362
0
        gctx->mdname = OPENSSL_strdup(p.digest->data);
1363
0
        if (gctx->mdname == NULL)
1364
0
            return 0;
1365
0
    }
1366
1367
0
    if (p.propq != NULL) {
1368
0
        if (p.propq->data_type != OSSL_PARAM_UTF8_STRING)
1369
0
            return 0;
1370
0
        OPENSSL_free(gctx->mdprops);
1371
0
        gctx->mdprops = OPENSSL_strdup(p.propq->data);
1372
0
        if (gctx->mdprops == NULL)
1373
0
            return 0;
1374
0
    }
1375
1376
0
    return 1;
1377
0
}
1378
1379
static int dh_gen_set_params(void *genctx, const OSSL_PARAM params[])
1380
0
{
1381
0
    struct dh_gen_ctx *gctx = genctx;
1382
0
    struct dhx_gen_set_params_st p;
1383
1384
0
    if (gctx == NULL || !dh_gen_set_params_decoder(params, &p))
1385
0
        return 0;
1386
1387
0
    if (!dh_gen_common_set_params(gctx, &p))
1388
0
        return 0;
1389
1390
0
    if (p.generator != NULL && !OSSL_PARAM_get_int(p.generator, &gctx->generator))
1391
0
        return 0;
1392
1393
0
    return 1;
1394
0
}
1395
1396
static int dh_gencb(int p, int n, BN_GENCB *cb)
1397
0
{
1398
0
    struct dh_gen_ctx *gctx = BN_GENCB_get_arg(cb);
1399
0
    OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
1400
1401
0
    params[0] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_POTENTIAL, &p);
1402
0
    params[1] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_ITERATION, &n);
1403
1404
0
    return gctx->cb(params, gctx->cbarg);
1405
0
}
1406
1407
static void *dh_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cbarg)
1408
0
{
1409
0
    int ret = 0;
1410
0
    struct dh_gen_ctx *gctx = genctx;
1411
0
    DH *dh = NULL;
1412
0
    BN_GENCB *gencb = NULL;
1413
0
    FFC_PARAMS *ffc;
1414
1415
0
    if (!ossl_prov_is_running() || gctx == NULL)
1416
0
        return NULL;
1417
1418
    /*
1419
     * If a group name is selected then the type is group regardless of what
1420
     * the user selected. This overrides rather than errors for backwards
1421
     * compatibility.
1422
     */
1423
0
    if (gctx->group_nid != NID_undef)
1424
0
        gctx->gen_type = DH_PARAMGEN_TYPE_GROUP;
1425
1426
    /*
1427
     * Do a bounds check on context gen_type. Must be in range:
1428
     * DH_PARAMGEN_TYPE_GENERATOR <= gen_type <= DH_PARAMGEN_TYPE_GROUP
1429
     * Noted here as this needs to be adjusted if a new group type is
1430
     * added.
1431
     */
1432
0
    if (!ossl_assert((gctx->gen_type >= DH_PARAMGEN_TYPE_GENERATOR)
1433
0
                    && (gctx->gen_type <= DH_PARAMGEN_TYPE_GROUP))) {
1434
0
        ERR_raise_data(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR,
1435
0
                       "gen_type set to unsupported value %d", gctx->gen_type);
1436
0
        return NULL;
1437
0
    }
1438
1439
    /* For parameter generation - If there is a group name just create it */
1440
0
    if (gctx->gen_type == DH_PARAMGEN_TYPE_GROUP
1441
0
            && gctx->ffc_params == NULL) {
1442
        /* Select a named group if there is not one already */
1443
0
        if (gctx->group_nid == NID_undef)
1444
0
            gctx->group_nid = ossl_dh_get_named_group_uid_from_size((int)gctx->pbits);
1445
0
        if (gctx->group_nid == NID_undef)
1446
0
            return NULL;
1447
0
        dh = ossl_dh_new_by_nid_ex(gctx->libctx, gctx->group_nid);
1448
0
        if (dh == NULL)
1449
0
            return NULL;
1450
0
        ffc = ossl_dh_get0_params(dh);
1451
0
    } else {
1452
0
        dh = ossl_dh_new_ex(gctx->libctx);
1453
0
        if (dh == NULL)
1454
0
            return NULL;
1455
0
        ffc = ossl_dh_get0_params(dh);
1456
1457
        /* Copy the template value if one was passed */
1458
0
        if (gctx->ffc_params != NULL
1459
0
            && !ossl_ffc_params_copy(ffc, gctx->ffc_params))
1460
0
            goto end;
1461
1462
0
        if (!ossl_ffc_params_set_seed(ffc, gctx->seed, gctx->seedlen))
1463
0
            goto end;
1464
0
        if (gctx->gindex != -1) {
1465
0
            ossl_ffc_params_set_gindex(ffc, gctx->gindex);
1466
0
            if (gctx->pcounter != -1)
1467
0
                ossl_ffc_params_set_pcounter(ffc, gctx->pcounter);
1468
0
        } else if (gctx->hindex != 0) {
1469
0
            ossl_ffc_params_set_h(ffc, gctx->hindex);
1470
0
        }
1471
0
        if (gctx->mdname != NULL)
1472
0
            ossl_ffc_set_digest(ffc, gctx->mdname, gctx->mdprops);
1473
0
        gctx->cb = osslcb;
1474
0
        gctx->cbarg = cbarg;
1475
0
        gencb = BN_GENCB_new();
1476
0
        if (gencb != NULL)
1477
0
            BN_GENCB_set(gencb, dh_gencb, genctx);
1478
1479
0
        if ((gctx->selection & OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS) != 0) {
1480
            /*
1481
             * NOTE: The old safe prime generator code is not used in fips mode,
1482
             * (i.e internally it ignores the generator and chooses a named
1483
             * group based on pbits.
1484
             */
1485
0
            if (gctx->gen_type == DH_PARAMGEN_TYPE_GENERATOR)
1486
0
                ret = DH_generate_parameters_ex(dh, (int)gctx->pbits,
1487
0
                                                gctx->generator, gencb);
1488
0
            else
1489
0
                ret = ossl_dh_generate_ffc_parameters(dh, gctx->gen_type,
1490
0
                                                      (int)gctx->pbits,
1491
0
                                                      (int)gctx->qbits, gencb);
1492
0
            if (ret <= 0)
1493
0
                goto end;
1494
0
        }
1495
0
    }
1496
1497
0
    if ((gctx->selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
1498
0
        if (ffc->p == NULL || ffc->g == NULL)
1499
0
            goto end;
1500
0
        if (gctx->priv_len > 0)
1501
0
            DH_set_length(dh, (long)gctx->priv_len);
1502
0
        ossl_ffc_params_enable_flags(ffc, FFC_PARAM_FLAG_VALIDATE_LEGACY,
1503
0
                                     gctx->gen_type == DH_PARAMGEN_TYPE_FIPS_186_2);
1504
0
        if (DH_generate_key(dh) <= 0)
1505
0
            goto end;
1506
#ifdef FIPS_MODULE
1507
        if (!ossl_fips_self_testing()) {
1508
            ret = ossl_dh_check_pairwise(dh, 0);
1509
            if (ret <= 0) {
1510
                ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT);
1511
                goto end;
1512
            }
1513
        }
1514
#endif /* FIPS_MODULE */
1515
0
    }
1516
0
    DH_clear_flags(dh, DH_FLAG_TYPE_MASK);
1517
0
    DH_set_flags(dh, gctx->dh_type);
1518
1519
0
    ret = 1;
1520
0
end:
1521
0
    if (ret <= 0) {
1522
0
        DH_free(dh);
1523
0
        dh = NULL;
1524
0
    }
1525
0
    BN_GENCB_free(gencb);
1526
0
    return dh;
1527
0
}
1528
1529
static void dh_gen_cleanup(void *genctx)
1530
0
{
1531
0
    struct dh_gen_ctx *gctx = genctx;
1532
1533
0
    if (gctx == NULL)
1534
0
        return;
1535
1536
0
    OPENSSL_free(gctx->mdname);
1537
0
    OPENSSL_free(gctx->mdprops);
1538
0
    OPENSSL_clear_free(gctx->seed, gctx->seedlen);
1539
0
    OPENSSL_free(gctx);
1540
0
}
1541
1542
static void *dh_load(const void *reference, size_t reference_sz)
1543
0
{
1544
0
    DH *dh = NULL;
1545
1546
0
    if (ossl_prov_is_running() && reference_sz == sizeof(dh)) {
1547
        /* The contents of the reference is the address to our object */
1548
0
        dh = *(DH **)reference;
1549
        /* We grabbed, so we detach it */
1550
0
        *(DH **)reference = NULL;
1551
0
        return dh;
1552
0
    }
1553
0
    return NULL;
1554
0
}
1555
1556
static void *dh_dup(const void *keydata_from, int selection)
1557
0
{
1558
0
    if (ossl_prov_is_running())
1559
0
        return ossl_dh_dup(keydata_from, selection);
1560
0
    return NULL;
1561
0
}
1562
1563
const OSSL_DISPATCH ossl_dh_keymgmt_functions[] = {
1564
    { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))dh_newdata },
1565
    { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))dh_gen_init },
1566
    { OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE, (void (*)(void))dh_gen_set_template },
1567
    { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS, (void (*)(void))dh_gen_set_params },
1568
    { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS,
1569
      (void (*)(void))dh_gen_settable_params },
1570
    { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))dh_gen },
1571
    { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))dh_gen_cleanup },
1572
    { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))dh_load },
1573
    { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))dh_freedata },
1574
    { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))dh_get_params },
1575
    { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))dh_gettable_params },
1576
    { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*) (void))dh_set_params },
1577
    { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*) (void))dh_settable_params },
1578
    { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))dh_has },
1579
    { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))dh_match },
1580
    { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))dh_validate },
1581
    { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))dh_import },
1582
    { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))dh_import_types },
1583
    { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))dh_export },
1584
    { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))dh_export_types },
1585
    { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))dh_dup },
1586
    OSSL_DISPATCH_END
1587
};
1588
1589
/* For any DH key, we use the "DH" algorithms regardless of sub-type. */
1590
static const char *dhx_query_operation_name(int operation_id)
1591
0
{
1592
0
    return "DH";
1593
0
}
1594
1595
const OSSL_DISPATCH ossl_dhx_keymgmt_functions[] = {
1596
    { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))dhx_newdata },
1597
    { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))dhx_gen_init },
1598
    { OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE, (void (*)(void))dh_gen_set_template },
1599
    { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS, (void (*)(void))dhx_gen_set_params },
1600
    { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS,
1601
      (void (*)(void))dhx_gen_settable_params },
1602
    { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))dh_gen },
1603
    { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))dh_gen_cleanup },
1604
    { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))dh_load },
1605
    { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))dh_freedata },
1606
    { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*) (void))dh_get_params },
1607
    { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*) (void))dh_gettable_params },
1608
    { OSSL_FUNC_KEYMGMT_SET_PARAMS, (void (*) (void))dh_set_params },
1609
    { OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS, (void (*) (void))dh_settable_params },
1610
    { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))dh_has },
1611
    { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))dh_match },
1612
    { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))dh_validate },
1613
    { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))dh_import },
1614
    { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))dh_import_types },
1615
    { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))dh_export },
1616
    { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))dh_export_types },
1617
    { OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME,
1618
      (void (*)(void))dhx_query_operation_name },
1619
    { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))dh_dup },
1620
    OSSL_DISPATCH_END
1621
};