Coverage Report

Created: 2026-10-28 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/signature/ecdsa_sig.c
Line
Count
Source
1
/*
2
 * Copyright 2020-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
/*
14
 * ECDSA 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> /* memcpy */
20
#include <openssl/crypto.h>
21
#include <openssl/core_dispatch.h>
22
#include <openssl/core_names.h>
23
#include <openssl/dsa.h>
24
#include <openssl/params.h>
25
#include <openssl/evp.h>
26
#include <openssl/err.h>
27
#include <openssl/proverr.h>
28
#include "internal/nelem.h"
29
#include "internal/sizes.h"
30
#include "internal/cryptlib.h"
31
#include "internal/deterministic_nonce.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_ec.h"
37
#include "crypto/ec.h"
38
39
static OSSL_FUNC_signature_newctx_fn ecdsa_newctx;
40
static OSSL_FUNC_signature_sign_init_fn ecdsa_sign_init;
41
static OSSL_FUNC_signature_verify_init_fn ecdsa_verify_init;
42
static OSSL_FUNC_signature_sign_fn ecdsa_sign;
43
static OSSL_FUNC_signature_sign_message_update_fn ecdsa_signverify_message_update;
44
static OSSL_FUNC_signature_sign_message_final_fn ecdsa_sign_message_final;
45
static OSSL_FUNC_signature_verify_fn ecdsa_verify;
46
static OSSL_FUNC_signature_verify_message_update_fn ecdsa_signverify_message_update;
47
static OSSL_FUNC_signature_verify_message_final_fn ecdsa_verify_message_final;
48
static OSSL_FUNC_signature_digest_sign_init_fn ecdsa_digest_sign_init;
49
static OSSL_FUNC_signature_digest_sign_update_fn ecdsa_digest_signverify_update;
50
static OSSL_FUNC_signature_digest_sign_final_fn ecdsa_digest_sign_final;
51
static OSSL_FUNC_signature_digest_verify_init_fn ecdsa_digest_verify_init;
52
static OSSL_FUNC_signature_digest_verify_update_fn ecdsa_digest_signverify_update;
53
static OSSL_FUNC_signature_digest_verify_final_fn ecdsa_digest_verify_final;
54
static OSSL_FUNC_signature_freectx_fn ecdsa_freectx;
55
static OSSL_FUNC_signature_dupctx_fn ecdsa_dupctx;
56
static OSSL_FUNC_signature_query_key_types_fn ecdsa_sigalg_query_key_types;
57
static OSSL_FUNC_signature_get_ctx_params_fn ecdsa_get_ctx_params;
58
static OSSL_FUNC_signature_gettable_ctx_params_fn ecdsa_gettable_ctx_params;
59
static OSSL_FUNC_signature_set_ctx_params_fn ecdsa_set_ctx_params;
60
static OSSL_FUNC_signature_settable_ctx_params_fn ecdsa_settable_ctx_params;
61
static OSSL_FUNC_signature_get_ctx_md_params_fn ecdsa_get_ctx_md_params;
62
static OSSL_FUNC_signature_gettable_ctx_md_params_fn ecdsa_gettable_ctx_md_params;
63
static OSSL_FUNC_signature_set_ctx_md_params_fn ecdsa_set_ctx_md_params;
64
static OSSL_FUNC_signature_settable_ctx_md_params_fn ecdsa_settable_ctx_md_params;
65
static OSSL_FUNC_signature_set_ctx_params_fn ecdsa_sigalg_set_ctx_params;
66
static OSSL_FUNC_signature_settable_ctx_params_fn ecdsa_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
    EC_KEY *ec;
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
    /* The Algorithm Identifier of the combined signature algorithm */
100
    unsigned char aid_buf[OSSL_MAX_ALGORITHM_ID_SIZE];
101
    size_t aid_len;
102
103
    /* main digest */
104
    char mdname[OSSL_MAX_NAME_SIZE];
105
    EVP_MD *md;
106
    EVP_MD_CTX *mdctx;
107
    size_t mdsize;
108
109
    /* Signature, for verification */
110
    unsigned char *sig;
111
    size_t siglen;
112
113
    /*
114
     * Internally used to cache the results of calling the EC group
115
     * sign_setup() methods which are then passed to the sign operation.
116
     * This is used by CAVS failure tests to terminate a loop if the signature
117
     * is not valid.
118
     * This could of also been done with a simple flag.
119
     */
120
    BIGNUM *kinv;
121
    BIGNUM *r;
122
#if !defined(OPENSSL_NO_ACVP_TESTS)
123
    /*
124
     * This indicates that KAT (CAVS) test is running. Externally an app will
125
     * override the random callback such that the generated private key and k
126
     * are known.
127
     * Normal operation will loop to choose a new k if the signature is not
128
     * valid - but for this mode of operation it forces a failure instead.
129
     */
130
    unsigned int kattest;
131
#endif
132
#ifdef FIPS_MODULE
133
    /*
134
     * FIPS 140-3 IG 2.4.B mandates that verification based on a digest of a
135
     * message is not permitted.  However, signing based on a digest is still
136
     * permitted.
137
     */
138
    int verify_message;
139
#endif
140
    /* If this is set then the generated k is not random */
141
    unsigned int nonce_type;
142
    OSSL_FIPS_IND_DECLARE
143
} PROV_ECDSA_CTX;
144
145
static void *ecdsa_newctx(void *provctx, const char *propq)
146
18.2k
{
147
18.2k
    PROV_ECDSA_CTX *ctx;
148
149
18.2k
    if (!ossl_prov_is_running())
150
0
        return NULL;
151
152
18.2k
    ctx = OPENSSL_zalloc(sizeof(PROV_ECDSA_CTX));
153
18.2k
    if (ctx == NULL)
154
0
        return NULL;
155
156
18.2k
    OSSL_FIPS_IND_INIT(ctx)
157
18.2k
    ctx->flag_allow_md = 1;
158
#ifdef FIPS_MODULE
159
    ctx->verify_message = 1;
160
#endif
161
18.2k
    ctx->libctx = PROV_LIBCTX_OF(provctx);
162
18.2k
    if (propq != NULL && (ctx->propq = OPENSSL_strdup(propq)) == NULL) {
163
0
        OPENSSL_free(ctx);
164
0
        ctx = NULL;
165
0
    }
166
18.2k
    return ctx;
167
18.2k
}
168
169
static int ecdsa_setup_md(PROV_ECDSA_CTX *ctx,
170
    const char *mdname, const char *mdprops,
171
    const char *desc)
172
18.2k
{
173
18.2k
    EVP_MD *md = NULL;
174
18.2k
    size_t mdname_len;
175
18.2k
    int md_nid, md_size;
176
18.2k
    WPACKET pkt;
177
18.2k
    unsigned char *aid = NULL;
178
179
18.2k
    if (mdname == NULL)
180
0
        return 1;
181
182
18.2k
    mdname_len = strlen(mdname);
183
18.2k
    if (mdname_len >= sizeof(ctx->mdname)) {
184
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
185
0
            "%s exceeds name buffer length", mdname);
186
0
        return 0;
187
0
    }
188
18.2k
    if (mdprops == NULL)
189
15.9k
        mdprops = ctx->propq;
190
18.2k
    md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
191
18.2k
    if (md == NULL) {
192
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
193
0
            "%s could not be fetched", mdname);
194
0
        return 0;
195
0
    }
196
18.2k
    md_size = EVP_MD_get_size(md);
197
18.2k
    if (md_size <= 0) {
198
2
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
199
2
            "%s has invalid md size %d", mdname, md_size);
200
2
        goto err;
201
2
    }
202
18.2k
    md_nid = ossl_digest_get_approved_nid(md);
203
#ifdef FIPS_MODULE
204
    if (md_nid == NID_undef) {
205
        ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
206
            "digest=%s", mdname);
207
        goto err;
208
    }
209
#endif
210
    /* XOF digests don't work */
211
18.2k
    if (EVP_MD_xof(md)) {
212
0
        ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
213
0
        goto err;
214
0
    }
215
216
#ifdef FIPS_MODULE
217
    {
218
        int sha1_allowed
219
            = ((ctx->operation
220
                   & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG))
221
                == 0);
222
223
        if (!ossl_fips_ind_digest_sign_check(OSSL_FIPS_IND_GET(ctx),
224
                OSSL_FIPS_IND_SETTABLE1,
225
                ctx->libctx,
226
                md_nid, sha1_allowed, 0, desc,
227
                ossl_fips_config_signature_digest_check))
228
            goto err;
229
    }
230
#endif
231
232
18.2k
    if (!ctx->flag_allow_md) {
233
0
        if (ctx->mdname[0] != '\0' && !EVP_MD_is_a(md, ctx->mdname)) {
234
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
235
0
                "digest %s != %s", mdname, ctx->mdname);
236
0
            goto err;
237
0
        }
238
0
        EVP_MD_free(md);
239
0
        return 1;
240
0
    }
241
242
18.2k
    EVP_MD_CTX_free(ctx->mdctx);
243
18.2k
    EVP_MD_free(ctx->md);
244
245
18.2k
    ctx->aid_len = 0;
246
18.2k
#ifndef FIPS_MODULE
247
18.2k
    if (md_nid != NID_undef) {
248
#else
249
    {
250
#endif
251
18.1k
        if (WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf))
252
18.1k
            && ossl_DER_w_algorithmIdentifier_ECDSA_with_MD(&pkt, -1, ctx->ec,
253
18.1k
                md_nid)
254
18.1k
            && WPACKET_finish(&pkt)) {
255
18.1k
            WPACKET_get_total_written(&pkt, &ctx->aid_len);
256
18.1k
            aid = WPACKET_get_curr(&pkt);
257
18.1k
        }
258
18.1k
        WPACKET_cleanup(&pkt);
259
18.1k
        if (aid != NULL && ctx->aid_len != 0)
260
18.1k
            memmove(ctx->aid_buf, aid, ctx->aid_len);
261
18.1k
    }
262
263
18.2k
    ctx->mdctx = NULL;
264
18.2k
    ctx->md = md;
265
18.2k
    ctx->mdsize = (size_t)md_size;
266
18.2k
    OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
267
268
18.2k
    return 1;
269
2
err:
270
2
    EVP_MD_free(md);
271
2
    return 0;
272
18.2k
}
273
274
static int
275
ecdsa_signverify_init(PROV_ECDSA_CTX *ctx, void *ec,
276
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
277
    const OSSL_PARAM params[], int operation,
278
    const char *desc)
279
18.2k
{
280
18.2k
    if (!ossl_prov_is_running()
281
18.2k
        || ctx == NULL)
282
0
        return 0;
283
284
18.2k
    if (ec == NULL && ctx->ec == NULL) {
285
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
286
0
        return 0;
287
0
    }
288
289
18.2k
    if (ec != NULL) {
290
18.2k
        if (!EC_KEY_up_ref(ec))
291
0
            return 0;
292
18.2k
        EC_KEY_free(ctx->ec);
293
18.2k
        ctx->ec = ec;
294
18.2k
    }
295
296
18.2k
    ctx->operation = operation;
297
298
18.2k
    OSSL_FIPS_IND_SET_APPROVED(ctx)
299
18.2k
    if (!set_ctx_params(ctx, params))
300
0
        return 0;
301
#ifdef FIPS_MODULE
302
    if (!ossl_fips_ind_ec_key_check(OSSL_FIPS_IND_GET(ctx),
303
            OSSL_FIPS_IND_SETTABLE0, ctx->libctx,
304
            EC_KEY_get0_group(ctx->ec), desc,
305
            (operation & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG)) != 0))
306
        return 0;
307
#endif
308
18.2k
    return 1;
309
18.2k
}
310
311
static int ecdsa_sign_init(void *vctx, void *ec, const OSSL_PARAM params[])
312
0
{
313
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
314
315
#ifdef FIPS_MODULE
316
    ctx->verify_message = 1;
317
#endif
318
0
    return ecdsa_signverify_init(ctx, ec, ecdsa_set_ctx_params, params,
319
0
        EVP_PKEY_OP_SIGN, "ECDSA Sign Init");
320
0
}
321
322
/*
323
 * Sign tbs without digesting it first.  This is suitable for "primitive"
324
 * signing and signing the digest of a message.
325
 */
326
static int ecdsa_sign_directly(void *vctx,
327
    unsigned char *sig, size_t *siglen, size_t sigsize,
328
    const unsigned char *tbs, size_t tbslen)
329
12.3k
{
330
12.3k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
331
12.3k
    int ret;
332
12.3k
    unsigned int sltmp;
333
12.3k
    size_t ecsize = ECDSA_size(ctx->ec);
334
335
12.3k
    if (!ossl_prov_is_running())
336
0
        return 0;
337
338
12.3k
    if (sig == NULL) {
339
6.17k
        *siglen = ecsize;
340
6.17k
        return 1;
341
6.17k
    }
342
343
#if !defined(OPENSSL_NO_ACVP_TESTS)
344
    if (ctx->kattest && !ECDSA_sign_setup(ctx->ec, NULL, &ctx->kinv, &ctx->r))
345
        return 0;
346
#endif
347
348
6.17k
    if (sigsize < (size_t)ecsize)
349
0
        return 0;
350
351
6.17k
    if (ctx->mdsize != 0 && tbslen != ctx->mdsize)
352
0
        return 0;
353
354
6.17k
    if (ctx->nonce_type != 0) {
355
0
        const char *mdname = NULL;
356
357
0
        if (ctx->mdname[0] != '\0')
358
0
            mdname = ctx->mdname;
359
0
        ret = ossl_ecdsa_deterministic_sign(tbs, (int)tbslen, sig, &sltmp,
360
0
            ctx->ec, ctx->nonce_type,
361
0
            mdname,
362
0
            ctx->libctx, ctx->propq);
363
6.17k
    } else {
364
6.17k
        ret = ECDSA_sign_ex(0, tbs, (int)tbslen, sig, &sltmp,
365
6.17k
            ctx->kinv, ctx->r, ctx->ec);
366
6.17k
    }
367
6.17k
    if (ret <= 0)
368
0
        return 0;
369
370
6.17k
    *siglen = sltmp;
371
6.17k
    return 1;
372
6.17k
}
373
374
static int ecdsa_signverify_message_update(void *vctx,
375
    const unsigned char *data,
376
    size_t datalen)
377
8.29k
{
378
8.29k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
379
380
8.29k
    if (ctx == NULL)
381
0
        return 0;
382
383
8.29k
    return EVP_DigestUpdate(ctx->mdctx, data, datalen);
384
8.29k
}
385
386
static int ecdsa_sign_message_final(void *vctx, unsigned char *sig,
387
    size_t *siglen, size_t sigsize)
388
12.3k
{
389
12.3k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
390
12.3k
    unsigned char digest[EVP_MAX_MD_SIZE];
391
12.3k
    unsigned int dlen = 0;
392
393
12.3k
    if (!ossl_prov_is_running() || ctx == NULL)
394
0
        return 0;
395
12.3k
    if (ctx->mdctx == NULL)
396
0
        return 0;
397
    /*
398
     * If sig is NULL then we're just finding out the sig size. Other fields
399
     * are ignored. Defer to ecdsa_sign.
400
     */
401
12.3k
    if (sig != NULL
402
6.17k
        && !EVP_DigestFinal_ex(ctx->mdctx, digest, &dlen))
403
0
        return 0;
404
12.3k
    return ecdsa_sign_directly(vctx, sig, siglen, sigsize, digest, dlen);
405
12.3k
}
406
407
/*
408
 * If signing a message, digest tbs and sign the result.
409
 * Otherwise, sign tbs directly.
410
 */
411
static int ecdsa_sign(void *vctx, unsigned char *sig, size_t *siglen,
412
    size_t sigsize, const unsigned char *tbs, size_t tbslen)
413
0
{
414
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
415
416
0
    if (ctx->operation == EVP_PKEY_OP_SIGNMSG) {
417
        /*
418
         * If |sig| is NULL, the caller is only looking for the sig length.
419
         * DO NOT update the input in this case.
420
         */
421
0
        if (sig == NULL)
422
0
            return ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
423
424
0
        if (ecdsa_signverify_message_update(ctx, tbs, tbslen) <= 0)
425
0
            return 0;
426
0
        return ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
427
0
    }
428
0
    return ecdsa_sign_directly(ctx, sig, siglen, sigsize, tbs, tbslen);
429
0
}
430
431
static int ecdsa_verify_init(void *vctx, void *ec, const OSSL_PARAM params[])
432
1.31k
{
433
1.31k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
434
435
#ifdef FIPS_MODULE
436
    ctx->verify_message = 0;
437
#endif
438
1.31k
    return ecdsa_signverify_init(ctx, ec, ecdsa_set_ctx_params, params,
439
1.31k
        EVP_PKEY_OP_VERIFY, "ECDSA Verify Init");
440
1.31k
}
441
442
static int ecdsa_verify_directly(void *vctx,
443
    const unsigned char *sig, size_t siglen,
444
    const unsigned char *tbs, size_t tbslen)
445
3.43k
{
446
3.43k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
447
448
3.43k
    if (!ossl_prov_is_running() || (ctx->mdsize != 0 && tbslen != ctx->mdsize))
449
0
        return 0;
450
451
3.43k
    return ECDSA_verify(0, tbs, (int)tbslen, sig, (int)siglen, ctx->ec);
452
3.43k
}
453
454
static int ecdsa_verify_set_sig(void *vctx,
455
    const unsigned char *sig, size_t siglen)
456
2.12k
{
457
2.12k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
458
2.12k
    OSSL_PARAM params[2];
459
460
2.12k
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
461
2.12k
        (unsigned char *)sig, siglen);
462
2.12k
    params[1] = OSSL_PARAM_construct_end();
463
2.12k
    return ecdsa_sigalg_set_ctx_params(ctx, params);
464
2.12k
}
465
466
static int ecdsa_verify_message_final(void *vctx)
467
2.11k
{
468
2.11k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
469
2.11k
    unsigned char digest[EVP_MAX_MD_SIZE];
470
2.11k
    unsigned int dlen = 0;
471
472
2.11k
    if (!ossl_prov_is_running() || ctx == NULL || ctx->mdctx == NULL)
473
0
        return 0;
474
475
    /*
476
     * The digests used here are all known (see ecdsa_get_md_nid()), so they
477
     * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
478
     */
479
2.11k
    if (!EVP_DigestFinal_ex(ctx->mdctx, digest, &dlen))
480
0
        return 0;
481
482
2.11k
    return ecdsa_verify_directly(vctx, ctx->sig, ctx->siglen,
483
2.11k
        digest, dlen);
484
2.11k
}
485
486
/*
487
 * If verifying a message, digest tbs and verify the result.
488
 * Otherwise, verify tbs directly.
489
 */
490
static int ecdsa_verify(void *vctx,
491
    const unsigned char *sig, size_t siglen,
492
    const unsigned char *tbs, size_t tbslen)
493
1.31k
{
494
1.31k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
495
496
1.31k
    if (ctx->operation == EVP_PKEY_OP_VERIFYMSG) {
497
0
        if (ecdsa_verify_set_sig(ctx, sig, siglen) <= 0)
498
0
            return 0;
499
0
        if (ecdsa_signverify_message_update(ctx, tbs, tbslen) <= 0)
500
0
            return 0;
501
0
        return ecdsa_verify_message_final(ctx);
502
0
    }
503
1.31k
    return ecdsa_verify_directly(ctx, sig, siglen, tbs, tbslen);
504
1.31k
}
505
506
/* DigestSign/DigestVerify wrappers */
507
508
static int ecdsa_digest_signverify_init(void *vctx, const char *mdname,
509
    void *ec, const OSSL_PARAM params[],
510
    int operation, const char *desc)
511
16.9k
{
512
16.9k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
513
514
16.9k
    if (!ossl_prov_is_running())
515
0
        return 0;
516
517
#ifdef FIPS_MODULE
518
    ctx->verify_message = 1;
519
#endif
520
16.9k
    if (!ecdsa_signverify_init(vctx, ec, ecdsa_set_ctx_params, params,
521
16.9k
            operation, desc))
522
0
        return 0;
523
524
16.9k
    if (mdname != NULL
525
        /* was ecdsa_setup_md already called in ecdsa_signverify_init()? */
526
16.9k
        && (mdname[0] == '\0' || OPENSSL_strcasecmp(ctx->mdname, mdname) != 0)
527
15.9k
        && !ecdsa_setup_md(ctx, mdname, NULL, desc))
528
1
        return 0;
529
530
16.9k
    ctx->flag_allow_md = 0;
531
532
16.9k
    if (ctx->mdctx == NULL) {
533
16.9k
        ctx->mdctx = EVP_MD_CTX_new();
534
16.9k
        if (ctx->mdctx == NULL)
535
0
            goto error;
536
16.9k
    }
537
538
16.9k
    if (!EVP_DigestInit_ex2(ctx->mdctx, ctx->md, params))
539
0
        goto error;
540
16.9k
    return 1;
541
0
error:
542
0
    EVP_MD_CTX_free(ctx->mdctx);
543
0
    ctx->mdctx = NULL;
544
0
    return 0;
545
16.9k
}
546
547
static int ecdsa_digest_sign_init(void *vctx, const char *mdname, void *ec,
548
    const OSSL_PARAM params[])
549
14.8k
{
550
14.8k
    return ecdsa_digest_signverify_init(vctx, mdname, ec, params,
551
14.8k
        EVP_PKEY_OP_SIGNMSG,
552
14.8k
        "ECDSA Digest Sign Init");
553
14.8k
}
554
555
static int ecdsa_digest_signverify_update(void *vctx, const unsigned char *data,
556
    size_t datalen)
557
8.29k
{
558
8.29k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
559
560
8.29k
    if (ctx == NULL || ctx->mdctx == NULL)
561
0
        return 0;
562
    /* Sigalg implementations shouldn't do digest_sign */
563
8.29k
    if (ctx->flag_sigalg)
564
0
        return 0;
565
566
8.29k
    return ecdsa_signverify_message_update(vctx, data, datalen);
567
8.29k
}
568
569
int ecdsa_digest_sign_final(void *vctx, unsigned char *sig, size_t *siglen,
570
    size_t sigsize)
571
12.3k
{
572
12.3k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
573
12.3k
    int ok = 0;
574
575
12.3k
    if (ctx == NULL)
576
0
        return 0;
577
    /* Sigalg implementations shouldn't do digest_sign */
578
12.3k
    if (ctx->flag_sigalg)
579
0
        return 0;
580
581
12.3k
    ok = ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
582
583
12.3k
    ctx->flag_allow_md = 1;
584
585
12.3k
    return ok;
586
12.3k
}
587
588
static int ecdsa_digest_verify_init(void *vctx, const char *mdname, void *ec,
589
    const OSSL_PARAM params[])
590
2.12k
{
591
2.12k
    return ecdsa_digest_signverify_init(vctx, mdname, ec, params,
592
2.12k
        EVP_PKEY_OP_VERIFYMSG,
593
2.12k
        "ECDSA Digest Verify Init");
594
2.12k
}
595
596
int ecdsa_digest_verify_final(void *vctx, const unsigned char *sig,
597
    size_t siglen)
598
2.12k
{
599
2.12k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
600
2.12k
    int ok = 0;
601
602
2.12k
    if (!ossl_prov_is_running() || ctx == NULL || ctx->mdctx == NULL)
603
0
        return 0;
604
605
    /* Sigalg implementations shouldn't do digest_verify */
606
2.12k
    if (ctx->flag_sigalg)
607
0
        return 0;
608
609
2.12k
    if (ecdsa_verify_set_sig(ctx, sig, siglen))
610
2.11k
        ok = ecdsa_verify_message_final(ctx);
611
612
2.12k
    ctx->flag_allow_md = 1;
613
614
2.12k
    return ok;
615
2.12k
}
616
617
static void ecdsa_freectx(void *vctx)
618
26.5k
{
619
26.5k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
620
621
26.5k
    EVP_MD_CTX_free(ctx->mdctx);
622
26.5k
    EVP_MD_free(ctx->md);
623
26.5k
    OPENSSL_free(ctx->propq);
624
26.5k
    OPENSSL_free(ctx->sig);
625
26.5k
    EC_KEY_free(ctx->ec);
626
26.5k
    BN_clear_free(ctx->kinv);
627
26.5k
    BN_clear_free(ctx->r);
628
26.5k
    OPENSSL_free(ctx);
629
26.5k
}
630
631
static void *ecdsa_dupctx(void *vctx)
632
8.29k
{
633
8.29k
    PROV_ECDSA_CTX *srcctx = (PROV_ECDSA_CTX *)vctx;
634
8.29k
    PROV_ECDSA_CTX *dstctx;
635
636
    /* Test KATS should not need to be supported */
637
8.29k
    if (!ossl_prov_is_running()
638
8.29k
        || srcctx->kinv != NULL
639
8.29k
        || srcctx->r != NULL
640
8.29k
        || (dstctx = OPENSSL_memdup(srcctx, sizeof(*srcctx))) == NULL)
641
0
        return NULL;
642
643
8.29k
    dstctx->ec = NULL;
644
8.29k
    dstctx->propq = NULL;
645
8.29k
    dstctx->md = NULL;
646
8.29k
    dstctx->mdctx = NULL;
647
8.29k
    dstctx->sig = NULL;
648
649
8.29k
    if (srcctx->ec != NULL && !EC_KEY_up_ref(srcctx->ec))
650
0
        goto err;
651
8.29k
    dstctx->ec = srcctx->ec;
652
653
8.29k
    if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
654
0
        goto err;
655
8.29k
    dstctx->md = srcctx->md;
656
657
8.29k
    if (srcctx->mdctx != NULL
658
8.29k
        && ((dstctx->mdctx = EVP_MD_CTX_new()) == NULL
659
8.29k
            || !EVP_MD_CTX_copy_ex(dstctx->mdctx, srcctx->mdctx)))
660
0
        goto err;
661
8.29k
    if (srcctx->propq != NULL
662
0
        && (dstctx->propq = OPENSSL_strdup(srcctx->propq)) == NULL)
663
0
        goto err;
664
8.29k
    if (srcctx->sig != NULL
665
0
        && (dstctx->sig = OPENSSL_memdup(srcctx->sig, srcctx->siglen)) == NULL)
666
0
        goto err;
667
668
8.29k
    return dstctx;
669
0
err:
670
0
    ecdsa_freectx(dstctx);
671
0
    return NULL;
672
8.29k
}
673
674
/* clang-format off */
675
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
676
#ifndef ecdsa_get_ctx_params_list
677
static ossl_unused const OSSL_PARAM ecdsa_get_ctx_params_list[] = {
678
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
679
    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
680
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
681
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
682
# if defined(FIPS_MODULE)
683
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE, NULL),
684
# endif
685
# if defined(FIPS_MODULE)
686
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR, NULL),
687
# endif
688
    OSSL_PARAM_END
689
};
690
#endif
691
692
#ifndef ecdsa_get_ctx_params_st
693
struct ecdsa_get_ctx_params_st {
694
    OSSL_PARAM *algid;
695
    OSSL_PARAM *digest;
696
# if defined(FIPS_MODULE)
697
    OSSL_PARAM *ind;
698
# endif
699
    OSSL_PARAM *nonce;
700
    OSSL_PARAM *size;
701
# if defined(FIPS_MODULE)
702
    OSSL_PARAM *verify;
703
# endif
704
};
705
#endif
706
707
#ifndef ecdsa_get_ctx_params_decoder
708
static ossl_unused int ecdsa_get_ctx_params_decoder
709
    (const OSSL_PARAM *p, struct ecdsa_get_ctx_params_st *r)
710
0
{
711
0
    const char *s;
712
713
0
    memset(r, 0, sizeof(*r));
714
0
    if (p != NULL)
715
0
        for (; (s = p->key) != NULL; p++)
716
0
            switch(s[0]) {
717
0
            default:
718
0
                break;
719
0
            case 'a':
720
0
                if (ossl_likely(strcmp("lgorithm-id", s + 1) == 0)) {
721
                    /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
722
0
                    if (ossl_unlikely(r->algid != NULL)) {
723
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
724
0
                                       "param %s is repeated", s);
725
0
                        return 0;
726
0
                    }
727
0
                    r->algid = (OSSL_PARAM *)p;
728
0
                }
729
0
                break;
730
0
            case 'd':
731
0
                switch(s[1]) {
732
0
                default:
733
0
                    break;
734
0
                case 'i':
735
0
                    switch(s[2]) {
736
0
                    default:
737
0
                        break;
738
0
                    case 'g':
739
0
                        switch(s[3]) {
740
0
                        default:
741
0
                            break;
742
0
                        case 'e':
743
0
                            switch(s[4]) {
744
0
                            default:
745
0
                                break;
746
0
                            case 's':
747
0
                                switch(s[5]) {
748
0
                                default:
749
0
                                    break;
750
0
                                case 't':
751
0
                                    switch(s[6]) {
752
0
                                    default:
753
0
                                        break;
754
0
                                    case '-':
755
0
                                        if (ossl_likely(strcmp("size", s + 7) == 0)) {
756
                                            /* OSSL_SIGNATURE_PARAM_DIGEST_SIZE */
757
0
                                            if (ossl_unlikely(r->size != NULL)) {
758
0
                                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
759
0
                                                               "param %s is repeated", s);
760
0
                                                return 0;
761
0
                                            }
762
0
                                            r->size = (OSSL_PARAM *)p;
763
0
                                        }
764
0
                                        break;
765
0
                                    case '\0':
766
0
                                        if (ossl_unlikely(r->digest != NULL)) {
767
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
768
0
                                                           "param %s is repeated", s);
769
0
                                            return 0;
770
0
                                        }
771
0
                                        r->digest = (OSSL_PARAM *)p;
772
0
                                    }
773
0
                                }
774
0
                            }
775
0
                        }
776
0
                    }
777
0
                }
778
0
                break;
779
0
            case 'f':
780
# if defined(FIPS_MODULE)
781
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
782
                    /* OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR */
783
                    if (ossl_unlikely(r->ind != NULL)) {
784
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
785
                                       "param %s is repeated", s);
786
                        return 0;
787
                    }
788
                    r->ind = (OSSL_PARAM *)p;
789
                }
790
# endif
791
0
                break;
792
0
            case 'n':
793
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
794
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
795
0
                    if (ossl_unlikely(r->nonce != NULL)) {
796
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
797
0
                                       "param %s is repeated", s);
798
0
                        return 0;
799
0
                    }
800
0
                    r->nonce = (OSSL_PARAM *)p;
801
0
                }
802
0
                break;
803
0
            case 'v':
804
# if defined(FIPS_MODULE)
805
                if (ossl_likely(strcmp("erify-message", s + 1) == 0)) {
806
                    /* OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE */
807
                    if (ossl_unlikely(r->verify != NULL)) {
808
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
809
                                       "param %s is repeated", s);
810
                        return 0;
811
                    }
812
                    r->verify = (OSSL_PARAM *)p;
813
                }
814
# endif
815
0
                break;
816
0
            }
817
0
    return 1;
818
0
}
819
#endif
820
/* End of machine generated */
821
/* clang-format on */
822
823
static int ecdsa_get_ctx_params(void *vctx, OSSL_PARAM *params)
824
0
{
825
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
826
0
    struct ecdsa_get_ctx_params_st p;
827
828
0
    if (ctx == NULL || !ecdsa_get_ctx_params_decoder(params, &p))
829
0
        return 0;
830
831
0
    if (p.algid != NULL
832
0
        && !OSSL_PARAM_set_octet_string(p.algid,
833
0
            ctx->aid_len == 0 ? NULL : ctx->aid_buf,
834
0
            ctx->aid_len))
835
0
        return 0;
836
837
0
    if (p.size != NULL && !OSSL_PARAM_set_size_t(p.size, ctx->mdsize))
838
0
        return 0;
839
840
0
    if (p.digest != NULL
841
0
        && !OSSL_PARAM_set_utf8_string(p.digest, ctx->md == NULL ? ctx->mdname : EVP_MD_get0_name(ctx->md)))
842
0
        return 0;
843
844
0
    if (p.nonce != NULL && !OSSL_PARAM_set_uint(p.nonce, ctx->nonce_type))
845
0
        return 0;
846
847
#ifdef FIPS_MODULE
848
    if (p.verify != NULL && !OSSL_PARAM_set_uint(p.verify, ctx->verify_message))
849
        return 0;
850
#endif
851
852
0
    if (!OSSL_FIPS_IND_GET_CTX_FROM_PARAM_CONDITIONAL(ctx, p.ind,
853
0
            ctx->verify_message))
854
0
        return 0;
855
0
    return 1;
856
0
}
857
858
static const OSSL_PARAM *ecdsa_gettable_ctx_params(ossl_unused void *vctx,
859
    ossl_unused void *provctx)
860
0
{
861
0
    return ecdsa_get_ctx_params_list;
862
0
}
863
864
struct ecdsa_all_set_ctx_params_st {
865
    OSSL_PARAM *digest; /* ecdsa_set_ctx_params */
866
    OSSL_PARAM *propq; /* ecdsa_set_ctx_params */
867
    OSSL_PARAM *size; /* ecdsa_set_ctx_params */
868
#ifdef FIPS_MODULE
869
    OSSL_PARAM *ind_d;
870
    OSSL_PARAM *ind_k;
871
#endif
872
#if !defined(OPENSSL_NO_ACVP_TESTS)
873
    OSSL_PARAM *kat;
874
#endif
875
    OSSL_PARAM *nonce;
876
    OSSL_PARAM *sig; /* ecdsa_sigalg_set_ctx_params */
877
};
878
879
/**
880
 * @brief Set up common params for ecdsa_set_ctx_params and
881
 * ecdsa_sigalg_set_ctx_params. The caller is responsible for checking |vctx| is
882
 * not NULL and |params| is not empty.
883
 */
884
static int ecdsa_common_set_ctx_params(PROV_ECDSA_CTX *ctx,
885
    const struct ecdsa_all_set_ctx_params_st *p)
886
15.7k
{
887
15.7k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0,
888
15.7k
            p->ind_k))
889
0
        return 0;
890
15.7k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1,
891
15.7k
            p->ind_d))
892
0
        return 0;
893
894
#if !defined(OPENSSL_NO_ACVP_TESTS)
895
    if (p->kat != NULL && !OSSL_PARAM_get_uint(p->kat, &ctx->kattest))
896
        return 0;
897
#endif
898
899
15.7k
    if (p->nonce != NULL && !OSSL_PARAM_get_uint(p->nonce, &ctx->nonce_type))
900
0
        return 0;
901
15.7k
    return 1;
902
15.7k
}
903
904
#define ecdsa_set_ctx_params_st ecdsa_all_set_ctx_params_st
905
906
/* clang-format off */
907
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
908
#ifndef ecdsa_set_ctx_params_list
909
static ossl_unused const OSSL_PARAM ecdsa_set_ctx_params_list[] = {
910
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
911
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
912
    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
913
# if !defined(OPENSSL_NO_ACVP_TESTS)
914
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_KAT, NULL),
915
# endif
916
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
917
# if defined(FIPS_MODULE)
918
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
919
# endif
920
# if defined(FIPS_MODULE)
921
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
922
# endif
923
    OSSL_PARAM_END
924
};
925
#endif
926
927
#ifndef ecdsa_set_ctx_params_st
928
struct ecdsa_set_ctx_params_st {
929
    OSSL_PARAM *digest;
930
# if defined(FIPS_MODULE)
931
    OSSL_PARAM *ind_d;
932
# endif
933
# if defined(FIPS_MODULE)
934
    OSSL_PARAM *ind_k;
935
# endif
936
# if !defined(OPENSSL_NO_ACVP_TESTS)
937
    OSSL_PARAM *kat;
938
# endif
939
    OSSL_PARAM *nonce;
940
    OSSL_PARAM *propq;
941
    OSSL_PARAM *size;
942
};
943
#endif
944
945
#ifndef ecdsa_set_ctx_params_decoder
946
static ossl_unused int ecdsa_set_ctx_params_decoder
947
    (const OSSL_PARAM *p, struct ecdsa_set_ctx_params_st *r)
948
13.8k
{
949
13.8k
    const char *s;
950
951
13.8k
    memset(r, 0, sizeof(*r));
952
13.8k
    if (p != NULL)
953
5.75k
        for (; (s = p->key) != NULL; p++)
954
3.40k
            switch(s[0]) {
955
1.04k
            default:
956
1.04k
                break;
957
2.35k
            case 'd':
958
2.35k
                switch(s[1]) {
959
0
                default:
960
0
                    break;
961
2.35k
                case 'i':
962
2.35k
                    switch(s[2]) {
963
0
                    default:
964
0
                        break;
965
2.35k
                    case 'g':
966
2.35k
                        switch(s[3]) {
967
0
                        default:
968
0
                            break;
969
2.35k
                        case 'e':
970
2.35k
                            switch(s[4]) {
971
0
                            default:
972
0
                                break;
973
2.35k
                            case 's':
974
2.35k
                                switch(s[5]) {
975
0
                                default:
976
0
                                    break;
977
2.35k
                                case 't':
978
2.35k
                                    switch(s[6]) {
979
0
                                    default:
980
0
                                        break;
981
0
                                    case '-':
982
0
                                        switch(s[7]) {
983
0
                                        default:
984
0
                                            break;
985
0
                                        case 'c':
986
# if defined(FIPS_MODULE)
987
                                            if (ossl_likely(strcmp("heck", s + 8) == 0)) {
988
                                                /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
989
                                                if (ossl_unlikely(r->ind_d != NULL)) {
990
                                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
991
                                                                   "param %s is repeated", s);
992
                                                    return 0;
993
                                                }
994
                                                r->ind_d = (OSSL_PARAM *)p;
995
                                            }
996
# endif
997
0
                                            break;
998
0
                                        case 's':
999
0
                                            if (ossl_likely(strcmp("ize", s + 8) == 0)) {
1000
                                                /* OSSL_SIGNATURE_PARAM_DIGEST_SIZE */
1001
0
                                                if (ossl_unlikely(r->size != NULL)) {
1002
0
                                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1003
0
                                                                   "param %s is repeated", s);
1004
0
                                                    return 0;
1005
0
                                                }
1006
0
                                                r->size = (OSSL_PARAM *)p;
1007
0
                                            }
1008
0
                                        }
1009
0
                                        break;
1010
2.35k
                                    case '\0':
1011
2.35k
                                        if (ossl_unlikely(r->digest != NULL)) {
1012
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1013
0
                                                           "param %s is repeated", s);
1014
0
                                            return 0;
1015
0
                                        }
1016
2.35k
                                        r->digest = (OSSL_PARAM *)p;
1017
2.35k
                                    }
1018
2.35k
                                }
1019
2.35k
                            }
1020
2.35k
                        }
1021
2.35k
                    }
1022
2.35k
                }
1023
2.35k
                break;
1024
2.35k
            case 'k':
1025
0
                switch(s[1]) {
1026
0
                default:
1027
0
                    break;
1028
0
                case 'a':
1029
# if !defined(OPENSSL_NO_ACVP_TESTS)
1030
                    if (ossl_likely(strcmp("t", s + 2) == 0)) {
1031
                        /* OSSL_SIGNATURE_PARAM_KAT */
1032
                        if (ossl_unlikely(r->kat != NULL)) {
1033
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1034
                                           "param %s is repeated", s);
1035
                            return 0;
1036
                        }
1037
                        r->kat = (OSSL_PARAM *)p;
1038
                    }
1039
# endif
1040
0
                    break;
1041
0
                case 'e':
1042
# if defined(FIPS_MODULE)
1043
                    if (ossl_likely(strcmp("y-check", s + 2) == 0)) {
1044
                        /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1045
                        if (ossl_unlikely(r->ind_k != NULL)) {
1046
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1047
                                           "param %s is repeated", s);
1048
                            return 0;
1049
                        }
1050
                        r->ind_k = (OSSL_PARAM *)p;
1051
                    }
1052
# endif
1053
0
                    break;
1054
0
                }
1055
0
                break;
1056
0
            case 'n':
1057
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
1058
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
1059
0
                    if (ossl_unlikely(r->nonce != NULL)) {
1060
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1061
0
                                       "param %s is repeated", s);
1062
0
                        return 0;
1063
0
                    }
1064
0
                    r->nonce = (OSSL_PARAM *)p;
1065
0
                }
1066
0
                break;
1067
0
            case 'p':
1068
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
1069
                    /* OSSL_SIGNATURE_PARAM_PROPERTIES */
1070
0
                    if (ossl_unlikely(r->propq != NULL)) {
1071
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1072
0
                                       "param %s is repeated", s);
1073
0
                        return 0;
1074
0
                    }
1075
0
                    r->propq = (OSSL_PARAM *)p;
1076
0
                }
1077
3.40k
            }
1078
13.8k
    return 1;
1079
13.8k
}
1080
#endif
1081
/* End of machine generated */
1082
/* clang-format on */
1083
1084
static int ecdsa_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1085
13.8k
{
1086
13.8k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1087
13.8k
    struct ecdsa_all_set_ctx_params_st p;
1088
13.8k
    size_t mdsize = 0;
1089
13.8k
    int ret;
1090
1091
13.8k
    if (ctx == NULL || !ecdsa_set_ctx_params_decoder(params, &p))
1092
0
        return 0;
1093
1094
13.8k
    if ((ret = ecdsa_common_set_ctx_params(ctx, &p)) <= 0)
1095
0
        return ret;
1096
1097
13.8k
    if (p.digest != NULL) {
1098
2.35k
        char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = mdname;
1099
2.35k
        char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = mdprops;
1100
1101
2.35k
        if (!OSSL_PARAM_get_utf8_string(p.digest, &pmdname, sizeof(mdname)))
1102
0
            return 0;
1103
2.35k
        if (p.propq != NULL
1104
0
            && !OSSL_PARAM_get_utf8_string(p.propq, &pmdprops, sizeof(mdprops)))
1105
0
            return 0;
1106
2.35k
        if (!ecdsa_setup_md(ctx, mdname, mdprops, "ECDSA Set Ctx"))
1107
1
            return 0;
1108
2.35k
    }
1109
1110
13.8k
    if (p.size != NULL) {
1111
0
        if (!OSSL_PARAM_get_size_t(p.size, &mdsize)
1112
0
            || (!ctx->flag_allow_md && mdsize != ctx->mdsize))
1113
0
            return 0;
1114
0
        ctx->mdsize = mdsize;
1115
0
    }
1116
13.8k
    return 1;
1117
13.8k
}
1118
1119
static const OSSL_PARAM *ecdsa_settable_ctx_params(void *vctx,
1120
    ossl_unused void *provctx)
1121
9
{
1122
9
    return ecdsa_set_ctx_params_list;
1123
9
}
1124
1125
static int ecdsa_get_ctx_md_params(void *vctx, OSSL_PARAM *params)
1126
0
{
1127
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1128
1129
0
    if (ctx->mdctx == NULL)
1130
0
        return 0;
1131
1132
0
    return EVP_MD_CTX_get_params(ctx->mdctx, params);
1133
0
}
1134
1135
static const OSSL_PARAM *ecdsa_gettable_ctx_md_params(void *vctx)
1136
0
{
1137
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1138
1139
0
    if (ctx->md == NULL)
1140
0
        return 0;
1141
1142
0
    return EVP_MD_gettable_ctx_params(ctx->md);
1143
0
}
1144
1145
static int ecdsa_set_ctx_md_params(void *vctx, const OSSL_PARAM params[])
1146
0
{
1147
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1148
1149
0
    if (ctx->mdctx == NULL)
1150
0
        return 0;
1151
1152
0
    return EVP_MD_CTX_set_params(ctx->mdctx, params);
1153
0
}
1154
1155
static const OSSL_PARAM *ecdsa_settable_ctx_md_params(void *vctx)
1156
0
{
1157
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1158
1159
0
    if (ctx->md == NULL)
1160
0
        return 0;
1161
1162
0
    return EVP_MD_settable_ctx_params(ctx->md);
1163
0
}
1164
1165
const OSSL_DISPATCH ossl_ecdsa_signature_functions[] = {
1166
    { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ecdsa_newctx },
1167
    { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))ecdsa_sign_init },
1168
    { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ecdsa_sign },
1169
    { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))ecdsa_verify_init },
1170
    { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))ecdsa_verify },
1171
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
1172
        (void (*)(void))ecdsa_digest_sign_init },
1173
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
1174
        (void (*)(void))ecdsa_digest_signverify_update },
1175
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
1176
        (void (*)(void))ecdsa_digest_sign_final },
1177
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
1178
        (void (*)(void))ecdsa_digest_verify_init },
1179
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
1180
        (void (*)(void))ecdsa_digest_signverify_update },
1181
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
1182
        (void (*)(void))ecdsa_digest_verify_final },
1183
    { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ecdsa_freectx },
1184
    { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ecdsa_dupctx },
1185
    { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))ecdsa_get_ctx_params },
1186
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
1187
        (void (*)(void))ecdsa_gettable_ctx_params },
1188
    { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))ecdsa_set_ctx_params },
1189
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
1190
        (void (*)(void))ecdsa_settable_ctx_params },
1191
    { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
1192
        (void (*)(void))ecdsa_get_ctx_md_params },
1193
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
1194
        (void (*)(void))ecdsa_gettable_ctx_md_params },
1195
    { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
1196
        (void (*)(void))ecdsa_set_ctx_md_params },
1197
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
1198
        (void (*)(void))ecdsa_settable_ctx_md_params },
1199
    OSSL_DISPATCH_END
1200
};
1201
1202
/* ------------------------------------------------------------------ */
1203
1204
/*
1205
 * So called sigalgs (composite ECDSA+hash) implemented below.  They
1206
 * are pretty much hard coded.
1207
 */
1208
1209
static OSSL_FUNC_signature_query_key_types_fn ecdsa_sigalg_query_key_types;
1210
static OSSL_FUNC_signature_settable_ctx_params_fn ecdsa_sigalg_settable_ctx_params;
1211
static OSSL_FUNC_signature_set_ctx_params_fn ecdsa_sigalg_set_ctx_params;
1212
1213
/*
1214
 * ecdsa_sigalg_signverify_init() is almost like ecdsa_digest_signverify_init(),
1215
 * just doesn't allow fetching an MD from whatever the user chooses.
1216
 */
1217
static int ecdsa_sigalg_signverify_init(void *vctx, void *vec,
1218
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
1219
    const OSSL_PARAM params[],
1220
    const char *mdname,
1221
    int operation, const char *desc)
1222
0
{
1223
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1224
1225
0
    if (!ossl_prov_is_running())
1226
0
        return 0;
1227
1228
0
    if (!ecdsa_signverify_init(vctx, vec, set_ctx_params, params, operation,
1229
0
            desc))
1230
0
        return 0;
1231
1232
0
    if (!ecdsa_setup_md(ctx, mdname, NULL, desc))
1233
0
        return 0;
1234
1235
0
    ctx->flag_sigalg = 1;
1236
0
    ctx->flag_allow_md = 0;
1237
1238
0
    if (ctx->mdctx == NULL) {
1239
0
        ctx->mdctx = EVP_MD_CTX_new();
1240
0
        if (ctx->mdctx == NULL)
1241
0
            goto error;
1242
0
    }
1243
1244
0
    if (!EVP_DigestInit_ex2(ctx->mdctx, ctx->md, params))
1245
0
        goto error;
1246
1247
0
    return 1;
1248
1249
0
error:
1250
0
    EVP_MD_CTX_free(ctx->mdctx);
1251
0
    ctx->mdctx = NULL;
1252
0
    return 0;
1253
0
}
1254
1255
static const char **ecdsa_sigalg_query_key_types(void)
1256
0
{
1257
0
    static const char *keytypes[] = { "EC", NULL };
1258
1259
0
    return keytypes;
1260
0
}
1261
1262
#define ecdsa_sigalg_set_ctx_params_st ecdsa_all_set_ctx_params_st
1263
1264
/* clang-format off */
1265
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1266
#ifndef ecdsa_sigalg_set_ctx_params_list
1267
static ossl_unused const OSSL_PARAM ecdsa_sigalg_set_ctx_params_list[] = {
1268
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
1269
# if !defined(OPENSSL_NO_ACVP_TESTS)
1270
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_KAT, NULL),
1271
# endif
1272
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
1273
# if defined(FIPS_MODULE)
1274
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
1275
# endif
1276
# if defined(FIPS_MODULE)
1277
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
1278
# endif
1279
    OSSL_PARAM_END
1280
};
1281
#endif
1282
1283
#ifndef ecdsa_sigalg_set_ctx_params_st
1284
struct ecdsa_sigalg_set_ctx_params_st {
1285
# if defined(FIPS_MODULE)
1286
    OSSL_PARAM *ind_d;
1287
# endif
1288
# if defined(FIPS_MODULE)
1289
    OSSL_PARAM *ind_k;
1290
# endif
1291
# if !defined(OPENSSL_NO_ACVP_TESTS)
1292
    OSSL_PARAM *kat;
1293
# endif
1294
    OSSL_PARAM *nonce;
1295
    OSSL_PARAM *sig;
1296
};
1297
#endif
1298
1299
#ifndef ecdsa_sigalg_set_ctx_params_decoder
1300
static ossl_unused int ecdsa_sigalg_set_ctx_params_decoder
1301
    (const OSSL_PARAM *p, struct ecdsa_sigalg_set_ctx_params_st *r)
1302
1.44k
{
1303
1.44k
    const char *s;
1304
1305
1.44k
    memset(r, 0, sizeof(*r));
1306
1.44k
    if (p != NULL)
1307
2.88k
        for (; (s = p->key) != NULL; p++)
1308
1.44k
            switch(s[0]) {
1309
0
            default:
1310
0
                break;
1311
0
            case 'd':
1312
# if defined(FIPS_MODULE)
1313
                if (ossl_likely(strcmp("igest-check", s + 1) == 0)) {
1314
                    /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
1315
                    if (ossl_unlikely(r->ind_d != NULL)) {
1316
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1317
                                       "param %s is repeated", s);
1318
                        return 0;
1319
                    }
1320
                    r->ind_d = (OSSL_PARAM *)p;
1321
                }
1322
# endif
1323
0
                break;
1324
0
            case 'k':
1325
0
                switch(s[1]) {
1326
0
                default:
1327
0
                    break;
1328
0
                case 'a':
1329
# if !defined(OPENSSL_NO_ACVP_TESTS)
1330
                    if (ossl_likely(strcmp("t", s + 2) == 0)) {
1331
                        /* OSSL_SIGNATURE_PARAM_KAT */
1332
                        if (ossl_unlikely(r->kat != NULL)) {
1333
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1334
                                           "param %s is repeated", s);
1335
                            return 0;
1336
                        }
1337
                        r->kat = (OSSL_PARAM *)p;
1338
                    }
1339
# endif
1340
0
                    break;
1341
0
                case 'e':
1342
# if defined(FIPS_MODULE)
1343
                    if (ossl_likely(strcmp("y-check", s + 2) == 0)) {
1344
                        /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1345
                        if (ossl_unlikely(r->ind_k != NULL)) {
1346
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1347
                                           "param %s is repeated", s);
1348
                            return 0;
1349
                        }
1350
                        r->ind_k = (OSSL_PARAM *)p;
1351
                    }
1352
# endif
1353
0
                    break;
1354
0
                }
1355
0
                break;
1356
0
            case 'n':
1357
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
1358
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
1359
0
                    if (ossl_unlikely(r->nonce != NULL)) {
1360
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1361
0
                                       "param %s is repeated", s);
1362
0
                        return 0;
1363
0
                    }
1364
0
                    r->nonce = (OSSL_PARAM *)p;
1365
0
                }
1366
0
                break;
1367
1.44k
            case 's':
1368
1.44k
                if (ossl_likely(strcmp("ignature", s + 1) == 0)) {
1369
                    /* OSSL_SIGNATURE_PARAM_SIGNATURE */
1370
1.44k
                    if (ossl_unlikely(r->sig != NULL)) {
1371
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1372
0
                                       "param %s is repeated", s);
1373
0
                        return 0;
1374
0
                    }
1375
1.44k
                    r->sig = (OSSL_PARAM *)p;
1376
1.44k
                }
1377
1.44k
            }
1378
1.44k
    return 1;
1379
1.44k
}
1380
#endif
1381
/* End of machine generated */
1382
/* clang-format on */
1383
1384
static const OSSL_PARAM *ecdsa_sigalg_settable_ctx_params(void *vctx,
1385
    ossl_unused void *provctx)
1386
8
{
1387
8
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1388
1389
8
    if (ctx != NULL && ctx->operation == EVP_PKEY_OP_VERIFYMSG)
1390
0
        return ecdsa_sigalg_set_ctx_params_list;
1391
8
    return NULL;
1392
8
}
1393
1394
static int ecdsa_sigalg_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1395
1.44k
{
1396
1.44k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1397
1.44k
    struct ecdsa_all_set_ctx_params_st p;
1398
1.44k
    int ret;
1399
1400
1.44k
    if (ctx == NULL || !ecdsa_sigalg_set_ctx_params_decoder(params, &p))
1401
0
        return 0;
1402
1403
1.44k
    if ((ret = ecdsa_common_set_ctx_params(ctx, &p)) <= 0)
1404
0
        return ret;
1405
1406
1.44k
    if (ctx->operation == EVP_PKEY_OP_VERIFYMSG) {
1407
1.44k
        if (p.sig != NULL) {
1408
1.44k
            OPENSSL_free(ctx->sig);
1409
1.44k
            ctx->sig = NULL;
1410
1.44k
            ctx->siglen = 0;
1411
1.44k
            if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&ctx->sig,
1412
1.44k
                    0, &ctx->siglen))
1413
0
                return 0;
1414
            /* The signature must not be empty */
1415
1.44k
            if (ctx->siglen == 0) {
1416
3
                OPENSSL_free(ctx->sig);
1417
3
                ctx->sig = NULL;
1418
3
                return 0;
1419
3
            }
1420
1.44k
        }
1421
1.44k
    }
1422
1.43k
    return 1;
1423
1.44k
}
1424
1425
#define IMPL_ECDSA_SIGALG(md, MD)                                       \
1426
    static OSSL_FUNC_signature_sign_init_fn ecdsa_##md##_sign_init;     \
1427
    static OSSL_FUNC_signature_sign_message_init_fn                     \
1428
        ecdsa_##md##_sign_message_init;                                 \
1429
    static OSSL_FUNC_signature_verify_init_fn ecdsa_##md##_verify_init; \
1430
    static OSSL_FUNC_signature_verify_message_init_fn                   \
1431
        ecdsa_##md##_verify_message_init;                               \
1432
                                                                        \
1433
    static int                                                          \
1434
    ecdsa_##md##_sign_init(void *vctx, void *vec,                       \
1435
        const OSSL_PARAM params[])                                      \
1436
0
    {                                                                   \
1437
0
        static const char desc[] = "ECDSA-" MD " Sign Init";            \
1438
0
                                                                        \
1439
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1440
0
            ecdsa_sigalg_set_ctx_params,                                \
1441
0
            params, MD,                                                 \
1442
0
            EVP_PKEY_OP_SIGN,                                           \
1443
0
            desc);                                                      \
1444
0
    }                                                                   \
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha1_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha224_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha256_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha384_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha512_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_224_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_256_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_384_sign_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_512_sign_init
1445
                                                                        \
1446
    static int                                                          \
1447
    ecdsa_##md##_sign_message_init(void *vctx, void *vec,               \
1448
        const OSSL_PARAM params[])                                      \
1449
0
    {                                                                   \
1450
0
        static const char desc[] = "ECDSA-" MD " Sign Message Init";    \
1451
0
                                                                        \
1452
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1453
0
            ecdsa_sigalg_set_ctx_params,                                \
1454
0
            params, MD,                                                 \
1455
0
            EVP_PKEY_OP_SIGNMSG,                                        \
1456
0
            desc);                                                      \
1457
0
    }                                                                   \
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha1_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha224_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha256_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha384_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha512_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_224_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_256_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_384_sign_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_512_sign_message_init
1458
                                                                        \
1459
    static int                                                          \
1460
    ecdsa_##md##_verify_init(void *vctx, void *vec,                     \
1461
        const OSSL_PARAM params[])                                      \
1462
0
    {                                                                   \
1463
0
        static const char desc[] = "ECDSA-" MD " Verify Init";          \
1464
0
                                                                        \
1465
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1466
0
            ecdsa_sigalg_set_ctx_params,                                \
1467
0
            params, MD,                                                 \
1468
0
            EVP_PKEY_OP_VERIFY,                                         \
1469
0
            desc);                                                      \
1470
0
    }                                                                   \
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha1_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha224_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha256_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha384_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha512_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_224_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_256_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_384_verify_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_512_verify_init
1471
                                                                        \
1472
    static int                                                          \
1473
    ecdsa_##md##_verify_message_init(void *vctx, void *vec,             \
1474
        const OSSL_PARAM params[])                                      \
1475
0
    {                                                                   \
1476
0
        static const char desc[] = "ECDSA-" MD " Verify Message Init";  \
1477
0
                                                                        \
1478
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1479
0
            ecdsa_sigalg_set_ctx_params,                                \
1480
0
            params, MD,                                                 \
1481
0
            EVP_PKEY_OP_VERIFYMSG,                                      \
1482
0
            desc);                                                      \
1483
0
    }                                                                   \
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha1_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha224_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha256_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha384_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha512_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_224_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_256_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_384_verify_message_init
Unexecuted instantiation: ecdsa_sig.c:ecdsa_sha3_512_verify_message_init
1484
                                                                        \
1485
    const OSSL_DISPATCH ossl_ecdsa_##md##_signature_functions[] = {     \
1486
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ecdsa_newctx },   \
1487
        { OSSL_FUNC_SIGNATURE_SIGN_INIT,                                \
1488
            (void (*)(void))ecdsa_##md##_sign_init },                   \
1489
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ecdsa_sign },       \
1490
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                        \
1491
            (void (*)(void))ecdsa_##md##_sign_message_init },           \
1492
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                      \
1493
            (void (*)(void))ecdsa_signverify_message_update },          \
1494
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                       \
1495
            (void (*)(void))ecdsa_sign_message_final },                 \
1496
        { OSSL_FUNC_SIGNATURE_VERIFY_INIT,                              \
1497
            (void (*)(void))ecdsa_##md##_verify_init },                 \
1498
        { OSSL_FUNC_SIGNATURE_VERIFY,                                   \
1499
            (void (*)(void))ecdsa_verify },                             \
1500
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                      \
1501
            (void (*)(void))ecdsa_##md##_verify_message_init },         \
1502
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                    \
1503
            (void (*)(void))ecdsa_signverify_message_update },          \
1504
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                     \
1505
            (void (*)(void))ecdsa_verify_message_final },               \
1506
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ecdsa_freectx }, \
1507
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ecdsa_dupctx },   \
1508
        { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES,                          \
1509
            (void (*)(void))ecdsa_sigalg_query_key_types },             \
1510
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                           \
1511
            (void (*)(void))ecdsa_get_ctx_params },                     \
1512
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                      \
1513
            (void (*)(void))ecdsa_gettable_ctx_params },                \
1514
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                           \
1515
            (void (*)(void))ecdsa_sigalg_set_ctx_params },              \
1516
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                      \
1517
            (void (*)(void))ecdsa_sigalg_settable_ctx_params },         \
1518
        OSSL_DISPATCH_END                                               \
1519
    }
1520
1521
IMPL_ECDSA_SIGALG(sha1, "SHA1");
1522
IMPL_ECDSA_SIGALG(sha224, "SHA2-224");
1523
IMPL_ECDSA_SIGALG(sha256, "SHA2-256");
1524
IMPL_ECDSA_SIGALG(sha384, "SHA2-384");
1525
IMPL_ECDSA_SIGALG(sha512, "SHA2-512");
1526
IMPL_ECDSA_SIGALG(sha3_224, "SHA3-224");
1527
IMPL_ECDSA_SIGALG(sha3_256, "SHA3-256");
1528
IMPL_ECDSA_SIGALG(sha3_384, "SHA3-384");
1529
IMPL_ECDSA_SIGALG(sha3_512, "SHA3-512");