Coverage Report

Created: 2026-04-01 06:39

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/signature/dsa_sig.c
Line
Count
Source
1
/*
2
 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
/* clang-format off */
10
11
/* clang-format on */
12
13
/*
14
 * DSA low level APIs are deprecated for public use, but still ok for
15
 * internal use.
16
 */
17
#include "internal/deprecated.h"
18
19
#include <string.h>
20
21
#include <openssl/crypto.h>
22
#include <openssl/core_dispatch.h>
23
#include <openssl/core_names.h>
24
#include <openssl/err.h>
25
#include <openssl/dsa.h>
26
#include <openssl/params.h>
27
#include <openssl/evp.h>
28
#include <openssl/proverr.h>
29
#include "internal/nelem.h"
30
#include "internal/sizes.h"
31
#include "internal/cryptlib.h"
32
#include "prov/providercommon.h"
33
#include "prov/implementations.h"
34
#include "prov/provider_ctx.h"
35
#include "prov/securitycheck.h"
36
#include "prov/der_dsa.h"
37
#include "crypto/dsa.h"
38
39
static OSSL_FUNC_signature_newctx_fn dsa_newctx;
40
static OSSL_FUNC_signature_sign_init_fn dsa_sign_init;
41
static OSSL_FUNC_signature_verify_init_fn dsa_verify_init;
42
static OSSL_FUNC_signature_sign_fn dsa_sign;
43
static OSSL_FUNC_signature_sign_message_update_fn dsa_signverify_message_update;
44
static OSSL_FUNC_signature_sign_message_final_fn dsa_sign_message_final;
45
static OSSL_FUNC_signature_verify_fn dsa_verify;
46
static OSSL_FUNC_signature_verify_message_update_fn dsa_signverify_message_update;
47
static OSSL_FUNC_signature_verify_message_final_fn dsa_verify_message_final;
48
static OSSL_FUNC_signature_digest_sign_init_fn dsa_digest_sign_init;
49
static OSSL_FUNC_signature_digest_sign_update_fn dsa_digest_signverify_update;
50
static OSSL_FUNC_signature_digest_sign_final_fn dsa_digest_sign_final;
51
static OSSL_FUNC_signature_digest_verify_init_fn dsa_digest_verify_init;
52
static OSSL_FUNC_signature_digest_verify_update_fn dsa_digest_signverify_update;
53
static OSSL_FUNC_signature_digest_verify_final_fn dsa_digest_verify_final;
54
static OSSL_FUNC_signature_freectx_fn dsa_freectx;
55
static OSSL_FUNC_signature_dupctx_fn dsa_dupctx;
56
static OSSL_FUNC_signature_query_key_types_fn dsa_sigalg_query_key_types;
57
static OSSL_FUNC_signature_get_ctx_params_fn dsa_get_ctx_params;
58
static OSSL_FUNC_signature_gettable_ctx_params_fn dsa_gettable_ctx_params;
59
static OSSL_FUNC_signature_set_ctx_params_fn dsa_set_ctx_params;
60
static OSSL_FUNC_signature_settable_ctx_params_fn dsa_settable_ctx_params;
61
static OSSL_FUNC_signature_get_ctx_md_params_fn dsa_get_ctx_md_params;
62
static OSSL_FUNC_signature_gettable_ctx_md_params_fn dsa_gettable_ctx_md_params;
63
static OSSL_FUNC_signature_set_ctx_md_params_fn dsa_set_ctx_md_params;
64
static OSSL_FUNC_signature_settable_ctx_md_params_fn dsa_settable_ctx_md_params;
65
static OSSL_FUNC_signature_set_ctx_params_fn dsa_sigalg_set_ctx_params;
66
static OSSL_FUNC_signature_settable_ctx_params_fn dsa_sigalg_settable_ctx_params;
67
68
/*
69
 * What's passed as an actual key is defined by the KEYMGMT interface.
70
 * We happen to know that our KEYMGMT simply passes DSA structures, so
71
 * we use that here too.
72
 */
73
74
typedef struct {
75
    OSSL_LIB_CTX *libctx;
76
    char *propq;
77
    DSA *dsa;
78
    /* |operation| reuses EVP's operation bitfield */
79
    int operation;
80
81
    /*
82
     * Flag to determine if a full sigalg is run (1) or if a composable
83
     * signature algorithm is run (0).
84
     *
85
     * When a full sigalg is run (1), this currently affects the following
86
     * other flags, which are to remain untouched after their initialization:
87
     *
88
     * - flag_allow_md (initialized to 0)
89
     */
90
    unsigned int flag_sigalg : 1;
91
    /*
92
     * Flag to determine if the hash function can be changed (1) or not (0)
93
     * Because it's dangerous to change during a DigestSign or DigestVerify
94
     * operation, this flag is cleared by their Init function, and set again
95
     * by their Final function.
96
     */
97
    unsigned int flag_allow_md : 1;
98
99
    /* If this is set to 1 then the generated k is not random */
100
    unsigned int nonce_type;
101
102
    /* The Algorithm Identifier of the combined signature algorithm */
103
    unsigned char aid_buf[OSSL_MAX_ALGORITHM_ID_SIZE];
104
    size_t aid_len;
105
106
    /* main digest */
107
    char mdname[OSSL_MAX_NAME_SIZE];
108
    EVP_MD *md;
109
    EVP_MD_CTX *mdctx;
110
111
    /* Signature, for verification */
112
    unsigned char *sig;
113
    size_t siglen;
114
115
    OSSL_FIPS_IND_DECLARE
116
} PROV_DSA_CTX;
117
118
static size_t dsa_get_md_size(const PROV_DSA_CTX *pdsactx)
119
2.58k
{
120
2.58k
    int md_size;
121
122
2.58k
    if (pdsactx->md != NULL) {
123
2.58k
        md_size = EVP_MD_get_size(pdsactx->md);
124
2.58k
        if (md_size <= 0)
125
0
            return 0;
126
2.58k
        return (size_t)md_size;
127
2.58k
    }
128
0
    return 0;
129
2.58k
}
130
131
static void *dsa_newctx(void *provctx, const char *propq)
132
3.35k
{
133
3.35k
    PROV_DSA_CTX *pdsactx;
134
135
3.35k
    if (!ossl_prov_is_running())
136
0
        return NULL;
137
138
3.35k
    pdsactx = OPENSSL_zalloc(sizeof(PROV_DSA_CTX));
139
3.35k
    if (pdsactx == NULL)
140
0
        return NULL;
141
142
3.35k
    pdsactx->libctx = PROV_LIBCTX_OF(provctx);
143
3.35k
    pdsactx->flag_allow_md = 1;
144
3.35k
    OSSL_FIPS_IND_INIT(pdsactx)
145
3.35k
    if (propq != NULL && (pdsactx->propq = OPENSSL_strdup(propq)) == NULL) {
146
0
        OPENSSL_free(pdsactx);
147
0
        pdsactx = NULL;
148
0
    }
149
3.35k
    return pdsactx;
150
3.35k
}
151
152
static int dsa_setup_md(PROV_DSA_CTX *ctx,
153
    const char *mdname, const char *mdprops,
154
    const char *desc)
155
2.58k
{
156
2.58k
    EVP_MD *md = NULL;
157
158
2.58k
    if (mdprops == NULL)
159
2.58k
        mdprops = ctx->propq;
160
161
2.58k
    if (mdname != NULL) {
162
2.58k
        WPACKET pkt;
163
2.58k
        int md_nid;
164
2.58k
        size_t mdname_len = strlen(mdname);
165
2.58k
        unsigned char *aid = NULL;
166
167
2.58k
        md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
168
2.58k
        md_nid = ossl_digest_get_approved_nid(md);
169
170
2.58k
        if (md == NULL) {
171
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
172
0
                "%s could not be fetched", mdname);
173
0
            goto err;
174
0
        }
175
2.58k
        if (md_nid == NID_undef) {
176
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
177
0
                "digest=%s", mdname);
178
0
            goto err;
179
0
        }
180
2.58k
        if (mdname_len >= sizeof(ctx->mdname)) {
181
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
182
0
                "%s exceeds name buffer length", mdname);
183
0
            goto err;
184
0
        }
185
        /* XOF digests don't work */
186
2.58k
        if (EVP_MD_xof(md)) {
187
0
            ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
188
0
            goto err;
189
0
        }
190
#ifdef FIPS_MODULE
191
        {
192
            int sha1_allowed
193
                = ((ctx->operation
194
                       & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG))
195
                    == 0);
196
197
            if (!ossl_fips_ind_digest_sign_check(OSSL_FIPS_IND_GET(ctx),
198
                    OSSL_FIPS_IND_SETTABLE1,
199
                    ctx->libctx,
200
                    md_nid, sha1_allowed, 0, desc,
201
                    ossl_fips_config_signature_digest_check))
202
                goto err;
203
        }
204
#endif
205
206
2.58k
        if (!ctx->flag_allow_md) {
207
0
            if (ctx->mdname[0] != '\0'
208
0
                && !EVP_MD_is_a(md, ctx->mdname)) {
209
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
210
0
                    "digest %s != %s", mdname, ctx->mdname);
211
0
                goto err;
212
0
            }
213
0
            EVP_MD_free(md);
214
0
            return 1;
215
0
        }
216
217
2.58k
        EVP_MD_CTX_free(ctx->mdctx);
218
2.58k
        EVP_MD_free(ctx->md);
219
220
        /*
221
         * We do not care about DER writing errors.
222
         * All it really means is that for some reason, there's no
223
         * AlgorithmIdentifier to be had, but the operation itself is
224
         * still valid, just as long as it's not used to construct
225
         * anything that needs an AlgorithmIdentifier.
226
         */
227
2.58k
        ctx->aid_len = 0;
228
2.58k
        if (WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf))
229
2.58k
            && ossl_DER_w_algorithmIdentifier_DSA_with_MD(&pkt, -1, ctx->dsa,
230
2.58k
                md_nid)
231
2.58k
            && WPACKET_finish(&pkt)) {
232
2.58k
            WPACKET_get_total_written(&pkt, &ctx->aid_len);
233
2.58k
            aid = WPACKET_get_curr(&pkt);
234
2.58k
        }
235
2.58k
        WPACKET_cleanup(&pkt);
236
2.58k
        if (aid != NULL && ctx->aid_len != 0)
237
2.58k
            memmove(ctx->aid_buf, aid, ctx->aid_len);
238
239
2.58k
        ctx->mdctx = NULL;
240
2.58k
        ctx->md = md;
241
2.58k
        OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
242
2.58k
    }
243
244
2.58k
    return 1;
245
0
err:
246
0
    EVP_MD_free(md);
247
0
    return 0;
248
2.58k
}
249
250
#ifdef FIPS_MODULE
251
252
static int dsa_sign_check_approved(PROV_DSA_CTX *ctx, int signing,
253
    const char *desc)
254
{
255
    /* DSA Signing is not approved in FIPS 140-3 */
256
    if (signing
257
        && !OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE2,
258
            ctx->libctx, desc, "DSA",
259
            ossl_fips_config_dsa_sign_disallowed))
260
        return 0;
261
    return 1;
262
}
263
264
static int dsa_check_key(PROV_DSA_CTX *ctx, int sign, const char *desc)
265
{
266
    int approved = ossl_dsa_check_key(ctx->dsa, sign);
267
268
    if (!approved) {
269
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE0,
270
                ctx->libctx, desc, "DSA Key",
271
                ossl_fips_config_signature_digest_check)) {
272
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
273
            return 0;
274
        }
275
    }
276
    return 1;
277
}
278
#endif
279
280
static int
281
dsa_signverify_init(void *vpdsactx, void *vdsa,
282
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
283
    const OSSL_PARAM params[], int operation,
284
    const char *desc)
285
2.58k
{
286
2.58k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
287
288
2.58k
    if (!ossl_prov_is_running()
289
2.58k
        || pdsactx == NULL)
290
0
        return 0;
291
292
2.58k
    if (vdsa == NULL && pdsactx->dsa == NULL) {
293
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
294
0
        return 0;
295
0
    }
296
297
2.58k
    if (vdsa != NULL) {
298
2.58k
        if (!DSA_up_ref(vdsa))
299
0
            return 0;
300
2.58k
        DSA_free(pdsactx->dsa);
301
2.58k
        pdsactx->dsa = vdsa;
302
2.58k
    }
303
304
2.58k
    pdsactx->operation = operation;
305
306
2.58k
    OSSL_FIPS_IND_SET_APPROVED(pdsactx)
307
2.58k
    if (!set_ctx_params(pdsactx, params))
308
0
        return 0;
309
#ifdef FIPS_MODULE
310
    {
311
        int operation_is_sign
312
            = (operation & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG)) != 0;
313
314
        if (!dsa_sign_check_approved(pdsactx, operation_is_sign, desc))
315
            return 0;
316
        if (!dsa_check_key(pdsactx, operation_is_sign, desc))
317
            return 0;
318
    }
319
#endif
320
2.58k
    return 1;
321
2.58k
}
322
323
static int dsa_sign_init(void *vpdsactx, void *vdsa, const OSSL_PARAM params[])
324
0
{
325
0
    return dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
326
0
        EVP_PKEY_OP_SIGN, "DSA Sign Init");
327
0
}
328
329
/*
330
 * Sign tbs without digesting it first.  This is suitable for "primitive"
331
 * signing and signing the digest of a message, i.e. should be used with
332
 * implementations of the keytype related algorithms.
333
 */
334
static int dsa_sign_directly(void *vpdsactx,
335
    unsigned char *sig, size_t *siglen, size_t sigsize,
336
    const unsigned char *tbs, size_t tbslen)
337
74
{
338
74
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
339
74
    int ret;
340
74
    unsigned int sltmp;
341
74
    size_t dsasize = DSA_size(pdsactx->dsa);
342
74
    size_t mdsize = dsa_get_md_size(pdsactx);
343
344
74
    if (!ossl_prov_is_running())
345
0
        return 0;
346
347
#ifdef FIPS_MODULE
348
    if (!dsa_sign_check_approved(pdsactx, 1, "Sign"))
349
        return 0;
350
#endif
351
352
74
    if (sig == NULL) {
353
37
        *siglen = dsasize;
354
37
        return 1;
355
37
    }
356
357
37
    if (sigsize < dsasize)
358
0
        return 0;
359
360
37
    if (mdsize != 0 && tbslen != mdsize)
361
0
        return 0;
362
363
37
    ret = ossl_dsa_sign_int(0, tbs, (int)tbslen, sig, &sltmp, pdsactx->dsa,
364
37
        pdsactx->nonce_type, pdsactx->mdname,
365
37
        pdsactx->libctx, pdsactx->propq);
366
37
    if (ret <= 0)
367
5
        return 0;
368
369
32
    *siglen = sltmp;
370
32
    return 1;
371
37
}
372
373
static int dsa_signverify_message_update(void *vpdsactx,
374
    const unsigned char *data,
375
    size_t datalen)
376
2.55k
{
377
2.55k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
378
379
2.55k
    if (pdsactx == NULL)
380
0
        return 0;
381
382
2.55k
    return EVP_DigestUpdate(pdsactx->mdctx, data, datalen);
383
2.55k
}
384
385
static int dsa_sign_message_final(void *vpdsactx, unsigned char *sig,
386
    size_t *siglen, size_t sigsize)
387
74
{
388
74
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
389
74
    unsigned char digest[EVP_MAX_MD_SIZE];
390
74
    unsigned int dlen = 0;
391
392
74
    if (!ossl_prov_is_running() || pdsactx == NULL || pdsactx->mdctx == NULL)
393
0
        return 0;
394
    /*
395
     * If sig is NULL then we're just finding out the sig size. Other fields
396
     * are ignored. Defer to dsa_sign.
397
     */
398
74
    if (sig != NULL) {
399
        /*
400
         * When this function is used through dsa_digest_sign_final(),
401
         * there is the possibility that some externally provided digests
402
         * exceed EVP_MAX_MD_SIZE. We should probably handle that
403
         * somehow but that problem is much larger than just in DSA.
404
         */
405
37
        if (!EVP_DigestFinal_ex(pdsactx->mdctx, digest, &dlen))
406
0
            return 0;
407
37
    }
408
409
74
    return dsa_sign_directly(vpdsactx, sig, siglen, sigsize, digest, dlen);
410
74
}
411
412
/*
413
 * If signing a message, digest tbs and sign the result.
414
 * Otherwise, sign tbs directly.
415
 */
416
static int dsa_sign(void *vpdsactx, unsigned char *sig, size_t *siglen,
417
    size_t sigsize, const unsigned char *tbs, size_t tbslen)
418
0
{
419
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
420
421
0
    if (pdsactx->operation == EVP_PKEY_OP_SIGNMSG) {
422
        /*
423
         * If |sig| is NULL, the caller is only looking for the sig length.
424
         * DO NOT update the input in this case.
425
         */
426
0
        if (sig == NULL)
427
0
            return dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
428
429
0
        if (dsa_signverify_message_update(pdsactx, tbs, tbslen) <= 0)
430
0
            return 0;
431
0
        return dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
432
0
    }
433
0
    return dsa_sign_directly(pdsactx, sig, siglen, sigsize, tbs, tbslen);
434
0
}
435
436
static int dsa_verify_init(void *vpdsactx, void *vdsa,
437
    const OSSL_PARAM params[])
438
0
{
439
0
    return dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
440
0
        EVP_PKEY_OP_VERIFY, "DSA Verify Init");
441
0
}
442
443
static int dsa_verify_directly(void *vpdsactx,
444
    const unsigned char *sig, size_t siglen,
445
    const unsigned char *tbs, size_t tbslen)
446
2.51k
{
447
2.51k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
448
2.51k
    size_t mdsize = dsa_get_md_size(pdsactx);
449
450
2.51k
    if (!ossl_prov_is_running() || (mdsize != 0 && tbslen != mdsize))
451
0
        return 0;
452
453
2.51k
    return DSA_verify(0, tbs, (int)tbslen, sig, (int)siglen, pdsactx->dsa);
454
2.51k
}
455
456
static int dsa_verify_set_sig(void *vpdsactx,
457
    const unsigned char *sig, size_t siglen)
458
2.51k
{
459
2.51k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
460
2.51k
    OSSL_PARAM params[2];
461
462
2.51k
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
463
2.51k
        (unsigned char *)sig, siglen);
464
2.51k
    params[1] = OSSL_PARAM_construct_end();
465
2.51k
    return dsa_sigalg_set_ctx_params(pdsactx, params);
466
2.51k
}
467
468
static int dsa_verify_message_final(void *vpdsactx)
469
2.51k
{
470
2.51k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
471
2.51k
    unsigned char digest[EVP_MAX_MD_SIZE];
472
2.51k
    unsigned int dlen = 0;
473
474
2.51k
    if (!ossl_prov_is_running())
475
0
        return 0;
476
477
2.51k
    if (pdsactx == NULL || pdsactx->mdctx == NULL)
478
0
        return 0;
479
480
    /*
481
     * The digests used here are all known (see dsa_get_md_nid()), so they
482
     * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
483
     */
484
2.51k
    if (!EVP_DigestFinal_ex(pdsactx->mdctx, digest, &dlen))
485
0
        return 0;
486
487
2.51k
    return dsa_verify_directly(vpdsactx, pdsactx->sig, pdsactx->siglen,
488
2.51k
        digest, dlen);
489
2.51k
}
490
491
/*
492
 * If verifying a message, digest tbs and verify the result.
493
 * Otherwise, verify tbs directly.
494
 */
495
static int dsa_verify(void *vpdsactx,
496
    const unsigned char *sig, size_t siglen,
497
    const unsigned char *tbs, size_t tbslen)
498
0
{
499
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
500
501
0
    if (pdsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
502
0
        if (dsa_verify_set_sig(pdsactx, sig, siglen) <= 0)
503
0
            return 0;
504
0
        if (dsa_signverify_message_update(pdsactx, tbs, tbslen) <= 0)
505
0
            return 0;
506
0
        return dsa_verify_message_final(pdsactx);
507
0
    }
508
0
    return dsa_verify_directly(pdsactx, sig, siglen, tbs, tbslen);
509
0
}
510
511
/* DigestSign/DigestVerify wrappers */
512
513
static int dsa_digest_signverify_init(void *vpdsactx, const char *mdname,
514
    void *vdsa, const OSSL_PARAM params[],
515
    int operation, const char *desc)
516
2.58k
{
517
2.58k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
518
519
2.58k
    if (!ossl_prov_is_running())
520
0
        return 0;
521
522
2.58k
    if (!dsa_signverify_init(vpdsactx, vdsa, dsa_set_ctx_params, params,
523
2.58k
            operation, desc))
524
0
        return 0;
525
526
2.58k
    if (mdname != NULL
527
        /* was dsa_setup_md already called in dsa_signverify_init()? */
528
2.58k
        && (mdname[0] == '\0' || OPENSSL_strcasecmp(pdsactx->mdname, mdname) != 0)
529
2.58k
        && !dsa_setup_md(pdsactx, mdname, NULL, desc))
530
0
        return 0;
531
532
2.58k
    pdsactx->flag_allow_md = 0;
533
534
2.58k
    if (pdsactx->mdctx == NULL) {
535
2.58k
        pdsactx->mdctx = EVP_MD_CTX_new();
536
2.58k
        if (pdsactx->mdctx == NULL)
537
0
            goto error;
538
2.58k
    }
539
540
2.58k
    if (!EVP_DigestInit_ex2(pdsactx->mdctx, pdsactx->md, params))
541
0
        goto error;
542
543
2.58k
    return 1;
544
545
0
error:
546
0
    EVP_MD_CTX_free(pdsactx->mdctx);
547
0
    pdsactx->mdctx = NULL;
548
0
    return 0;
549
2.58k
}
550
551
static int dsa_digest_sign_init(void *vpdsactx, const char *mdname,
552
    void *vdsa, const OSSL_PARAM params[])
553
70
{
554
70
    return dsa_digest_signverify_init(vpdsactx, mdname, vdsa, params,
555
70
        EVP_PKEY_OP_SIGNMSG,
556
70
        "DSA Digest Sign Init");
557
70
}
558
559
static int dsa_digest_signverify_update(void *vpdsactx, const unsigned char *data,
560
    size_t datalen)
561
2.55k
{
562
2.55k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
563
564
2.55k
    if (pdsactx == NULL)
565
0
        return 0;
566
    /* Sigalg implementations shouldn't do digest_sign */
567
2.55k
    if (pdsactx->flag_sigalg)
568
0
        return 0;
569
570
2.55k
    return dsa_signverify_message_update(vpdsactx, data, datalen);
571
2.55k
}
572
573
static int dsa_digest_sign_final(void *vpdsactx, unsigned char *sig,
574
    size_t *siglen, size_t sigsize)
575
74
{
576
74
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
577
74
    int ok = 0;
578
579
74
    if (pdsactx == NULL)
580
0
        return 0;
581
    /* Sigalg implementations shouldn't do digest_sign */
582
74
    if (pdsactx->flag_sigalg)
583
0
        return 0;
584
585
74
    ok = dsa_sign_message_final(pdsactx, sig, siglen, sigsize);
586
587
74
    pdsactx->flag_allow_md = 1;
588
589
74
    return ok;
590
74
}
591
592
static int dsa_digest_verify_init(void *vpdsactx, const char *mdname,
593
    void *vdsa, const OSSL_PARAM params[])
594
3.28k
{
595
3.28k
    return dsa_digest_signverify_init(vpdsactx, mdname, vdsa, params,
596
3.28k
        EVP_PKEY_OP_VERIFYMSG,
597
3.28k
        "DSA Digest Verify Init");
598
3.28k
}
599
600
int dsa_digest_verify_final(void *vpdsactx, const unsigned char *sig,
601
    size_t siglen)
602
2.51k
{
603
2.51k
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
604
2.51k
    int ok = 0;
605
606
2.51k
    if (pdsactx == NULL)
607
0
        return 0;
608
    /* Sigalg implementations shouldn't do digest_verify */
609
2.51k
    if (pdsactx->flag_sigalg)
610
0
        return 0;
611
612
2.51k
    if (dsa_verify_set_sig(pdsactx, sig, siglen))
613
2.51k
        ok = dsa_verify_message_final(vpdsactx);
614
615
2.51k
    pdsactx->flag_allow_md = 1;
616
617
2.51k
    return ok;
618
2.51k
}
619
620
static void dsa_freectx(void *vpdsactx)
621
6.67k
{
622
6.67k
    PROV_DSA_CTX *ctx = (PROV_DSA_CTX *)vpdsactx;
623
624
6.67k
    EVP_MD_CTX_free(ctx->mdctx);
625
6.67k
    EVP_MD_free(ctx->md);
626
6.67k
    OPENSSL_free(ctx->sig);
627
6.67k
    OPENSSL_free(ctx->propq);
628
6.67k
    DSA_free(ctx->dsa);
629
6.67k
    OPENSSL_free(ctx);
630
6.67k
}
631
632
static void *dsa_dupctx(void *vpdsactx)
633
2.55k
{
634
2.55k
    PROV_DSA_CTX *srcctx = (PROV_DSA_CTX *)vpdsactx;
635
2.55k
    PROV_DSA_CTX *dstctx;
636
637
2.55k
    if (!ossl_prov_is_running())
638
0
        return NULL;
639
640
2.55k
    if ((dstctx = OPENSSL_memdup(srcctx, sizeof(*srcctx))) == NULL)
641
0
        return NULL;
642
643
2.55k
    dstctx->dsa = NULL;
644
2.55k
    dstctx->propq = NULL;
645
2.55k
    dstctx->md = NULL;
646
2.55k
    dstctx->mdctx = NULL;
647
2.55k
    dstctx->sig = NULL;
648
649
2.55k
    if (srcctx->dsa != NULL && !DSA_up_ref(srcctx->dsa))
650
0
        goto err;
651
2.55k
    dstctx->dsa = srcctx->dsa;
652
653
2.55k
    if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
654
0
        goto err;
655
2.55k
    dstctx->md = srcctx->md;
656
657
2.55k
    if (srcctx->mdctx != NULL
658
2.55k
        && (dstctx->mdctx = EVP_MD_CTX_dup(srcctx->mdctx)) == NULL)
659
0
        goto err;
660
2.55k
    if (srcctx->propq != NULL
661
0
        && ((dstctx->propq = OPENSSL_strdup(srcctx->propq)) == NULL))
662
0
        goto err;
663
2.55k
    if (srcctx->sig != NULL
664
0
        && ((dstctx->sig = OPENSSL_memdup(srcctx->sig, srcctx->siglen)) == NULL))
665
0
        goto err;
666
667
2.55k
    return dstctx;
668
0
err:
669
0
    dsa_freectx(dstctx);
670
0
    return NULL;
671
2.55k
}
672
673
/* clang-format off */
674
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
675
#ifndef dsa_get_ctx_params_list
676
static const OSSL_PARAM dsa_get_ctx_params_list[] = {
677
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
678
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
679
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
680
# if defined(FIPS_MODULE)
681
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR, NULL),
682
# endif
683
    OSSL_PARAM_END
684
};
685
#endif
686
687
#ifndef dsa_get_ctx_params_st
688
struct dsa_get_ctx_params_st {
689
    OSSL_PARAM *algid;
690
    OSSL_PARAM *digest;
691
# if defined(FIPS_MODULE)
692
    OSSL_PARAM *ind;
693
# endif
694
    OSSL_PARAM *nonce;
695
};
696
#endif
697
698
#ifndef dsa_get_ctx_params_decoder
699
static int dsa_get_ctx_params_decoder
700
    (const OSSL_PARAM *p, struct dsa_get_ctx_params_st *r)
701
0
{
702
0
    const char *s;
703
704
0
    memset(r, 0, sizeof(*r));
705
0
    if (p != NULL)
706
0
        for (; (s = p->key) != NULL; p++)
707
0
            switch(s[0]) {
708
0
            default:
709
0
                break;
710
0
            case 'a':
711
0
                if (ossl_likely(strcmp("lgorithm-id", s + 1) == 0)) {
712
                    /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
713
0
                    if (ossl_unlikely(r->algid != NULL)) {
714
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
715
0
                                       "param %s is repeated", s);
716
0
                        return 0;
717
0
                    }
718
0
                    r->algid = (OSSL_PARAM *)p;
719
0
                }
720
0
                break;
721
0
            case 'd':
722
0
                if (ossl_likely(strcmp("igest", s + 1) == 0)) {
723
                    /* OSSL_SIGNATURE_PARAM_DIGEST */
724
0
                    if (ossl_unlikely(r->digest != NULL)) {
725
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
726
0
                                       "param %s is repeated", s);
727
0
                        return 0;
728
0
                    }
729
0
                    r->digest = (OSSL_PARAM *)p;
730
0
                }
731
0
                break;
732
0
            case 'f':
733
# if defined(FIPS_MODULE)
734
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
735
                    /* OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR */
736
                    if (ossl_unlikely(r->ind != NULL)) {
737
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
738
                                       "param %s is repeated", s);
739
                        return 0;
740
                    }
741
                    r->ind = (OSSL_PARAM *)p;
742
                }
743
# endif
744
0
                break;
745
0
            case 'n':
746
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
747
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
748
0
                    if (ossl_unlikely(r->nonce != NULL)) {
749
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
750
0
                                       "param %s is repeated", s);
751
0
                        return 0;
752
0
                    }
753
0
                    r->nonce = (OSSL_PARAM *)p;
754
0
                }
755
0
            }
756
0
    return 1;
757
0
}
758
#endif
759
/* End of machine generated */
760
/* clang-format on */
761
762
static int dsa_get_ctx_params(void *vpdsactx, OSSL_PARAM *params)
763
0
{
764
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
765
0
    struct dsa_get_ctx_params_st p;
766
767
0
    if (pdsactx == NULL || !dsa_get_ctx_params_decoder(params, &p))
768
0
        return 0;
769
770
0
    if (p.algid != NULL
771
0
        && !OSSL_PARAM_set_octet_string(p.algid,
772
0
            pdsactx->aid_len == 0 ? NULL : pdsactx->aid_buf,
773
0
            pdsactx->aid_len))
774
0
        return 0;
775
776
0
    if (p.digest != NULL && !OSSL_PARAM_set_utf8_string(p.digest, pdsactx->mdname))
777
0
        return 0;
778
779
0
    if (p.nonce != NULL && !OSSL_PARAM_set_uint(p.nonce, pdsactx->nonce_type))
780
0
        return 0;
781
782
0
    if (!OSSL_FIPS_IND_GET_CTX_FROM_PARAM(pdsactx, p.ind))
783
0
        return 0;
784
785
0
    return 1;
786
0
}
787
788
static const OSSL_PARAM *dsa_gettable_ctx_params(ossl_unused void *ctx,
789
    ossl_unused void *provctx)
790
0
{
791
0
    return dsa_get_ctx_params_list;
792
0
}
793
794
struct dsa_all_set_ctx_params_st {
795
    OSSL_PARAM *digest; /* dsa_set_ctx_params */
796
    OSSL_PARAM *propq; /* dsa_set_ctx_params */
797
#ifdef FIPS_MODULE
798
    OSSL_PARAM *ind_d;
799
    OSSL_PARAM *ind_k;
800
    OSSL_PARAM *ind_sign;
801
#endif
802
    OSSL_PARAM *nonce;
803
    OSSL_PARAM *sig; /* dsa_sigalg_set_ctx_params */
804
};
805
806
/**
807
 * @brief Setup common params for dsa_set_ctx_params and dsa_sigalg_set_ctx_params
808
 * The caller is responsible for checking |vpdsactx| is not NULL and |params|
809
 * is not empty.
810
 */
811
static int dsa_common_set_ctx_params(PROV_DSA_CTX *pdsactx,
812
    const struct dsa_all_set_ctx_params_st *p)
813
2.89k
{
814
2.89k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE0,
815
2.89k
            p->ind_k))
816
0
        return 0;
817
2.89k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE1,
818
2.89k
            p->ind_d))
819
0
        return 0;
820
2.89k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(pdsactx, OSSL_FIPS_IND_SETTABLE2,
821
2.89k
            p->ind_sign))
822
0
        return 0;
823
824
2.89k
    if (p->nonce != NULL
825
0
        && !OSSL_PARAM_get_uint(p->nonce, &pdsactx->nonce_type))
826
0
        return 0;
827
2.89k
    return 1;
828
2.89k
}
829
830
#define dsa_set_ctx_params_st dsa_all_set_ctx_params_st
831
832
/* clang-format off */
833
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
834
#ifndef dsa_set_ctx_params_list
835
static const OSSL_PARAM dsa_set_ctx_params_list[] = {
836
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
837
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
838
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
839
# if defined(FIPS_MODULE)
840
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
841
# endif
842
# if defined(FIPS_MODULE)
843
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
844
# endif
845
# if defined(FIPS_MODULE)
846
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK, NULL),
847
# endif
848
    OSSL_PARAM_END
849
};
850
#endif
851
852
#ifndef dsa_set_ctx_params_st
853
struct dsa_set_ctx_params_st {
854
    OSSL_PARAM *digest;
855
# if defined(FIPS_MODULE)
856
    OSSL_PARAM *ind_d;
857
# endif
858
# if defined(FIPS_MODULE)
859
    OSSL_PARAM *ind_k;
860
# endif
861
# if defined(FIPS_MODULE)
862
    OSSL_PARAM *ind_sign;
863
# endif
864
    OSSL_PARAM *nonce;
865
    OSSL_PARAM *propq;
866
};
867
#endif
868
869
#ifndef dsa_set_ctx_params_decoder
870
static int dsa_set_ctx_params_decoder
871
    (const OSSL_PARAM *p, struct dsa_set_ctx_params_st *r)
872
834
{
873
834
    const char *s;
874
875
834
    memset(r, 0, sizeof(*r));
876
834
    if (p != NULL)
877
0
        for (; (s = p->key) != NULL; p++)
878
0
            switch(s[0]) {
879
0
            default:
880
0
                break;
881
0
            case 'd':
882
0
                switch(s[1]) {
883
0
                default:
884
0
                    break;
885
0
                case 'i':
886
0
                    switch(s[2]) {
887
0
                    default:
888
0
                        break;
889
0
                    case 'g':
890
0
                        switch(s[3]) {
891
0
                        default:
892
0
                            break;
893
0
                        case 'e':
894
0
                            switch(s[4]) {
895
0
                            default:
896
0
                                break;
897
0
                            case 's':
898
0
                                switch(s[5]) {
899
0
                                default:
900
0
                                    break;
901
0
                                case 't':
902
0
                                    switch(s[6]) {
903
0
                                    default:
904
0
                                        break;
905
0
                                    case '-':
906
# if defined(FIPS_MODULE)
907
                                        if (ossl_likely(strcmp("check", s + 7) == 0)) {
908
                                            /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
909
                                            if (ossl_unlikely(r->ind_d != NULL)) {
910
                                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
911
                                                               "param %s is repeated", s);
912
                                                return 0;
913
                                            }
914
                                            r->ind_d = (OSSL_PARAM *)p;
915
                                        }
916
# endif
917
0
                                        break;
918
0
                                    case '\0':
919
0
                                        if (ossl_unlikely(r->digest != NULL)) {
920
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
921
0
                                                           "param %s is repeated", s);
922
0
                                            return 0;
923
0
                                        }
924
0
                                        r->digest = (OSSL_PARAM *)p;
925
0
                                    }
926
0
                                }
927
0
                            }
928
0
                        }
929
0
                    }
930
0
                }
931
0
                break;
932
0
            case 'k':
933
# if defined(FIPS_MODULE)
934
                if (ossl_likely(strcmp("ey-check", s + 1) == 0)) {
935
                    /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
936
                    if (ossl_unlikely(r->ind_k != NULL)) {
937
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
938
                                       "param %s is repeated", s);
939
                        return 0;
940
                    }
941
                    r->ind_k = (OSSL_PARAM *)p;
942
                }
943
# endif
944
0
                break;
945
0
            case 'n':
946
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
947
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
948
0
                    if (ossl_unlikely(r->nonce != NULL)) {
949
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
950
0
                                       "param %s is repeated", s);
951
0
                        return 0;
952
0
                    }
953
0
                    r->nonce = (OSSL_PARAM *)p;
954
0
                }
955
0
                break;
956
0
            case 'p':
957
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
958
                    /* OSSL_SIGNATURE_PARAM_PROPERTIES */
959
0
                    if (ossl_unlikely(r->propq != NULL)) {
960
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
961
0
                                       "param %s is repeated", s);
962
0
                        return 0;
963
0
                    }
964
0
                    r->propq = (OSSL_PARAM *)p;
965
0
                }
966
0
                break;
967
0
            case 's':
968
# if defined(FIPS_MODULE)
969
                if (ossl_likely(strcmp("ign-check", s + 1) == 0)) {
970
                    /* OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK */
971
                    if (ossl_unlikely(r->ind_sign != NULL)) {
972
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
973
                                       "param %s is repeated", s);
974
                        return 0;
975
                    }
976
                    r->ind_sign = (OSSL_PARAM *)p;
977
                }
978
# endif
979
0
                break;
980
0
            }
981
834
    return 1;
982
834
}
983
#endif
984
/* End of machine generated */
985
/* clang-format on */
986
987
static int dsa_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[])
988
834
{
989
834
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
990
834
    struct dsa_all_set_ctx_params_st p;
991
834
    int ret;
992
993
834
    if (pdsactx == NULL || !dsa_set_ctx_params_decoder(params, &p))
994
0
        return 0;
995
996
834
    if ((ret = dsa_common_set_ctx_params(pdsactx, &p)) <= 0)
997
0
        return ret;
998
999
834
    if (p.digest != NULL) {
1000
0
        char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = mdname;
1001
0
        char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = mdprops;
1002
1003
0
        if (!OSSL_PARAM_get_utf8_string(p.digest, &pmdname, sizeof(mdname)))
1004
0
            return 0;
1005
0
        if (p.propq != NULL
1006
0
            && !OSSL_PARAM_get_utf8_string(p.propq, &pmdprops, sizeof(mdprops)))
1007
0
            return 0;
1008
0
        if (!dsa_setup_md(pdsactx, mdname, mdprops, "DSA Set Ctx"))
1009
0
            return 0;
1010
0
    }
1011
834
    return 1;
1012
834
}
1013
1014
static const OSSL_PARAM settable_ctx_params_no_digest[] = {
1015
    OSSL_PARAM_END
1016
};
1017
1018
static const OSSL_PARAM *dsa_settable_ctx_params(void *vpdsactx,
1019
    ossl_unused void *provctx)
1020
7
{
1021
7
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1022
1023
7
    if (pdsactx != NULL && !pdsactx->flag_allow_md)
1024
0
        return settable_ctx_params_no_digest;
1025
7
    return dsa_set_ctx_params_list;
1026
7
}
1027
1028
static int dsa_get_ctx_md_params(void *vpdsactx, OSSL_PARAM *params)
1029
0
{
1030
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1031
1032
0
    if (pdsactx->mdctx == NULL)
1033
0
        return 0;
1034
1035
0
    return EVP_MD_CTX_get_params(pdsactx->mdctx, params);
1036
0
}
1037
1038
static const OSSL_PARAM *dsa_gettable_ctx_md_params(void *vpdsactx)
1039
0
{
1040
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1041
1042
0
    if (pdsactx->md == NULL)
1043
0
        return 0;
1044
1045
0
    return EVP_MD_gettable_ctx_params(pdsactx->md);
1046
0
}
1047
1048
static int dsa_set_ctx_md_params(void *vpdsactx, const OSSL_PARAM params[])
1049
0
{
1050
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1051
1052
0
    if (pdsactx->mdctx == NULL)
1053
0
        return 0;
1054
1055
0
    return EVP_MD_CTX_set_params(pdsactx->mdctx, params);
1056
0
}
1057
1058
static const OSSL_PARAM *dsa_settable_ctx_md_params(void *vpdsactx)
1059
0
{
1060
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1061
1062
0
    if (pdsactx->md == NULL)
1063
0
        return 0;
1064
1065
0
    return EVP_MD_settable_ctx_params(pdsactx->md);
1066
0
}
1067
1068
const OSSL_DISPATCH ossl_dsa_signature_functions[] = {
1069
    { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))dsa_newctx },
1070
    { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))dsa_sign_init },
1071
    { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))dsa_sign },
1072
    { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))dsa_verify_init },
1073
    { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))dsa_verify },
1074
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
1075
        (void (*)(void))dsa_digest_sign_init },
1076
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
1077
        (void (*)(void))dsa_digest_signverify_update },
1078
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
1079
        (void (*)(void))dsa_digest_sign_final },
1080
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
1081
        (void (*)(void))dsa_digest_verify_init },
1082
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
1083
        (void (*)(void))dsa_digest_signverify_update },
1084
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
1085
        (void (*)(void))dsa_digest_verify_final },
1086
    { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))dsa_freectx },
1087
    { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))dsa_dupctx },
1088
    { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))dsa_get_ctx_params },
1089
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
1090
        (void (*)(void))dsa_gettable_ctx_params },
1091
    { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))dsa_set_ctx_params },
1092
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
1093
        (void (*)(void))dsa_settable_ctx_params },
1094
    { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
1095
        (void (*)(void))dsa_get_ctx_md_params },
1096
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
1097
        (void (*)(void))dsa_gettable_ctx_md_params },
1098
    { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
1099
        (void (*)(void))dsa_set_ctx_md_params },
1100
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
1101
        (void (*)(void))dsa_settable_ctx_md_params },
1102
    OSSL_DISPATCH_END
1103
};
1104
1105
/* ------------------------------------------------------------------ */
1106
1107
/*
1108
 * So called sigalgs (composite DSA+hash) implemented below.  They
1109
 * are pretty much hard coded.
1110
 */
1111
1112
static OSSL_FUNC_signature_query_key_types_fn dsa_sigalg_query_key_types;
1113
static OSSL_FUNC_signature_settable_ctx_params_fn dsa_sigalg_settable_ctx_params;
1114
static OSSL_FUNC_signature_set_ctx_params_fn dsa_sigalg_set_ctx_params;
1115
1116
/*
1117
 * dsa_sigalg_signverify_init() is almost like dsa_digest_signverify_init(),
1118
 * just doesn't allow fetching an MD from whatever the user chooses.
1119
 */
1120
static int dsa_sigalg_signverify_init(void *vpdsactx, void *vdsa,
1121
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
1122
    const OSSL_PARAM params[],
1123
    const char *mdname,
1124
    int operation, const char *desc)
1125
0
{
1126
0
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1127
1128
0
    if (!ossl_prov_is_running())
1129
0
        return 0;
1130
1131
0
    if (!dsa_signverify_init(vpdsactx, vdsa, set_ctx_params, params, operation,
1132
0
            desc))
1133
0
        return 0;
1134
1135
0
    if (!dsa_setup_md(pdsactx, mdname, NULL, desc))
1136
0
        return 0;
1137
1138
0
    pdsactx->flag_sigalg = 1;
1139
0
    pdsactx->flag_allow_md = 0;
1140
1141
0
    if (pdsactx->mdctx == NULL) {
1142
0
        pdsactx->mdctx = EVP_MD_CTX_new();
1143
0
        if (pdsactx->mdctx == NULL)
1144
0
            goto error;
1145
0
    }
1146
1147
0
    if (!EVP_DigestInit_ex2(pdsactx->mdctx, pdsactx->md, params))
1148
0
        goto error;
1149
1150
0
    return 1;
1151
1152
0
error:
1153
0
    EVP_MD_CTX_free(pdsactx->mdctx);
1154
0
    pdsactx->mdctx = NULL;
1155
0
    return 0;
1156
0
}
1157
1158
static const char **dsa_sigalg_query_key_types(void)
1159
0
{
1160
0
    static const char *keytypes[] = { "DSA", NULL };
1161
1162
0
    return keytypes;
1163
0
}
1164
1165
#define dsa_sigalg_set_ctx_params_st dsa_all_set_ctx_params_st
1166
1167
/* clang-format off */
1168
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1169
#ifndef dsa_sigalg_set_ctx_params_list
1170
static const OSSL_PARAM dsa_sigalg_set_ctx_params_list[] = {
1171
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
1172
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
1173
# if defined(FIPS_MODULE)
1174
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
1175
# endif
1176
# if defined(FIPS_MODULE)
1177
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
1178
# endif
1179
# if defined(FIPS_MODULE)
1180
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK, NULL),
1181
# endif
1182
    OSSL_PARAM_END
1183
};
1184
#endif
1185
1186
#ifndef dsa_sigalg_set_ctx_params_st
1187
struct dsa_sigalg_set_ctx_params_st {
1188
# if defined(FIPS_MODULE)
1189
    OSSL_PARAM *ind_d;
1190
# endif
1191
# if defined(FIPS_MODULE)
1192
    OSSL_PARAM *ind_k;
1193
# endif
1194
# if defined(FIPS_MODULE)
1195
    OSSL_PARAM *ind_sign;
1196
# endif
1197
    OSSL_PARAM *nonce;
1198
    OSSL_PARAM *sig;
1199
};
1200
#endif
1201
1202
#ifndef dsa_sigalg_set_ctx_params_decoder
1203
static int dsa_sigalg_set_ctx_params_decoder
1204
    (const OSSL_PARAM *p, struct dsa_sigalg_set_ctx_params_st *r)
1205
764
{
1206
764
    const char *s;
1207
1208
764
    memset(r, 0, sizeof(*r));
1209
764
    if (p != NULL)
1210
1.52k
        for (; (s = p->key) != NULL; p++)
1211
764
            switch(s[0]) {
1212
0
            default:
1213
0
                break;
1214
0
            case 'd':
1215
# if defined(FIPS_MODULE)
1216
                if (ossl_likely(strcmp("igest-check", s + 1) == 0)) {
1217
                    /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
1218
                    if (ossl_unlikely(r->ind_d != NULL)) {
1219
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1220
                                       "param %s is repeated", s);
1221
                        return 0;
1222
                    }
1223
                    r->ind_d = (OSSL_PARAM *)p;
1224
                }
1225
# endif
1226
0
                break;
1227
0
            case 'k':
1228
# if defined(FIPS_MODULE)
1229
                if (ossl_likely(strcmp("ey-check", s + 1) == 0)) {
1230
                    /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1231
                    if (ossl_unlikely(r->ind_k != NULL)) {
1232
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1233
                                       "param %s is repeated", s);
1234
                        return 0;
1235
                    }
1236
                    r->ind_k = (OSSL_PARAM *)p;
1237
                }
1238
# endif
1239
0
                break;
1240
0
            case 'n':
1241
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
1242
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
1243
0
                    if (ossl_unlikely(r->nonce != NULL)) {
1244
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1245
0
                                       "param %s is repeated", s);
1246
0
                        return 0;
1247
0
                    }
1248
0
                    r->nonce = (OSSL_PARAM *)p;
1249
0
                }
1250
0
                break;
1251
764
            case 's':
1252
764
                switch(s[1]) {
1253
0
                default:
1254
0
                    break;
1255
764
                case 'i':
1256
764
                    switch(s[2]) {
1257
0
                    default:
1258
0
                        break;
1259
764
                    case 'g':
1260
764
                        switch(s[3]) {
1261
0
                        default:
1262
0
                            break;
1263
764
                        case 'n':
1264
764
                            switch(s[4]) {
1265
0
                            default:
1266
0
                                break;
1267
0
                            case '-':
1268
# if defined(FIPS_MODULE)
1269
                                if (ossl_likely(strcmp("check", s + 5) == 0)) {
1270
                                    /* OSSL_SIGNATURE_PARAM_FIPS_SIGN_CHECK */
1271
                                    if (ossl_unlikely(r->ind_sign != NULL)) {
1272
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1273
                                                       "param %s is repeated", s);
1274
                                        return 0;
1275
                                    }
1276
                                    r->ind_sign = (OSSL_PARAM *)p;
1277
                                }
1278
# endif
1279
0
                                break;
1280
764
                            case 'a':
1281
764
                                if (ossl_likely(strcmp("ture", s + 5) == 0)) {
1282
                                    /* OSSL_SIGNATURE_PARAM_SIGNATURE */
1283
764
                                    if (ossl_unlikely(r->sig != NULL)) {
1284
0
                                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1285
0
                                                       "param %s is repeated", s);
1286
0
                                        return 0;
1287
0
                                    }
1288
764
                                    r->sig = (OSSL_PARAM *)p;
1289
764
                                }
1290
764
                            }
1291
764
                        }
1292
764
                    }
1293
764
                }
1294
764
            }
1295
764
    return 1;
1296
764
}
1297
#endif
1298
/* End of machine generated */
1299
/* clang-format on */
1300
1301
static const OSSL_PARAM *dsa_sigalg_settable_ctx_params(void *vpdsactx,
1302
    ossl_unused void *provctx)
1303
4
{
1304
4
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1305
1306
4
    if (pdsactx != NULL && pdsactx->operation == EVP_PKEY_OP_VERIFYMSG)
1307
0
        return dsa_sigalg_set_ctx_params_list;
1308
4
    return NULL;
1309
4
}
1310
1311
static int dsa_sigalg_set_ctx_params(void *vpdsactx, const OSSL_PARAM params[])
1312
764
{
1313
764
    PROV_DSA_CTX *pdsactx = (PROV_DSA_CTX *)vpdsactx;
1314
764
    struct dsa_all_set_ctx_params_st p;
1315
764
    int ret;
1316
1317
764
    if (pdsactx == NULL || !dsa_sigalg_set_ctx_params_decoder(params, &p))
1318
0
        return 0;
1319
1320
764
    if ((ret = dsa_common_set_ctx_params(pdsactx, &p)) <= 0)
1321
0
        return ret;
1322
1323
764
    if (pdsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
1324
764
        if (p.sig != NULL) {
1325
764
            OPENSSL_free(pdsactx->sig);
1326
764
            pdsactx->sig = NULL;
1327
764
            pdsactx->siglen = 0;
1328
764
            if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&pdsactx->sig,
1329
764
                    0, &pdsactx->siglen))
1330
0
                return 0;
1331
            /* The signature must not be empty */
1332
764
            if (pdsactx->siglen == 0) {
1333
0
                OPENSSL_free(pdsactx->sig);
1334
0
                pdsactx->sig = NULL;
1335
0
                return 0;
1336
0
            }
1337
764
        }
1338
764
    }
1339
764
    return 1;
1340
764
}
1341
1342
#define IMPL_DSA_SIGALG(md, MD)                                       \
1343
    static OSSL_FUNC_signature_sign_init_fn dsa_##md##_sign_init;     \
1344
    static OSSL_FUNC_signature_sign_message_init_fn                   \
1345
        dsa_##md##_sign_message_init;                                 \
1346
    static OSSL_FUNC_signature_verify_init_fn dsa_##md##_verify_init; \
1347
    static OSSL_FUNC_signature_verify_message_init_fn                 \
1348
        dsa_##md##_verify_message_init;                               \
1349
                                                                      \
1350
    static int                                                        \
1351
    dsa_##md##_sign_init(void *vpdsactx, void *vdsa,                  \
1352
        const OSSL_PARAM params[])                                    \
1353
0
    {                                                                 \
1354
0
        static const char desc[] = "DSA-" MD " Sign Init";            \
1355
0
                                                                      \
1356
0
        return dsa_sigalg_signverify_init(vpdsactx, vdsa,             \
1357
0
            dsa_sigalg_set_ctx_params,                                \
1358
0
            params, MD,                                               \
1359
0
            EVP_PKEY_OP_SIGN,                                         \
1360
0
            desc);                                                    \
1361
0
    }                                                                 \
Unexecuted instantiation: dsa_sig.c:dsa_sha1_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha224_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha256_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha384_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha512_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_224_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_256_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_384_sign_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_512_sign_init
1362
                                                                      \
1363
    static int                                                        \
1364
    dsa_##md##_sign_message_init(void *vpdsactx, void *vdsa,          \
1365
        const OSSL_PARAM params[])                                    \
1366
0
    {                                                                 \
1367
0
        static const char desc[] = "DSA-" MD " Sign Message Init";    \
1368
0
                                                                      \
1369
0
        return dsa_sigalg_signverify_init(vpdsactx, vdsa,             \
1370
0
            dsa_sigalg_set_ctx_params,                                \
1371
0
            params, MD,                                               \
1372
0
            EVP_PKEY_OP_SIGNMSG,                                      \
1373
0
            desc);                                                    \
1374
0
    }                                                                 \
Unexecuted instantiation: dsa_sig.c:dsa_sha1_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha224_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha256_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha384_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha512_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_224_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_256_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_384_sign_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_512_sign_message_init
1375
                                                                      \
1376
    static int                                                        \
1377
    dsa_##md##_verify_init(void *vpdsactx, void *vdsa,                \
1378
        const OSSL_PARAM params[])                                    \
1379
0
    {                                                                 \
1380
0
        static const char desc[] = "DSA-" MD " Verify Init";          \
1381
0
                                                                      \
1382
0
        return dsa_sigalg_signverify_init(vpdsactx, vdsa,             \
1383
0
            dsa_sigalg_set_ctx_params,                                \
1384
0
            params, MD,                                               \
1385
0
            EVP_PKEY_OP_VERIFY,                                       \
1386
0
            desc);                                                    \
1387
0
    }                                                                 \
Unexecuted instantiation: dsa_sig.c:dsa_sha1_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha224_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha256_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha384_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha512_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_224_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_256_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_384_verify_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_512_verify_init
1388
                                                                      \
1389
    static int                                                        \
1390
    dsa_##md##_verify_message_init(void *vpdsactx, void *vdsa,        \
1391
        const OSSL_PARAM params[])                                    \
1392
0
    {                                                                 \
1393
0
        static const char desc[] = "DSA-" MD " Verify Message Init";  \
1394
0
                                                                      \
1395
0
        return dsa_sigalg_signverify_init(vpdsactx, vdsa,             \
1396
0
            dsa_sigalg_set_ctx_params,                                \
1397
0
            params, MD,                                               \
1398
0
            EVP_PKEY_OP_VERIFYMSG,                                    \
1399
0
            desc);                                                    \
1400
0
    }                                                                 \
Unexecuted instantiation: dsa_sig.c:dsa_sha1_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha224_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha256_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha384_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha512_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_224_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_256_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_384_verify_message_init
Unexecuted instantiation: dsa_sig.c:dsa_sha3_512_verify_message_init
1401
                                                                      \
1402
    const OSSL_DISPATCH ossl_dsa_##md##_signature_functions[] = {     \
1403
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))dsa_newctx },   \
1404
        { OSSL_FUNC_SIGNATURE_SIGN_INIT,                              \
1405
            (void (*)(void))dsa_##md##_sign_init },                   \
1406
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))dsa_sign },       \
1407
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                      \
1408
            (void (*)(void))dsa_##md##_sign_message_init },           \
1409
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                    \
1410
            (void (*)(void))dsa_signverify_message_update },          \
1411
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                     \
1412
            (void (*)(void))dsa_sign_message_final },                 \
1413
        { OSSL_FUNC_SIGNATURE_VERIFY_INIT,                            \
1414
            (void (*)(void))dsa_##md##_verify_init },                 \
1415
        { OSSL_FUNC_SIGNATURE_VERIFY,                                 \
1416
            (void (*)(void))dsa_verify },                             \
1417
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                    \
1418
            (void (*)(void))dsa_##md##_verify_message_init },         \
1419
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                  \
1420
            (void (*)(void))dsa_signverify_message_update },          \
1421
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                   \
1422
            (void (*)(void))dsa_verify_message_final },               \
1423
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))dsa_freectx }, \
1424
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))dsa_dupctx },   \
1425
        { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES,                        \
1426
            (void (*)(void))dsa_sigalg_query_key_types },             \
1427
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                         \
1428
            (void (*)(void))dsa_get_ctx_params },                     \
1429
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                    \
1430
            (void (*)(void))dsa_gettable_ctx_params },                \
1431
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                         \
1432
            (void (*)(void))dsa_sigalg_set_ctx_params },              \
1433
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                    \
1434
            (void (*)(void))dsa_sigalg_settable_ctx_params },         \
1435
        OSSL_DISPATCH_END                                             \
1436
    }
1437
1438
IMPL_DSA_SIGALG(sha1, "SHA1");
1439
IMPL_DSA_SIGALG(sha224, "SHA2-224");
1440
IMPL_DSA_SIGALG(sha256, "SHA2-256");
1441
IMPL_DSA_SIGALG(sha384, "SHA2-384");
1442
IMPL_DSA_SIGALG(sha512, "SHA2-512");
1443
IMPL_DSA_SIGALG(sha3_224, "SHA3-224");
1444
IMPL_DSA_SIGALG(sha3_256, "SHA3-256");
1445
IMPL_DSA_SIGALG(sha3_384, "SHA3-384");
1446
IMPL_DSA_SIGALG(sha3_512, "SHA3-512");