Coverage Report

Created: 2026-10-28 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/signature/ml_dsa_sig.c
Line
Count
Source
1
/*
2
 * Copyright 2024-2026 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 "internal/deprecated.h"
14
15
#include <assert.h>
16
#include <string.h> /* memset */
17
#include <openssl/core_names.h>
18
#include <openssl/err.h>
19
#include <openssl/rand.h>
20
#include <openssl/proverr.h>
21
#include "prov/implementations.h"
22
#include "prov/providercommon.h"
23
#include "prov/provider_ctx.h"
24
#include "prov/der_ml_dsa.h"
25
#include "crypto/ml_dsa.h"
26
#include "internal/common.h"
27
#include "internal/fips.h"
28
#include "internal/packet.h"
29
#include "internal/sizes.h"
30
#include "fips/fipsindicator.h"
31
32
#define ML_DSA_MESSAGE_ENCODE_RAW 0
33
2.17k
#define ML_DSA_MESSAGE_ENCODE_PURE 1
34
35
static OSSL_FUNC_signature_sign_message_init_fn ml_dsa_sign_msg_init;
36
static OSSL_FUNC_signature_sign_message_update_fn ml_dsa_signverify_msg_update;
37
static OSSL_FUNC_signature_sign_message_final_fn ml_dsa_sign_msg_final;
38
static OSSL_FUNC_signature_sign_fn ml_dsa_sign;
39
static OSSL_FUNC_signature_verify_message_init_fn ml_dsa_verify_msg_init;
40
static OSSL_FUNC_signature_verify_message_update_fn ml_dsa_signverify_msg_update;
41
static OSSL_FUNC_signature_verify_message_final_fn ml_dsa_verify_msg_final;
42
static OSSL_FUNC_signature_verify_fn ml_dsa_verify;
43
static OSSL_FUNC_signature_digest_sign_init_fn ml_dsa_digest_signverify_init;
44
static OSSL_FUNC_signature_digest_sign_fn ml_dsa_digest_sign;
45
static OSSL_FUNC_signature_digest_verify_fn ml_dsa_digest_verify;
46
static OSSL_FUNC_signature_freectx_fn ml_dsa_freectx;
47
static OSSL_FUNC_signature_set_ctx_params_fn ml_dsa_set_ctx_params;
48
static OSSL_FUNC_signature_settable_ctx_params_fn ml_dsa_settable_ctx_params;
49
static OSSL_FUNC_signature_get_ctx_params_fn ml_dsa_get_ctx_params;
50
static OSSL_FUNC_signature_gettable_ctx_params_fn ml_dsa_gettable_ctx_params;
51
static OSSL_FUNC_signature_dupctx_fn ml_dsa_dupctx;
52
53
typedef struct {
54
    ML_DSA_KEY *key;
55
    OSSL_LIB_CTX *libctx;
56
    uint8_t context_string[ML_DSA_MAX_CONTEXT_STRING_LEN];
57
    size_t context_string_len;
58
    uint8_t test_entropy[ML_DSA_ENTROPY_LEN];
59
    size_t test_entropy_len;
60
    int msg_encode;
61
    int deterministic;
62
    int evp_type;
63
    /* The Algorithm Identifier of the signature algorithm */
64
    uint8_t aid_buf[OSSL_MAX_ALGORITHM_ID_SIZE];
65
    size_t aid_len;
66
    int mu; /* Flag indicating we should begin from \mu, not the message */
67
68
    int operation;
69
    EVP_MD_CTX *md_ctx; /* Ctx for msg_init/update/final interface */
70
    unsigned char *sig; /* Signature, for verification */
71
    size_t siglen;
72
} PROV_ML_DSA_CTX;
73
74
static void ml_dsa_freectx(void *vctx)
75
2.17k
{
76
2.17k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
77
78
2.17k
    EVP_MD_CTX_free(ctx->md_ctx);
79
2.17k
    OPENSSL_cleanse(ctx->test_entropy, ctx->test_entropy_len);
80
2.17k
    OPENSSL_free(ctx->sig);
81
2.17k
    OPENSSL_free(ctx);
82
2.17k
}
83
84
static void *ml_dsa_newctx(void *provctx, int evp_type, const char *propq)
85
2.17k
{
86
2.17k
    PROV_ML_DSA_CTX *ctx;
87
88
2.17k
    if (!ossl_prov_is_running())
89
0
        return NULL;
90
91
2.17k
    ctx = OPENSSL_zalloc(sizeof(PROV_ML_DSA_CTX));
92
2.17k
    if (ctx == NULL)
93
0
        return NULL;
94
95
2.17k
    ctx->libctx = PROV_LIBCTX_OF(provctx);
96
2.17k
    ctx->msg_encode = ML_DSA_MESSAGE_ENCODE_PURE;
97
2.17k
    ctx->evp_type = evp_type;
98
2.17k
    return ctx;
99
2.17k
}
100
101
static void *ml_dsa_dupctx(void *vctx)
102
0
{
103
0
    PROV_ML_DSA_CTX *srcctx = (PROV_ML_DSA_CTX *)vctx;
104
0
    PROV_ML_DSA_CTX *dstctx;
105
106
0
    if (!ossl_prov_is_running())
107
0
        return NULL;
108
109
    /*
110
     * Note that the ML_DSA_KEY is ref counted via EVP_PKEY so we can just copy
111
     * the key here.
112
     */
113
0
    dstctx = OPENSSL_memdup(srcctx, sizeof(*srcctx));
114
115
0
    if (dstctx == NULL)
116
0
        return NULL;
117
118
0
    if (srcctx->sig != NULL) {
119
0
        dstctx->sig = OPENSSL_memdup(srcctx->sig, srcctx->siglen);
120
0
        if (dstctx->sig == NULL) {
121
            /*
122
             * Can't call ml_dsa_freectx() here, as it would free
123
             * md_ctx which has not been duplicated yet.
124
             */
125
0
            OPENSSL_free(dstctx);
126
0
            return NULL;
127
0
        }
128
0
    }
129
130
0
    if (srcctx->md_ctx != NULL) {
131
0
        dstctx->md_ctx = EVP_MD_CTX_dup(srcctx->md_ctx);
132
0
        if (dstctx->md_ctx == NULL) {
133
0
            ml_dsa_freectx(dstctx);
134
0
            return NULL;
135
0
        }
136
0
    }
137
138
0
    return dstctx;
139
0
}
140
141
static int set_alg_id_buffer(PROV_ML_DSA_CTX *ctx)
142
2.17k
{
143
2.17k
    int ret;
144
2.17k
    WPACKET pkt;
145
2.17k
    uint8_t *aid = NULL;
146
147
    /*
148
     * We do not care about DER writing errors.
149
     * All it really means is that for some reason, there's no
150
     * AlgorithmIdentifier to be had, but the operation itself is
151
     * still valid, just as long as it's not used to construct
152
     * anything that needs an AlgorithmIdentifier.
153
     */
154
2.17k
    ctx->aid_len = 0;
155
2.17k
    ret = WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf));
156
2.17k
    ret = ret && ossl_DER_w_algorithmIdentifier_ML_DSA(&pkt, -1, ctx->key);
157
2.17k
    if (ret && WPACKET_finish(&pkt)) {
158
2.17k
        WPACKET_get_total_written(&pkt, &ctx->aid_len);
159
2.17k
        aid = WPACKET_get_curr(&pkt);
160
2.17k
    }
161
2.17k
    WPACKET_cleanup(&pkt);
162
2.17k
    if (aid != NULL && ctx->aid_len != 0)
163
2.17k
        memmove(ctx->aid_buf, aid, ctx->aid_len);
164
2.17k
    return 1;
165
2.17k
}
166
167
static int ml_dsa_signverify_msg_init(void *vctx, void *vkey,
168
    const OSSL_PARAM params[], int operation,
169
    const char *desc)
170
2.17k
{
171
2.17k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
172
2.17k
    ML_DSA_KEY *key = vkey;
173
174
2.17k
    if (!ossl_prov_is_running()
175
2.17k
        || ctx == NULL)
176
0
        return 0;
177
178
2.17k
    if (vkey == NULL && ctx->key == NULL) {
179
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
180
0
        return 0;
181
0
    }
182
183
2.17k
    if (key != NULL)
184
2.17k
        ctx->key = vkey;
185
2.17k
    if (!ossl_ml_dsa_key_matches(ctx->key, ctx->evp_type))
186
0
        return 0;
187
188
2.17k
    set_alg_id_buffer(ctx);
189
2.17k
    ctx->mu = 0;
190
2.17k
    ctx->operation = operation;
191
192
2.17k
    return ml_dsa_set_ctx_params(ctx, params);
193
2.17k
}
194
195
static int ml_dsa_sign_msg_init(void *vctx, void *vkey, const OSSL_PARAM params[])
196
630
{
197
630
    return ml_dsa_signverify_msg_init(vctx, vkey, params,
198
630
        EVP_PKEY_OP_SIGNMSG, "ML_DSA Sign Init");
199
630
}
200
201
static int ml_dsa_digest_signverify_init(void *vctx, const char *mdname,
202
    void *vkey, const OSSL_PARAM params[])
203
794
{
204
794
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
205
206
794
    if (mdname != NULL && mdname[0] != '\0') {
207
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
208
0
            "Explicit digest not supported for ML-DSA operations");
209
0
        return 0;
210
0
    }
211
212
794
    ctx->mu = 0;
213
214
794
    if (vkey == NULL && ctx->key != NULL)
215
0
        return ml_dsa_set_ctx_params(ctx, params);
216
217
794
    return ml_dsa_signverify_msg_init(vctx, vkey, params,
218
794
        EVP_PKEY_OP_SIGN, "ML_DSA Sign Init");
219
794
}
220
221
static int ml_dsa_signverify_msg_update(void *vctx,
222
    const unsigned char *data,
223
    size_t datalen)
224
3.91k
{
225
3.91k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
226
227
3.91k
    if (ctx == NULL)
228
0
        return 0;
229
230
3.91k
    if (!ossl_prov_is_running())
231
0
        return 0;
232
233
3.91k
    if (ctx->mu)
234
0
        return 0;
235
236
3.91k
    if (ctx->md_ctx == NULL) {
237
122
        ctx->md_ctx = ossl_ml_dsa_mu_init(ctx->key, ctx->msg_encode,
238
122
            ctx->context_string,
239
122
            ctx->context_string_len);
240
122
        if (ctx->md_ctx == NULL)
241
0
            return 0;
242
122
    }
243
244
3.91k
    return ossl_ml_dsa_mu_update(ctx->md_ctx, data, datalen);
245
3.91k
}
246
247
static int ml_dsa_sign_msg_final(void *vctx, unsigned char *sig,
248
    size_t *siglen, size_t sigsize)
249
0
{
250
0
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
251
0
    uint8_t rand_tmp[ML_DSA_ENTROPY_LEN], *rnd = NULL;
252
0
    uint8_t mu[ML_DSA_MU_BYTES];
253
0
    int ret = 0;
254
255
0
    if (ctx == NULL)
256
0
        return 0;
257
258
0
    if (!ossl_prov_is_running())
259
0
        return 0;
260
261
0
    if (ctx->md_ctx == NULL)
262
0
        return 0;
263
264
0
    if (sig != NULL) {
265
0
        if (ctx->test_entropy_len != 0) {
266
0
            rnd = ctx->test_entropy;
267
0
        } else {
268
0
            rnd = rand_tmp;
269
270
0
            if (ctx->deterministic == 1)
271
0
                memset(rnd, 0, sizeof(rand_tmp));
272
0
            else if (RAND_priv_bytes_ex(ctx->libctx, rnd, sizeof(rand_tmp), 0) <= 0)
273
0
                return 0;
274
0
        }
275
276
0
        if (!ossl_ml_dsa_mu_finalize(ctx->md_ctx, mu, sizeof(mu))) {
277
0
            OPENSSL_cleanse(mu, sizeof(mu));
278
0
            return 0;
279
0
        }
280
0
    }
281
282
0
    ret = ossl_ml_dsa_sign(ctx->key, 1, mu, sizeof(mu), NULL, 0, rnd,
283
0
        sizeof(rand_tmp), 0, sig, siglen, sigsize);
284
0
    if (rnd != ctx->test_entropy)
285
0
        OPENSSL_cleanse(rand_tmp, sizeof(rand_tmp));
286
0
    OPENSSL_cleanse(mu, sizeof(mu));
287
0
    return ret;
288
0
}
289
290
static int ml_dsa_sign(void *vctx, uint8_t *sig, size_t *siglen, size_t sigsize,
291
    const uint8_t *msg, size_t msg_len)
292
2.05k
{
293
2.05k
    int ret = 0;
294
2.05k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
295
2.05k
    uint8_t rand_tmp[ML_DSA_ENTROPY_LEN], *rnd = NULL;
296
297
2.05k
    if (!ossl_prov_is_running())
298
0
        return 0;
299
300
2.05k
    if (sig != NULL) {
301
1.02k
        if (ctx->test_entropy_len != 0) {
302
0
            rnd = ctx->test_entropy;
303
1.02k
        } else {
304
1.02k
            rnd = rand_tmp;
305
306
1.02k
            if (ctx->deterministic == 1)
307
0
                memset(rnd, 0, sizeof(rand_tmp));
308
1.02k
            else if (RAND_priv_bytes_ex(ctx->libctx, rnd, sizeof(rand_tmp), 0) <= 0)
309
0
                return 0;
310
1.02k
        }
311
1.02k
    }
312
2.05k
    ret = ossl_ml_dsa_sign(ctx->key, ctx->mu, msg, msg_len,
313
2.05k
        ctx->context_string, ctx->context_string_len,
314
2.05k
        rnd, sizeof(rand_tmp), ctx->msg_encode,
315
2.05k
        sig, siglen, sigsize);
316
2.05k
    if (rnd != ctx->test_entropy)
317
2.05k
        OPENSSL_cleanse(rand_tmp, sizeof(rand_tmp));
318
2.05k
    return ret;
319
2.05k
}
320
321
static int ml_dsa_digest_sign(void *vctx, uint8_t *sig, size_t *siglen, size_t sigsize,
322
    const uint8_t *tbs, size_t tbslen)
323
790
{
324
790
    return ml_dsa_sign(vctx, sig, siglen, sigsize, tbs, tbslen);
325
790
}
326
327
static int ml_dsa_verify_msg_init(void *vctx, void *vkey, const OSSL_PARAM params[])
328
752
{
329
752
    return ml_dsa_signverify_msg_init(vctx, vkey, params, EVP_PKEY_OP_VERIFYMSG,
330
752
        "ML_DSA Verify Init");
331
752
}
332
333
static int ml_dsa_verify_msg_final(void *vctx)
334
122
{
335
122
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
336
122
    uint8_t mu[ML_DSA_MU_BYTES];
337
122
    int ret = 0;
338
339
122
    if (!ossl_prov_is_running())
340
0
        return 0;
341
342
122
    if (ctx->md_ctx == NULL)
343
0
        return 0;
344
345
122
    if (ossl_ml_dsa_mu_finalize(ctx->md_ctx, mu, sizeof(mu)))
346
122
        ret = ossl_ml_dsa_verify(ctx->key, 1, mu, sizeof(mu), NULL, 0, 0,
347
122
            ctx->sig, ctx->siglen);
348
349
122
    OPENSSL_cleanse(mu, sizeof(mu));
350
122
    return ret;
351
122
}
352
353
static int ml_dsa_verify(void *vctx, const uint8_t *sig, size_t siglen,
354
    const uint8_t *msg, size_t msg_len)
355
1.02k
{
356
1.02k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
357
358
1.02k
    if (!ossl_prov_is_running())
359
0
        return 0;
360
1.02k
    return ossl_ml_dsa_verify(ctx->key, ctx->mu, msg, msg_len,
361
1.02k
        ctx->context_string, ctx->context_string_len,
362
1.02k
        ctx->msg_encode, sig, siglen);
363
1.02k
}
364
static int ml_dsa_digest_verify(void *vctx,
365
    const uint8_t *sig, size_t siglen,
366
    const uint8_t *tbs, size_t tbslen)
367
399
{
368
399
    return ml_dsa_verify(vctx, sig, siglen, tbs, tbslen);
369
399
}
370
371
/*
372
 * Only need the param list for the signing case.  The decoder and structure
373
 * are shared between the sign and verify cases.
374
 */
375
#define ml_dsa_set_ctx_params_st ml_dsa_verifymsg_set_ctx_params_st
376
#define ml_dsa_set_ctx_params_decoder ml_dsa_verifymsg_set_ctx_params_decoder
377
378
/* clang-format off */
379
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
380
#ifndef ml_dsa_set_ctx_params_list
381
static ossl_unused const OSSL_PARAM ml_dsa_set_ctx_params_list[] = {
382
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, NULL, 0),
383
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_TEST_ENTROPY, NULL, 0),
384
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, NULL),
385
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, NULL),
386
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, NULL),
387
    OSSL_PARAM_END
388
};
389
#endif
390
391
#ifndef ml_dsa_set_ctx_params_st
392
struct ml_dsa_set_ctx_params_st {
393
    OSSL_PARAM *ctx;
394
    OSSL_PARAM *det;
395
    OSSL_PARAM *ent;
396
    OSSL_PARAM *msgenc;
397
    OSSL_PARAM *mu;
398
};
399
#endif
400
401
#ifndef ml_dsa_set_ctx_params_decoder
402
static ossl_unused int ml_dsa_set_ctx_params_decoder
403
    (const OSSL_PARAM *p, struct ml_dsa_set_ctx_params_st *r)
404
{
405
    const char *s;
406
407
    memset(r, 0, sizeof(*r));
408
    if (p != NULL)
409
        for (; (s = p->key) != NULL; p++)
410
            switch(s[0]) {
411
            default:
412
                break;
413
            case 'c':
414
                if (ossl_likely(strcmp("ontext-string", s + 1) == 0)) {
415
                    /* OSSL_SIGNATURE_PARAM_CONTEXT_STRING */
416
                    if (ossl_unlikely(r->ctx != NULL)) {
417
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
418
                                       "param %s is repeated", s);
419
                        return 0;
420
                    }
421
                    r->ctx = (OSSL_PARAM *)p;
422
                }
423
                break;
424
            case 'd':
425
                if (ossl_likely(strcmp("eterministic", s + 1) == 0)) {
426
                    /* OSSL_SIGNATURE_PARAM_DETERMINISTIC */
427
                    if (ossl_unlikely(r->det != NULL)) {
428
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
429
                                       "param %s is repeated", s);
430
                        return 0;
431
                    }
432
                    r->det = (OSSL_PARAM *)p;
433
                }
434
                break;
435
            case 'm':
436
                switch(s[1]) {
437
                default:
438
                    break;
439
                case 'e':
440
                    if (ossl_likely(strcmp("ssage-encoding", s + 2) == 0)) {
441
                        /* OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING */
442
                        if (ossl_unlikely(r->msgenc != NULL)) {
443
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
444
                                           "param %s is repeated", s);
445
                            return 0;
446
                        }
447
                        r->msgenc = (OSSL_PARAM *)p;
448
                    }
449
                    break;
450
                case 'u':
451
                    switch(s[2]) {
452
                    default:
453
                        break;
454
                    case '\0':
455
                        if (ossl_unlikely(r->mu != NULL)) {
456
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
457
                                           "param %s is repeated", s);
458
                            return 0;
459
                        }
460
                        r->mu = (OSSL_PARAM *)p;
461
                    }
462
                }
463
                break;
464
            case 't':
465
                if (ossl_likely(strcmp("est-entropy", s + 1) == 0)) {
466
                    /* OSSL_SIGNATURE_PARAM_TEST_ENTROPY */
467
                    if (ossl_unlikely(r->ent != NULL)) {
468
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
469
                                       "param %s is repeated", s);
470
                        return 0;
471
                    }
472
                    r->ent = (OSSL_PARAM *)p;
473
                }
474
            }
475
    return 1;
476
}
477
#endif
478
/* End of machine generated */
479
/* clang-format on */
480
481
/* clang-format off */
482
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
483
#ifndef ml_dsa_verifymsg_set_ctx_params_list
484
static ossl_unused const OSSL_PARAM ml_dsa_verifymsg_set_ctx_params_list[] = {
485
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, NULL, 0),
486
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_TEST_ENTROPY, NULL, 0),
487
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, NULL),
488
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, NULL),
489
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, NULL),
490
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
491
    OSSL_PARAM_END
492
};
493
#endif
494
495
#ifndef ml_dsa_verifymsg_set_ctx_params_st
496
struct ml_dsa_verifymsg_set_ctx_params_st {
497
    OSSL_PARAM *ctx;
498
    OSSL_PARAM *det;
499
    OSSL_PARAM *ent;
500
    OSSL_PARAM *msgenc;
501
    OSSL_PARAM *mu;
502
    OSSL_PARAM *sig;
503
};
504
#endif
505
506
#ifndef ml_dsa_verifymsg_set_ctx_params_decoder
507
static ossl_unused int ml_dsa_verifymsg_set_ctx_params_decoder
508
    (const OSSL_PARAM *p, struct ml_dsa_verifymsg_set_ctx_params_st *r)
509
1.92k
{
510
1.92k
    const char *s;
511
512
1.92k
    memset(r, 0, sizeof(*r));
513
1.92k
    if (p != NULL)
514
3.60k
        for (; (s = p->key) != NULL; p++)
515
1.80k
            switch(s[0]) {
516
0
            default:
517
0
                break;
518
1.67k
            case 'c':
519
1.67k
                if (ossl_likely(strcmp("ontext-string", s + 1) == 0)) {
520
                    /* OSSL_SIGNATURE_PARAM_CONTEXT_STRING */
521
1.67k
                    if (ossl_unlikely(r->ctx != NULL)) {
522
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
523
0
                                       "param %s is repeated", s);
524
0
                        return 0;
525
0
                    }
526
1.67k
                    r->ctx = (OSSL_PARAM *)p;
527
1.67k
                }
528
1.67k
                break;
529
1.67k
            case 'd':
530
0
                if (ossl_likely(strcmp("eterministic", s + 1) == 0)) {
531
                    /* OSSL_SIGNATURE_PARAM_DETERMINISTIC */
532
0
                    if (ossl_unlikely(r->det != NULL)) {
533
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
534
0
                                       "param %s is repeated", s);
535
0
                        return 0;
536
0
                    }
537
0
                    r->det = (OSSL_PARAM *)p;
538
0
                }
539
0
                break;
540
0
            case 'm':
541
0
                switch(s[1]) {
542
0
                default:
543
0
                    break;
544
0
                case 'e':
545
0
                    if (ossl_likely(strcmp("ssage-encoding", s + 2) == 0)) {
546
                        /* OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING */
547
0
                        if (ossl_unlikely(r->msgenc != NULL)) {
548
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
549
0
                                           "param %s is repeated", s);
550
0
                            return 0;
551
0
                        }
552
0
                        r->msgenc = (OSSL_PARAM *)p;
553
0
                    }
554
0
                    break;
555
0
                case 'u':
556
0
                    switch(s[2]) {
557
0
                    default:
558
0
                        break;
559
0
                    case '\0':
560
0
                        if (ossl_unlikely(r->mu != NULL)) {
561
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
562
0
                                           "param %s is repeated", s);
563
0
                            return 0;
564
0
                        }
565
0
                        r->mu = (OSSL_PARAM *)p;
566
0
                    }
567
0
                }
568
0
                break;
569
122
            case 's':
570
122
                if (ossl_likely(strcmp("ignature", s + 1) == 0)) {
571
                    /* OSSL_SIGNATURE_PARAM_SIGNATURE */
572
122
                    if (ossl_unlikely(r->sig != NULL)) {
573
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
574
0
                                       "param %s is repeated", s);
575
0
                        return 0;
576
0
                    }
577
122
                    r->sig = (OSSL_PARAM *)p;
578
122
                }
579
122
                break;
580
122
            case 't':
581
0
                if (ossl_likely(strcmp("est-entropy", s + 1) == 0)) {
582
                    /* OSSL_SIGNATURE_PARAM_TEST_ENTROPY */
583
0
                    if (ossl_unlikely(r->ent != NULL)) {
584
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
585
0
                                       "param %s is repeated", s);
586
0
                        return 0;
587
0
                    }
588
0
                    r->ent = (OSSL_PARAM *)p;
589
0
                }
590
1.80k
            }
591
1.92k
    return 1;
592
1.92k
}
593
#endif
594
/* End of machine generated */
595
/* clang-format on */
596
597
static int ml_dsa_set_ctx_params(void *vctx, const OSSL_PARAM params[])
598
1.92k
{
599
1.92k
    PROV_ML_DSA_CTX *pctx = (PROV_ML_DSA_CTX *)vctx;
600
1.92k
    struct ml_dsa_verifymsg_set_ctx_params_st p;
601
602
1.92k
    if (pctx == NULL || !ml_dsa_verifymsg_set_ctx_params_decoder(params, &p))
603
0
        return 0;
604
605
1.92k
    if (p.ctx != NULL) {
606
1.67k
        void *vp = pctx->context_string;
607
608
1.67k
        if (!OSSL_PARAM_get_octet_string(p.ctx, &vp, sizeof(pctx->context_string),
609
1.67k
                &(pctx->context_string_len))) {
610
0
            pctx->context_string_len = 0;
611
0
            return 0;
612
0
        }
613
1.67k
    }
614
615
1.92k
    if (p.ent != NULL) {
616
0
        void *vp = pctx->test_entropy;
617
618
0
        pctx->test_entropy_len = 0;
619
0
        if (!OSSL_PARAM_get_octet_string(p.ent, &vp, sizeof(pctx->test_entropy),
620
0
                &(pctx->test_entropy_len)))
621
0
            return 0;
622
0
        if (pctx->test_entropy_len != sizeof(pctx->test_entropy)) {
623
0
            pctx->test_entropy_len = 0;
624
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SEED_LENGTH);
625
0
            return 0;
626
0
        }
627
0
    }
628
629
1.92k
    if (p.det != NULL && !OSSL_PARAM_get_int(p.det, &pctx->deterministic))
630
0
        return 0;
631
632
1.92k
    if (p.msgenc != NULL && !OSSL_PARAM_get_int(p.msgenc, &pctx->msg_encode))
633
0
        return 0;
634
635
1.92k
    if (p.mu != NULL && !OSSL_PARAM_get_int(p.mu, &pctx->mu))
636
0
        return 0;
637
638
1.92k
    if (p.sig != NULL && pctx->operation == EVP_PKEY_OP_VERIFYMSG) {
639
122
        OPENSSL_free(pctx->sig);
640
122
        pctx->sig = NULL;
641
122
        pctx->siglen = 0;
642
122
        if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&pctx->sig,
643
122
                0, &pctx->siglen))
644
0
            return 0;
645
122
    }
646
647
1.92k
    return 1;
648
1.92k
}
649
650
static const OSSL_PARAM *ml_dsa_settable_ctx_params(void *vctx,
651
    ossl_unused void *provctx)
652
19
{
653
19
    PROV_ML_DSA_CTX *pctx = (PROV_ML_DSA_CTX *)vctx;
654
655
19
    if (pctx != NULL && pctx->operation == EVP_PKEY_OP_VERIFYMSG)
656
0
        return ml_dsa_verifymsg_set_ctx_params_list;
657
19
    else
658
19
        return ml_dsa_set_ctx_params_list;
659
19
}
660
661
/* clang-format off */
662
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
663
#ifndef ml_dsa_get_ctx_params_list
664
static ossl_unused const OSSL_PARAM ml_dsa_get_ctx_params_list[] = {
665
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
666
# if defined(FIPS_MODULE)
667
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR, NULL),
668
# endif
669
    OSSL_PARAM_END
670
};
671
#endif
672
673
#ifndef ml_dsa_get_ctx_params_st
674
struct ml_dsa_get_ctx_params_st {
675
    OSSL_PARAM *id;
676
# if defined(FIPS_MODULE)
677
    OSSL_PARAM *ind;
678
# endif
679
};
680
#endif
681
682
#ifndef ml_dsa_get_ctx_params_decoder
683
static ossl_unused int ml_dsa_get_ctx_params_decoder
684
    (const OSSL_PARAM *p, struct ml_dsa_get_ctx_params_st *r)
685
0
{
686
0
    const char *s;
687
688
0
    memset(r, 0, sizeof(*r));
689
0
    if (p != NULL)
690
0
        for (; (s = p->key) != NULL; p++)
691
0
            switch(s[0]) {
692
0
            default:
693
0
                break;
694
0
            case 'a':
695
0
                if (ossl_likely(strcmp("lgorithm-id", s + 1) == 0)) {
696
                    /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
697
0
                    if (ossl_unlikely(r->id != NULL)) {
698
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
699
0
                                       "param %s is repeated", s);
700
0
                        return 0;
701
0
                    }
702
0
                    r->id = (OSSL_PARAM *)p;
703
0
                }
704
0
                break;
705
0
            case 'f':
706
# if defined(FIPS_MODULE)
707
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
708
                    /* OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR */
709
                    if (ossl_unlikely(r->ind != NULL)) {
710
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
711
                                       "param %s is repeated", s);
712
                        return 0;
713
                    }
714
                    r->ind = (OSSL_PARAM *)p;
715
                }
716
# endif
717
0
                break;
718
0
            }
719
0
    return 1;
720
0
}
721
#endif
722
/* End of machine generated */
723
/* clang-format on */
724
725
static const OSSL_PARAM *ml_dsa_gettable_ctx_params(ossl_unused void *vctx,
726
    ossl_unused void *provctx)
727
0
{
728
0
    return ml_dsa_get_ctx_params_list;
729
0
}
730
731
static int ml_dsa_get_ctx_params(void *vctx, OSSL_PARAM *params)
732
0
{
733
0
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
734
0
    struct ml_dsa_get_ctx_params_st p;
735
736
0
    if (ctx == NULL || !ml_dsa_get_ctx_params_decoder(params, &p))
737
0
        return 0;
738
739
0
    if (p.id != NULL
740
0
        && !OSSL_PARAM_set_octet_string(p.id,
741
0
            ctx->aid_len == 0 ? NULL : ctx->aid_buf,
742
0
            ctx->aid_len))
743
0
        return 0;
744
745
0
    if (!OSSL_FIPS_IND_GET_PARAM_CONDITIONAL(p.ind,
746
0
            ctx->test_entropy_len == 0
747
0
                && ctx->msg_encode == ML_DSA_MESSAGE_ENCODE_PURE))
748
0
        return 0;
749
750
0
    return 1;
751
0
}
752
753
#define MAKE_SIGNATURE_FUNCTIONS(alg)                                          \
754
    static OSSL_FUNC_signature_newctx_fn ml_dsa_##alg##_newctx;                \
755
    static void *ml_dsa_##alg##_newctx(void *provctx, const char *propq)       \
756
2.17k
    {                                                                          \
757
2.17k
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
758
2.17k
    }                                                                          \
ml_dsa_sig.c:ml_dsa_44_newctx
Line
Count
Source
756
948
    {                                                                          \
757
948
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
758
948
    }                                                                          \
ml_dsa_sig.c:ml_dsa_65_newctx
Line
Count
Source
756
650
    {                                                                          \
757
650
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
758
650
    }                                                                          \
ml_dsa_sig.c:ml_dsa_87_newctx
Line
Count
Source
756
580
    {                                                                          \
757
580
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
758
580
    }                                                                          \
759
    const OSSL_DISPATCH ossl_ml_dsa_##alg##_signature_functions[] = {          \
760
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ml_dsa_##alg##_newctx }, \
761
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                               \
762
            (void (*)(void))ml_dsa_sign_msg_init },                            \
763
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                             \
764
            (void (*)(void))ml_dsa_signverify_msg_update },                    \
765
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                              \
766
            (void (*)(void))ml_dsa_sign_msg_final },                           \
767
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ml_dsa_sign },             \
768
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                             \
769
            (void (*)(void))ml_dsa_verify_msg_init },                          \
770
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                           \
771
            (void (*)(void))ml_dsa_signverify_msg_update },                    \
772
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                            \
773
            (void (*)(void))ml_dsa_verify_msg_final },                         \
774
        { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))ml_dsa_verify },         \
775
        { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,                                \
776
            (void (*)(void))ml_dsa_digest_signverify_init },                   \
777
        { OSSL_FUNC_SIGNATURE_DIGEST_SIGN,                                     \
778
            (void (*)(void))ml_dsa_digest_sign },                              \
779
        { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,                              \
780
            (void (*)(void))ml_dsa_digest_signverify_init },                   \
781
        { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY,                                   \
782
            (void (*)(void))ml_dsa_digest_verify },                            \
783
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ml_dsa_freectx },       \
784
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                                  \
785
            (void (*)(void))ml_dsa_set_ctx_params },                           \
786
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                             \
787
            (void (*)(void))ml_dsa_settable_ctx_params },                      \
788
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                                  \
789
            (void (*)(void))ml_dsa_get_ctx_params },                           \
790
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                             \
791
            (void (*)(void))ml_dsa_gettable_ctx_params },                      \
792
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ml_dsa_dupctx },         \
793
        OSSL_DISPATCH_END                                                      \
794
    }
795
796
MAKE_SIGNATURE_FUNCTIONS(44);
797
MAKE_SIGNATURE_FUNCTIONS(65);
798
MAKE_SIGNATURE_FUNCTIONS(87);