Coverage Report

Created: 2026-09-12 06:55

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/packet.h"
28
#include "internal/sizes.h"
29
30
#define ML_DSA_MESSAGE_ENCODE_RAW 0
31
1.78k
#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.78k
{
74
1.78k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
75
76
1.78k
    EVP_MD_CTX_free(ctx->md_ctx);
77
1.78k
    OPENSSL_cleanse(ctx->test_entropy, ctx->test_entropy_len);
78
1.78k
    OPENSSL_free(ctx->sig);
79
1.78k
    OPENSSL_free(ctx);
80
1.78k
}
81
82
static void *ml_dsa_newctx(void *provctx, int evp_type, const char *propq)
83
1.78k
{
84
1.78k
    PROV_ML_DSA_CTX *ctx;
85
86
1.78k
    if (!ossl_prov_is_running())
87
0
        return NULL;
88
89
1.78k
    ctx = OPENSSL_zalloc(sizeof(PROV_ML_DSA_CTX));
90
1.78k
    if (ctx == NULL)
91
0
        return NULL;
92
93
1.78k
    ctx->libctx = PROV_LIBCTX_OF(provctx);
94
1.78k
    ctx->msg_encode = ML_DSA_MESSAGE_ENCODE_PURE;
95
1.78k
    ctx->evp_type = evp_type;
96
1.78k
    return ctx;
97
1.78k
}
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.78k
{
141
1.78k
    int ret;
142
1.78k
    WPACKET pkt;
143
1.78k
    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.78k
    ctx->aid_len = 0;
153
1.78k
    ret = WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf));
154
1.78k
    ret = ret && ossl_DER_w_algorithmIdentifier_ML_DSA(&pkt, -1, ctx->key);
155
1.78k
    if (ret && WPACKET_finish(&pkt)) {
156
1.78k
        WPACKET_get_total_written(&pkt, &ctx->aid_len);
157
1.78k
        aid = WPACKET_get_curr(&pkt);
158
1.78k
    }
159
1.78k
    WPACKET_cleanup(&pkt);
160
1.78k
    if (aid != NULL && ctx->aid_len != 0)
161
1.78k
        memmove(ctx->aid_buf, aid, ctx->aid_len);
162
1.78k
    return 1;
163
1.78k
}
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.78k
{
169
1.78k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
170
1.78k
    ML_DSA_KEY *key = vkey;
171
172
1.78k
    if (!ossl_prov_is_running()
173
1.78k
        || ctx == NULL)
174
0
        return 0;
175
176
1.78k
    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.78k
    if (key != NULL)
182
1.78k
        ctx->key = vkey;
183
1.78k
    if (!ossl_ml_dsa_key_matches(ctx->key, ctx->evp_type))
184
0
        return 0;
185
186
1.78k
    set_alg_id_buffer(ctx);
187
1.78k
    ctx->mu = 0;
188
1.78k
    ctx->operation = operation;
189
190
1.78k
    return ml_dsa_set_ctx_params(ctx, params);
191
1.78k
}
192
193
static int ml_dsa_sign_msg_init(void *vctx, void *vkey, const OSSL_PARAM params[])
194
535
{
195
535
    return ml_dsa_signverify_msg_init(vctx, vkey, params,
196
535
        EVP_PKEY_OP_SIGNMSG, "ML_DSA Sign Init");
197
535
}
198
199
static int ml_dsa_digest_signverify_init(void *vctx, const char *mdname,
200
    void *vkey, const OSSL_PARAM params[])
201
714
{
202
714
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
203
204
714
    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
714
    ctx->mu = 0;
211
212
714
    if (vkey == NULL && ctx->key != NULL)
213
0
        return ml_dsa_set_ctx_params(ctx, params);
214
215
714
    return ml_dsa_signverify_msg_init(vctx, vkey, params,
216
714
        EVP_PKEY_OP_SIGN, "ML_DSA Sign Init");
217
714
}
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
            OPENSSL_cleanse(mu, sizeof(mu));
276
0
            return 0;
277
0
        }
278
0
    }
279
280
0
    ret = ossl_ml_dsa_sign(ctx->key, 1, mu, sizeof(mu), NULL, 0, rnd,
281
0
        sizeof(rand_tmp), 0, sig, siglen, sigsize);
282
0
    if (rnd != ctx->test_entropy)
283
0
        OPENSSL_cleanse(rand_tmp, sizeof(rand_tmp));
284
0
    OPENSSL_cleanse(mu, sizeof(mu));
285
0
    return ret;
286
0
}
287
288
static int ml_dsa_sign(void *vctx, uint8_t *sig, size_t *siglen, size_t sigsize,
289
    const uint8_t *msg, size_t msg_len)
290
1.78k
{
291
1.78k
    int ret = 0;
292
1.78k
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
293
1.78k
    uint8_t rand_tmp[ML_DSA_ENTROPY_LEN], *rnd = NULL;
294
295
1.78k
    if (!ossl_prov_is_running())
296
0
        return 0;
297
298
1.78k
    if (sig != NULL) {
299
892
        if (ctx->test_entropy_len != 0) {
300
0
            rnd = ctx->test_entropy;
301
892
        } else {
302
892
            rnd = rand_tmp;
303
304
892
            if (ctx->deterministic == 1)
305
0
                memset(rnd, 0, sizeof(rand_tmp));
306
892
            else if (RAND_priv_bytes_ex(ctx->libctx, rnd, sizeof(rand_tmp), 0) <= 0)
307
0
                return 0;
308
892
        }
309
892
    }
310
1.78k
    ret = ossl_ml_dsa_sign(ctx->key, ctx->mu, msg, msg_len,
311
1.78k
        ctx->context_string, ctx->context_string_len,
312
1.78k
        rnd, sizeof(rand_tmp), ctx->msg_encode,
313
1.78k
        sig, siglen, sigsize);
314
1.78k
    if (rnd != ctx->test_entropy)
315
1.78k
        OPENSSL_cleanse(rand_tmp, sizeof(rand_tmp));
316
1.78k
    return ret;
317
1.78k
}
318
319
static int ml_dsa_digest_sign(void *vctx, uint8_t *sig, size_t *siglen, size_t sigsize,
320
    const uint8_t *tbs, size_t tbslen)
321
714
{
322
714
    return ml_dsa_sign(vctx, sig, siglen, sigsize, tbs, tbslen);
323
714
}
324
325
static int ml_dsa_verify_msg_init(void *vctx, void *vkey, const OSSL_PARAM params[])
326
535
{
327
535
    return ml_dsa_signverify_msg_init(vctx, vkey, params, EVP_PKEY_OP_VERIFYMSG,
328
535
        "ML_DSA Verify Init");
329
535
}
330
331
static int ml_dsa_verify_msg_final(void *vctx)
332
0
{
333
0
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
334
0
    uint8_t mu[ML_DSA_MU_BYTES];
335
0
    int ret = 0;
336
337
0
    if (!ossl_prov_is_running())
338
0
        return 0;
339
340
0
    if (ctx->md_ctx == NULL)
341
0
        return 0;
342
343
0
    if (ossl_ml_dsa_mu_finalize(ctx->md_ctx, mu, sizeof(mu)))
344
0
        ret = ossl_ml_dsa_verify(ctx->key, 1, mu, sizeof(mu), NULL, 0, 0,
345
0
            ctx->sig, ctx->siglen);
346
347
0
    OPENSSL_cleanse(mu, sizeof(mu));
348
0
    return ret;
349
0
}
350
351
static int ml_dsa_verify(void *vctx, const uint8_t *sig, size_t siglen,
352
    const uint8_t *msg, size_t msg_len)
353
892
{
354
892
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
355
356
892
    if (!ossl_prov_is_running())
357
0
        return 0;
358
892
    return ossl_ml_dsa_verify(ctx->key, ctx->mu, msg, msg_len,
359
892
        ctx->context_string, ctx->context_string_len,
360
892
        ctx->msg_encode, sig, siglen);
361
892
}
362
static int ml_dsa_digest_verify(void *vctx,
363
    const uint8_t *sig, size_t siglen,
364
    const uint8_t *tbs, size_t tbslen)
365
357
{
366
357
    return ml_dsa_verify(vctx, sig, siglen, tbs, tbslen);
367
357
}
368
369
/*
370
 * Only need the param list for the signing case.  The decoder and structure
371
 * are shared between the sign and verify cases.
372
 */
373
#define ml_dsa_set_ctx_params_st ml_dsa_verifymsg_set_ctx_params_st
374
#define ml_dsa_set_ctx_params_decoder ml_dsa_verifymsg_set_ctx_params_decoder
375
376
/* clang-format off */
377
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
378
#ifndef ml_dsa_set_ctx_params_list
379
static const OSSL_PARAM ml_dsa_set_ctx_params_list[] = {
380
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, NULL, 0),
381
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_TEST_ENTROPY, NULL, 0),
382
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, NULL),
383
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, NULL),
384
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, NULL),
385
    OSSL_PARAM_END
386
};
387
#endif
388
389
#ifndef ml_dsa_set_ctx_params_st
390
struct ml_dsa_set_ctx_params_st {
391
    OSSL_PARAM *ctx;
392
    OSSL_PARAM *det;
393
    OSSL_PARAM *ent;
394
    OSSL_PARAM *msgenc;
395
    OSSL_PARAM *mu;
396
};
397
#endif
398
399
#ifndef ml_dsa_set_ctx_params_decoder
400
static int ml_dsa_set_ctx_params_decoder
401
    (const OSSL_PARAM *p, struct ml_dsa_set_ctx_params_st *r)
402
{
403
    const char *s;
404
405
    memset(r, 0, sizeof(*r));
406
    if (p != NULL)
407
        for (; (s = p->key) != NULL; p++)
408
            switch(s[0]) {
409
            default:
410
                break;
411
            case 'c':
412
                if (ossl_likely(strcmp("ontext-string", s + 1) == 0)) {
413
                    /* OSSL_SIGNATURE_PARAM_CONTEXT_STRING */
414
                    if (ossl_unlikely(r->ctx != NULL)) {
415
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
416
                                       "param %s is repeated", s);
417
                        return 0;
418
                    }
419
                    r->ctx = (OSSL_PARAM *)p;
420
                }
421
                break;
422
            case 'd':
423
                if (ossl_likely(strcmp("eterministic", s + 1) == 0)) {
424
                    /* OSSL_SIGNATURE_PARAM_DETERMINISTIC */
425
                    if (ossl_unlikely(r->det != NULL)) {
426
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
427
                                       "param %s is repeated", s);
428
                        return 0;
429
                    }
430
                    r->det = (OSSL_PARAM *)p;
431
                }
432
                break;
433
            case 'm':
434
                switch(s[1]) {
435
                default:
436
                    break;
437
                case 'e':
438
                    if (ossl_likely(strcmp("ssage-encoding", s + 2) == 0)) {
439
                        /* OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING */
440
                        if (ossl_unlikely(r->msgenc != NULL)) {
441
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
442
                                           "param %s is repeated", s);
443
                            return 0;
444
                        }
445
                        r->msgenc = (OSSL_PARAM *)p;
446
                    }
447
                    break;
448
                case 'u':
449
                    switch(s[2]) {
450
                    default:
451
                        break;
452
                    case '\0':
453
                        if (ossl_unlikely(r->mu != NULL)) {
454
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
455
                                           "param %s is repeated", s);
456
                            return 0;
457
                        }
458
                        r->mu = (OSSL_PARAM *)p;
459
                    }
460
                }
461
                break;
462
            case 't':
463
                if (ossl_likely(strcmp("est-entropy", s + 1) == 0)) {
464
                    /* OSSL_SIGNATURE_PARAM_TEST_ENTROPY */
465
                    if (ossl_unlikely(r->ent != NULL)) {
466
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
467
                                       "param %s is repeated", s);
468
                        return 0;
469
                    }
470
                    r->ent = (OSSL_PARAM *)p;
471
                }
472
            }
473
    return 1;
474
}
475
#endif
476
/* End of machine generated */
477
/* clang-format on */
478
479
/* clang-format off */
480
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
481
#ifndef ml_dsa_verifymsg_set_ctx_params_list
482
static const OSSL_PARAM ml_dsa_verifymsg_set_ctx_params_list[] = {
483
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_CONTEXT_STRING, NULL, 0),
484
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_TEST_ENTROPY, NULL, 0),
485
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_DETERMINISTIC, NULL),
486
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING, NULL),
487
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_MU, NULL),
488
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
489
    OSSL_PARAM_END
490
};
491
#endif
492
493
#ifndef ml_dsa_verifymsg_set_ctx_params_st
494
struct ml_dsa_verifymsg_set_ctx_params_st {
495
    OSSL_PARAM *ctx;
496
    OSSL_PARAM *det;
497
    OSSL_PARAM *ent;
498
    OSSL_PARAM *msgenc;
499
    OSSL_PARAM *mu;
500
    OSSL_PARAM *sig;
501
};
502
#endif
503
504
#ifndef ml_dsa_verifymsg_set_ctx_params_decoder
505
static int ml_dsa_verifymsg_set_ctx_params_decoder
506
    (const OSSL_PARAM *p, struct ml_dsa_verifymsg_set_ctx_params_st *r)
507
1.36k
{
508
1.36k
    const char *s;
509
510
1.36k
    memset(r, 0, sizeof(*r));
511
1.36k
    if (p != NULL)
512
2.72k
        for (; (s = p->key) != NULL; p++)
513
1.36k
            switch(s[0]) {
514
0
            default:
515
0
                break;
516
1.36k
            case 'c':
517
1.36k
                if (ossl_likely(strcmp("ontext-string", s + 1) == 0)) {
518
                    /* OSSL_SIGNATURE_PARAM_CONTEXT_STRING */
519
1.36k
                    if (ossl_unlikely(r->ctx != NULL)) {
520
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
521
0
                                       "param %s is repeated", s);
522
0
                        return 0;
523
0
                    }
524
1.36k
                    r->ctx = (OSSL_PARAM *)p;
525
1.36k
                }
526
1.36k
                break;
527
1.36k
            case 'd':
528
0
                if (ossl_likely(strcmp("eterministic", s + 1) == 0)) {
529
                    /* OSSL_SIGNATURE_PARAM_DETERMINISTIC */
530
0
                    if (ossl_unlikely(r->det != NULL)) {
531
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
532
0
                                       "param %s is repeated", s);
533
0
                        return 0;
534
0
                    }
535
0
                    r->det = (OSSL_PARAM *)p;
536
0
                }
537
0
                break;
538
0
            case 'm':
539
0
                switch(s[1]) {
540
0
                default:
541
0
                    break;
542
0
                case 'e':
543
0
                    if (ossl_likely(strcmp("ssage-encoding", s + 2) == 0)) {
544
                        /* OSSL_SIGNATURE_PARAM_MESSAGE_ENCODING */
545
0
                        if (ossl_unlikely(r->msgenc != NULL)) {
546
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
547
0
                                           "param %s is repeated", s);
548
0
                            return 0;
549
0
                        }
550
0
                        r->msgenc = (OSSL_PARAM *)p;
551
0
                    }
552
0
                    break;
553
0
                case 'u':
554
0
                    switch(s[2]) {
555
0
                    default:
556
0
                        break;
557
0
                    case '\0':
558
0
                        if (ossl_unlikely(r->mu != NULL)) {
559
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
560
0
                                           "param %s is repeated", s);
561
0
                            return 0;
562
0
                        }
563
0
                        r->mu = (OSSL_PARAM *)p;
564
0
                    }
565
0
                }
566
0
                break;
567
0
            case 's':
568
0
                if (ossl_likely(strcmp("ignature", s + 1) == 0)) {
569
                    /* OSSL_SIGNATURE_PARAM_SIGNATURE */
570
0
                    if (ossl_unlikely(r->sig != NULL)) {
571
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
572
0
                                       "param %s is repeated", s);
573
0
                        return 0;
574
0
                    }
575
0
                    r->sig = (OSSL_PARAM *)p;
576
0
                }
577
0
                break;
578
0
            case 't':
579
0
                if (ossl_likely(strcmp("est-entropy", s + 1) == 0)) {
580
                    /* OSSL_SIGNATURE_PARAM_TEST_ENTROPY */
581
0
                    if (ossl_unlikely(r->ent != NULL)) {
582
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
583
0
                                       "param %s is repeated", s);
584
0
                        return 0;
585
0
                    }
586
0
                    r->ent = (OSSL_PARAM *)p;
587
0
                }
588
1.36k
            }
589
1.36k
    return 1;
590
1.36k
}
591
#endif
592
/* End of machine generated */
593
/* clang-format on */
594
595
static int ml_dsa_set_ctx_params(void *vctx, const OSSL_PARAM params[])
596
1.36k
{
597
1.36k
    PROV_ML_DSA_CTX *pctx = (PROV_ML_DSA_CTX *)vctx;
598
1.36k
    struct ml_dsa_verifymsg_set_ctx_params_st p;
599
600
1.36k
    if (pctx == NULL || !ml_dsa_verifymsg_set_ctx_params_decoder(params, &p))
601
0
        return 0;
602
603
1.36k
    if (p.ctx != NULL) {
604
1.36k
        void *vp = pctx->context_string;
605
606
1.36k
        if (!OSSL_PARAM_get_octet_string(p.ctx, &vp, sizeof(pctx->context_string),
607
1.36k
                &(pctx->context_string_len))) {
608
0
            pctx->context_string_len = 0;
609
0
            return 0;
610
0
        }
611
1.36k
    }
612
613
1.36k
    if (p.ent != NULL) {
614
0
        void *vp = pctx->test_entropy;
615
616
0
        pctx->test_entropy_len = 0;
617
0
        if (!OSSL_PARAM_get_octet_string(p.ent, &vp, sizeof(pctx->test_entropy),
618
0
                &(pctx->test_entropy_len)))
619
0
            return 0;
620
0
        if (pctx->test_entropy_len != sizeof(pctx->test_entropy)) {
621
0
            pctx->test_entropy_len = 0;
622
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SEED_LENGTH);
623
0
            return 0;
624
0
        }
625
0
    }
626
627
1.36k
    if (p.det != NULL && !OSSL_PARAM_get_int(p.det, &pctx->deterministic))
628
0
        return 0;
629
630
1.36k
    if (p.msgenc != NULL && !OSSL_PARAM_get_int(p.msgenc, &pctx->msg_encode))
631
0
        return 0;
632
633
1.36k
    if (p.mu != NULL && !OSSL_PARAM_get_int(p.mu, &pctx->mu))
634
0
        return 0;
635
636
1.36k
    if (p.sig != NULL && pctx->operation == EVP_PKEY_OP_VERIFYMSG) {
637
0
        OPENSSL_free(pctx->sig);
638
0
        pctx->sig = NULL;
639
0
        pctx->siglen = 0;
640
0
        if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&pctx->sig,
641
0
                0, &pctx->siglen))
642
0
            return 0;
643
0
    }
644
645
1.36k
    return 1;
646
1.36k
}
647
648
static const OSSL_PARAM *ml_dsa_settable_ctx_params(void *vctx,
649
    ossl_unused void *provctx)
650
15
{
651
15
    PROV_ML_DSA_CTX *pctx = (PROV_ML_DSA_CTX *)vctx;
652
653
15
    if (pctx != NULL && pctx->operation == EVP_PKEY_OP_VERIFYMSG)
654
0
        return ml_dsa_verifymsg_set_ctx_params_list;
655
15
    else
656
15
        return ml_dsa_set_ctx_params_list;
657
15
}
658
659
/* clang-format off */
660
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
661
#ifndef ml_dsa_get_ctx_params_list
662
static const OSSL_PARAM ml_dsa_get_ctx_params_list[] = {
663
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
664
    OSSL_PARAM_END
665
};
666
#endif
667
668
#ifndef ml_dsa_get_ctx_params_st
669
struct ml_dsa_get_ctx_params_st {
670
    OSSL_PARAM *id;
671
};
672
#endif
673
674
#ifndef ml_dsa_get_ctx_params_decoder
675
static int ml_dsa_get_ctx_params_decoder
676
    (const OSSL_PARAM *p, struct ml_dsa_get_ctx_params_st *r)
677
0
{
678
0
    const char *s;
679
680
0
    memset(r, 0, sizeof(*r));
681
0
    if (p != NULL)
682
0
        for (; (s = p->key) != NULL; p++)
683
0
            if (ossl_likely(strcmp("algorithm-id", s + 0) == 0)) {
684
                /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
685
0
                if (ossl_unlikely(r->id != NULL)) {
686
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
687
0
                                   "param %s is repeated", s);
688
0
                    return 0;
689
0
                }
690
0
                r->id = (OSSL_PARAM *)p;
691
0
            }
692
0
    return 1;
693
0
}
694
#endif
695
/* End of machine generated */
696
/* clang-format on */
697
698
static const OSSL_PARAM *ml_dsa_gettable_ctx_params(ossl_unused void *vctx,
699
    ossl_unused void *provctx)
700
0
{
701
0
    return ml_dsa_get_ctx_params_list;
702
0
}
703
704
static int ml_dsa_get_ctx_params(void *vctx, OSSL_PARAM *params)
705
0
{
706
0
    PROV_ML_DSA_CTX *ctx = (PROV_ML_DSA_CTX *)vctx;
707
0
    struct ml_dsa_get_ctx_params_st p;
708
709
0
    if (ctx == NULL || !ml_dsa_get_ctx_params_decoder(params, &p))
710
0
        return 0;
711
712
0
    if (p.id != NULL
713
0
        && !OSSL_PARAM_set_octet_string(p.id,
714
0
            ctx->aid_len == 0 ? NULL : ctx->aid_buf,
715
0
            ctx->aid_len))
716
0
        return 0;
717
718
0
    return 1;
719
0
}
720
721
#define MAKE_SIGNATURE_FUNCTIONS(alg)                                          \
722
    static OSSL_FUNC_signature_newctx_fn ml_dsa_##alg##_newctx;                \
723
    static void *ml_dsa_##alg##_newctx(void *provctx, const char *propq)       \
724
1.78k
    {                                                                          \
725
1.78k
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
726
1.78k
    }                                                                          \
ml_dsa_sig.c:ml_dsa_44_newctx
Line
Count
Source
724
721
    {                                                                          \
725
721
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
726
721
    }                                                                          \
ml_dsa_sig.c:ml_dsa_65_newctx
Line
Count
Source
724
562
    {                                                                          \
725
562
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
726
562
    }                                                                          \
ml_dsa_sig.c:ml_dsa_87_newctx
Line
Count
Source
724
502
    {                                                                          \
725
502
        return ml_dsa_newctx(provctx, EVP_PKEY_ML_DSA_##alg, propq);           \
726
502
    }                                                                          \
727
    const OSSL_DISPATCH ossl_ml_dsa_##alg##_signature_functions[] = {          \
728
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ml_dsa_##alg##_newctx }, \
729
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                               \
730
            (void (*)(void))ml_dsa_sign_msg_init },                            \
731
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                             \
732
            (void (*)(void))ml_dsa_signverify_msg_update },                    \
733
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                              \
734
            (void (*)(void))ml_dsa_sign_msg_final },                           \
735
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ml_dsa_sign },             \
736
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                             \
737
            (void (*)(void))ml_dsa_verify_msg_init },                          \
738
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                           \
739
            (void (*)(void))ml_dsa_signverify_msg_update },                    \
740
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                            \
741
            (void (*)(void))ml_dsa_verify_msg_final },                         \
742
        { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))ml_dsa_verify },         \
743
        { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,                                \
744
            (void (*)(void))ml_dsa_digest_signverify_init },                   \
745
        { OSSL_FUNC_SIGNATURE_DIGEST_SIGN,                                     \
746
            (void (*)(void))ml_dsa_digest_sign },                              \
747
        { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,                              \
748
            (void (*)(void))ml_dsa_digest_signverify_init },                   \
749
        { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY,                                   \
750
            (void (*)(void))ml_dsa_digest_verify },                            \
751
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ml_dsa_freectx },       \
752
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                                  \
753
            (void (*)(void))ml_dsa_set_ctx_params },                           \
754
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                             \
755
            (void (*)(void))ml_dsa_settable_ctx_params },                      \
756
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                                  \
757
            (void (*)(void))ml_dsa_get_ctx_params },                           \
758
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                             \
759
            (void (*)(void))ml_dsa_gettable_ctx_params },                      \
760
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ml_dsa_dupctx },         \
761
        OSSL_DISPATCH_END                                                      \
762
    }
763
764
MAKE_SIGNATURE_FUNCTIONS(44);
765
MAKE_SIGNATURE_FUNCTIONS(65);
766
MAKE_SIGNATURE_FUNCTIONS(87);