Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/keymgmt/slh_dsa_kmgmt.c
Line
Count
Source
1
/*
2
 * Copyright 2024-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
/* clang-format off */
10
11
/* clang-format on */
12
13
#include <openssl/core_dispatch.h>
14
#include <openssl/core_names.h>
15
#include <openssl/param_build.h>
16
#include <openssl/proverr.h>
17
#include <openssl/self_test.h>
18
#include <openssl/proverr.h>
19
#include "crypto/slh_dsa.h"
20
#include "internal/fips.h"
21
#include "internal/param_build_set.h"
22
#include "prov/implementations.h"
23
#include "prov/providercommon.h"
24
#include "prov/provider_ctx.h"
25
26
#ifdef FIPS_MODULE
27
static int slh_dsa_fips140_pairwise_test(const SLH_DSA_KEY *key,
28
    SLH_DSA_HASH_CTX *ctx);
29
#endif /* FIPS_MODULE */
30
31
static OSSL_FUNC_keymgmt_free_fn slh_dsa_free_key;
32
static OSSL_FUNC_keymgmt_has_fn slh_dsa_has;
33
static OSSL_FUNC_keymgmt_match_fn slh_dsa_match;
34
static OSSL_FUNC_keymgmt_import_fn slh_dsa_import;
35
static OSSL_FUNC_keymgmt_export_fn slh_dsa_export;
36
static OSSL_FUNC_keymgmt_import_types_fn slh_dsa_imexport_types;
37
static OSSL_FUNC_keymgmt_export_types_fn slh_dsa_imexport_types;
38
static OSSL_FUNC_keymgmt_load_fn slh_dsa_load;
39
static OSSL_FUNC_keymgmt_get_params_fn slh_dsa_get_params;
40
static OSSL_FUNC_keymgmt_gettable_params_fn slh_dsa_gettable_params;
41
static OSSL_FUNC_keymgmt_validate_fn slh_dsa_validate;
42
static OSSL_FUNC_keymgmt_gen_init_fn slh_dsa_gen_init;
43
static OSSL_FUNC_keymgmt_gen_cleanup_fn slh_dsa_gen_cleanup;
44
static OSSL_FUNC_keymgmt_gen_set_params_fn slh_dsa_gen_set_params;
45
static OSSL_FUNC_keymgmt_gen_settable_params_fn slh_dsa_gen_settable_params;
46
static OSSL_FUNC_keymgmt_dup_fn slh_dsa_dup_key;
47
48
1.21k
#define SLH_DSA_POSSIBLE_SELECTIONS (OSSL_KEYMGMT_SELECT_KEYPAIR)
49
50
struct slh_dsa_gen_ctx {
51
    SLH_DSA_HASH_CTX *ctx;
52
    OSSL_LIB_CTX *libctx;
53
    char *propq;
54
    uint8_t entropy[SLH_DSA_MAX_N * 3];
55
    size_t entropy_len;
56
};
57
58
static void *slh_dsa_new_key(void *provctx, const char *alg)
59
418
{
60
418
    if (!ossl_prov_is_running())
61
0
        return 0;
62
63
418
    return ossl_slh_dsa_key_new(PROV_LIBCTX_OF(provctx), NULL, alg);
64
418
}
65
66
static void slh_dsa_free_key(void *keydata)
67
2.00k
{
68
2.00k
    ossl_slh_dsa_key_free((SLH_DSA_KEY *)keydata);
69
2.00k
}
70
71
static void *slh_dsa_dup_key(const void *keydata_from, int selection)
72
0
{
73
0
    if (ossl_prov_is_running())
74
0
        return ossl_slh_dsa_key_dup(keydata_from, selection);
75
0
    return NULL;
76
0
}
77
78
static int slh_dsa_has(const void *keydata, int selection)
79
953
{
80
953
    const SLH_DSA_KEY *key = keydata;
81
82
953
    if (!ossl_prov_is_running() || key == NULL)
83
0
        return 0;
84
953
    if ((selection & SLH_DSA_POSSIBLE_SELECTIONS) == 0)
85
0
        return 1; /* the selection is not missing */
86
87
953
    return ossl_slh_dsa_key_has(key, selection);
88
953
}
89
90
static int slh_dsa_match(const void *keydata1, const void *keydata2, int selection)
91
397
{
92
397
    const SLH_DSA_KEY *key1 = keydata1;
93
397
    const SLH_DSA_KEY *key2 = keydata2;
94
95
397
    if (!ossl_prov_is_running())
96
0
        return 0;
97
397
    if (key1 == NULL || key2 == NULL)
98
0
        return 0;
99
397
    return ossl_slh_dsa_key_equal(key1, key2, selection);
100
397
}
101
102
static int slh_dsa_validate(const void *key_data, int selection, int check_type)
103
0
{
104
0
    const SLH_DSA_KEY *key = key_data;
105
106
0
    if (!slh_dsa_has(key, selection))
107
0
        return 0;
108
109
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == OSSL_KEYMGMT_SELECT_KEYPAIR)
110
0
        return ossl_slh_dsa_key_pairwise_check(key);
111
0
    return 1;
112
0
}
113
114
/* clang-format off */
115
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
116
#ifndef slh_dsa_import_list
117
static const OSSL_PARAM slh_dsa_import_list[] = {
118
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0),
119
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0),
120
    OSSL_PARAM_END
121
};
122
#endif
123
124
#ifndef slh_dsa_import_st
125
struct slh_dsa_import_st {
126
    OSSL_PARAM *priv;
127
    OSSL_PARAM *pub;
128
};
129
#endif
130
131
#ifndef slh_dsa_import_decoder
132
static int slh_dsa_import_decoder
133
    (const OSSL_PARAM *p, struct slh_dsa_import_st *r)
134
266
{
135
266
    const char *s;
136
137
266
    memset(r, 0, sizeof(*r));
138
266
    if (p != NULL)
139
798
        for (; (s = p->key) != NULL; p++)
140
532
            switch(s[0]) {
141
0
            default:
142
0
                break;
143
532
            case 'p':
144
532
                switch(s[1]) {
145
0
                default:
146
0
                    break;
147
266
                case 'r':
148
266
                    if (ossl_likely(strcmp("iv", s + 2) == 0)) {
149
                        /* OSSL_PKEY_PARAM_PRIV_KEY */
150
266
                        if (ossl_unlikely(r->priv != NULL)) {
151
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
152
0
                                           "param %s is repeated", s);
153
0
                            return 0;
154
0
                        }
155
266
                        r->priv = (OSSL_PARAM *)p;
156
266
                    }
157
266
                    break;
158
266
                case 'u':
159
266
                    if (ossl_likely(strcmp("b", s + 2) == 0)) {
160
                        /* OSSL_PKEY_PARAM_PUB_KEY */
161
266
                        if (ossl_unlikely(r->pub != NULL)) {
162
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
163
0
                                           "param %s is repeated", s);
164
0
                            return 0;
165
0
                        }
166
266
                        r->pub = (OSSL_PARAM *)p;
167
266
                    }
168
532
                }
169
532
            }
170
266
    return 1;
171
266
}
172
#endif
173
/* End of machine generated */
174
/* clang-format on */
175
176
static int slh_dsa_import(void *keydata, int selection, const OSSL_PARAM params[])
177
266
{
178
266
    SLH_DSA_KEY *key = keydata;
179
266
    int include_priv;
180
266
    struct slh_dsa_import_st p;
181
182
266
    if (!ossl_prov_is_running()
183
266
        || key == NULL
184
266
        || !slh_dsa_import_decoder(params, &p))
185
0
        return 0;
186
187
266
    if ((selection & SLH_DSA_POSSIBLE_SELECTIONS) == 0)
188
0
        return 0;
189
190
266
    include_priv = ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0);
191
266
    return ossl_slh_dsa_key_fromdata(key, p.pub, p.priv, include_priv);
192
266
}
193
194
static const OSSL_PARAM *slh_dsa_imexport_types(int selection)
195
0
{
196
0
    if ((selection & SLH_DSA_POSSIBLE_SELECTIONS) == 0)
197
0
        return NULL;
198
0
    return slh_dsa_import_list;
199
0
}
200
201
/* clang-format off */
202
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
203
#ifndef slh_dsa_get_params_list
204
static const OSSL_PARAM slh_dsa_get_params_list[] = {
205
    OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL),
206
    OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL),
207
    OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL),
208
    OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_CATEGORY, NULL),
209
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_MANDATORY_DIGEST, NULL, 0),
210
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PUB_KEY, NULL, 0),
211
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_PRIV_KEY, NULL, 0),
212
    OSSL_PARAM_END
213
};
214
#endif
215
216
#ifndef slh_dsa_get_params_st
217
struct slh_dsa_get_params_st {
218
    OSSL_PARAM *bits;
219
    OSSL_PARAM *mandgst;
220
    OSSL_PARAM *maxsize;
221
    OSSL_PARAM *priv;
222
    OSSL_PARAM *pub;
223
    OSSL_PARAM *secbits;
224
    OSSL_PARAM *seccat;
225
};
226
#endif
227
228
#ifndef slh_dsa_get_params_decoder
229
static int slh_dsa_get_params_decoder
230
    (const OSSL_PARAM *p, struct slh_dsa_get_params_st *r)
231
1.23k
{
232
1.23k
    const char *s;
233
234
1.23k
    memset(r, 0, sizeof(*r));
235
1.23k
    if (p != NULL)
236
6.15k
        for (; (s = p->key) != NULL; p++)
237
4.92k
            switch(s[0]) {
238
0
            default:
239
0
                break;
240
1.23k
            case 'b':
241
1.23k
                if (ossl_likely(strcmp("its", s + 1) == 0)) {
242
                    /* OSSL_PKEY_PARAM_BITS */
243
1.23k
                    if (ossl_unlikely(r->bits != NULL)) {
244
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
245
0
                                       "param %s is repeated", s);
246
0
                        return 0;
247
0
                    }
248
1.23k
                    r->bits = (OSSL_PARAM *)p;
249
1.23k
                }
250
1.23k
                break;
251
1.23k
            case 'm':
252
1.23k
                switch(s[1]) {
253
0
                default:
254
0
                    break;
255
1.23k
                case 'a':
256
1.23k
                    switch(s[2]) {
257
0
                    default:
258
0
                        break;
259
0
                    case 'n':
260
0
                        if (ossl_likely(strcmp("datory-digest", s + 3) == 0)) {
261
                            /* OSSL_PKEY_PARAM_MANDATORY_DIGEST */
262
0
                            if (ossl_unlikely(r->mandgst != NULL)) {
263
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
264
0
                                               "param %s is repeated", s);
265
0
                                return 0;
266
0
                            }
267
0
                            r->mandgst = (OSSL_PARAM *)p;
268
0
                        }
269
0
                        break;
270
1.23k
                    case 'x':
271
1.23k
                        if (ossl_likely(strcmp("-size", s + 3) == 0)) {
272
                            /* OSSL_PKEY_PARAM_MAX_SIZE */
273
1.23k
                            if (ossl_unlikely(r->maxsize != NULL)) {
274
0
                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
275
0
                                               "param %s is repeated", s);
276
0
                                return 0;
277
0
                            }
278
1.23k
                            r->maxsize = (OSSL_PARAM *)p;
279
1.23k
                        }
280
1.23k
                    }
281
1.23k
                }
282
1.23k
                break;
283
1.23k
            case 'p':
284
0
                switch(s[1]) {
285
0
                default:
286
0
                    break;
287
0
                case 'r':
288
0
                    if (ossl_likely(strcmp("iv", s + 2) == 0)) {
289
                        /* OSSL_PKEY_PARAM_PRIV_KEY */
290
0
                        if (ossl_unlikely(r->priv != NULL)) {
291
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
292
0
                                           "param %s is repeated", s);
293
0
                            return 0;
294
0
                        }
295
0
                        r->priv = (OSSL_PARAM *)p;
296
0
                    }
297
0
                    break;
298
0
                case 'u':
299
0
                    if (ossl_likely(strcmp("b", s + 2) == 0)) {
300
                        /* OSSL_PKEY_PARAM_PUB_KEY */
301
0
                        if (ossl_unlikely(r->pub != NULL)) {
302
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
303
0
                                           "param %s is repeated", s);
304
0
                            return 0;
305
0
                        }
306
0
                        r->pub = (OSSL_PARAM *)p;
307
0
                    }
308
0
                }
309
0
                break;
310
2.46k
            case 's':
311
2.46k
                switch(s[1]) {
312
0
                default:
313
0
                    break;
314
2.46k
                case 'e':
315
2.46k
                    switch(s[2]) {
316
0
                    default:
317
0
                        break;
318
2.46k
                    case 'c':
319
2.46k
                        switch(s[3]) {
320
0
                        default:
321
0
                            break;
322
2.46k
                        case 'u':
323
2.46k
                            switch(s[4]) {
324
0
                            default:
325
0
                                break;
326
2.46k
                            case 'r':
327
2.46k
                                switch(s[5]) {
328
0
                                default:
329
0
                                    break;
330
2.46k
                                case 'i':
331
2.46k
                                    switch(s[6]) {
332
0
                                    default:
333
0
                                        break;
334
2.46k
                                    case 't':
335
2.46k
                                        switch(s[7]) {
336
0
                                        default:
337
0
                                            break;
338
2.46k
                                        case 'y':
339
2.46k
                                            switch(s[8]) {
340
0
                                            default:
341
0
                                                break;
342
2.46k
                                            case '-':
343
2.46k
                                                switch(s[9]) {
344
0
                                                default:
345
0
                                                    break;
346
1.23k
                                                case 'b':
347
1.23k
                                                    if (ossl_likely(strcmp("its", s + 10) == 0)) {
348
                                                        /* OSSL_PKEY_PARAM_SECURITY_BITS */
349
1.23k
                                                        if (ossl_unlikely(r->secbits != NULL)) {
350
0
                                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
351
0
                                                                           "param %s is repeated", s);
352
0
                                                            return 0;
353
0
                                                        }
354
1.23k
                                                        r->secbits = (OSSL_PARAM *)p;
355
1.23k
                                                    }
356
1.23k
                                                    break;
357
1.23k
                                                case 'c':
358
1.23k
                                                    if (ossl_likely(strcmp("ategory", s + 10) == 0)) {
359
                                                        /* OSSL_PKEY_PARAM_SECURITY_CATEGORY */
360
1.23k
                                                        if (ossl_unlikely(r->seccat != NULL)) {
361
0
                                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
362
0
                                                                           "param %s is repeated", s);
363
0
                                                            return 0;
364
0
                                                        }
365
1.23k
                                                        r->seccat = (OSSL_PARAM *)p;
366
1.23k
                                                    }
367
2.46k
                                                }
368
2.46k
                                            }
369
2.46k
                                        }
370
2.46k
                                    }
371
2.46k
                                }
372
2.46k
                            }
373
2.46k
                        }
374
2.46k
                    }
375
2.46k
                }
376
4.92k
            }
377
1.23k
    return 1;
378
1.23k
}
379
#endif
380
/* End of machine generated */
381
/* clang-format on */
382
383
static const OSSL_PARAM *slh_dsa_gettable_params(void *provctx)
384
0
{
385
0
    return slh_dsa_get_params_list;
386
0
}
387
388
static int key_to_params(SLH_DSA_KEY *key, OSSL_PARAM_BLD *tmpl,
389
    int selection)
390
312
{
391
    /* Error if there is no key or public key */
392
312
    if (key == NULL || ossl_slh_dsa_key_get_pub(key) == NULL)
393
0
        return 0;
394
395
312
    if (((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
396
312
        && ossl_slh_dsa_key_get_priv(key) != NULL)
397
312
        if (ossl_param_build_set_octet_string(tmpl, NULL,
398
312
                OSSL_PKEY_PARAM_PRIV_KEY,
399
312
                ossl_slh_dsa_key_get_priv(key),
400
312
                ossl_slh_dsa_key_get_priv_len(key))
401
312
            != 1)
402
0
            return 0;
403
404
312
    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) == 0)
405
0
        return 1;
406
407
312
    return ossl_param_build_set_octet_string(tmpl, NULL,
408
312
        OSSL_PKEY_PARAM_PUB_KEY,
409
312
        ossl_slh_dsa_key_get_pub(key),
410
312
        ossl_slh_dsa_key_get_pub_len(key));
411
312
}
412
413
static int slh_dsa_get_params(void *keydata, OSSL_PARAM params[])
414
1.23k
{
415
1.23k
    SLH_DSA_KEY *key = keydata;
416
1.23k
    struct slh_dsa_get_params_st p;
417
1.23k
    const uint8_t *pub, *priv;
418
419
1.23k
    if (key == NULL || !slh_dsa_get_params_decoder(params, &p))
420
0
        return 0;
421
422
1.23k
    if (p.bits != NULL
423
1.23k
        && !OSSL_PARAM_set_size_t(p.bits, 8 * ossl_slh_dsa_key_get_pub_len(key)))
424
0
        return 0;
425
1.23k
    if (p.secbits != NULL
426
1.23k
        && !OSSL_PARAM_set_size_t(p.secbits, 8 * ossl_slh_dsa_key_get_n(key)))
427
0
        return 0;
428
1.23k
    if (p.maxsize != NULL
429
1.23k
        && !OSSL_PARAM_set_size_t(p.maxsize, ossl_slh_dsa_key_get_sig_len(key)))
430
0
        return 0;
431
1.23k
    if (p.seccat != NULL
432
1.23k
        && !OSSL_PARAM_set_int(p.seccat, ossl_slh_dsa_key_get_security_category(key)))
433
0
        return 0;
434
435
1.23k
    priv = ossl_slh_dsa_key_get_priv(key);
436
1.23k
    if (priv != NULL) {
437
        /* Note: ossl_slh_dsa_key_get_priv_len() includes the public key */
438
1.23k
        if (p.priv != NULL
439
0
            && !OSSL_PARAM_set_octet_string(p.priv, priv,
440
0
                ossl_slh_dsa_key_get_priv_len(key)))
441
0
            return 0;
442
1.23k
    }
443
1.23k
    pub = ossl_slh_dsa_key_get_pub(key);
444
1.23k
    if (pub != NULL) {
445
1.23k
        if (p.pub != NULL
446
0
            && !OSSL_PARAM_set_octet_string(p.pub, pub,
447
0
                ossl_slh_dsa_key_get_pub_len(key)))
448
0
            return 0;
449
1.23k
    }
450
    /*
451
     * This allows apps to use an empty digest, so that the old API
452
     * for digest signing can be used.
453
     */
454
1.23k
    if (p.mandgst != NULL && !OSSL_PARAM_set_utf8_string(p.mandgst, ""))
455
0
        return 0;
456
1.23k
    return 1;
457
1.23k
}
458
459
static int slh_dsa_export(void *keydata, int selection, OSSL_CALLBACK *param_cb,
460
    void *cbarg)
461
312
{
462
312
    SLH_DSA_KEY *key = keydata;
463
312
    OSSL_PARAM_BLD *tmpl;
464
312
    OSSL_PARAM *params = NULL;
465
312
    int ret = 0;
466
467
312
    if (!ossl_prov_is_running() || key == NULL)
468
0
        return 0;
469
470
312
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
471
0
        return 0;
472
473
312
    tmpl = OSSL_PARAM_BLD_new();
474
312
    if (tmpl == NULL)
475
0
        return 0;
476
477
312
    if (!key_to_params(key, tmpl, selection))
478
0
        goto err;
479
480
312
    params = OSSL_PARAM_BLD_to_param(tmpl);
481
312
    if (params == NULL)
482
0
        goto err;
483
484
312
    ret = param_cb(params, cbarg);
485
312
    OSSL_PARAM_free(params);
486
312
err:
487
312
    OSSL_PARAM_BLD_free(tmpl);
488
312
    return ret;
489
312
}
490
491
static void *slh_dsa_load(const void *reference, size_t reference_sz)
492
17
{
493
17
    SLH_DSA_KEY *key = NULL;
494
495
17
    if (ossl_prov_is_running() && reference_sz == sizeof(key)) {
496
        /* The contents of the reference is the address to our object */
497
17
        key = *(SLH_DSA_KEY **)reference;
498
        /* We grabbed, so we detach it */
499
17
        *(SLH_DSA_KEY **)reference = NULL;
500
17
        return key;
501
17
    }
502
0
    return NULL;
503
17
}
504
505
static void *slh_dsa_gen_init(void *provctx, int selection,
506
    const OSSL_PARAM params[])
507
1.57k
{
508
1.57k
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
509
1.57k
    struct slh_dsa_gen_ctx *gctx = NULL;
510
511
1.57k
    if (!ossl_prov_is_running())
512
0
        return NULL;
513
514
1.57k
    if ((gctx = OPENSSL_zalloc(sizeof(*gctx))) != NULL) {
515
1.57k
        gctx->libctx = libctx;
516
1.57k
        if (!slh_dsa_gen_set_params(gctx, params)) {
517
0
            OPENSSL_free(gctx);
518
0
            gctx = NULL;
519
0
        }
520
1.57k
    }
521
1.57k
    return gctx;
522
1.57k
}
523
524
#ifdef FIPS_MODULE
525
/*
526
 * Refer to FIPS 140-3 IG 10.3.A Additional Comment 1
527
 * Perform a pairwise test for SLH_DSA by signing and verifying a signature.
528
 */
529
static int slh_dsa_fips140_pairwise_test(const SLH_DSA_KEY *key,
530
    SLH_DSA_HASH_CTX *ctx)
531
{
532
    int ret = 0;
533
    OSSL_SELF_TEST *st = NULL;
534
    OSSL_CALLBACK *cb = NULL;
535
    void *cb_arg = NULL;
536
    uint8_t msg[16] = { 0 };
537
    size_t msg_len = sizeof(msg);
538
    uint8_t *sig = NULL;
539
    size_t sig_len;
540
    OSSL_LIB_CTX *lib_ctx;
541
    int alloc_ctx = 0;
542
543
    /* During self test, it is a waste to do this test */
544
    if (ossl_fips_self_testing())
545
        return 1;
546
547
    if (ctx == NULL) {
548
        ctx = ossl_slh_dsa_hash_ctx_new(key);
549
        if (ctx == NULL)
550
            return 0;
551
        alloc_ctx = 1;
552
    }
553
    lib_ctx = ossl_slh_dsa_key_get0_libctx(key);
554
555
    OSSL_SELF_TEST_get_callback(lib_ctx, &cb, &cb_arg);
556
    st = OSSL_SELF_TEST_new(cb, cb_arg);
557
    if (st == NULL)
558
        goto err;
559
560
    OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_PCT,
561
        OSSL_SELF_TEST_DESC_PCT_SLH_DSA);
562
563
    sig_len = ossl_slh_dsa_key_get_sig_len(key);
564
    sig = OPENSSL_malloc(sig_len);
565
    if (sig == NULL)
566
        goto err;
567
568
    if (ossl_slh_dsa_sign(ctx, msg, msg_len, NULL, 0, NULL, 0,
569
            sig, &sig_len, sig_len)
570
        != 1)
571
        goto err;
572
573
    OSSL_SELF_TEST_oncorrupt_byte(st, sig);
574
575
    if (ossl_slh_dsa_verify(ctx, msg, msg_len, NULL, 0, 0, sig, sig_len) != 1)
576
        goto err;
577
578
    ret = 1;
579
err:
580
    if (alloc_ctx)
581
        ossl_slh_dsa_hash_ctx_free(ctx);
582
    OPENSSL_free(sig);
583
    OSSL_SELF_TEST_onend(st, ret);
584
    OSSL_SELF_TEST_free(st);
585
    return ret;
586
}
587
#endif /* FIPS_MODULE */
588
589
static void *slh_dsa_gen(void *genctx, const char *alg)
590
1.57k
{
591
1.57k
    struct slh_dsa_gen_ctx *gctx = genctx;
592
1.57k
    SLH_DSA_KEY *key = NULL;
593
1.57k
    SLH_DSA_HASH_CTX *ctx = NULL;
594
595
1.57k
    if (!ossl_prov_is_running())
596
0
        return NULL;
597
1.57k
    key = ossl_slh_dsa_key_new(gctx->libctx, gctx->propq, alg);
598
1.57k
    if (key == NULL)
599
0
        return NULL;
600
1.57k
    ctx = ossl_slh_dsa_hash_ctx_new(key);
601
1.57k
    if (ctx == NULL)
602
0
        goto err;
603
1.57k
    if (!ossl_slh_dsa_generate_key(ctx, key, gctx->libctx,
604
1.57k
            gctx->entropy, gctx->entropy_len))
605
0
        goto err;
606
#ifdef FIPS_MODULE
607
    if (!slh_dsa_fips140_pairwise_test(key, ctx)) {
608
        ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT);
609
        goto err;
610
    }
611
#endif /* FIPS_MODULE */
612
1.57k
    ossl_slh_dsa_hash_ctx_free(ctx);
613
1.57k
    return key;
614
0
err:
615
0
    ossl_slh_dsa_hash_ctx_free(ctx);
616
0
    ossl_slh_dsa_key_free(key);
617
0
    return NULL;
618
1.57k
}
619
620
/* clang-format off */
621
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
622
#ifndef slh_dsa_gen_set_params_list
623
static const OSSL_PARAM slh_dsa_gen_set_params_list[] = {
624
    OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_PROPERTIES, NULL, 0),
625
    OSSL_PARAM_octet_string(OSSL_PKEY_PARAM_SLH_DSA_SEED, NULL, 0),
626
    OSSL_PARAM_END
627
};
628
#endif
629
630
#ifndef slh_dsa_gen_set_params_st
631
struct slh_dsa_gen_set_params_st {
632
    OSSL_PARAM *propq;
633
    OSSL_PARAM *seed;
634
};
635
#endif
636
637
#ifndef slh_dsa_gen_set_params_decoder
638
static int slh_dsa_gen_set_params_decoder
639
    (const OSSL_PARAM *p, struct slh_dsa_gen_set_params_st *r)
640
1.02k
{
641
1.02k
    const char *s;
642
643
1.02k
    memset(r, 0, sizeof(*r));
644
1.02k
    if (p != NULL)
645
0
        for (; (s = p->key) != NULL; p++)
646
0
            switch(s[0]) {
647
0
            default:
648
0
                break;
649
0
            case 'p':
650
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
651
                    /* OSSL_PKEY_PARAM_PROPERTIES */
652
0
                    if (ossl_unlikely(r->propq != NULL)) {
653
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
654
0
                                       "param %s is repeated", s);
655
0
                        return 0;
656
0
                    }
657
0
                    r->propq = (OSSL_PARAM *)p;
658
0
                }
659
0
                break;
660
0
            case 's':
661
0
                if (ossl_likely(strcmp("eed", s + 1) == 0)) {
662
                    /* OSSL_PKEY_PARAM_SLH_DSA_SEED */
663
0
                    if (ossl_unlikely(r->seed != NULL)) {
664
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
665
0
                                       "param %s is repeated", s);
666
0
                        return 0;
667
0
                    }
668
0
                    r->seed = (OSSL_PARAM *)p;
669
0
                }
670
0
            }
671
1.02k
    return 1;
672
1.02k
}
673
#endif
674
/* End of machine generated */
675
/* clang-format on */
676
677
static int slh_dsa_gen_set_params(void *genctx, const OSSL_PARAM params[])
678
1.02k
{
679
1.02k
    struct slh_dsa_gen_ctx *gctx = genctx;
680
1.02k
    struct slh_dsa_gen_set_params_st p;
681
682
1.02k
    if (gctx == NULL || !slh_dsa_gen_set_params_decoder(params, &p))
683
0
        return 0;
684
685
1.02k
    if (p.seed != NULL) {
686
0
        void *vp = gctx->entropy;
687
0
        size_t len = sizeof(gctx->entropy);
688
689
0
        if (!OSSL_PARAM_get_octet_string(p.seed, &vp, len, &(gctx->entropy_len))) {
690
0
            gctx->entropy_len = 0;
691
0
            return 0;
692
0
        }
693
0
    }
694
695
1.02k
    if (p.propq != NULL) {
696
0
        if (p.propq->data_type != OSSL_PARAM_UTF8_STRING)
697
0
            return 0;
698
0
        OPENSSL_free(gctx->propq);
699
0
        gctx->propq = OPENSSL_strdup(p.propq->data);
700
0
        if (gctx->propq == NULL)
701
0
            return 0;
702
0
    }
703
1.02k
    return 1;
704
1.02k
}
705
706
static const OSSL_PARAM *slh_dsa_gen_settable_params(ossl_unused void *genctx,
707
    ossl_unused void *provctx)
708
0
{
709
0
    return slh_dsa_gen_set_params_list;
710
0
}
711
712
static void slh_dsa_gen_cleanup(void *genctx)
713
1.57k
{
714
1.57k
    struct slh_dsa_gen_ctx *gctx = genctx;
715
716
1.57k
    if (gctx == NULL)
717
0
        return;
718
719
1.57k
    OPENSSL_cleanse(gctx->entropy, gctx->entropy_len);
720
1.57k
    OPENSSL_free(gctx->propq);
721
1.57k
    OPENSSL_free(gctx);
722
1.57k
}
723
724
#define MAKE_KEYMGMT_FUNCTIONS(alg, fn)                                                 \
725
    static OSSL_FUNC_keymgmt_new_fn slh_dsa_##fn##_new_key;                             \
726
    static OSSL_FUNC_keymgmt_gen_fn slh_dsa_##fn##_gen;                                 \
727
    static void *slh_dsa_##fn##_new_key(void *provctx)                                  \
728
418
    {                                                                                   \
729
418
        return slh_dsa_new_key(provctx, alg);                                           \
730
418
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_128s_new_key
Line
Count
Source
728
70
    {                                                                                   \
729
70
        return slh_dsa_new_key(provctx, alg);                                           \
730
70
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_128f_new_key
Line
Count
Source
728
34
    {                                                                                   \
729
34
        return slh_dsa_new_key(provctx, alg);                                           \
730
34
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_192s_new_key
Line
Count
Source
728
28
    {                                                                                   \
729
28
        return slh_dsa_new_key(provctx, alg);                                           \
730
28
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_192f_new_key
Line
Count
Source
728
49
    {                                                                                   \
729
49
        return slh_dsa_new_key(provctx, alg);                                           \
730
49
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_256s_new_key
Line
Count
Source
728
21
    {                                                                                   \
729
21
        return slh_dsa_new_key(provctx, alg);                                           \
730
21
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_256f_new_key
Line
Count
Source
728
27
    {                                                                                   \
729
27
        return slh_dsa_new_key(provctx, alg);                                           \
730
27
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_128s_new_key
Line
Count
Source
728
50
    {                                                                                   \
729
50
        return slh_dsa_new_key(provctx, alg);                                           \
730
50
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_128f_new_key
Line
Count
Source
728
23
    {                                                                                   \
729
23
        return slh_dsa_new_key(provctx, alg);                                           \
730
23
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_192s_new_key
Line
Count
Source
728
42
    {                                                                                   \
729
42
        return slh_dsa_new_key(provctx, alg);                                           \
730
42
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_192f_new_key
Line
Count
Source
728
30
    {                                                                                   \
729
30
        return slh_dsa_new_key(provctx, alg);                                           \
730
30
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_256s_new_key
Line
Count
Source
728
22
    {                                                                                   \
729
22
        return slh_dsa_new_key(provctx, alg);                                           \
730
22
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_256f_new_key
Line
Count
Source
728
22
    {                                                                                   \
729
22
        return slh_dsa_new_key(provctx, alg);                                           \
730
22
    }                                                                                   \
731
    static void *slh_dsa_##fn##_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cbarg)   \
732
1.57k
    {                                                                                   \
733
1.57k
        return slh_dsa_gen(genctx, alg);                                                \
734
1.57k
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_128s_gen
Line
Count
Source
732
212
    {                                                                                   \
733
212
        return slh_dsa_gen(genctx, alg);                                                \
734
212
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_128f_gen
Line
Count
Source
732
242
    {                                                                                   \
733
242
        return slh_dsa_gen(genctx, alg);                                                \
734
242
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_192s_gen
Line
Count
Source
732
64
    {                                                                                   \
733
64
        return slh_dsa_gen(genctx, alg);                                                \
734
64
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_192f_gen
Line
Count
Source
732
256
    {                                                                                   \
733
256
        return slh_dsa_gen(genctx, alg);                                                \
734
256
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_256s_gen
Line
Count
Source
732
103
    {                                                                                   \
733
103
        return slh_dsa_gen(genctx, alg);                                                \
734
103
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_sha2_256f_gen
Line
Count
Source
732
129
    {                                                                                   \
733
129
        return slh_dsa_gen(genctx, alg);                                                \
734
129
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_128s_gen
Line
Count
Source
732
65
    {                                                                                   \
733
65
        return slh_dsa_gen(genctx, alg);                                                \
734
65
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_128f_gen
Line
Count
Source
732
74
    {                                                                                   \
733
74
        return slh_dsa_gen(genctx, alg);                                                \
734
74
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_192s_gen
Line
Count
Source
732
90
    {                                                                                   \
733
90
        return slh_dsa_gen(genctx, alg);                                                \
734
90
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_192f_gen
Line
Count
Source
732
160
    {                                                                                   \
733
160
        return slh_dsa_gen(genctx, alg);                                                \
734
160
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_256s_gen
Line
Count
Source
732
84
    {                                                                                   \
733
84
        return slh_dsa_gen(genctx, alg);                                                \
734
84
    }                                                                                   \
slh_dsa_kmgmt.c:slh_dsa_shake_256f_gen
Line
Count
Source
732
91
    {                                                                                   \
733
91
        return slh_dsa_gen(genctx, alg);                                                \
734
91
    }                                                                                   \
735
    const OSSL_DISPATCH ossl_slh_dsa_##fn##_keymgmt_functions[] = {                     \
736
        { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))slh_dsa_##fn##_new_key },              \
737
        { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))slh_dsa_free_key },                   \
738
        { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))slh_dsa_dup_key },                     \
739
        { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))slh_dsa_has },                         \
740
        { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))slh_dsa_match },                     \
741
        { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))slh_dsa_import },                   \
742
        { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))slh_dsa_imexport_types },     \
743
        { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))slh_dsa_export },                   \
744
        { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))slh_dsa_imexport_types },     \
745
        { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))slh_dsa_load },                       \
746
        { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))slh_dsa_get_params },           \
747
        { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))slh_dsa_gettable_params }, \
748
        { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))slh_dsa_validate },               \
749
        { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))slh_dsa_gen_init },               \
750
        { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))slh_dsa_##fn##_gen },                  \
751
        { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))slh_dsa_gen_cleanup },         \
752
        { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS,                                             \
753
            (void (*)(void))slh_dsa_gen_set_params },                                   \
754
        { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS,                                        \
755
            (void (*)(void))slh_dsa_gen_settable_params },                              \
756
        OSSL_DISPATCH_END                                                               \
757
    }
758
759
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-128s", sha2_128s);
760
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-128f", sha2_128f);
761
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-192s", sha2_192s);
762
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-192f", sha2_192f);
763
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-256s", sha2_256s);
764
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHA2-256f", sha2_256f);
765
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-128s", shake_128s);
766
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-128f", shake_128f);
767
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-192s", shake_192s);
768
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-192f", shake_192f);
769
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-256s", shake_256s);
770
MAKE_KEYMGMT_FUNCTIONS("SLH-DSA-SHAKE-256f", shake_256f);