Coverage Report

Created: 2025-12-31 06:58

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