Coverage Report

Created: 2026-07-16 06:59

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/evp/signature.c
Line
Count
Source
1
/*
2
 * Copyright 2006-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
10
#include <openssl/err.h>
11
#include <stdio.h>
12
#include <stdlib.h>
13
#include <openssl/core_names.h>
14
#include <openssl/objects.h>
15
#include <openssl/evp.h>
16
#include "internal/numbers.h" /* includes SIZE_MAX */
17
#include "internal/cryptlib.h"
18
#include "internal/provider.h"
19
#include "internal/core.h"
20
#include "crypto/evp.h"
21
#include "evp_local.h"
22
23
static void evp_signature_free(void *data)
24
0
{
25
0
    EVP_SIGNATURE *signature = (EVP_SIGNATURE *)data;
26
0
    int i;
27
28
0
    if (signature == NULL)
29
0
        return;
30
0
    CRYPTO_DOWN_REF(&signature->refcnt, &i);
31
0
    if (i > 0)
32
0
        return;
33
0
    OPENSSL_free(signature->type_name);
34
0
    ossl_provider_free(signature->prov);
35
0
    CRYPTO_FREE_REF(&signature->refcnt);
36
0
    OPENSSL_free(signature);
37
0
}
38
39
static int evp_signature_up_ref(void *data)
40
0
{
41
0
    EVP_SIGNATURE *signature = (EVP_SIGNATURE *)data;
42
0
    int ref = 0;
43
44
0
    CRYPTO_UP_REF(&signature->refcnt, &ref);
45
0
    return 1;
46
0
}
47
48
static EVP_SIGNATURE *evp_signature_new(OSSL_PROVIDER *prov)
49
0
{
50
0
    EVP_SIGNATURE *signature = OPENSSL_zalloc(sizeof(EVP_SIGNATURE));
51
52
0
    if (signature == NULL)
53
0
        return NULL;
54
55
0
    if (!CRYPTO_NEW_REF(&signature->refcnt, 1)
56
0
        || !ossl_provider_up_ref(prov)) {
57
0
        CRYPTO_FREE_REF(&signature->refcnt);
58
0
        OPENSSL_free(signature);
59
0
        return NULL;
60
0
    }
61
62
0
    signature->prov = prov;
63
64
0
    return signature;
65
0
}
66
67
static void *evp_signature_from_algorithm(int name_id,
68
    const OSSL_ALGORITHM *algodef,
69
    OSSL_PROVIDER *prov, int no_store)
70
0
{
71
0
    const OSSL_DISPATCH *fns = algodef->implementation;
72
0
    EVP_SIGNATURE *signature = NULL;
73
0
    const char *desc;
74
    /* Counts newctx / freectx */
75
0
    int ctxfncnt = 0;
76
    /* Counts all init functions  */
77
0
    int initfncnt = 0;
78
    /* Counts all parameter functions */
79
0
    int gparamfncnt = 0, sparamfncnt = 0, gmdparamfncnt = 0, smdparamfncnt = 0;
80
0
    int valid = 0;
81
82
0
    if ((signature = evp_signature_new(prov)) == NULL) {
83
0
        ERR_raise(ERR_LIB_EVP, ERR_R_EVP_LIB);
84
0
        goto err;
85
0
    }
86
87
0
    signature->name_id = name_id;
88
0
    signature->no_store = no_store;
89
0
    if ((signature->type_name = ossl_algorithm_get1_first_name(algodef)) == NULL)
90
0
        goto err;
91
0
    signature->description = algodef->algorithm_description;
92
0
    desc = signature->description != NULL ? signature->description : "";
93
94
0
    for (; fns->function_id != 0; fns++) {
95
0
        switch (fns->function_id) {
96
0
        case OSSL_FUNC_SIGNATURE_NEWCTX:
97
0
            if (signature->newctx != NULL)
98
0
                break;
99
0
            signature->newctx = OSSL_FUNC_signature_newctx(fns);
100
0
            ctxfncnt++;
101
0
            break;
102
0
        case OSSL_FUNC_SIGNATURE_SIGN_INIT:
103
0
            if (signature->sign_init != NULL)
104
0
                break;
105
0
            signature->sign_init = OSSL_FUNC_signature_sign_init(fns);
106
0
            initfncnt++;
107
0
            break;
108
0
        case OSSL_FUNC_SIGNATURE_SIGN:
109
0
            if (signature->sign != NULL)
110
0
                break;
111
0
            signature->sign = OSSL_FUNC_signature_sign(fns);
112
0
            break;
113
0
        case OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT:
114
0
            if (signature->sign_message_init != NULL)
115
0
                break;
116
0
            signature->sign_message_init
117
0
                = OSSL_FUNC_signature_sign_message_init(fns);
118
0
            initfncnt++;
119
0
            break;
120
0
        case OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE:
121
0
            if (signature->sign_message_update != NULL)
122
0
                break;
123
0
            signature->sign_message_update
124
0
                = OSSL_FUNC_signature_sign_message_update(fns);
125
0
            break;
126
0
        case OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL:
127
0
            if (signature->sign_message_final != NULL)
128
0
                break;
129
0
            signature->sign_message_final
130
0
                = OSSL_FUNC_signature_sign_message_final(fns);
131
0
            break;
132
0
        case OSSL_FUNC_SIGNATURE_VERIFY_INIT:
133
0
            if (signature->verify_init != NULL)
134
0
                break;
135
0
            signature->verify_init = OSSL_FUNC_signature_verify_init(fns);
136
0
            initfncnt++;
137
0
            break;
138
0
        case OSSL_FUNC_SIGNATURE_VERIFY:
139
0
            if (signature->verify != NULL)
140
0
                break;
141
0
            signature->verify = OSSL_FUNC_signature_verify(fns);
142
0
            break;
143
0
        case OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT:
144
0
            if (signature->verify_message_init != NULL)
145
0
                break;
146
0
            signature->verify_message_init
147
0
                = OSSL_FUNC_signature_verify_message_init(fns);
148
0
            initfncnt++;
149
0
            break;
150
0
        case OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE:
151
0
            if (signature->verify_message_update != NULL)
152
0
                break;
153
0
            signature->verify_message_update
154
0
                = OSSL_FUNC_signature_verify_message_update(fns);
155
0
            break;
156
0
        case OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL:
157
0
            if (signature->verify_message_final != NULL)
158
0
                break;
159
0
            signature->verify_message_final
160
0
                = OSSL_FUNC_signature_verify_message_final(fns);
161
0
            break;
162
0
        case OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT:
163
0
            if (signature->verify_recover_init != NULL)
164
0
                break;
165
0
            signature->verify_recover_init
166
0
                = OSSL_FUNC_signature_verify_recover_init(fns);
167
0
            initfncnt++;
168
0
            break;
169
0
        case OSSL_FUNC_SIGNATURE_VERIFY_RECOVER:
170
0
            if (signature->verify_recover != NULL)
171
0
                break;
172
0
            signature->verify_recover
173
0
                = OSSL_FUNC_signature_verify_recover(fns);
174
0
            break;
175
0
        case OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT:
176
0
            if (signature->digest_sign_init != NULL)
177
0
                break;
178
0
            signature->digest_sign_init
179
0
                = OSSL_FUNC_signature_digest_sign_init(fns);
180
0
            initfncnt++;
181
0
            break;
182
0
        case OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE:
183
0
            if (signature->digest_sign_update != NULL)
184
0
                break;
185
0
            signature->digest_sign_update
186
0
                = OSSL_FUNC_signature_digest_sign_update(fns);
187
0
            break;
188
0
        case OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL:
189
0
            if (signature->digest_sign_final != NULL)
190
0
                break;
191
0
            signature->digest_sign_final
192
0
                = OSSL_FUNC_signature_digest_sign_final(fns);
193
0
            break;
194
0
        case OSSL_FUNC_SIGNATURE_DIGEST_SIGN:
195
0
            if (signature->digest_sign != NULL)
196
0
                break;
197
0
            signature->digest_sign
198
0
                = OSSL_FUNC_signature_digest_sign(fns);
199
0
            break;
200
0
        case OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT:
201
0
            if (signature->digest_verify_init != NULL)
202
0
                break;
203
0
            signature->digest_verify_init
204
0
                = OSSL_FUNC_signature_digest_verify_init(fns);
205
0
            initfncnt++;
206
0
            break;
207
0
        case OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE:
208
0
            if (signature->digest_verify_update != NULL)
209
0
                break;
210
0
            signature->digest_verify_update
211
0
                = OSSL_FUNC_signature_digest_verify_update(fns);
212
0
            break;
213
0
        case OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL:
214
0
            if (signature->digest_verify_final != NULL)
215
0
                break;
216
0
            signature->digest_verify_final
217
0
                = OSSL_FUNC_signature_digest_verify_final(fns);
218
0
            break;
219
0
        case OSSL_FUNC_SIGNATURE_DIGEST_VERIFY:
220
0
            if (signature->digest_verify != NULL)
221
0
                break;
222
0
            signature->digest_verify
223
0
                = OSSL_FUNC_signature_digest_verify(fns);
224
0
            break;
225
0
        case OSSL_FUNC_SIGNATURE_FREECTX:
226
0
            if (signature->freectx != NULL)
227
0
                break;
228
0
            signature->freectx = OSSL_FUNC_signature_freectx(fns);
229
0
            ctxfncnt++;
230
0
            break;
231
0
        case OSSL_FUNC_SIGNATURE_DUPCTX:
232
0
            if (signature->dupctx != NULL)
233
0
                break;
234
0
            signature->dupctx = OSSL_FUNC_signature_dupctx(fns);
235
0
            break;
236
0
        case OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS:
237
0
            if (signature->get_ctx_params != NULL)
238
0
                break;
239
0
            signature->get_ctx_params
240
0
                = OSSL_FUNC_signature_get_ctx_params(fns);
241
0
            gparamfncnt++;
242
0
            break;
243
0
        case OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS:
244
0
            if (signature->gettable_ctx_params != NULL)
245
0
                break;
246
0
            signature->gettable_ctx_params
247
0
                = OSSL_FUNC_signature_gettable_ctx_params(fns);
248
0
            gparamfncnt++;
249
0
            break;
250
0
        case OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS:
251
0
            if (signature->set_ctx_params != NULL)
252
0
                break;
253
0
            signature->set_ctx_params
254
0
                = OSSL_FUNC_signature_set_ctx_params(fns);
255
0
            sparamfncnt++;
256
0
            break;
257
0
        case OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS:
258
0
            if (signature->settable_ctx_params != NULL)
259
0
                break;
260
0
            signature->settable_ctx_params
261
0
                = OSSL_FUNC_signature_settable_ctx_params(fns);
262
0
            sparamfncnt++;
263
0
            break;
264
0
        case OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS:
265
0
            if (signature->get_ctx_md_params != NULL)
266
0
                break;
267
0
            signature->get_ctx_md_params
268
0
                = OSSL_FUNC_signature_get_ctx_md_params(fns);
269
0
            gmdparamfncnt++;
270
0
            break;
271
0
        case OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS:
272
0
            if (signature->gettable_ctx_md_params != NULL)
273
0
                break;
274
0
            signature->gettable_ctx_md_params
275
0
                = OSSL_FUNC_signature_gettable_ctx_md_params(fns);
276
0
            gmdparamfncnt++;
277
0
            break;
278
0
        case OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS:
279
0
            if (signature->set_ctx_md_params != NULL)
280
0
                break;
281
0
            signature->set_ctx_md_params
282
0
                = OSSL_FUNC_signature_set_ctx_md_params(fns);
283
0
            smdparamfncnt++;
284
0
            break;
285
0
        case OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS:
286
0
            if (signature->settable_ctx_md_params != NULL)
287
0
                break;
288
0
            signature->settable_ctx_md_params
289
0
                = OSSL_FUNC_signature_settable_ctx_md_params(fns);
290
0
            smdparamfncnt++;
291
0
            break;
292
0
        case OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES:
293
0
            if (signature->query_key_types != NULL)
294
0
                break;
295
0
            signature->query_key_types
296
0
                = OSSL_FUNC_signature_query_key_types(fns);
297
0
            break;
298
0
        }
299
0
    }
300
    /*
301
     * In order to be a consistent set of functions we must have at least
302
     * a set of context functions (newctx and freectx) as well as a set of
303
     * "signature" functions.  Because there's an overlap between some sets
304
     * of functions, counters don't always cut it, we must test known
305
     * combinations.
306
     * We start by assuming the implementation is valid, and then look for
307
     * reasons it's not.
308
     */
309
0
    valid = 1;
310
    /* Start with the ones where counters say enough */
311
0
    if (ctxfncnt != 2) {
312
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
313
0
            "missing %s newctx or freectx:%s", signature->type_name, desc);
314
0
        valid = 0;
315
0
    }
316
0
    if (valid
317
0
        && ((gparamfncnt != 0 && gparamfncnt != 2)
318
0
            || (sparamfncnt != 0 && sparamfncnt != 2)
319
0
            || (gmdparamfncnt != 0 && gmdparamfncnt != 2)
320
0
            || (smdparamfncnt != 0 && smdparamfncnt != 2))) {
321
        /*
322
         * Params functions are optional, but if defined, they must
323
         * be pairwise complete sets, i.e. a getter must have an
324
         * associated gettable, etc
325
         */
326
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
327
0
            "missing %s params getter or setter:%s", signature->type_name, desc);
328
0
        valid = 0;
329
0
    }
330
0
    if (valid && initfncnt == 0) {
331
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
332
0
            "missing %s init:%s", signature->type_name, desc);
333
0
        valid = 0;
334
0
    }
335
336
    /* Now we check for function combinations */
337
0
    if (valid
338
0
        && ((signature->sign_init != NULL
339
0
                && signature->sign == NULL)
340
0
            || (signature->sign_message_init != NULL
341
0
                && signature->sign == NULL
342
0
                && (signature->sign_message_update == NULL
343
0
                    || signature->sign_message_final == NULL)))) {
344
        /* sign_init function(s) with no signing function?  That's weird */
345
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
346
0
            "missing %s signing function:%s", signature->type_name, desc);
347
0
        valid = 0;
348
0
    }
349
0
    if (valid
350
0
        && (signature->sign != NULL
351
0
            || signature->sign_message_update != NULL
352
0
            || signature->sign_message_final != NULL)
353
0
        && signature->sign_init == NULL
354
0
        && signature->sign_message_init == NULL) {
355
        /* signing function(s) with no sign_init? That's odd */
356
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
357
0
            "missing %s sign_init or sign_message_init:%s", signature->type_name, desc);
358
0
        valid = 0;
359
0
    }
360
361
0
    if (valid
362
0
        && ((signature->verify_init != NULL
363
0
                && signature->verify == NULL)
364
0
            || (signature->verify_message_init != NULL
365
0
                && signature->verify == NULL
366
0
                && (signature->verify_message_update == NULL
367
0
                    || signature->verify_message_final == NULL)))) {
368
        /* verify_init function(s) with no verification function?  That's weird */
369
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
370
0
            "missing %s verification function:%s", signature->type_name, desc);
371
0
        valid = 0;
372
0
    }
373
0
    if (valid
374
0
        && (signature->verify != NULL
375
0
            || signature->verify_message_update != NULL
376
0
            || signature->verify_message_final != NULL)
377
0
        && signature->verify_init == NULL
378
0
        && signature->verify_message_init == NULL) {
379
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
380
0
            "missing %s verify_init or verify_message_init:%s",
381
0
            signature->type_name, desc);
382
        /* verification function(s) with no verify_init? That's odd */
383
0
        valid = 0;
384
0
    }
385
386
0
    if (valid
387
0
        && (signature->verify_recover_init != NULL)
388
0
        && (signature->verify_recover == NULL)) {
389
        /* verify_recover_init function with no verify_recover?  How quaint */
390
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
391
0
            "missing %s verify_recover:%s", signature->type_name, desc);
392
0
        valid = 0;
393
0
    }
394
395
0
    if (valid
396
0
        && (signature->digest_sign_init != NULL
397
0
            && signature->digest_sign == NULL
398
0
            && (signature->digest_sign_update == NULL
399
0
                || signature->digest_sign_final == NULL))) {
400
        /* You can't have a digest_sign_init without *some* performing functions */
401
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
402
0
            "missing %s digest_sign function:%s", signature->type_name, desc);
403
0
        valid = 0;
404
0
    }
405
406
0
    if (valid
407
0
        && ((signature->digest_verify_init != NULL
408
0
            && signature->digest_verify == NULL
409
0
            && (signature->digest_verify_update == NULL
410
0
                || signature->digest_verify_final == NULL)))) {
411
        /* You can't have a digest_verify_init without *some* performing functions */
412
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
413
0
            "missing %s digest_verify function:%s", signature->type_name, desc);
414
0
        valid = 0;
415
0
    }
416
417
0
    if (!valid)
418
0
        goto err;
419
420
0
    if ((signature->digest_sign != NULL
421
0
            || signature->digest_sign_update != NULL
422
0
            || signature->digest_sign_final != NULL)
423
0
        && signature->digest_sign_init == NULL) {
424
        /* digest signing function(s) with no digest_sign_init? That's odd */
425
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
426
0
            "missing %s digest_sign_init:%s", signature->type_name, desc);
427
0
        goto err;
428
0
    }
429
430
0
    if ((signature->digest_verify != NULL
431
0
            || signature->digest_verify_update != NULL
432
0
            || signature->digest_verify_final != NULL)
433
0
        && signature->digest_verify_init == NULL) {
434
        /* digest verification function(s) with no digest_verify_init? That's odd */
435
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
436
0
            "missing %s digest_verify_init:%s", signature->type_name, desc);
437
0
        goto err;
438
0
    }
439
440
0
    if ((signature->sign_message_update == NULL) != (signature->sign_message_final == NULL)) {
441
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
442
0
            "only one of %s message signing update and final available:%s",
443
0
            signature->type_name, desc);
444
0
        goto err;
445
0
    }
446
0
    if ((signature->verify_message_update == NULL) != (signature->verify_message_final == NULL)) {
447
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
448
0
            "only one of %s message verification update and final available:%s",
449
0
            signature->type_name, desc);
450
0
        goto err;
451
0
    }
452
0
    if ((signature->digest_sign_update == NULL) != (signature->digest_sign_final == NULL)) {
453
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
454
0
            "only one of %s digest signing update and final available:%s",
455
0
            signature->type_name, desc);
456
0
        goto err;
457
0
    }
458
0
    if ((signature->digest_verify_update == NULL) != (signature->digest_verify_final == NULL)) {
459
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_INVALID_PROVIDER_FUNCTIONS,
460
0
            "only one of %s digest verification update and final available:%s",
461
0
            signature->type_name, desc);
462
0
        goto err;
463
0
    }
464
465
0
    return signature;
466
0
err:
467
0
    evp_signature_free(signature);
468
0
    return NULL;
469
0
}
470
471
void EVP_SIGNATURE_free(EVP_SIGNATURE *signature)
472
0
{
473
#ifdef OPENSSL_NO_CACHED_FETCH
474
    evp_signature_free(signature);
475
#else
476
0
    if (signature != NULL && (signature->no_store != 0))
477
0
        evp_signature_free(signature);
478
0
#endif
479
0
}
480
481
int EVP_SIGNATURE_up_ref(EVP_SIGNATURE *signature)
482
0
{
483
#ifdef OPENSSL_NO_CACHED_FETCH
484
    return evp_signature_up_ref(signature);
485
#else
486
0
    if (signature->no_store != 0)
487
0
        return evp_signature_up_ref(signature);
488
0
    return 1;
489
0
#endif
490
0
}
491
492
OSSL_PROVIDER *EVP_SIGNATURE_get0_provider(const EVP_SIGNATURE *signature)
493
0
{
494
0
    return signature->prov;
495
0
}
496
497
EVP_SIGNATURE *EVP_SIGNATURE_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
498
    const char *properties)
499
0
{
500
0
    return evp_generic_fetch(ctx, OSSL_OP_SIGNATURE, algorithm, properties,
501
0
        evp_signature_from_algorithm,
502
0
        evp_signature_up_ref,
503
0
        evp_signature_free);
504
0
}
505
506
EVP_SIGNATURE *evp_signature_fetch_from_prov(OSSL_PROVIDER *prov,
507
    const char *algorithm,
508
    const char *properties)
509
0
{
510
0
    return evp_generic_fetch_from_prov(prov, OSSL_OP_SIGNATURE,
511
0
        algorithm, properties,
512
0
        evp_signature_from_algorithm,
513
0
        evp_signature_up_ref,
514
0
        evp_signature_free);
515
0
}
516
517
int EVP_SIGNATURE_is_a(const EVP_SIGNATURE *signature, const char *name)
518
0
{
519
0
    return signature != NULL
520
0
        && evp_is_a(signature->prov, signature->name_id, NULL, name);
521
0
}
522
523
int EVP_SIGNATURE_has_message_update(const EVP_SIGNATURE *signature)
524
0
{
525
0
    return signature->verify_message_update != NULL
526
0
        && signature->sign_message_update != NULL;
527
0
}
528
529
int evp_signature_get_number(const EVP_SIGNATURE *signature)
530
0
{
531
0
    return signature->name_id;
532
0
}
533
534
const char *EVP_SIGNATURE_get0_name(const EVP_SIGNATURE *signature)
535
0
{
536
0
    return signature->type_name;
537
0
}
538
539
const char *EVP_SIGNATURE_get0_description(const EVP_SIGNATURE *signature)
540
0
{
541
0
    return signature->description;
542
0
}
543
544
void EVP_SIGNATURE_do_all_provided(OSSL_LIB_CTX *libctx,
545
    void (*fn)(EVP_SIGNATURE *signature,
546
        void *arg),
547
    void *arg)
548
0
{
549
0
    struct EVP_SIGNATURE_do_all_provided_thunk t;
550
551
0
    t.fn = fn;
552
0
    t.arg = arg;
553
0
    evp_generic_do_all(libctx, OSSL_OP_SIGNATURE,
554
0
        EVP_SIGNATURE_do_all_provided_thunk, &t,
555
0
        evp_signature_from_algorithm,
556
0
        evp_signature_up_ref,
557
0
        evp_signature_free);
558
0
}
559
560
int EVP_SIGNATURE_names_do_all(const EVP_SIGNATURE *signature,
561
    void (*fn)(const char *name, void *data),
562
    void *data)
563
0
{
564
0
    if (signature->prov != NULL)
565
0
        return evp_names_do_all(signature->prov, signature->name_id, fn, data);
566
567
0
    return 1;
568
0
}
569
570
const OSSL_PARAM *EVP_SIGNATURE_gettable_ctx_params(const EVP_SIGNATURE *sig)
571
0
{
572
0
    void *provctx;
573
574
0
    if (sig == NULL || sig->gettable_ctx_params == NULL)
575
0
        return NULL;
576
577
0
    provctx = ossl_provider_ctx(EVP_SIGNATURE_get0_provider(sig));
578
0
    return sig->gettable_ctx_params(NULL, provctx);
579
0
}
580
581
const OSSL_PARAM *EVP_SIGNATURE_settable_ctx_params(const EVP_SIGNATURE *sig)
582
0
{
583
0
    void *provctx;
584
585
0
    if (sig == NULL || sig->settable_ctx_params == NULL)
586
0
        return NULL;
587
588
0
    provctx = ossl_provider_ctx(EVP_SIGNATURE_get0_provider(sig));
589
0
    return sig->settable_ctx_params(NULL, provctx);
590
0
}
591
592
static int evp_pkey_signature_init(EVP_PKEY_CTX *ctx, EVP_SIGNATURE *signature,
593
    int operation, const OSSL_PARAM params[])
594
0
{
595
0
    const char *desc;
596
0
    int ret = 0;
597
0
    void *provkey = NULL;
598
0
    EVP_KEYMGMT *tmp_keymgmt = NULL;
599
0
    const OSSL_PROVIDER *tmp_prov = NULL;
600
0
    const char *supported_sig = NULL;
601
0
    int iter;
602
603
0
    if (ctx == NULL) {
604
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
605
0
        return -1;
606
0
    }
607
608
0
    evp_pkey_ctx_free_old_ops(ctx);
609
0
    ctx->operation = operation;
610
611
0
    if (signature != NULL) {
612
        /*
613
         * It's important to figure out what the key type should be, and if
614
         * that is what we have in ctx.
615
         */
616
617
0
        EVP_KEYMGMT *tmp_keymgmt_tofree = NULL;
618
619
0
        if (ctx->pkey == NULL) {
620
0
            ERR_raise(ERR_LIB_EVP, EVP_R_NO_KEY_SET);
621
0
            goto err;
622
0
        }
623
624
        /*
625
         * Ensure that the key is provided, either natively, or as a
626
         * cached export.  We start by fetching the keymgmt with the same
627
         * name as |ctx->pkey|, but from the provider of the signature
628
         * method, using the same property query as when fetching the
629
         * signature method.  With the keymgmt we found (if we did), we
630
         * try to export |ctx->pkey| to it (evp_pkey_export_to_provider()
631
         * is smart enough to only actually export it if |tmp_keymgmt|
632
         * is different from |ctx->pkey|'s keymgmt)
633
         */
634
0
        tmp_prov = EVP_SIGNATURE_get0_provider(signature);
635
0
        tmp_keymgmt_tofree = tmp_keymgmt = evp_keymgmt_fetch_from_prov((OSSL_PROVIDER *)tmp_prov,
636
0
            EVP_KEYMGMT_get0_name(ctx->keymgmt),
637
0
            ctx->propquery);
638
0
        if (tmp_keymgmt != NULL)
639
0
            provkey = evp_pkey_export_to_provider(ctx->pkey, ctx->libctx,
640
0
                &tmp_keymgmt, ctx->propquery);
641
0
        if (tmp_keymgmt == NULL)
642
0
            EVP_KEYMGMT_free(tmp_keymgmt_tofree);
643
644
0
        if (provkey == NULL)
645
0
            goto end;
646
647
        /*
648
         * Check that the signature matches the given key.  This is not
649
         * designed to work with legacy keys, so has to be done after we've
650
         * ensured that the key is at least exported to a provider (above).
651
         */
652
0
        if (signature->query_key_types != NULL) {
653
            /* This is expected to be a NULL-terminated array */
654
0
            const char **keytypes;
655
656
0
            keytypes = signature->query_key_types();
657
0
            for (; *keytypes != NULL; keytypes++)
658
0
                if (EVP_PKEY_CTX_is_a(ctx, *keytypes))
659
0
                    break;
660
0
            if (*keytypes == NULL) {
661
0
                ERR_raise(ERR_LIB_EVP, EVP_R_SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE);
662
0
                ret = -2;
663
0
                goto end;
664
0
            }
665
0
        } else {
666
            /*
667
             * Fallback 1:
668
             * check if the keytype is the same as the signature algorithm name
669
             */
670
0
            const char *keytype = EVP_KEYMGMT_get0_name(ctx->keymgmt);
671
0
            int ok = EVP_SIGNATURE_is_a(signature, keytype);
672
673
            /*
674
             * Fallback 2:
675
             * query the pkey for a default signature algorithm name, and check
676
             * if it matches the signature implementation
677
             */
678
0
            if (!ok) {
679
0
                const char *signame
680
0
                    = evp_keymgmt_util_query_operation_name(ctx->keymgmt,
681
0
                        OSSL_OP_SIGNATURE);
682
683
0
                ok = EVP_SIGNATURE_is_a(signature, signame);
684
0
            }
685
686
            /* If none of the fallbacks helped, we're lost */
687
0
            if (!ok) {
688
0
                ERR_raise(ERR_LIB_EVP, EVP_R_SIGNATURE_TYPE_AND_KEY_TYPE_INCOMPATIBLE);
689
0
                ret = -2;
690
0
                goto end;
691
0
            }
692
0
        }
693
694
0
        if (!EVP_SIGNATURE_up_ref(signature))
695
0
            goto err;
696
0
    } else {
697
        /* Without a pre-fetched signature, it must be figured out somehow */
698
0
        ERR_set_mark();
699
700
0
        if (evp_pkey_ctx_is_legacy(ctx))
701
0
            goto notsupported;
702
703
0
        if (ctx->pkey == NULL) {
704
0
            ERR_clear_last_mark();
705
0
            ERR_raise(ERR_LIB_EVP, EVP_R_NO_KEY_SET);
706
0
            goto err;
707
0
        }
708
709
        /*
710
         * Try to derive the supported signature from |ctx->keymgmt|.
711
         */
712
0
        if (!ossl_assert(ctx->pkey->keymgmt == NULL
713
0
                || ctx->pkey->keymgmt == ctx->keymgmt)) {
714
0
            ERR_clear_last_mark();
715
0
            ERR_raise(ERR_LIB_EVP, ERR_R_INTERNAL_ERROR);
716
0
            goto err;
717
0
        }
718
0
        supported_sig
719
0
            = evp_keymgmt_util_query_operation_name(ctx->keymgmt,
720
0
                OSSL_OP_SIGNATURE);
721
0
        if (supported_sig == NULL) {
722
0
            ERR_clear_last_mark();
723
0
            ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
724
0
            goto err;
725
0
        }
726
727
        /*
728
         * We perform two iterations:
729
         *
730
         * 1.  Do the normal signature fetch, using the fetching data given by
731
         *     the EVP_PKEY_CTX.
732
         * 2.  Do the provider specific signature fetch, from the same provider
733
         *     as |ctx->keymgmt|
734
         *
735
         * We then try to fetch the keymgmt from the same provider as the
736
         * signature, and try to export |ctx->pkey| to that keymgmt (when
737
         * this keymgmt happens to be the same as |ctx->keymgmt|, the export
738
         * is a no-op, but we call it anyway to not complicate the code even
739
         * more).
740
         * If the export call succeeds (returns a non-NULL provider key pointer),
741
         * we're done and can perform the operation itself.  If not, we perform
742
         * the second iteration, or jump to legacy.
743
         */
744
0
        for (iter = 1; iter < 3 && provkey == NULL; iter++) {
745
0
            EVP_KEYMGMT *tmp_keymgmt_tofree = NULL;
746
747
            /*
748
             * If we're on the second iteration, free the results from the first.
749
             * They are NULL on the first iteration, so no need to check what
750
             * iteration we're on.
751
             */
752
0
            EVP_SIGNATURE_free(signature);
753
0
            signature = NULL;
754
0
            EVP_KEYMGMT_free(tmp_keymgmt);
755
0
            tmp_keymgmt = NULL;
756
757
0
            switch (iter) {
758
0
            case 1:
759
0
                signature = EVP_SIGNATURE_fetch(ctx->libctx, supported_sig, ctx->propquery);
760
0
                if (signature != NULL)
761
0
                    tmp_prov = EVP_SIGNATURE_get0_provider(signature);
762
0
                break;
763
0
            case 2:
764
0
                tmp_prov = EVP_KEYMGMT_get0_provider(ctx->keymgmt);
765
0
                signature = evp_signature_fetch_from_prov((OSSL_PROVIDER *)tmp_prov,
766
0
                    supported_sig, ctx->propquery);
767
0
                if (signature == NULL)
768
0
                    goto notsupported;
769
0
                break;
770
0
            }
771
0
            if (signature == NULL)
772
0
                continue;
773
774
            /*
775
             * Ensure that the key is provided, either natively, or as a
776
             * cached export.  We start by fetching the keymgmt with the same
777
             * name as |ctx->pkey|, but from the provider of the signature
778
             * method, using the same property query as when fetching the
779
             * signature method.  With the keymgmt we found (if we did), we
780
             * try to export |ctx->pkey| to it (evp_pkey_export_to_provider()
781
             * is smart enough to only actually export it if |tmp_keymgmt|
782
             * is different from |ctx->pkey|'s keymgmt)
783
             */
784
0
            tmp_keymgmt_tofree = tmp_keymgmt = evp_keymgmt_fetch_from_prov((OSSL_PROVIDER *)tmp_prov,
785
0
                EVP_KEYMGMT_get0_name(ctx->keymgmt),
786
0
                ctx->propquery);
787
0
            if (tmp_keymgmt != NULL)
788
0
                provkey = evp_pkey_export_to_provider(ctx->pkey, ctx->libctx,
789
0
                    &tmp_keymgmt, ctx->propquery);
790
0
            if (tmp_keymgmt == NULL)
791
0
                EVP_KEYMGMT_free(tmp_keymgmt_tofree);
792
0
        }
793
794
0
        if (provkey == NULL) {
795
0
            EVP_SIGNATURE_free(signature);
796
0
            goto notsupported;
797
0
        }
798
799
0
        ERR_pop_to_mark();
800
0
    }
801
802
    /* No more legacy from here down to legacy: */
803
804
0
    ctx->op.sig.signature = signature;
805
0
    desc = signature->description != NULL ? signature->description : "";
806
807
0
    ctx->op.sig.algctx = signature->newctx(ossl_provider_ctx(signature->prov), ctx->propquery);
808
0
    if (ctx->op.sig.algctx == NULL) {
809
        /* The provider key can stay in the cache */
810
0
        ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
811
0
        goto err;
812
0
    }
813
814
0
    switch (operation) {
815
0
    case EVP_PKEY_OP_SIGN:
816
0
        if (signature->sign_init == NULL) {
817
0
            ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
818
0
                "%s sign_init:%s", signature->type_name, desc);
819
0
            ret = -2;
820
0
            goto err;
821
0
        }
822
0
        ret = signature->sign_init(ctx->op.sig.algctx, provkey, params);
823
0
        break;
824
0
    case EVP_PKEY_OP_SIGNMSG:
825
0
        if (signature->sign_message_init == NULL) {
826
0
            ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
827
0
                "%s sign_message_init:%s", signature->type_name, desc);
828
0
            ret = -2;
829
0
            goto err;
830
0
        }
831
0
        ret = signature->sign_message_init(ctx->op.sig.algctx, provkey, params);
832
0
        break;
833
0
    case EVP_PKEY_OP_VERIFY:
834
0
        if (signature->verify_init == NULL) {
835
0
            ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
836
0
                "%s verify_init:%s", signature->type_name, desc);
837
0
            ret = -2;
838
0
            goto err;
839
0
        }
840
0
        ret = signature->verify_init(ctx->op.sig.algctx, provkey, params);
841
0
        break;
842
0
    case EVP_PKEY_OP_VERIFYMSG:
843
0
        if (signature->verify_message_init == NULL) {
844
0
            ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
845
0
                "%s verify_message_init:%s", signature->type_name, desc);
846
0
            ret = -2;
847
0
            goto err;
848
0
        }
849
0
        ret = signature->verify_message_init(ctx->op.sig.algctx, provkey, params);
850
0
        break;
851
0
    case EVP_PKEY_OP_VERIFYRECOVER:
852
0
        if (signature->verify_recover_init == NULL) {
853
0
            ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
854
0
                "%s verify_recover_init:%s", signature->type_name, desc);
855
0
            ret = -2;
856
0
            goto err;
857
0
        }
858
0
        ret = signature->verify_recover_init(ctx->op.sig.algctx, provkey, params);
859
0
        break;
860
0
    default:
861
0
        ERR_raise(ERR_LIB_EVP, EVP_R_INITIALIZATION_ERROR);
862
0
        goto err;
863
0
    }
864
865
0
    if (ret <= 0) {
866
0
        signature->freectx(ctx->op.sig.algctx);
867
0
        ctx->op.sig.algctx = NULL;
868
0
        goto err;
869
0
    }
870
0
    goto end;
871
872
0
notsupported:
873
    /*
874
     * If we don't have the full support we need with provided methods,
875
     * let's go see if legacy does.
876
     */
877
0
    ERR_pop_to_mark();
878
0
    EVP_KEYMGMT_free(tmp_keymgmt);
879
0
    tmp_keymgmt = NULL;
880
881
0
    ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
882
0
    return -2;
883
884
0
end:
885
0
#ifndef FIPS_MODULE
886
0
    if (ret > 0)
887
0
        ret = evp_pkey_ctx_use_cached_data(ctx);
888
0
#endif
889
890
0
    EVP_KEYMGMT_free(tmp_keymgmt);
891
0
    return ret;
892
0
err:
893
0
    evp_pkey_ctx_free_old_ops(ctx);
894
0
    ctx->operation = EVP_PKEY_OP_UNDEFINED;
895
0
    EVP_KEYMGMT_free(tmp_keymgmt);
896
0
    return ret;
897
0
}
898
899
int EVP_PKEY_sign_init(EVP_PKEY_CTX *ctx)
900
0
{
901
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_SIGN, NULL);
902
0
}
903
904
int EVP_PKEY_sign_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[])
905
0
{
906
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_SIGN, params);
907
0
}
908
909
int EVP_PKEY_sign_init_ex2(EVP_PKEY_CTX *ctx,
910
    EVP_SIGNATURE *algo, const OSSL_PARAM params[])
911
0
{
912
0
    return evp_pkey_signature_init(ctx, algo, EVP_PKEY_OP_SIGN, params);
913
0
}
914
915
int EVP_PKEY_sign_message_init(EVP_PKEY_CTX *ctx,
916
    EVP_SIGNATURE *algo, const OSSL_PARAM params[])
917
0
{
918
0
    return evp_pkey_signature_init(ctx, algo, EVP_PKEY_OP_SIGNMSG, params);
919
0
}
920
921
int EVP_PKEY_sign_message_update(EVP_PKEY_CTX *ctx,
922
    const unsigned char *in, size_t inlen)
923
0
{
924
0
    EVP_SIGNATURE *signature;
925
0
    const char *desc;
926
0
    int ret;
927
928
0
    if (ctx == NULL) {
929
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
930
0
        return -1;
931
0
    }
932
933
0
    if (ctx->operation != EVP_PKEY_OP_SIGNMSG) {
934
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
935
0
        return -1;
936
0
    }
937
938
0
    signature = ctx->op.sig.signature;
939
0
    desc = signature->description != NULL ? signature->description : "";
940
0
    if (signature->sign_message_update == NULL) {
941
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
942
0
            "%s sign_message_update:%s", signature->type_name, desc);
943
0
        return -2;
944
0
    }
945
946
0
    ret = signature->sign_message_update(ctx->op.sig.algctx, in, inlen);
947
0
    if (ret <= 0)
948
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
949
0
            "%s sign_message_update:%s", signature->type_name, desc);
950
0
    return ret;
951
0
}
952
953
int EVP_PKEY_sign_message_final(EVP_PKEY_CTX *ctx,
954
    unsigned char *sig, size_t *siglen)
955
0
{
956
0
    EVP_SIGNATURE *signature;
957
0
    const char *desc;
958
0
    int ret;
959
960
0
    if (ctx == NULL) {
961
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
962
0
        return -1;
963
0
    }
964
965
0
    if (ctx->operation != EVP_PKEY_OP_SIGNMSG) {
966
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
967
0
        return -1;
968
0
    }
969
970
0
    signature = ctx->op.sig.signature;
971
0
    desc = signature->description != NULL ? signature->description : "";
972
0
    if (signature->sign_message_final == NULL) {
973
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
974
0
            "%s sign_message_final:%s", signature->type_name, desc);
975
0
        return -2;
976
0
    }
977
978
0
    ret = signature->sign_message_final(ctx->op.sig.algctx, sig, siglen,
979
0
        (sig == NULL) ? 0 : *siglen);
980
0
    if (ret <= 0)
981
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
982
0
            "%s sign_message_final:%s", signature->type_name, desc);
983
0
    return ret;
984
0
}
985
986
int EVP_PKEY_sign(EVP_PKEY_CTX *ctx,
987
    unsigned char *sig, size_t *siglen,
988
    const unsigned char *tbs, size_t tbslen)
989
0
{
990
0
    EVP_SIGNATURE *signature;
991
0
    const char *desc;
992
0
    int ret;
993
994
0
    if (ctx == NULL) {
995
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
996
0
        return -1;
997
0
    }
998
999
0
    if (ctx->operation != EVP_PKEY_OP_SIGN
1000
0
        && ctx->operation != EVP_PKEY_OP_SIGNMSG) {
1001
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
1002
0
        return -1;
1003
0
    }
1004
1005
0
    if (ctx->op.sig.algctx == NULL) {
1006
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
1007
0
        return -2;
1008
0
    }
1009
1010
0
    signature = ctx->op.sig.signature;
1011
0
    desc = signature->description != NULL ? signature->description : "";
1012
0
    if (signature->sign == NULL) {
1013
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
1014
0
            "%s sign:%s", signature->type_name, desc);
1015
0
        return -2;
1016
0
    }
1017
1018
0
    ret = signature->sign(ctx->op.sig.algctx, sig, siglen,
1019
0
        (sig == NULL) ? 0 : *siglen, tbs, tbslen);
1020
0
    if (ret <= 0)
1021
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
1022
0
            "%s sign:%s", signature->type_name, desc);
1023
0
    return ret;
1024
0
}
1025
1026
int EVP_PKEY_verify_init(EVP_PKEY_CTX *ctx)
1027
0
{
1028
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_VERIFY, NULL);
1029
0
}
1030
1031
int EVP_PKEY_verify_init_ex(EVP_PKEY_CTX *ctx, const OSSL_PARAM params[])
1032
0
{
1033
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_VERIFY, params);
1034
0
}
1035
1036
int EVP_PKEY_verify_init_ex2(EVP_PKEY_CTX *ctx,
1037
    EVP_SIGNATURE *algo, const OSSL_PARAM params[])
1038
0
{
1039
0
    return evp_pkey_signature_init(ctx, algo, EVP_PKEY_OP_VERIFY, params);
1040
0
}
1041
1042
int EVP_PKEY_verify_message_init(EVP_PKEY_CTX *ctx,
1043
    EVP_SIGNATURE *algo, const OSSL_PARAM params[])
1044
0
{
1045
0
    return evp_pkey_signature_init(ctx, algo, EVP_PKEY_OP_VERIFYMSG, params);
1046
0
}
1047
1048
int EVP_PKEY_CTX_set_signature(EVP_PKEY_CTX *ctx,
1049
    const unsigned char *sig, size_t siglen)
1050
0
{
1051
0
    OSSL_PARAM sig_params[2], *p = sig_params;
1052
1053
0
    if (ctx == NULL) {
1054
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
1055
0
        return 0;
1056
0
    }
1057
1058
0
    *p++ = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
1059
        /*
1060
         * Cast away the const. This is
1061
         * read only so should be safe
1062
         */
1063
0
        (char *)sig, siglen);
1064
0
    *p = OSSL_PARAM_construct_end();
1065
1066
0
    return EVP_PKEY_CTX_set_params(ctx, sig_params);
1067
0
}
1068
1069
int EVP_PKEY_verify_message_update(EVP_PKEY_CTX *ctx,
1070
    const unsigned char *in, size_t inlen)
1071
0
{
1072
0
    EVP_SIGNATURE *signature;
1073
0
    const char *desc;
1074
0
    int ret;
1075
1076
0
    if (ctx == NULL) {
1077
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
1078
0
        return -1;
1079
0
    }
1080
1081
0
    if (ctx->operation != EVP_PKEY_OP_VERIFYMSG) {
1082
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
1083
0
        return -1;
1084
0
    }
1085
1086
0
    signature = ctx->op.sig.signature;
1087
0
    desc = signature->description != NULL ? signature->description : "";
1088
0
    if (signature->verify_message_update == NULL) {
1089
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
1090
0
            "%s verify_message_update:%s", signature->type_name, desc);
1091
0
        return -2;
1092
0
    }
1093
1094
0
    ret = signature->verify_message_update(ctx->op.sig.algctx, in, inlen);
1095
0
    if (ret <= 0)
1096
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
1097
0
            "%s verify_message_update:%s", signature->type_name, desc);
1098
0
    return ret;
1099
0
}
1100
1101
int EVP_PKEY_verify_message_final(EVP_PKEY_CTX *ctx)
1102
0
{
1103
0
    EVP_SIGNATURE *signature;
1104
0
    const char *desc;
1105
0
    int ret;
1106
1107
0
    if (ctx == NULL) {
1108
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
1109
0
        return -1;
1110
0
    }
1111
1112
0
    if (ctx->operation != EVP_PKEY_OP_VERIFYMSG) {
1113
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
1114
0
        return -1;
1115
0
    }
1116
1117
0
    signature = ctx->op.sig.signature;
1118
0
    desc = signature->description != NULL ? signature->description : "";
1119
0
    if (signature->verify_message_final == NULL) {
1120
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
1121
0
            "%s verify_message_final:%s", signature->type_name, desc);
1122
0
        return -2;
1123
0
    }
1124
1125
    /* The signature must have been set with EVP_PKEY_CTX_set_signature() */
1126
0
    ret = signature->verify_message_final(ctx->op.sig.algctx);
1127
0
    if (ret <= 0)
1128
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
1129
0
            "%s verify_message_final:%s", signature->type_name, desc);
1130
0
    return ret;
1131
0
}
1132
1133
int EVP_PKEY_verify(EVP_PKEY_CTX *ctx,
1134
    const unsigned char *sig, size_t siglen,
1135
    const unsigned char *tbs, size_t tbslen)
1136
0
{
1137
0
    EVP_SIGNATURE *signature;
1138
0
    const char *desc;
1139
0
    int ret;
1140
1141
0
    if (ctx == NULL) {
1142
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
1143
0
        return -1;
1144
0
    }
1145
1146
0
    if (ctx->operation != EVP_PKEY_OP_VERIFY
1147
0
        && ctx->operation != EVP_PKEY_OP_VERIFYMSG) {
1148
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
1149
0
        return -1;
1150
0
    }
1151
1152
0
    if (ctx->op.sig.algctx == NULL) {
1153
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
1154
0
        return -2;
1155
0
    }
1156
1157
0
    signature = ctx->op.sig.signature;
1158
0
    desc = signature->description != NULL ? signature->description : "";
1159
0
    if (signature->verify == NULL) {
1160
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
1161
0
            "%s verify:%s", signature->type_name, desc);
1162
0
        return -2;
1163
0
    }
1164
1165
0
    ret = ctx->op.sig.signature->verify(ctx->op.sig.algctx, sig, siglen,
1166
0
        tbs, tbslen);
1167
0
    if (ret <= 0)
1168
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
1169
0
            "%s verify:%s", signature->type_name, desc);
1170
1171
0
    return ret;
1172
0
}
1173
1174
int EVP_PKEY_verify_recover_init(EVP_PKEY_CTX *ctx)
1175
0
{
1176
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_VERIFYRECOVER, NULL);
1177
0
}
1178
1179
int EVP_PKEY_verify_recover_init_ex(EVP_PKEY_CTX *ctx,
1180
    const OSSL_PARAM params[])
1181
0
{
1182
0
    return evp_pkey_signature_init(ctx, NULL, EVP_PKEY_OP_VERIFYRECOVER, params);
1183
0
}
1184
1185
int EVP_PKEY_verify_recover_init_ex2(EVP_PKEY_CTX *ctx,
1186
    EVP_SIGNATURE *algo, const OSSL_PARAM params[])
1187
0
{
1188
0
    return evp_pkey_signature_init(ctx, algo, EVP_PKEY_OP_VERIFYRECOVER, params);
1189
0
}
1190
1191
int EVP_PKEY_verify_recover(EVP_PKEY_CTX *ctx,
1192
    unsigned char *rout, size_t *routlen,
1193
    const unsigned char *sig, size_t siglen)
1194
0
{
1195
0
    EVP_SIGNATURE *signature;
1196
0
    const char *desc;
1197
0
    int ret;
1198
1199
0
    if (ctx == NULL) {
1200
0
        ERR_raise(ERR_LIB_EVP, ERR_R_PASSED_NULL_PARAMETER);
1201
0
        return -1;
1202
0
    }
1203
1204
0
    if (ctx->operation != EVP_PKEY_OP_VERIFYRECOVER) {
1205
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_INITIALIZED);
1206
0
        return -1;
1207
0
    }
1208
1209
0
    if (ctx->op.sig.algctx == NULL) {
1210
0
        ERR_raise(ERR_LIB_EVP, EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
1211
0
        return -2;
1212
0
    }
1213
1214
0
    signature = ctx->op.sig.signature;
1215
0
    desc = signature->description != NULL ? signature->description : "";
1216
0
    if (signature->verify_recover == NULL) {
1217
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_NOT_SUPPORTED,
1218
0
            "%s verify_recover:%s", signature->type_name, desc);
1219
0
        return -2;
1220
0
    }
1221
1222
0
    ret = signature->verify_recover(ctx->op.sig.algctx, rout, routlen,
1223
0
        (rout == NULL ? 0 : *routlen), sig, siglen);
1224
0
    if (ret <= 0)
1225
0
        ERR_raise_data(ERR_LIB_EVP, EVP_R_PROVIDER_SIGNATURE_FAILURE,
1226
0
            "%s verify_recover:%s", signature->type_name, desc);
1227
0
    return ret;
1228
0
}