Coverage Report

Created: 2025-12-31 06:58

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/signature/ecdsa_sig.c
Line
Count
Source
1
/*
2
 * Copyright 2020-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
 * 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
19.9k
{
147
19.9k
    PROV_ECDSA_CTX *ctx;
148
149
19.9k
    if (!ossl_prov_is_running())
150
0
        return NULL;
151
152
19.9k
    ctx = OPENSSL_zalloc(sizeof(PROV_ECDSA_CTX));
153
19.9k
    if (ctx == NULL)
154
0
        return NULL;
155
156
19.9k
    OSSL_FIPS_IND_INIT(ctx)
157
19.9k
    ctx->flag_allow_md = 1;
158
#ifdef FIPS_MODULE
159
    ctx->verify_message = 1;
160
#endif
161
19.9k
    ctx->libctx = PROV_LIBCTX_OF(provctx);
162
19.9k
    if (propq != NULL && (ctx->propq = OPENSSL_strdup(propq)) == NULL) {
163
0
        OPENSSL_free(ctx);
164
0
        ctx = NULL;
165
0
    }
166
19.9k
    return ctx;
167
19.9k
}
168
169
static int ecdsa_setup_md(PROV_ECDSA_CTX *ctx,
170
    const char *mdname, const char *mdprops,
171
    const char *desc)
172
13.4k
{
173
13.4k
    EVP_MD *md = NULL;
174
13.4k
    size_t mdname_len;
175
13.4k
    int md_nid, md_size;
176
13.4k
    WPACKET pkt;
177
13.4k
    unsigned char *aid = NULL;
178
179
13.4k
    if (mdname == NULL)
180
0
        return 1;
181
182
13.4k
    mdname_len = strlen(mdname);
183
13.4k
    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
13.4k
    if (mdprops == NULL)
189
13.4k
        mdprops = ctx->propq;
190
13.4k
    md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
191
13.4k
    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
13.4k
    md_size = EVP_MD_get_size(md);
197
13.4k
    if (md_size <= 0) {
198
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
199
0
            "%s has invalid md size %d", mdname, md_size);
200
0
        goto err;
201
0
    }
202
13.4k
    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
13.4k
    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
13.4k
    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
13.4k
    EVP_MD_CTX_free(ctx->mdctx);
243
13.4k
    EVP_MD_free(ctx->md);
244
245
13.4k
    ctx->aid_len = 0;
246
13.4k
#ifndef FIPS_MODULE
247
13.4k
    if (md_nid != NID_undef) {
248
#else
249
    {
250
#endif
251
13.4k
        if (WPACKET_init_der(&pkt, ctx->aid_buf, sizeof(ctx->aid_buf))
252
13.4k
            && ossl_DER_w_algorithmIdentifier_ECDSA_with_MD(&pkt, -1, ctx->ec,
253
13.4k
                md_nid)
254
13.4k
            && WPACKET_finish(&pkt)) {
255
13.4k
            WPACKET_get_total_written(&pkt, &ctx->aid_len);
256
13.4k
            aid = WPACKET_get_curr(&pkt);
257
13.4k
        }
258
13.4k
        WPACKET_cleanup(&pkt);
259
13.4k
        if (aid != NULL && ctx->aid_len != 0)
260
13.4k
            memmove(ctx->aid_buf, aid, ctx->aid_len);
261
13.4k
    }
262
263
13.4k
    ctx->mdctx = NULL;
264
13.4k
    ctx->md = md;
265
13.4k
    ctx->mdsize = (size_t)md_size;
266
13.4k
    OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
267
268
13.4k
    return 1;
269
0
err:
270
0
    EVP_MD_free(md);
271
0
    return 0;
272
13.4k
}
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
13.4k
{
280
13.4k
    if (!ossl_prov_is_running()
281
13.4k
        || ctx == NULL)
282
0
        return 0;
283
284
13.4k
    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
13.4k
    if (ec != NULL) {
290
13.4k
        if (!EC_KEY_up_ref(ec))
291
0
            return 0;
292
13.4k
        EC_KEY_free(ctx->ec);
293
13.4k
        ctx->ec = ec;
294
13.4k
    }
295
296
13.4k
    ctx->operation = operation;
297
298
13.4k
    OSSL_FIPS_IND_SET_APPROVED(ctx)
299
13.4k
    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
13.4k
    return 1;
309
13.4k
}
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
9.22k
{
330
9.22k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
331
9.22k
    int ret;
332
9.22k
    unsigned int sltmp;
333
9.22k
    size_t ecsize = ECDSA_size(ctx->ec);
334
335
9.22k
    if (!ossl_prov_is_running())
336
0
        return 0;
337
338
9.22k
    if (sig == NULL) {
339
4.61k
        *siglen = ecsize;
340
4.61k
        return 1;
341
4.61k
    }
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
4.61k
    if (sigsize < (size_t)ecsize)
349
0
        return 0;
350
351
4.61k
    if (ctx->mdsize != 0 && tbslen != ctx->mdsize)
352
0
        return 0;
353
354
4.61k
    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
4.61k
    } else {
364
4.61k
        ret = ECDSA_sign_ex(0, tbs, (int)tbslen, sig, &sltmp,
365
4.61k
            ctx->kinv, ctx->r, ctx->ec);
366
4.61k
    }
367
4.61k
    if (ret <= 0)
368
0
        return 0;
369
370
4.61k
    *siglen = sltmp;
371
4.61k
    return 1;
372
4.61k
}
373
374
static int ecdsa_signverify_message_update(void *vctx,
375
    const unsigned char *data,
376
    size_t datalen)
377
6.35k
{
378
6.35k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
379
380
6.35k
    if (ctx == NULL)
381
0
        return 0;
382
383
6.35k
    return EVP_DigestUpdate(ctx->mdctx, data, datalen);
384
6.35k
}
385
386
static int ecdsa_sign_message_final(void *vctx, unsigned char *sig,
387
    size_t *siglen, size_t sigsize)
388
9.22k
{
389
9.22k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
390
9.22k
    unsigned char digest[EVP_MAX_MD_SIZE];
391
9.22k
    unsigned int dlen = 0;
392
393
9.22k
    if (!ossl_prov_is_running() || ctx == NULL)
394
0
        return 0;
395
9.22k
    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
9.22k
    if (sig != NULL
402
4.61k
        && !EVP_DigestFinal_ex(ctx->mdctx, digest, &dlen))
403
0
        return 0;
404
9.22k
    return ecdsa_sign_directly(vctx, sig, siglen, sigsize, digest, dlen);
405
9.22k
}
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
{
414
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
415
416
    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
        if (sig == NULL)
422
            return ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
423
424
        if (ecdsa_signverify_message_update(ctx, tbs, tbslen) <= 0)
425
            return 0;
426
        return ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
427
    }
428
    return ecdsa_sign_directly(ctx, sig, siglen, sigsize, tbs, tbslen);
429
}
430
431
static int ecdsa_verify_init(void *vctx, void *ec, const OSSL_PARAM params[])
432
0
{
433
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
434
435
#ifdef FIPS_MODULE
436
    ctx->verify_message = 0;
437
#endif
438
0
    return ecdsa_signverify_init(ctx, ec, ecdsa_set_ctx_params, params,
439
0
        EVP_PKEY_OP_VERIFY, "ECDSA Verify Init");
440
0
}
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
1.73k
{
446
1.73k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
447
448
1.73k
    if (!ossl_prov_is_running() || (ctx->mdsize != 0 && tbslen != ctx->mdsize))
449
0
        return 0;
450
451
1.73k
    return ECDSA_verify(0, tbs, (int)tbslen, sig, (int)siglen, ctx->ec);
452
1.73k
}
453
454
static int ecdsa_verify_set_sig(void *vctx,
455
    const unsigned char *sig, size_t siglen)
456
1.74k
{
457
1.74k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
458
1.74k
    OSSL_PARAM params[2];
459
460
1.74k
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
461
1.74k
        (unsigned char *)sig, siglen);
462
1.74k
    params[1] = OSSL_PARAM_construct_end();
463
1.74k
    return ecdsa_sigalg_set_ctx_params(ctx, params);
464
1.74k
}
465
466
static int ecdsa_verify_message_final(void *vctx)
467
1.73k
{
468
1.73k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
469
1.73k
    unsigned char digest[EVP_MAX_MD_SIZE];
470
1.73k
    unsigned int dlen = 0;
471
472
1.73k
    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
1.73k
    if (!EVP_DigestFinal_ex(ctx->mdctx, digest, &dlen))
480
0
        return 0;
481
482
1.73k
    return ecdsa_verify_directly(vctx, ctx->sig, ctx->siglen,
483
1.73k
        digest, dlen);
484
1.73k
}
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
0
{
494
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
495
496
0
    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
0
    return ecdsa_verify_directly(ctx, sig, siglen, tbs, tbslen);
504
0
}
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
13.4k
{
512
13.4k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
513
514
13.4k
    if (!ossl_prov_is_running())
515
0
        return 0;
516
517
#ifdef FIPS_MODULE
518
    ctx->verify_message = 1;
519
#endif
520
13.4k
    if (!ecdsa_signverify_init(vctx, ec, ecdsa_set_ctx_params, params,
521
13.4k
            operation, desc))
522
0
        return 0;
523
524
13.4k
    if (mdname != NULL
525
        /* was ecdsa_setup_md already called in ecdsa_signverify_init()? */
526
13.4k
        && (mdname[0] == '\0' || OPENSSL_strcasecmp(ctx->mdname, mdname) != 0)
527
13.4k
        && !ecdsa_setup_md(ctx, mdname, NULL, desc))
528
0
        return 0;
529
530
13.4k
    ctx->flag_allow_md = 0;
531
532
13.4k
    if (ctx->mdctx == NULL) {
533
13.4k
        ctx->mdctx = EVP_MD_CTX_new();
534
13.4k
        if (ctx->mdctx == NULL)
535
0
            goto error;
536
13.4k
    }
537
538
13.4k
    if (!EVP_DigestInit_ex2(ctx->mdctx, ctx->md, params))
539
0
        goto error;
540
13.4k
    return 1;
541
0
error:
542
0
    EVP_MD_CTX_free(ctx->mdctx);
543
0
    ctx->mdctx = NULL;
544
0
    return 0;
545
13.4k
}
546
547
static int ecdsa_digest_sign_init(void *vctx, const char *mdname, void *ec,
548
    const OSSL_PARAM params[])
549
17.3k
{
550
17.3k
    return ecdsa_digest_signverify_init(vctx, mdname, ec, params,
551
17.3k
        EVP_PKEY_OP_SIGNMSG,
552
17.3k
        "ECDSA Digest Sign Init");
553
17.3k
}
554
555
static int ecdsa_digest_signverify_update(void *vctx, const unsigned char *data,
556
    size_t datalen)
557
6.35k
{
558
6.35k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
559
560
6.35k
    if (ctx == NULL || ctx->mdctx == NULL)
561
0
        return 0;
562
    /* Sigalg implementations shouldn't do digest_sign */
563
6.35k
    if (ctx->flag_sigalg)
564
0
        return 0;
565
566
6.35k
    return ecdsa_signverify_message_update(vctx, data, datalen);
567
6.35k
}
568
569
int ecdsa_digest_sign_final(void *vctx, unsigned char *sig, size_t *siglen,
570
    size_t sigsize)
571
9.22k
{
572
9.22k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
573
9.22k
    int ok = 0;
574
575
9.22k
    if (ctx == NULL)
576
0
        return 0;
577
    /* Sigalg implementations shouldn't do digest_sign */
578
9.22k
    if (ctx->flag_sigalg)
579
0
        return 0;
580
581
9.22k
    ok = ecdsa_sign_message_final(ctx, sig, siglen, sigsize);
582
583
9.22k
    ctx->flag_allow_md = 1;
584
585
9.22k
    return ok;
586
9.22k
}
587
588
static int ecdsa_digest_verify_init(void *vctx, const char *mdname, void *ec,
589
    const OSSL_PARAM params[])
590
2.61k
{
591
2.61k
    return ecdsa_digest_signverify_init(vctx, mdname, ec, params,
592
2.61k
        EVP_PKEY_OP_VERIFYMSG,
593
2.61k
        "ECDSA Digest Verify Init");
594
2.61k
}
595
596
int ecdsa_digest_verify_final(void *vctx, const unsigned char *sig,
597
    size_t siglen)
598
1.74k
{
599
1.74k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
600
1.74k
    int ok = 0;
601
602
1.74k
    if (!ossl_prov_is_running() || ctx == NULL || ctx->mdctx == NULL)
603
0
        return 0;
604
605
    /* Sigalg implementations shouldn't do digest_verify */
606
1.74k
    if (ctx->flag_sigalg)
607
0
        return 0;
608
609
1.74k
    if (ecdsa_verify_set_sig(ctx, sig, siglen))
610
1.73k
        ok = ecdsa_verify_message_final(ctx);
611
612
1.74k
    ctx->flag_allow_md = 1;
613
614
1.74k
    return ok;
615
1.74k
}
616
617
static void ecdsa_freectx(void *vctx)
618
29.3k
{
619
29.3k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
620
621
29.3k
    EVP_MD_CTX_free(ctx->mdctx);
622
29.3k
    EVP_MD_free(ctx->md);
623
29.3k
    OPENSSL_free(ctx->propq);
624
29.3k
    OPENSSL_free(ctx->sig);
625
29.3k
    EC_KEY_free(ctx->ec);
626
29.3k
    BN_clear_free(ctx->kinv);
627
29.3k
    BN_clear_free(ctx->r);
628
29.3k
    OPENSSL_free(ctx);
629
29.3k
}
630
631
static void *ecdsa_dupctx(void *vctx)
632
9.36k
{
633
9.36k
    PROV_ECDSA_CTX *srcctx = (PROV_ECDSA_CTX *)vctx;
634
9.36k
    PROV_ECDSA_CTX *dstctx;
635
636
9.36k
    if (!ossl_prov_is_running())
637
0
        return NULL;
638
639
9.36k
    dstctx = OPENSSL_zalloc(sizeof(*srcctx));
640
9.36k
    if (dstctx == NULL)
641
0
        return NULL;
642
643
9.36k
    *dstctx = *srcctx;
644
9.36k
    dstctx->ec = NULL;
645
9.36k
    dstctx->propq = NULL;
646
647
9.36k
    if (srcctx->ec != NULL && !EC_KEY_up_ref(srcctx->ec))
648
0
        goto err;
649
    /* Test KATS should not need to be supported */
650
9.36k
    if (srcctx->kinv != NULL || srcctx->r != NULL)
651
0
        goto err;
652
9.36k
    dstctx->ec = srcctx->ec;
653
654
9.36k
    if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
655
0
        goto err;
656
9.36k
    dstctx->md = srcctx->md;
657
658
9.36k
    if (srcctx->mdctx != NULL) {
659
9.36k
        dstctx->mdctx = EVP_MD_CTX_new();
660
9.36k
        if (dstctx->mdctx == NULL
661
9.36k
            || !EVP_MD_CTX_copy_ex(dstctx->mdctx, srcctx->mdctx))
662
0
            goto err;
663
9.36k
    }
664
665
9.36k
    if (srcctx->propq != NULL) {
666
0
        dstctx->propq = OPENSSL_strdup(srcctx->propq);
667
0
        if (dstctx->propq == NULL)
668
0
            goto err;
669
0
    }
670
671
9.36k
    return dstctx;
672
0
err:
673
0
    ecdsa_freectx(dstctx);
674
0
    return NULL;
675
9.36k
}
676
677
/* clang-format off */
678
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
679
#ifndef ecdsa_get_ctx_params_list
680
static const OSSL_PARAM ecdsa_get_ctx_params_list[] = {
681
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
682
    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
683
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
684
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
685
# if defined(FIPS_MODULE)
686
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE, NULL),
687
# endif
688
# if defined(FIPS_MODULE)
689
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR, NULL),
690
# endif
691
    OSSL_PARAM_END
692
};
693
#endif
694
695
#ifndef ecdsa_get_ctx_params_st
696
struct ecdsa_get_ctx_params_st {
697
    OSSL_PARAM *algid;
698
    OSSL_PARAM *digest;
699
# if defined(FIPS_MODULE)
700
    OSSL_PARAM *ind;
701
# endif
702
    OSSL_PARAM *nonce;
703
    OSSL_PARAM *size;
704
# if defined(FIPS_MODULE)
705
    OSSL_PARAM *verify;
706
# endif
707
};
708
#endif
709
710
#ifndef ecdsa_get_ctx_params_decoder
711
static int ecdsa_get_ctx_params_decoder
712
    (const OSSL_PARAM *p, struct ecdsa_get_ctx_params_st *r)
713
0
{
714
0
    const char *s;
715
716
0
    memset(r, 0, sizeof(*r));
717
0
    if (p != NULL)
718
0
        for (; (s = p->key) != NULL; p++)
719
0
            switch(s[0]) {
720
0
            default:
721
0
                break;
722
0
            case 'a':
723
0
                if (ossl_likely(strcmp("lgorithm-id", s + 1) == 0)) {
724
                    /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
725
0
                    if (ossl_unlikely(r->algid != NULL)) {
726
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
727
0
                                       "param %s is repeated", s);
728
0
                        return 0;
729
0
                    }
730
0
                    r->algid = (OSSL_PARAM *)p;
731
0
                }
732
0
                break;
733
0
            case 'd':
734
0
                switch(s[1]) {
735
0
                default:
736
0
                    break;
737
0
                case 'i':
738
0
                    switch(s[2]) {
739
0
                    default:
740
0
                        break;
741
0
                    case 'g':
742
0
                        switch(s[3]) {
743
0
                        default:
744
0
                            break;
745
0
                        case 'e':
746
0
                            switch(s[4]) {
747
0
                            default:
748
0
                                break;
749
0
                            case 's':
750
0
                                switch(s[5]) {
751
0
                                default:
752
0
                                    break;
753
0
                                case 't':
754
0
                                    switch(s[6]) {
755
0
                                    default:
756
0
                                        break;
757
0
                                    case '-':
758
0
                                        if (ossl_likely(strcmp("size", s + 7) == 0)) {
759
                                            /* OSSL_SIGNATURE_PARAM_DIGEST_SIZE */
760
0
                                            if (ossl_unlikely(r->size != NULL)) {
761
0
                                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
762
0
                                                               "param %s is repeated", s);
763
0
                                                return 0;
764
0
                                            }
765
0
                                            r->size = (OSSL_PARAM *)p;
766
0
                                        }
767
0
                                        break;
768
0
                                    case '\0':
769
0
                                        if (ossl_unlikely(r->digest != NULL)) {
770
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
771
0
                                                           "param %s is repeated", s);
772
0
                                            return 0;
773
0
                                        }
774
0
                                        r->digest = (OSSL_PARAM *)p;
775
0
                                    }
776
0
                                }
777
0
                            }
778
0
                        }
779
0
                    }
780
0
                }
781
0
                break;
782
0
            case 'f':
783
# if defined(FIPS_MODULE)
784
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
785
                    /* OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR */
786
                    if (ossl_unlikely(r->ind != NULL)) {
787
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
788
                                       "param %s is repeated", s);
789
                        return 0;
790
                    }
791
                    r->ind = (OSSL_PARAM *)p;
792
                }
793
# endif
794
0
                break;
795
0
            case 'n':
796
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
797
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
798
0
                    if (ossl_unlikely(r->nonce != NULL)) {
799
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
800
0
                                       "param %s is repeated", s);
801
0
                        return 0;
802
0
                    }
803
0
                    r->nonce = (OSSL_PARAM *)p;
804
0
                }
805
0
                break;
806
0
            case 'v':
807
# if defined(FIPS_MODULE)
808
                if (ossl_likely(strcmp("erify-message", s + 1) == 0)) {
809
                    /* OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE */
810
                    if (ossl_unlikely(r->verify != NULL)) {
811
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
812
                                       "param %s is repeated", s);
813
                        return 0;
814
                    }
815
                    r->verify = (OSSL_PARAM *)p;
816
                }
817
# endif
818
0
                break;
819
0
            }
820
0
    return 1;
821
0
}
822
#endif
823
/* End of machine generated */
824
/* clang-format on */
825
826
static int ecdsa_get_ctx_params(void *vctx, OSSL_PARAM *params)
827
0
{
828
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
829
0
    struct ecdsa_get_ctx_params_st p;
830
831
0
    if (ctx == NULL || !ecdsa_get_ctx_params_decoder(params, &p))
832
0
        return 0;
833
834
0
    if (p.algid != NULL
835
0
        && !OSSL_PARAM_set_octet_string(p.algid,
836
0
            ctx->aid_len == 0 ? NULL : ctx->aid_buf,
837
0
            ctx->aid_len))
838
0
        return 0;
839
840
0
    if (p.size != NULL && !OSSL_PARAM_set_size_t(p.size, ctx->mdsize))
841
0
        return 0;
842
843
0
    if (p.digest != NULL
844
0
        && !OSSL_PARAM_set_utf8_string(p.digest, ctx->md == NULL ? ctx->mdname : EVP_MD_get0_name(ctx->md)))
845
0
        return 0;
846
847
0
    if (p.nonce != NULL && !OSSL_PARAM_set_uint(p.nonce, ctx->nonce_type))
848
0
        return 0;
849
850
#ifdef FIPS_MODULE
851
    if (p.verify != NULL && !OSSL_PARAM_set_uint(p.verify, ctx->verify_message))
852
        return 0;
853
#endif
854
855
0
    if (!OSSL_FIPS_IND_GET_CTX_FROM_PARAM(ctx, p.ind))
856
0
        return 0;
857
0
    return 1;
858
0
}
859
860
static const OSSL_PARAM *ecdsa_gettable_ctx_params(ossl_unused void *vctx,
861
    ossl_unused void *provctx)
862
0
{
863
0
    return ecdsa_get_ctx_params_list;
864
0
}
865
866
struct ecdsa_all_set_ctx_params_st {
867
    OSSL_PARAM *digest; /* ecdsa_set_ctx_params */
868
    OSSL_PARAM *propq; /* ecdsa_set_ctx_params */
869
    OSSL_PARAM *size; /* ecdsa_set_ctx_params */
870
#ifdef FIPS_MODULE
871
    OSSL_PARAM *ind_d;
872
    OSSL_PARAM *ind_k;
873
#endif
874
#if !defined(OPENSSL_NO_ACVP_TESTS)
875
    OSSL_PARAM *kat;
876
#endif
877
    OSSL_PARAM *nonce;
878
    OSSL_PARAM *sig; /* ecdsa_sigalg_set_ctx_params */
879
};
880
881
/**
882
 * @brief Set up common params for ecdsa_set_ctx_params and
883
 * ecdsa_sigalg_set_ctx_params. The caller is responsible for checking |vctx| is
884
 * not NULL and |params| is not empty.
885
 */
886
static int ecdsa_common_set_ctx_params(PROV_ECDSA_CTX *ctx,
887
    const struct ecdsa_all_set_ctx_params_st *p)
888
8.54k
{
889
8.54k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE0,
890
8.54k
            p->ind_k))
891
0
        return 0;
892
8.54k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(ctx, OSSL_FIPS_IND_SETTABLE1,
893
8.54k
            p->ind_d))
894
0
        return 0;
895
896
#if !defined(OPENSSL_NO_ACVP_TESTS)
897
    if (p->kat != NULL && !OSSL_PARAM_get_uint(p->kat, &ctx->kattest))
898
        return 0;
899
#endif
900
901
8.54k
    if (p->nonce != NULL && !OSSL_PARAM_get_uint(p->nonce, &ctx->nonce_type))
902
0
        return 0;
903
8.54k
    return 1;
904
8.54k
}
905
906
#define ecdsa_set_ctx_params_st ecdsa_all_set_ctx_params_st
907
908
/* clang-format off */
909
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
910
#ifndef ecdsa_set_ctx_params_list
911
static const OSSL_PARAM ecdsa_set_ctx_params_list[] = {
912
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
913
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
914
    OSSL_PARAM_size_t(OSSL_SIGNATURE_PARAM_DIGEST_SIZE, NULL),
915
# if !defined(OPENSSL_NO_ACVP_TESTS)
916
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_KAT, NULL),
917
# endif
918
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
919
# if defined(FIPS_MODULE)
920
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
921
# endif
922
# if defined(FIPS_MODULE)
923
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
924
# endif
925
    OSSL_PARAM_END
926
};
927
#endif
928
929
#ifndef ecdsa_set_ctx_params_st
930
struct ecdsa_set_ctx_params_st {
931
    OSSL_PARAM *digest;
932
# if defined(FIPS_MODULE)
933
    OSSL_PARAM *ind_d;
934
# endif
935
# if defined(FIPS_MODULE)
936
    OSSL_PARAM *ind_k;
937
# endif
938
# if !defined(OPENSSL_NO_ACVP_TESTS)
939
    OSSL_PARAM *kat;
940
# endif
941
    OSSL_PARAM *nonce;
942
    OSSL_PARAM *propq;
943
    OSSL_PARAM *size;
944
};
945
#endif
946
947
#ifndef ecdsa_set_ctx_params_decoder
948
static int ecdsa_set_ctx_params_decoder
949
    (const OSSL_PARAM *p, struct ecdsa_set_ctx_params_st *r)
950
7.11k
{
951
7.11k
    const char *s;
952
953
7.11k
    memset(r, 0, sizeof(*r));
954
7.11k
    if (p != NULL)
955
0
        for (; (s = p->key) != NULL; p++)
956
0
            switch(s[0]) {
957
0
            default:
958
0
                break;
959
0
            case 'd':
960
0
                switch(s[1]) {
961
0
                default:
962
0
                    break;
963
0
                case 'i':
964
0
                    switch(s[2]) {
965
0
                    default:
966
0
                        break;
967
0
                    case 'g':
968
0
                        switch(s[3]) {
969
0
                        default:
970
0
                            break;
971
0
                        case 'e':
972
0
                            switch(s[4]) {
973
0
                            default:
974
0
                                break;
975
0
                            case 's':
976
0
                                switch(s[5]) {
977
0
                                default:
978
0
                                    break;
979
0
                                case 't':
980
0
                                    switch(s[6]) {
981
0
                                    default:
982
0
                                        break;
983
0
                                    case '-':
984
0
                                        switch(s[7]) {
985
0
                                        default:
986
0
                                            break;
987
0
                                        case 'c':
988
# if defined(FIPS_MODULE)
989
                                            if (ossl_likely(strcmp("heck", s + 8) == 0)) {
990
                                                /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
991
                                                if (ossl_unlikely(r->ind_d != NULL)) {
992
                                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
993
                                                                   "param %s is repeated", s);
994
                                                    return 0;
995
                                                }
996
                                                r->ind_d = (OSSL_PARAM *)p;
997
                                            }
998
# endif
999
0
                                            break;
1000
0
                                        case 's':
1001
0
                                            if (ossl_likely(strcmp("ize", s + 8) == 0)) {
1002
                                                /* OSSL_SIGNATURE_PARAM_DIGEST_SIZE */
1003
0
                                                if (ossl_unlikely(r->size != NULL)) {
1004
0
                                                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1005
0
                                                                   "param %s is repeated", s);
1006
0
                                                    return 0;
1007
0
                                                }
1008
0
                                                r->size = (OSSL_PARAM *)p;
1009
0
                                            }
1010
0
                                        }
1011
0
                                        break;
1012
0
                                    case '\0':
1013
0
                                        if (ossl_unlikely(r->digest != NULL)) {
1014
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1015
0
                                                           "param %s is repeated", s);
1016
0
                                            return 0;
1017
0
                                        }
1018
0
                                        r->digest = (OSSL_PARAM *)p;
1019
0
                                    }
1020
0
                                }
1021
0
                            }
1022
0
                        }
1023
0
                    }
1024
0
                }
1025
0
                break;
1026
0
            case 'k':
1027
0
                switch(s[1]) {
1028
0
                default:
1029
0
                    break;
1030
0
                case 'a':
1031
# if !defined(OPENSSL_NO_ACVP_TESTS)
1032
                    if (ossl_likely(strcmp("t", s + 2) == 0)) {
1033
                        /* OSSL_SIGNATURE_PARAM_KAT */
1034
                        if (ossl_unlikely(r->kat != NULL)) {
1035
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1036
                                           "param %s is repeated", s);
1037
                            return 0;
1038
                        }
1039
                        r->kat = (OSSL_PARAM *)p;
1040
                    }
1041
# endif
1042
0
                    break;
1043
0
                case 'e':
1044
# if defined(FIPS_MODULE)
1045
                    if (ossl_likely(strcmp("y-check", s + 2) == 0)) {
1046
                        /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1047
                        if (ossl_unlikely(r->ind_k != NULL)) {
1048
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1049
                                           "param %s is repeated", s);
1050
                            return 0;
1051
                        }
1052
                        r->ind_k = (OSSL_PARAM *)p;
1053
                    }
1054
# endif
1055
0
                    break;
1056
0
                }
1057
0
                break;
1058
0
            case 'n':
1059
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
1060
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
1061
0
                    if (ossl_unlikely(r->nonce != NULL)) {
1062
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1063
0
                                       "param %s is repeated", s);
1064
0
                        return 0;
1065
0
                    }
1066
0
                    r->nonce = (OSSL_PARAM *)p;
1067
0
                }
1068
0
                break;
1069
0
            case 'p':
1070
0
                if (ossl_likely(strcmp("roperties", s + 1) == 0)) {
1071
                    /* OSSL_SIGNATURE_PARAM_PROPERTIES */
1072
0
                    if (ossl_unlikely(r->propq != NULL)) {
1073
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1074
0
                                       "param %s is repeated", s);
1075
0
                        return 0;
1076
0
                    }
1077
0
                    r->propq = (OSSL_PARAM *)p;
1078
0
                }
1079
0
            }
1080
7.11k
    return 1;
1081
7.11k
}
1082
#endif
1083
/* End of machine generated */
1084
/* clang-format on */
1085
1086
static int ecdsa_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1087
7.11k
{
1088
7.11k
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1089
7.11k
    struct ecdsa_all_set_ctx_params_st p;
1090
7.11k
    size_t mdsize = 0;
1091
7.11k
    int ret;
1092
1093
7.11k
    if (ctx == NULL || !ecdsa_set_ctx_params_decoder(params, &p))
1094
0
        return 0;
1095
1096
7.11k
    if ((ret = ecdsa_common_set_ctx_params(ctx, &p)) <= 0)
1097
0
        return ret;
1098
1099
7.11k
    if (p.digest != NULL) {
1100
0
        char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = mdname;
1101
0
        char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = mdprops;
1102
1103
0
        if (!OSSL_PARAM_get_utf8_string(p.digest, &pmdname, sizeof(mdname)))
1104
0
            return 0;
1105
0
        if (p.propq != NULL
1106
0
            && !OSSL_PARAM_get_utf8_string(p.propq, &pmdprops, sizeof(mdprops)))
1107
0
            return 0;
1108
0
        if (!ecdsa_setup_md(ctx, mdname, mdprops, "ECDSA Set Ctx"))
1109
0
            return 0;
1110
0
    }
1111
1112
7.11k
    if (p.size != NULL) {
1113
0
        if (!OSSL_PARAM_get_size_t(p.size, &mdsize)
1114
0
            || (!ctx->flag_allow_md && mdsize != ctx->mdsize))
1115
0
            return 0;
1116
0
        ctx->mdsize = mdsize;
1117
0
    }
1118
7.11k
    return 1;
1119
7.11k
}
1120
1121
static const OSSL_PARAM *ecdsa_settable_ctx_params(void *vctx,
1122
    ossl_unused void *provctx)
1123
4
{
1124
4
    return ecdsa_set_ctx_params_list;
1125
4
}
1126
1127
static int ecdsa_get_ctx_md_params(void *vctx, OSSL_PARAM *params)
1128
0
{
1129
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1130
1131
0
    if (ctx->mdctx == NULL)
1132
0
        return 0;
1133
1134
0
    return EVP_MD_CTX_get_params(ctx->mdctx, params);
1135
0
}
1136
1137
static const OSSL_PARAM *ecdsa_gettable_ctx_md_params(void *vctx)
1138
0
{
1139
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1140
1141
0
    if (ctx->md == NULL)
1142
0
        return 0;
1143
1144
0
    return EVP_MD_gettable_ctx_params(ctx->md);
1145
0
}
1146
1147
static int ecdsa_set_ctx_md_params(void *vctx, const OSSL_PARAM params[])
1148
0
{
1149
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1150
1151
0
    if (ctx->mdctx == NULL)
1152
0
        return 0;
1153
1154
0
    return EVP_MD_CTX_set_params(ctx->mdctx, params);
1155
0
}
1156
1157
static const OSSL_PARAM *ecdsa_settable_ctx_md_params(void *vctx)
1158
0
{
1159
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1160
1161
0
    if (ctx->md == NULL)
1162
0
        return 0;
1163
1164
0
    return EVP_MD_settable_ctx_params(ctx->md);
1165
0
}
1166
1167
const OSSL_DISPATCH ossl_ecdsa_signature_functions[] = {
1168
    { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ecdsa_newctx },
1169
    { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))ecdsa_sign_init },
1170
    { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ecdsa_sign },
1171
    { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))ecdsa_verify_init },
1172
    { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))ecdsa_verify },
1173
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
1174
        (void (*)(void))ecdsa_digest_sign_init },
1175
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
1176
        (void (*)(void))ecdsa_digest_signverify_update },
1177
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
1178
        (void (*)(void))ecdsa_digest_sign_final },
1179
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
1180
        (void (*)(void))ecdsa_digest_verify_init },
1181
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
1182
        (void (*)(void))ecdsa_digest_signverify_update },
1183
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
1184
        (void (*)(void))ecdsa_digest_verify_final },
1185
    { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ecdsa_freectx },
1186
    { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ecdsa_dupctx },
1187
    { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))ecdsa_get_ctx_params },
1188
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
1189
        (void (*)(void))ecdsa_gettable_ctx_params },
1190
    { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))ecdsa_set_ctx_params },
1191
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
1192
        (void (*)(void))ecdsa_settable_ctx_params },
1193
    { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
1194
        (void (*)(void))ecdsa_get_ctx_md_params },
1195
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
1196
        (void (*)(void))ecdsa_gettable_ctx_md_params },
1197
    { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
1198
        (void (*)(void))ecdsa_set_ctx_md_params },
1199
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
1200
        (void (*)(void))ecdsa_settable_ctx_md_params },
1201
    OSSL_DISPATCH_END
1202
};
1203
1204
/* ------------------------------------------------------------------ */
1205
1206
/*
1207
 * So called sigalgs (composite ECDSA+hash) implemented below.  They
1208
 * are pretty much hard coded.
1209
 */
1210
1211
static OSSL_FUNC_signature_query_key_types_fn ecdsa_sigalg_query_key_types;
1212
static OSSL_FUNC_signature_settable_ctx_params_fn ecdsa_sigalg_settable_ctx_params;
1213
static OSSL_FUNC_signature_set_ctx_params_fn ecdsa_sigalg_set_ctx_params;
1214
1215
/*
1216
 * ecdsa_sigalg_signverify_init() is almost like ecdsa_digest_signverify_init(),
1217
 * just doesn't allow fetching an MD from whatever the user chooses.
1218
 */
1219
static int ecdsa_sigalg_signverify_init(void *vctx, void *vec,
1220
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
1221
    const OSSL_PARAM params[],
1222
    const char *mdname,
1223
    int operation, const char *desc)
1224
0
{
1225
0
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1226
1227
0
    if (!ossl_prov_is_running())
1228
0
        return 0;
1229
1230
0
    if (!ecdsa_signverify_init(vctx, vec, set_ctx_params, params, operation,
1231
0
            desc))
1232
0
        return 0;
1233
1234
0
    if (!ecdsa_setup_md(ctx, mdname, NULL, desc))
1235
0
        return 0;
1236
1237
0
    ctx->flag_sigalg = 1;
1238
0
    ctx->flag_allow_md = 0;
1239
1240
0
    if (ctx->mdctx == NULL) {
1241
0
        ctx->mdctx = EVP_MD_CTX_new();
1242
0
        if (ctx->mdctx == NULL)
1243
0
            goto error;
1244
0
    }
1245
1246
0
    if (!EVP_DigestInit_ex2(ctx->mdctx, ctx->md, params))
1247
0
        goto error;
1248
1249
0
    return 1;
1250
1251
0
error:
1252
0
    EVP_MD_CTX_free(ctx->mdctx);
1253
0
    ctx->mdctx = NULL;
1254
0
    return 0;
1255
0
}
1256
1257
static const char **ecdsa_sigalg_query_key_types(void)
1258
0
{
1259
0
    static const char *keytypes[] = { "EC", NULL };
1260
1261
0
    return keytypes;
1262
0
}
1263
1264
#define ecdsa_sigalg_set_ctx_params_st ecdsa_all_set_ctx_params_st
1265
1266
/* clang-format off */
1267
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1268
#ifndef ecdsa_sigalg_set_ctx_params_list
1269
static const OSSL_PARAM ecdsa_sigalg_set_ctx_params_list[] = {
1270
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
1271
# if !defined(OPENSSL_NO_ACVP_TESTS)
1272
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_KAT, NULL),
1273
# endif
1274
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_NONCE_TYPE, NULL),
1275
# if defined(FIPS_MODULE)
1276
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
1277
# endif
1278
# if defined(FIPS_MODULE)
1279
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
1280
# endif
1281
    OSSL_PARAM_END
1282
};
1283
#endif
1284
1285
#ifndef ecdsa_sigalg_set_ctx_params_st
1286
struct ecdsa_sigalg_set_ctx_params_st {
1287
# if defined(FIPS_MODULE)
1288
    OSSL_PARAM *ind_d;
1289
# endif
1290
# if defined(FIPS_MODULE)
1291
    OSSL_PARAM *ind_k;
1292
# endif
1293
# if !defined(OPENSSL_NO_ACVP_TESTS)
1294
    OSSL_PARAM *kat;
1295
# endif
1296
    OSSL_PARAM *nonce;
1297
    OSSL_PARAM *sig;
1298
};
1299
#endif
1300
1301
#ifndef ecdsa_sigalg_set_ctx_params_decoder
1302
static int ecdsa_sigalg_set_ctx_params_decoder
1303
    (const OSSL_PARAM *p, struct ecdsa_sigalg_set_ctx_params_st *r)
1304
801
{
1305
801
    const char *s;
1306
1307
801
    memset(r, 0, sizeof(*r));
1308
801
    if (p != NULL)
1309
1.60k
        for (; (s = p->key) != NULL; p++)
1310
801
            switch(s[0]) {
1311
0
            default:
1312
0
                break;
1313
0
            case 'd':
1314
# if defined(FIPS_MODULE)
1315
                if (ossl_likely(strcmp("igest-check", s + 1) == 0)) {
1316
                    /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
1317
                    if (ossl_unlikely(r->ind_d != NULL)) {
1318
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1319
                                       "param %s is repeated", s);
1320
                        return 0;
1321
                    }
1322
                    r->ind_d = (OSSL_PARAM *)p;
1323
                }
1324
# endif
1325
0
                break;
1326
0
            case 'k':
1327
0
                switch(s[1]) {
1328
0
                default:
1329
0
                    break;
1330
0
                case 'a':
1331
# if !defined(OPENSSL_NO_ACVP_TESTS)
1332
                    if (ossl_likely(strcmp("t", s + 2) == 0)) {
1333
                        /* OSSL_SIGNATURE_PARAM_KAT */
1334
                        if (ossl_unlikely(r->kat != NULL)) {
1335
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1336
                                           "param %s is repeated", s);
1337
                            return 0;
1338
                        }
1339
                        r->kat = (OSSL_PARAM *)p;
1340
                    }
1341
# endif
1342
0
                    break;
1343
0
                case 'e':
1344
# if defined(FIPS_MODULE)
1345
                    if (ossl_likely(strcmp("y-check", s + 2) == 0)) {
1346
                        /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1347
                        if (ossl_unlikely(r->ind_k != NULL)) {
1348
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1349
                                           "param %s is repeated", s);
1350
                            return 0;
1351
                        }
1352
                        r->ind_k = (OSSL_PARAM *)p;
1353
                    }
1354
# endif
1355
0
                    break;
1356
0
                }
1357
0
                break;
1358
0
            case 'n':
1359
0
                if (ossl_likely(strcmp("once-type", s + 1) == 0)) {
1360
                    /* OSSL_SIGNATURE_PARAM_NONCE_TYPE */
1361
0
                    if (ossl_unlikely(r->nonce != NULL)) {
1362
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1363
0
                                       "param %s is repeated", s);
1364
0
                        return 0;
1365
0
                    }
1366
0
                    r->nonce = (OSSL_PARAM *)p;
1367
0
                }
1368
0
                break;
1369
801
            case 's':
1370
801
                if (ossl_likely(strcmp("ignature", s + 1) == 0)) {
1371
                    /* OSSL_SIGNATURE_PARAM_SIGNATURE */
1372
801
                    if (ossl_unlikely(r->sig != NULL)) {
1373
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1374
0
                                       "param %s is repeated", s);
1375
0
                        return 0;
1376
0
                    }
1377
801
                    r->sig = (OSSL_PARAM *)p;
1378
801
                }
1379
801
            }
1380
801
    return 1;
1381
801
}
1382
#endif
1383
/* End of machine generated */
1384
/* clang-format on */
1385
1386
static const OSSL_PARAM *ecdsa_sigalg_settable_ctx_params(void *vctx,
1387
    ossl_unused void *provctx)
1388
4
{
1389
4
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1390
1391
4
    if (ctx != NULL && ctx->operation == EVP_PKEY_OP_VERIFYMSG)
1392
0
        return ecdsa_sigalg_set_ctx_params_list;
1393
4
    return NULL;
1394
4
}
1395
1396
static int ecdsa_sigalg_set_ctx_params(void *vctx, const OSSL_PARAM params[])
1397
801
{
1398
801
    PROV_ECDSA_CTX *ctx = (PROV_ECDSA_CTX *)vctx;
1399
801
    struct ecdsa_all_set_ctx_params_st p;
1400
801
    int ret;
1401
1402
801
    if (ctx == NULL || !ecdsa_sigalg_set_ctx_params_decoder(params, &p))
1403
0
        return 0;
1404
1405
801
    if ((ret = ecdsa_common_set_ctx_params(ctx, &p)) <= 0)
1406
0
        return ret;
1407
1408
801
    if (ctx->operation == EVP_PKEY_OP_VERIFYMSG) {
1409
801
        if (p.sig != NULL) {
1410
801
            OPENSSL_free(ctx->sig);
1411
801
            ctx->sig = NULL;
1412
801
            ctx->siglen = 0;
1413
801
            if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&ctx->sig,
1414
801
                    0, &ctx->siglen))
1415
0
                return 0;
1416
801
        }
1417
801
    }
1418
801
    return 1;
1419
801
}
1420
1421
#define IMPL_ECDSA_SIGALG(md, MD)                                       \
1422
    static OSSL_FUNC_signature_sign_init_fn ecdsa_##md##_sign_init;     \
1423
    static OSSL_FUNC_signature_sign_message_init_fn                     \
1424
        ecdsa_##md##_sign_message_init;                                 \
1425
    static OSSL_FUNC_signature_verify_init_fn ecdsa_##md##_verify_init; \
1426
    static OSSL_FUNC_signature_verify_message_init_fn                   \
1427
        ecdsa_##md##_verify_message_init;                               \
1428
                                                                        \
1429
    static int                                                          \
1430
    ecdsa_##md##_sign_init(void *vctx, void *vec,                       \
1431
        const OSSL_PARAM params[])                                      \
1432
0
    {                                                                   \
1433
0
        static const char desc[] = "ECDSA-" MD " Sign Init";            \
1434
0
                                                                        \
1435
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1436
0
            ecdsa_sigalg_set_ctx_params,                                \
1437
0
            params, MD,                                                 \
1438
0
            EVP_PKEY_OP_SIGN,                                           \
1439
0
            desc);                                                      \
1440
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
1441
                                                                        \
1442
    static int                                                          \
1443
    ecdsa_##md##_sign_message_init(void *vctx, void *vec,               \
1444
        const OSSL_PARAM params[])                                      \
1445
0
    {                                                                   \
1446
0
        static const char desc[] = "ECDSA-" MD " Sign Message Init";    \
1447
0
                                                                        \
1448
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1449
0
            ecdsa_sigalg_set_ctx_params,                                \
1450
0
            params, MD,                                                 \
1451
0
            EVP_PKEY_OP_SIGNMSG,                                        \
1452
0
            desc);                                                      \
1453
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
1454
                                                                        \
1455
    static int                                                          \
1456
    ecdsa_##md##_verify_init(void *vctx, void *vec,                     \
1457
        const OSSL_PARAM params[])                                      \
1458
0
    {                                                                   \
1459
0
        static const char desc[] = "ECDSA-" MD " Verify Init";          \
1460
0
                                                                        \
1461
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1462
0
            ecdsa_sigalg_set_ctx_params,                                \
1463
0
            params, MD,                                                 \
1464
0
            EVP_PKEY_OP_VERIFY,                                         \
1465
0
            desc);                                                      \
1466
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
1467
                                                                        \
1468
    static int                                                          \
1469
    ecdsa_##md##_verify_message_init(void *vctx, void *vec,             \
1470
        const OSSL_PARAM params[])                                      \
1471
0
    {                                                                   \
1472
0
        static const char desc[] = "ECDSA-" MD " Verify Message Init";  \
1473
0
                                                                        \
1474
0
        return ecdsa_sigalg_signverify_init(vctx, vec,                  \
1475
0
            ecdsa_sigalg_set_ctx_params,                                \
1476
0
            params, MD,                                                 \
1477
0
            EVP_PKEY_OP_VERIFYMSG,                                      \
1478
0
            desc);                                                      \
1479
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
1480
                                                                        \
1481
    const OSSL_DISPATCH ossl_ecdsa_##md##_signature_functions[] = {     \
1482
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))ecdsa_newctx },   \
1483
        { OSSL_FUNC_SIGNATURE_SIGN_INIT,                                \
1484
            (void (*)(void))ecdsa_##md##_sign_init },                   \
1485
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))ecdsa_sign },       \
1486
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                        \
1487
            (void (*)(void))ecdsa_##md##_sign_message_init },           \
1488
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                      \
1489
            (void (*)(void))ecdsa_signverify_message_update },          \
1490
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                       \
1491
            (void (*)(void))ecdsa_sign_message_final },                 \
1492
        { OSSL_FUNC_SIGNATURE_VERIFY_INIT,                              \
1493
            (void (*)(void))ecdsa_##md##_verify_init },                 \
1494
        { OSSL_FUNC_SIGNATURE_VERIFY,                                   \
1495
            (void (*)(void))ecdsa_verify },                             \
1496
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                      \
1497
            (void (*)(void))ecdsa_##md##_verify_message_init },         \
1498
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                    \
1499
            (void (*)(void))ecdsa_signverify_message_update },          \
1500
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                     \
1501
            (void (*)(void))ecdsa_verify_message_final },               \
1502
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))ecdsa_freectx }, \
1503
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))ecdsa_dupctx },   \
1504
        { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES,                          \
1505
            (void (*)(void))ecdsa_sigalg_query_key_types },             \
1506
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                           \
1507
            (void (*)(void))ecdsa_get_ctx_params },                     \
1508
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                      \
1509
            (void (*)(void))ecdsa_gettable_ctx_params },                \
1510
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                           \
1511
            (void (*)(void))ecdsa_sigalg_set_ctx_params },              \
1512
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                      \
1513
            (void (*)(void))ecdsa_sigalg_settable_ctx_params },         \
1514
        OSSL_DISPATCH_END                                               \
1515
    }
1516
1517
IMPL_ECDSA_SIGALG(sha1, "SHA1");
1518
IMPL_ECDSA_SIGALG(sha224, "SHA2-224");
1519
IMPL_ECDSA_SIGALG(sha256, "SHA2-256");
1520
IMPL_ECDSA_SIGALG(sha384, "SHA2-384");
1521
IMPL_ECDSA_SIGALG(sha512, "SHA2-512");
1522
IMPL_ECDSA_SIGALG(sha3_224, "SHA3-224");
1523
IMPL_ECDSA_SIGALG(sha3_256, "SHA3-256");
1524
IMPL_ECDSA_SIGALG(sha3_384, "SHA3-384");
1525
IMPL_ECDSA_SIGALG(sha3_512, "SHA3-512");