Coverage Report

Created: 2026-10-28 06:28

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl36/providers/implementations/signature/rsa_sig.c
Line
Count
Source
1
/*
2
 * Copyright 2019-2026 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the Apache License 2.0 (the "License").  You may not use
5
 * this file except in compliance with the License.  You can obtain a copy
6
 * in the file LICENSE in the source distribution or at
7
 * https://www.openssl.org/source/license.html
8
 */
9
/* clang-format off */
10
11
/* clang-format on */
12
13
/*
14
 * RSA low level APIs are deprecated for public use, but still ok for
15
 * internal use.
16
 */
17
#include "internal/deprecated.h"
18
19
#include <string.h>
20
#include <openssl/crypto.h>
21
#include <openssl/core_dispatch.h>
22
#include <openssl/core_names.h>
23
#include <openssl/err.h>
24
#include <openssl/obj_mac.h>
25
#include <openssl/rsa.h>
26
#include <openssl/params.h>
27
#include <openssl/evp.h>
28
#include <openssl/proverr.h>
29
#include "internal/cryptlib.h"
30
#include "internal/nelem.h"
31
#include "internal/sizes.h"
32
#include "crypto/rsa.h"
33
#include "prov/providercommon.h"
34
#include "prov/implementations.h"
35
#include "prov/provider_ctx.h"
36
#include "prov/der_rsa.h"
37
#include "prov/securitycheck.h"
38
39
0
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
40
41
static OSSL_FUNC_signature_newctx_fn rsa_newctx;
42
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
43
static OSSL_FUNC_signature_verify_init_fn rsa_verify_init;
44
static OSSL_FUNC_signature_verify_recover_init_fn rsa_verify_recover_init;
45
static OSSL_FUNC_signature_sign_fn rsa_sign;
46
static OSSL_FUNC_signature_sign_message_update_fn rsa_signverify_message_update;
47
static OSSL_FUNC_signature_sign_message_final_fn rsa_sign_message_final;
48
static OSSL_FUNC_signature_verify_fn rsa_verify;
49
static OSSL_FUNC_signature_verify_recover_fn rsa_verify_recover;
50
static OSSL_FUNC_signature_verify_message_update_fn rsa_signverify_message_update;
51
static OSSL_FUNC_signature_verify_message_final_fn rsa_verify_message_final;
52
static OSSL_FUNC_signature_digest_sign_init_fn rsa_digest_sign_init;
53
static OSSL_FUNC_signature_digest_sign_update_fn rsa_digest_sign_update;
54
static OSSL_FUNC_signature_digest_sign_final_fn rsa_digest_sign_final;
55
static OSSL_FUNC_signature_digest_verify_init_fn rsa_digest_verify_init;
56
static OSSL_FUNC_signature_digest_verify_update_fn rsa_digest_verify_update;
57
static OSSL_FUNC_signature_digest_verify_final_fn rsa_digest_verify_final;
58
static OSSL_FUNC_signature_freectx_fn rsa_freectx;
59
static OSSL_FUNC_signature_dupctx_fn rsa_dupctx;
60
static OSSL_FUNC_signature_query_key_types_fn rsa_sigalg_query_key_types;
61
static OSSL_FUNC_signature_get_ctx_params_fn rsa_get_ctx_params;
62
static OSSL_FUNC_signature_gettable_ctx_params_fn rsa_gettable_ctx_params;
63
static OSSL_FUNC_signature_set_ctx_params_fn rsa_set_ctx_params;
64
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_settable_ctx_params;
65
static OSSL_FUNC_signature_get_ctx_md_params_fn rsa_get_ctx_md_params;
66
static OSSL_FUNC_signature_gettable_ctx_md_params_fn rsa_gettable_ctx_md_params;
67
static OSSL_FUNC_signature_set_ctx_md_params_fn rsa_set_ctx_md_params;
68
static OSSL_FUNC_signature_settable_ctx_md_params_fn rsa_settable_ctx_md_params;
69
static OSSL_FUNC_signature_set_ctx_params_fn rsa_sigalg_set_ctx_params;
70
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_sigalg_settable_ctx_params;
71
72
static OSSL_ITEM padding_item[] = {
73
    { RSA_PKCS1_PADDING, OSSL_PKEY_RSA_PAD_MODE_PKCSV15 },
74
    { RSA_NO_PADDING, OSSL_PKEY_RSA_PAD_MODE_NONE },
75
    { RSA_X931_PADDING, OSSL_PKEY_RSA_PAD_MODE_X931 },
76
    { RSA_PKCS1_PSS_PADDING, OSSL_PKEY_RSA_PAD_MODE_PSS },
77
    { 0, NULL }
78
};
79
80
/*
81
 * What's passed as an actual key is defined by the KEYMGMT interface.
82
 * We happen to know that our KEYMGMT simply passes RSA structures, so
83
 * we use that here too.
84
 */
85
86
typedef struct {
87
    OSSL_LIB_CTX *libctx;
88
    char *propq;
89
    RSA *rsa;
90
    int operation;
91
92
    /*
93
     * Flag to determine if a full sigalg is run (1) or if a composable
94
     * signature algorithm is run (0).
95
     *
96
     * When a full sigalg is run (1), this currently affects the following
97
     * other flags, which are to remain untouched after their initialization:
98
     *
99
     * - flag_allow_md (initialized to 0)
100
     */
101
    unsigned int flag_sigalg : 1;
102
    /*
103
     * Flag to determine if the hash function can be changed (1) or not (0)
104
     * Because it's dangerous to change during a DigestSign or DigestVerify
105
     * operation, this flag is cleared by their Init function, and set again
106
     * by their Final function.
107
     * Implementations of full sigalgs (such as RSA-SHA256) hard-code this
108
     * flag to not allow changes (0).
109
     */
110
    unsigned int flag_allow_md : 1;
111
    unsigned int mgf1_md_set : 1;
112
    /*
113
     * Flags to say what are the possible next external calls in what
114
     * constitutes the life cycle of an algorithm.  The relevant calls are:
115
     * - init
116
     * - update
117
     * - final
118
     * - oneshot
119
     * All other external calls are regarded as utilitarian and are allowed
120
     * at any time (they may be affected by other flags, like flag_allow_md,
121
     * though).
122
     */
123
    unsigned int flag_allow_update : 1;
124
    unsigned int flag_allow_final : 1;
125
    unsigned int flag_allow_oneshot : 1;
126
127
    /* main digest */
128
    EVP_MD *md;
129
    EVP_MD_CTX *mdctx;
130
    int mdnid;
131
    char mdname[OSSL_MAX_NAME_SIZE]; /* Purely informational */
132
133
    /* RSA padding mode */
134
    int pad_mode;
135
    /* message digest for MGF1 */
136
    EVP_MD *mgf1_md;
137
    int mgf1_mdnid;
138
    char mgf1_mdname[OSSL_MAX_NAME_SIZE]; /* Purely informational */
139
    /* PSS salt length */
140
    int saltlen;
141
    /* Minimum salt length or -1 if no PSS parameter restriction */
142
    int min_saltlen;
143
144
    /* Signature, for verification */
145
    unsigned char *sig;
146
    size_t siglen;
147
148
#ifdef FIPS_MODULE
149
    /*
150
     * FIPS 140-3 IG 2.4.B mandates that verification based on a digest of a
151
     * message is not permitted.  However, signing based on a digest is still
152
     * permitted.
153
     */
154
    int verify_message;
155
#endif
156
157
    /* Temp buffer */
158
    unsigned char *tbuf;
159
160
    OSSL_FIPS_IND_DECLARE
161
} PROV_RSA_CTX;
162
163
/* True if PSS parameters are restricted */
164
62.4k
#define rsa_pss_restricted(prsactx) (prsactx->min_saltlen != -1)
165
166
static int rsa_get_md_size(const PROV_RSA_CTX *prsactx)
167
34.5k
{
168
34.5k
    int md_size;
169
170
34.5k
    if (prsactx->md != NULL) {
171
34.5k
        md_size = EVP_MD_get_size(prsactx->md);
172
34.5k
        if (md_size <= 0)
173
0
            return 0;
174
34.5k
        return md_size;
175
34.5k
    }
176
0
    return 0;
177
34.5k
}
178
179
static int rsa_check_padding(const PROV_RSA_CTX *prsactx,
180
    const char *mdname, const char *mgf1_mdname,
181
    int mdnid)
182
118k
{
183
118k
    switch (prsactx->pad_mode) {
184
0
    case RSA_NO_PADDING:
185
0
        if (mdname != NULL || mdnid != NID_undef) {
186
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE);
187
0
            return 0;
188
0
        }
189
0
        break;
190
0
    case RSA_X931_PADDING:
191
0
        if (RSA_X931_hash_id(mdnid) == -1) {
192
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_X931_DIGEST);
193
0
            return 0;
194
0
        }
195
0
        break;
196
56.8k
    case RSA_PKCS1_PSS_PADDING:
197
56.8k
        if (rsa_pss_restricted(prsactx))
198
3.12k
            if ((mdname != NULL && !EVP_MD_is_a(prsactx->md, mdname))
199
3.09k
                || (mgf1_mdname != NULL
200
766
                    && !EVP_MD_is_a(prsactx->mgf1_md, mgf1_mdname))) {
201
30
                ERR_raise(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED);
202
30
                return 0;
203
30
            }
204
56.8k
        break;
205
61.4k
    default:
206
61.4k
        break;
207
118k
    }
208
209
118k
    return 1;
210
118k
}
211
212
static int rsa_check_parameters(PROV_RSA_CTX *prsactx, int min_saltlen)
213
856
{
214
856
    if (prsactx->pad_mode == RSA_PKCS1_PSS_PADDING) {
215
856
        int max_saltlen;
216
217
        /* See if minimum salt length exceeds maximum possible */
218
856
        max_saltlen = RSA_size(prsactx->rsa) - EVP_MD_get_size(prsactx->md);
219
856
        if ((RSA_bits(prsactx->rsa) & 0x7) == 1)
220
364
            max_saltlen--;
221
856
        if (min_saltlen < 0 || min_saltlen > max_saltlen) {
222
42
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
223
42
            return 0;
224
42
        }
225
814
        prsactx->min_saltlen = min_saltlen;
226
814
    }
227
814
    return 1;
228
856
}
229
230
static void *rsa_newctx(void *provctx, const char *propq)
231
62.4k
{
232
62.4k
    PROV_RSA_CTX *prsactx = NULL;
233
62.4k
    char *propq_copy = NULL;
234
235
62.4k
    if (!ossl_prov_is_running())
236
0
        return NULL;
237
238
62.4k
    if ((prsactx = OPENSSL_zalloc(sizeof(PROV_RSA_CTX))) == NULL
239
62.4k
        || (propq != NULL
240
0
            && (propq_copy = OPENSSL_strdup(propq)) == NULL)) {
241
0
        OPENSSL_free(prsactx);
242
0
        return NULL;
243
0
    }
244
245
62.4k
    OSSL_FIPS_IND_INIT(prsactx)
246
62.4k
    prsactx->libctx = PROV_LIBCTX_OF(provctx);
247
62.4k
    prsactx->flag_allow_md = 1;
248
#ifdef FIPS_MODULE
249
    prsactx->verify_message = 1;
250
#endif
251
62.4k
    prsactx->propq = propq_copy;
252
    /* Maximum up to digest length for sign, auto for verify */
253
62.4k
    prsactx->saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
254
62.4k
    prsactx->min_saltlen = -1;
255
62.4k
    return prsactx;
256
62.4k
}
257
258
static int rsa_pss_compute_saltlen(PROV_RSA_CTX *ctx)
259
0
{
260
0
    int saltlen = ctx->saltlen;
261
0
    int saltlenMax = -1;
262
263
    /* FIPS 186-4 section 5 "The RSA Digital Signature Algorithm", subsection
264
     * 5.5 "PKCS #1" says: "For RSASSA-PSS […] the length (in bytes) of the
265
     * salt (sLen) shall satisfy 0 <= sLen <= hLen, where hLen is the length of
266
     * the hash function output block (in bytes)."
267
     *
268
     * Provide a way to use at most the digest length, so that the default does
269
     * not violate FIPS 186-4. */
270
0
    if (saltlen == RSA_PSS_SALTLEN_DIGEST) {
271
0
        if ((saltlen = EVP_MD_get_size(ctx->md)) <= 0) {
272
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
273
0
            return -1;
274
0
        }
275
0
    } else if (saltlen == RSA_PSS_SALTLEN_AUTO_DIGEST_MAX) {
276
0
        saltlen = RSA_PSS_SALTLEN_MAX;
277
0
        if ((saltlenMax = EVP_MD_get_size(ctx->md)) <= 0) {
278
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
279
0
            return -1;
280
0
        }
281
0
    }
282
0
    if (saltlen == RSA_PSS_SALTLEN_MAX || saltlen == RSA_PSS_SALTLEN_AUTO) {
283
0
        int mdsize, rsasize;
284
285
0
        if ((mdsize = EVP_MD_get_size(ctx->md)) <= 0) {
286
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
287
0
            return -1;
288
0
        }
289
0
        if ((rsasize = RSA_size(ctx->rsa)) <= 2 || rsasize - 2 < mdsize) {
290
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY);
291
0
            return -1;
292
0
        }
293
0
        saltlen = rsasize - mdsize - 2;
294
0
        if ((RSA_bits(ctx->rsa) & 0x7) == 1)
295
0
            saltlen--;
296
0
        if (saltlenMax >= 0 && saltlen > saltlenMax)
297
0
            saltlen = saltlenMax;
298
0
    }
299
0
    if (saltlen < 0) {
300
0
        ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
301
0
        return -1;
302
0
    } else if (saltlen < ctx->min_saltlen) {
303
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_PSS_SALTLEN_TOO_SMALL,
304
0
            "minimum salt length: %d, actual salt length: %d",
305
0
            ctx->min_saltlen, saltlen);
306
0
        return -1;
307
0
    }
308
0
    return saltlen;
309
0
}
310
311
static unsigned char *rsa_generate_signature_aid(PROV_RSA_CTX *ctx,
312
    unsigned char *aid_buf,
313
    size_t buf_len,
314
    size_t *aid_len)
315
0
{
316
0
    WPACKET pkt;
317
0
    unsigned char *aid = NULL;
318
0
    int saltlen;
319
0
    RSA_PSS_PARAMS_30 pss_params;
320
0
    int ret;
321
322
0
    if (!WPACKET_init_der(&pkt, aid_buf, buf_len)) {
323
0
        ERR_raise(ERR_LIB_PROV, ERR_R_CRYPTO_LIB);
324
0
        return NULL;
325
0
    }
326
327
0
    switch (ctx->pad_mode) {
328
0
    case RSA_PKCS1_PADDING:
329
0
        ret = ossl_DER_w_algorithmIdentifier_MDWithRSAEncryption(&pkt, -1,
330
0
            ctx->mdnid);
331
332
0
        if (ret > 0) {
333
0
            break;
334
0
        } else if (ret == 0) {
335
0
            ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
336
0
            goto cleanup;
337
0
        }
338
0
        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
339
0
            "Algorithm ID generation - md NID: %d",
340
0
            ctx->mdnid);
341
0
        goto cleanup;
342
0
    case RSA_PKCS1_PSS_PADDING:
343
0
        saltlen = rsa_pss_compute_saltlen(ctx);
344
0
        if (saltlen < 0)
345
0
            goto cleanup;
346
0
        if (!ossl_rsa_pss_params_30_set_defaults(&pss_params)
347
0
            || !ossl_rsa_pss_params_30_set_hashalg(&pss_params, ctx->mdnid)
348
0
            || !ossl_rsa_pss_params_30_set_maskgenhashalg(&pss_params,
349
0
                ctx->mgf1_mdnid)
350
0
            || !ossl_rsa_pss_params_30_set_saltlen(&pss_params, saltlen)
351
0
            || !ossl_DER_w_algorithmIdentifier_RSA_PSS(&pkt, -1,
352
0
                RSA_FLAG_TYPE_RSASSAPSS,
353
0
                &pss_params)) {
354
0
            ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
355
0
            goto cleanup;
356
0
        }
357
0
        break;
358
0
    default:
359
0
        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
360
0
            "Algorithm ID generation - pad mode: %d",
361
0
            ctx->pad_mode);
362
0
        goto cleanup;
363
0
    }
364
0
    if (WPACKET_finish(&pkt)) {
365
0
        WPACKET_get_total_written(&pkt, aid_len);
366
0
        aid = WPACKET_get_curr(&pkt);
367
0
    }
368
0
cleanup:
369
0
    WPACKET_cleanup(&pkt);
370
0
    return aid;
371
0
}
372
373
static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
374
    const char *mdprops, const char *desc)
375
62.4k
{
376
62.4k
    EVP_MD *md = NULL;
377
378
62.4k
    if (mdprops == NULL)
379
62.4k
        mdprops = ctx->propq;
380
381
62.4k
    if (mdname != NULL) {
382
62.4k
        int md_nid;
383
62.4k
        size_t mdname_len = strlen(mdname);
384
385
62.4k
        md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
386
387
62.4k
        if (md == NULL) {
388
80
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
389
80
                "%s could not be fetched", mdname);
390
80
            goto err;
391
80
        }
392
62.3k
        md_nid = ossl_digest_rsa_sign_get_md_nid(md);
393
62.3k
        if (md_nid == NID_undef) {
394
2
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
395
2
                "digest=%s", mdname);
396
2
            goto err;
397
2
        }
398
        /*
399
         * XOF digests are not allowed except for RSA PSS.
400
         * We don't support XOF digests with RSA PSS (yet), so just fail.
401
         * When we do support them, uncomment the second clause.
402
         */
403
62.3k
        if (EVP_MD_xof(md)
404
62.3k
            /* && ctx->pad_mode != RSA_PKCS1_PSS_PADDING */) {
405
0
            ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
406
0
            goto err;
407
0
        }
408
#ifdef FIPS_MODULE
409
        {
410
            int sha1_allowed
411
                = ((ctx->operation
412
                       & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG))
413
                    == 0);
414
415
            if (!ossl_fips_ind_digest_sign_check(OSSL_FIPS_IND_GET(ctx),
416
                    OSSL_FIPS_IND_SETTABLE1,
417
                    ctx->libctx,
418
                    md_nid, sha1_allowed, 1, desc,
419
                    ossl_fips_config_signature_digest_check))
420
                goto err;
421
        }
422
#endif
423
424
62.3k
        if (!rsa_check_padding(ctx, mdname, NULL, md_nid))
425
30
            goto err;
426
62.3k
        if (mdname_len >= sizeof(ctx->mdname)) {
427
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
428
0
                "%s exceeds name buffer length", mdname);
429
0
            goto err;
430
0
        }
431
432
62.3k
        if (!ctx->flag_allow_md) {
433
0
            if (ctx->mdname[0] != '\0' && !EVP_MD_is_a(md, ctx->mdname)) {
434
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
435
0
                    "digest %s != %s", mdname, ctx->mdname);
436
0
                goto err;
437
0
            }
438
0
            EVP_MD_free(md);
439
0
            return 1;
440
0
        }
441
442
62.3k
        if (!ctx->mgf1_md_set) {
443
61.4k
            if (!EVP_MD_up_ref(md)) {
444
0
                goto err;
445
0
            }
446
61.4k
            EVP_MD_free(ctx->mgf1_md);
447
61.4k
            ctx->mgf1_md = md;
448
61.4k
            ctx->mgf1_mdnid = md_nid;
449
61.4k
            OPENSSL_strlcpy(ctx->mgf1_mdname, mdname, sizeof(ctx->mgf1_mdname));
450
61.4k
        }
451
452
62.3k
        EVP_MD_CTX_free(ctx->mdctx);
453
62.3k
        EVP_MD_free(ctx->md);
454
455
62.3k
        ctx->mdctx = NULL;
456
62.3k
        ctx->md = md;
457
62.3k
        ctx->mdnid = md_nid;
458
62.3k
        OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
459
62.3k
    }
460
461
62.3k
    return 1;
462
112
err:
463
112
    EVP_MD_free(md);
464
112
    return 0;
465
62.4k
}
466
467
static int rsa_setup_mgf1_md(PROV_RSA_CTX *ctx, const char *mdname,
468
    const char *mdprops)
469
5.07k
{
470
5.07k
    size_t len;
471
5.07k
    EVP_MD *md = NULL;
472
5.07k
    int mdnid;
473
474
5.07k
    if (mdprops == NULL)
475
5.07k
        mdprops = ctx->propq;
476
477
5.07k
    if ((md = EVP_MD_fetch(ctx->libctx, mdname, mdprops)) == NULL) {
478
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
479
0
            "%s could not be fetched", mdname);
480
0
        return 0;
481
0
    }
482
    /* The default for mgf1 is SHA1 - so allow SHA1 */
483
5.07k
    if ((mdnid = ossl_digest_rsa_sign_get_md_nid(md)) <= 0
484
5.06k
        || !rsa_check_padding(ctx, NULL, mdname, mdnid)) {
485
1
        if (mdnid <= 0)
486
1
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
487
1
                "digest=%s", mdname);
488
1
        EVP_MD_free(md);
489
1
        return 0;
490
1
    }
491
5.06k
    len = OPENSSL_strlcpy(ctx->mgf1_mdname, mdname, sizeof(ctx->mgf1_mdname));
492
5.06k
    if (len >= sizeof(ctx->mgf1_mdname)) {
493
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
494
0
            "%s exceeds name buffer length", mdname);
495
0
        EVP_MD_free(md);
496
0
        return 0;
497
0
    }
498
499
5.06k
    EVP_MD_free(ctx->mgf1_md);
500
5.06k
    ctx->mgf1_md = md;
501
5.06k
    ctx->mgf1_mdnid = mdnid;
502
5.06k
    ctx->mgf1_md_set = 1;
503
5.06k
    return 1;
504
5.06k
}
505
506
static int
507
rsa_signverify_init(PROV_RSA_CTX *prsactx, void *vrsa,
508
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
509
    const OSSL_PARAM params[], int operation,
510
    const char *desc)
511
62.4k
{
512
62.4k
    int protect;
513
514
62.4k
    if (!ossl_prov_is_running() || prsactx == NULL)
515
0
        return 0;
516
517
62.4k
    if (vrsa == NULL && prsactx->rsa == NULL) {
518
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
519
0
        return 0;
520
0
    }
521
522
62.4k
    if (vrsa != NULL) {
523
62.4k
        if (!RSA_up_ref(vrsa))
524
0
            return 0;
525
62.4k
        RSA_free(prsactx->rsa);
526
62.4k
        prsactx->rsa = vrsa;
527
62.4k
    }
528
62.4k
    if (!ossl_rsa_key_op_get_protect(prsactx->rsa, operation, &protect))
529
0
        return 0;
530
531
62.4k
    prsactx->operation = operation;
532
62.4k
    prsactx->flag_allow_update = 1;
533
62.4k
    prsactx->flag_allow_final = 1;
534
62.4k
    prsactx->flag_allow_oneshot = 1;
535
536
    /* Maximize up to digest length for sign, auto for verify */
537
62.4k
    prsactx->saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
538
62.4k
    prsactx->min_saltlen = -1;
539
540
62.4k
    switch (RSA_test_flags(prsactx->rsa, RSA_FLAG_TYPE_MASK)) {
541
61.5k
    case RSA_FLAG_TYPE_RSA:
542
61.5k
        prsactx->pad_mode = RSA_PKCS1_PADDING;
543
61.5k
        break;
544
885
    case RSA_FLAG_TYPE_RSASSAPSS:
545
885
        prsactx->pad_mode = RSA_PKCS1_PSS_PADDING;
546
547
885
        {
548
885
            const RSA_PSS_PARAMS_30 *pss = ossl_rsa_get0_pss_params_30(prsactx->rsa);
549
550
885
            if (!ossl_rsa_pss_params_30_is_unrestricted(pss)) {
551
860
                int md_nid = ossl_rsa_pss_params_30_hashalg(pss);
552
860
                int mgf1md_nid = ossl_rsa_pss_params_30_maskgenhashalg(pss);
553
860
                int min_saltlen = ossl_rsa_pss_params_30_saltlen(pss);
554
860
                const char *mdname, *mgf1mdname;
555
860
                size_t len;
556
557
860
                mdname = ossl_rsa_oaeppss_nid2name(md_nid);
558
860
                mgf1mdname = ossl_rsa_oaeppss_nid2name(mgf1md_nid);
559
560
860
                if (mdname == NULL) {
561
2
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
562
2
                        "PSS restrictions lack hash algorithm");
563
2
                    return 0;
564
2
                }
565
858
                if (mgf1mdname == NULL) {
566
2
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
567
2
                        "PSS restrictions lack MGF1 hash algorithm");
568
2
                    return 0;
569
2
                }
570
571
856
                len = OPENSSL_strlcpy(prsactx->mdname, mdname,
572
856
                    sizeof(prsactx->mdname));
573
856
                if (len >= sizeof(prsactx->mdname)) {
574
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
575
0
                        "hash algorithm name too long");
576
0
                    return 0;
577
0
                }
578
856
                len = OPENSSL_strlcpy(prsactx->mgf1_mdname, mgf1mdname,
579
856
                    sizeof(prsactx->mgf1_mdname));
580
856
                if (len >= sizeof(prsactx->mgf1_mdname)) {
581
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
582
0
                        "MGF1 hash algorithm name too long");
583
0
                    return 0;
584
0
                }
585
856
                prsactx->saltlen = min_saltlen;
586
587
                /* call rsa_setup_mgf1_md before rsa_setup_md to avoid duplication */
588
856
                if (!rsa_setup_mgf1_md(prsactx, mgf1mdname, prsactx->propq)
589
856
                    || !rsa_setup_md(prsactx, mdname, prsactx->propq, desc)
590
856
                    || !rsa_check_parameters(prsactx, min_saltlen))
591
42
                    return 0;
592
856
            }
593
885
        }
594
595
839
        break;
596
839
    default:
597
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
598
0
        return 0;
599
62.4k
    }
600
601
62.3k
    OSSL_FIPS_IND_SET_APPROVED(prsactx)
602
62.3k
    if (!set_ctx_params(prsactx, params))
603
5
        return 0;
604
#ifdef FIPS_MODULE
605
    if (!ossl_fips_ind_rsa_key_check(OSSL_FIPS_IND_GET(prsactx),
606
            OSSL_FIPS_IND_SETTABLE0, prsactx->libctx,
607
            prsactx->rsa, desc, protect))
608
        return 0;
609
#endif
610
62.3k
    return 1;
611
62.3k
}
612
613
static int setup_tbuf(PROV_RSA_CTX *ctx)
614
23.3k
{
615
23.3k
    if (ctx->tbuf != NULL)
616
0
        return 1;
617
23.3k
    if ((ctx->tbuf = OPENSSL_malloc(RSA_size(ctx->rsa))) == NULL)
618
22
        return 0;
619
23.2k
    return 1;
620
23.3k
}
621
622
static void clean_tbuf(PROV_RSA_CTX *ctx)
623
99.3k
{
624
99.3k
    if (ctx->tbuf != NULL)
625
24.7k
        OPENSSL_cleanse(ctx->tbuf, RSA_size(ctx->rsa));
626
99.3k
}
627
628
static void free_tbuf(PROV_RSA_CTX *ctx)
629
97.9k
{
630
97.9k
    clean_tbuf(ctx);
631
97.9k
    OPENSSL_free(ctx->tbuf);
632
97.9k
    ctx->tbuf = NULL;
633
97.9k
}
634
635
#ifdef FIPS_MODULE
636
static int rsa_pss_saltlen_check_passed(PROV_RSA_CTX *ctx, const char *algoname, int saltlen)
637
{
638
    int mdsize = rsa_get_md_size(ctx);
639
    /*
640
     * Perform the check if the salt length is compliant to FIPS 186-5.
641
     *
642
     * According to FIPS 186-5 5.4 (g), the salt length shall be between zero
643
     * and the output block length of the digest function (inclusive).
644
     */
645
    int approved = (saltlen >= 0 && saltlen <= mdsize);
646
647
    if (!approved) {
648
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE3,
649
                ctx->libctx,
650
                algoname, "PSS Salt Length",
651
                ossl_fips_config_rsa_pss_saltlen_check)) {
652
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
653
            return 0;
654
        }
655
    }
656
657
    return 1;
658
}
659
#endif
660
661
static int rsa_sign_init(void *vprsactx, void *vrsa, const OSSL_PARAM params[])
662
0
{
663
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
664
665
#ifdef FIPS_MODULE
666
    if (prsactx != NULL)
667
        prsactx->verify_message = 1;
668
#endif
669
670
0
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
671
0
        EVP_PKEY_OP_SIGN, "RSA Sign Init");
672
0
}
673
674
/*
675
 * Sign tbs without digesting it first.  This is suitable for "primitive"
676
 * signing and signing the digest of a message, i.e. should be used with
677
 * implementations of the keytype related algorithms.
678
 */
679
static int rsa_sign_directly(PROV_RSA_CTX *prsactx,
680
    unsigned char *sig, size_t *siglen, size_t sigsize,
681
    const unsigned char *tbs, size_t tbslen)
682
12.6k
{
683
12.6k
    int ret;
684
12.6k
    size_t rsasize = RSA_size(prsactx->rsa);
685
12.6k
    size_t mdsize = rsa_get_md_size(prsactx);
686
687
12.6k
    if (!ossl_prov_is_running())
688
0
        return 0;
689
690
12.6k
    if (sig == NULL) {
691
6.34k
        *siglen = rsasize;
692
6.34k
        return 1;
693
6.34k
    }
694
695
6.34k
    if (sigsize < rsasize) {
696
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SIGNATURE_SIZE,
697
0
            "is %zu, should be at least %zu", sigsize, rsasize);
698
0
        return 0;
699
0
    }
700
701
6.34k
    if (mdsize != 0) {
702
6.34k
        if (tbslen != mdsize) {
703
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
704
0
            return 0;
705
0
        }
706
707
6.34k
#ifndef FIPS_MODULE
708
6.34k
        if (EVP_MD_is_a(prsactx->md, OSSL_DIGEST_NAME_MDC2)) {
709
0
            unsigned int sltmp;
710
711
0
            if (prsactx->pad_mode != RSA_PKCS1_PADDING) {
712
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
713
0
                    "only PKCS#1 padding supported with MDC2");
714
0
                return 0;
715
0
            }
716
0
            ret = RSA_sign_ASN1_OCTET_STRING(0, tbs, (unsigned int)tbslen, sig,
717
0
                &sltmp, prsactx->rsa);
718
719
0
            if (ret <= 0) {
720
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
721
0
                return 0;
722
0
            }
723
0
            ret = sltmp;
724
0
            goto end;
725
0
        }
726
6.34k
#endif
727
6.34k
        switch (prsactx->pad_mode) {
728
0
        case RSA_X931_PADDING:
729
0
            if ((size_t)RSA_size(prsactx->rsa) < tbslen + 1) {
730
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL,
731
0
                    "RSA key size = %d, expected minimum = %d",
732
0
                    RSA_size(prsactx->rsa), tbslen + 1);
733
0
                return 0;
734
0
            }
735
0
            if (!setup_tbuf(prsactx)) {
736
0
                ERR_raise(ERR_LIB_PROV, ERR_R_PROV_LIB);
737
0
                return 0;
738
0
            }
739
0
            memcpy(prsactx->tbuf, tbs, tbslen);
740
0
            prsactx->tbuf[tbslen] = RSA_X931_hash_id(prsactx->mdnid);
741
0
            ret = RSA_private_encrypt((int)(tbslen + 1), prsactx->tbuf,
742
0
                sig, prsactx->rsa, RSA_X931_PADDING);
743
0
            clean_tbuf(prsactx);
744
0
            break;
745
4.85k
        case RSA_PKCS1_PADDING: {
746
4.85k
            unsigned int sltmp;
747
748
4.85k
            ret = RSA_sign(prsactx->mdnid, tbs, (unsigned int)tbslen,
749
4.85k
                sig, &sltmp, prsactx->rsa);
750
4.85k
            if (ret <= 0) {
751
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
752
0
                return 0;
753
0
            }
754
4.85k
            ret = sltmp;
755
4.85k
        } break;
756
757
1.48k
        case RSA_PKCS1_PSS_PADDING: {
758
1.48k
            int saltlen;
759
760
            /* Check PSS restrictions */
761
1.48k
            if (rsa_pss_restricted(prsactx)) {
762
0
                switch (prsactx->saltlen) {
763
0
                case RSA_PSS_SALTLEN_DIGEST:
764
0
                    if (prsactx->min_saltlen > EVP_MD_get_size(prsactx->md)) {
765
0
                        ERR_raise_data(ERR_LIB_PROV,
766
0
                            PROV_R_PSS_SALTLEN_TOO_SMALL,
767
0
                            "minimum salt length set to %d, "
768
0
                            "but the digest only gives %d",
769
0
                            prsactx->min_saltlen,
770
0
                            EVP_MD_get_size(prsactx->md));
771
0
                        return 0;
772
0
                    }
773
                    /* FALLTHRU */
774
0
                default:
775
0
                    if (prsactx->saltlen >= 0
776
0
                        && prsactx->saltlen < prsactx->min_saltlen) {
777
0
                        ERR_raise_data(ERR_LIB_PROV,
778
0
                            PROV_R_PSS_SALTLEN_TOO_SMALL,
779
0
                            "minimum salt length set to %d, but the"
780
0
                            "actual salt length is only set to %d",
781
0
                            prsactx->min_saltlen,
782
0
                            prsactx->saltlen);
783
0
                        return 0;
784
0
                    }
785
0
                    break;
786
0
                }
787
0
            }
788
1.48k
            if (!setup_tbuf(prsactx))
789
0
                return 0;
790
1.48k
            saltlen = prsactx->saltlen;
791
1.48k
            if (!ossl_rsa_padding_add_PKCS1_PSS_mgf1(prsactx->rsa,
792
1.48k
                    prsactx->tbuf, tbs,
793
1.48k
                    prsactx->md, prsactx->mgf1_md,
794
1.48k
                    &saltlen)) {
795
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
796
0
                return 0;
797
0
            }
798
#ifdef FIPS_MODULE
799
            if (!rsa_pss_saltlen_check_passed(prsactx, "RSA Sign", saltlen))
800
                return 0;
801
#endif
802
1.48k
            ret = RSA_private_encrypt(RSA_size(prsactx->rsa), prsactx->tbuf,
803
1.48k
                sig, prsactx->rsa, RSA_NO_PADDING);
804
1.48k
            clean_tbuf(prsactx);
805
1.48k
        } break;
806
807
0
        default:
808
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
809
0
                "Only X.931, PKCS#1 v1.5 or PSS padding allowed");
810
0
            return 0;
811
6.34k
        }
812
6.34k
    } else {
813
0
        ret = RSA_private_encrypt((int)tbslen, tbs, sig, prsactx->rsa,
814
0
            prsactx->pad_mode);
815
0
    }
816
817
6.34k
#ifndef FIPS_MODULE
818
6.34k
end:
819
6.34k
#endif
820
6.34k
    if (ret <= 0) {
821
0
        ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
822
0
        return 0;
823
0
    }
824
825
6.34k
    *siglen = ret;
826
6.34k
    return 1;
827
6.34k
}
828
829
static int rsa_signverify_message_update(void *vprsactx,
830
    const unsigned char *data,
831
    size_t datalen)
832
35.4k
{
833
35.4k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
834
835
35.4k
    if (prsactx == NULL || prsactx->mdctx == NULL)
836
0
        return 0;
837
838
35.4k
    if (!prsactx->flag_allow_update) {
839
0
        ERR_raise(ERR_LIB_PROV, PROV_R_UPDATE_CALL_OUT_OF_ORDER);
840
0
        return 0;
841
0
    }
842
35.4k
    prsactx->flag_allow_oneshot = 0;
843
844
35.4k
    return EVP_DigestUpdate(prsactx->mdctx, data, datalen);
845
35.4k
}
846
847
static int rsa_sign_message_final(void *vprsactx, unsigned char *sig,
848
    size_t *siglen, size_t sigsize)
849
12.6k
{
850
12.6k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
851
12.6k
    unsigned char digest[EVP_MAX_MD_SIZE];
852
12.6k
    unsigned int dlen = 0;
853
854
12.6k
    if (!ossl_prov_is_running() || prsactx == NULL)
855
0
        return 0;
856
12.6k
    if (prsactx->mdctx == NULL)
857
0
        return 0;
858
12.6k
    if (!prsactx->flag_allow_final) {
859
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FINAL_CALL_OUT_OF_ORDER);
860
0
        return 0;
861
0
    }
862
863
    /*
864
     * If sig is NULL then we're just finding out the sig size. Other fields
865
     * are ignored. Defer to rsa_sign.
866
     */
867
12.6k
    if (sig != NULL) {
868
        /*
869
         * The digests used here are all known (see rsa_get_md_nid()), so they
870
         * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
871
         */
872
6.34k
        if (!EVP_DigestFinal_ex(prsactx->mdctx, digest, &dlen))
873
0
            return 0;
874
875
6.34k
        prsactx->flag_allow_update = 0;
876
6.34k
        prsactx->flag_allow_oneshot = 0;
877
6.34k
        prsactx->flag_allow_final = 0;
878
6.34k
    }
879
880
12.6k
    return rsa_sign_directly(prsactx, sig, siglen, sigsize, digest, dlen);
881
12.6k
}
882
883
/*
884
 * If signing a message, digest tbs and sign the result.
885
 * Otherwise, sign tbs directly.
886
 */
887
static int rsa_sign(void *vprsactx, unsigned char *sig, size_t *siglen,
888
    size_t sigsize, const unsigned char *tbs, size_t tbslen)
889
0
{
890
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
891
892
0
    if (!ossl_prov_is_running() || prsactx == NULL)
893
0
        return 0;
894
0
    if (!prsactx->flag_allow_oneshot) {
895
0
        ERR_raise(ERR_LIB_PROV, PROV_R_ONESHOT_CALL_OUT_OF_ORDER);
896
0
        return 0;
897
0
    }
898
899
0
    if (prsactx->operation == EVP_PKEY_OP_SIGNMSG) {
900
        /*
901
         * If |sig| is NULL, the caller is only looking for the sig length.
902
         * DO NOT update the input in this case.
903
         */
904
0
        if (sig == NULL)
905
0
            return rsa_sign_message_final(prsactx, sig, siglen, sigsize);
906
907
0
        return rsa_signverify_message_update(prsactx, tbs, tbslen)
908
0
            && rsa_sign_message_final(prsactx, sig, siglen, sigsize);
909
0
    }
910
0
    return rsa_sign_directly(prsactx, sig, siglen, sigsize, tbs, tbslen);
911
0
}
912
913
static int rsa_verify_recover_init(void *vprsactx, void *vrsa,
914
    const OSSL_PARAM params[])
915
0
{
916
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
917
918
#ifdef FIPS_MODULE
919
    if (prsactx != NULL)
920
        prsactx->verify_message = 0;
921
#endif
922
923
0
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
924
0
        EVP_PKEY_OP_VERIFYRECOVER, "RSA VerifyRecover Init");
925
0
}
926
927
/*
928
 * There is no message variant of verify recover, so no need for
929
 * 'rsa_verify_recover_directly', just use this function, er, directly.
930
 */
931
static int rsa_verify_recover(void *vprsactx,
932
    unsigned char *rout, size_t *routlen,
933
    size_t routsize,
934
    const unsigned char *sig, size_t siglen)
935
0
{
936
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
937
0
    int ret;
938
939
0
    if (!ossl_prov_is_running())
940
0
        return 0;
941
942
0
    if (rout == NULL) {
943
0
        *routlen = RSA_size(prsactx->rsa);
944
0
        return 1;
945
0
    }
946
947
0
    if (prsactx->md != NULL) {
948
0
        switch (prsactx->pad_mode) {
949
0
        case RSA_X931_PADDING:
950
0
            if (!setup_tbuf(prsactx))
951
0
                return 0;
952
0
            ret = RSA_public_decrypt((int)siglen, sig, prsactx->tbuf, prsactx->rsa,
953
0
                RSA_X931_PADDING);
954
0
            if (ret <= 0) {
955
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
956
0
                return 0;
957
0
            }
958
0
            ret--;
959
0
            if (prsactx->tbuf[ret] != RSA_X931_hash_id(prsactx->mdnid)) {
960
0
                ERR_raise(ERR_LIB_PROV, PROV_R_ALGORITHM_MISMATCH);
961
0
                return 0;
962
0
            }
963
0
            if (ret != EVP_MD_get_size(prsactx->md)) {
964
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH,
965
0
                    "Should be %d, but got %d",
966
0
                    EVP_MD_get_size(prsactx->md), ret);
967
0
                return 0;
968
0
            }
969
970
0
            *routlen = ret;
971
0
            if (rout != prsactx->tbuf) {
972
0
                if (routsize < (size_t)ret) {
973
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
974
0
                        "buffer size is %d, should be %d",
975
0
                        routsize, ret);
976
0
                    return 0;
977
0
                }
978
0
                memcpy(rout, prsactx->tbuf, ret);
979
0
            }
980
0
            break;
981
982
0
        case RSA_PKCS1_PADDING: {
983
0
            int mdsize = EVP_MD_get_size(prsactx->md);
984
0
            size_t sltmp;
985
986
0
            if (mdsize <= 0) {
987
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
988
0
                return 0;
989
0
            }
990
0
            if (routsize < (size_t)mdsize) {
991
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
992
0
                    "buffer size is %d, should be %d",
993
0
                    routsize, mdsize);
994
0
                return 0;
995
0
            }
996
0
            ret = ossl_rsa_verify(prsactx->mdnid, NULL, 0, rout, &sltmp,
997
0
                sig, siglen, prsactx->rsa);
998
0
            if (ret <= 0) {
999
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1000
0
                return 0;
1001
0
            }
1002
0
            ret = (int)sltmp;
1003
0
        } break;
1004
1005
0
        default:
1006
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
1007
0
                "Only X.931 or PKCS#1 v1.5 padding allowed");
1008
0
            return 0;
1009
0
        }
1010
0
    } else {
1011
0
        int rsasize = RSA_size(prsactx->rsa);
1012
1013
0
        if (routsize < (size_t)rsasize) {
1014
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
1015
0
                "buffer size is %d, should be %d",
1016
0
                routsize, rsasize);
1017
0
            return 0;
1018
0
        }
1019
0
        ret = RSA_public_decrypt((int)siglen, sig, rout, prsactx->rsa,
1020
0
            prsactx->pad_mode);
1021
        /*
1022
         * RSA_public_decrypt() returns -1 on error and otherwise the number
1023
         * of recovered bytes, which may legitimately be zero for a raw
1024
         * PKCS#1 v1.5 signature that encodes an empty payload.  Treat only
1025
         * a negative result as an error.
1026
         */
1027
0
        if (ret < 0) {
1028
0
            ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1029
0
            return 0;
1030
0
        }
1031
0
    }
1032
0
    *routlen = ret;
1033
0
    return 1;
1034
0
}
1035
1036
static int rsa_verify_init(void *vprsactx, void *vrsa,
1037
    const OSSL_PARAM params[])
1038
1.93k
{
1039
1.93k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1040
1041
#ifdef FIPS_MODULE
1042
    if (prsactx != NULL)
1043
        prsactx->verify_message = 0;
1044
#endif
1045
1046
1.93k
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
1047
1.93k
        EVP_PKEY_OP_VERIFY, "RSA Verify Init");
1048
1.93k
}
1049
1050
static int rsa_verify_directly(PROV_RSA_CTX *prsactx,
1051
    const unsigned char *sig, size_t siglen,
1052
    const unsigned char *tbs, size_t tbslen)
1053
31.0k
{
1054
31.0k
    size_t rslen;
1055
1056
31.0k
    if (!ossl_prov_is_running())
1057
0
        return 0;
1058
31.0k
    if (prsactx->md != NULL) {
1059
31.0k
        switch (prsactx->pad_mode) {
1060
9.22k
        case RSA_PKCS1_PADDING:
1061
9.22k
            if (!RSA_verify(prsactx->mdnid, tbs, (unsigned int)tbslen,
1062
9.22k
                    sig, (unsigned int)siglen, prsactx->rsa)) {
1063
8.54k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1064
8.54k
                return 0;
1065
8.54k
            }
1066
686
            return 1;
1067
0
        case RSA_X931_PADDING:
1068
0
            if (!setup_tbuf(prsactx))
1069
0
                return 0;
1070
0
            if (rsa_verify_recover(prsactx, prsactx->tbuf, &rslen, 0,
1071
0
                    sig, siglen)
1072
0
                <= 0)
1073
0
                return 0;
1074
0
            break;
1075
21.8k
        case RSA_PKCS1_PSS_PADDING: {
1076
21.8k
            int ret;
1077
21.8k
            int saltlen;
1078
21.8k
            size_t mdsize;
1079
1080
            /*
1081
             * We need to check this for the RSA_verify_PKCS1_PSS_mgf1()
1082
             * call
1083
             */
1084
21.8k
            mdsize = rsa_get_md_size(prsactx);
1085
21.8k
            if (tbslen != mdsize) {
1086
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH,
1087
0
                    "Should be %d, but got %d",
1088
0
                    mdsize, tbslen);
1089
0
                return 0;
1090
0
            }
1091
1092
21.8k
            if (!setup_tbuf(prsactx))
1093
22
                return 0;
1094
21.8k
            ret = RSA_public_decrypt((int)siglen, sig, prsactx->tbuf,
1095
21.8k
                prsactx->rsa, RSA_NO_PADDING);
1096
21.8k
            if (ret <= 0) {
1097
5.11k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1098
5.11k
                return 0;
1099
5.11k
            }
1100
16.6k
            saltlen = prsactx->saltlen;
1101
16.6k
            ret = ossl_rsa_verify_PKCS1_PSS_mgf1(prsactx->rsa, tbs,
1102
16.6k
                prsactx->md, prsactx->mgf1_md,
1103
16.6k
                prsactx->tbuf,
1104
16.6k
                &saltlen);
1105
16.6k
            if (ret <= 0) {
1106
16.6k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1107
16.6k
                return 0;
1108
16.6k
            }
1109
#ifdef FIPS_MODULE
1110
            if (!rsa_pss_saltlen_check_passed(prsactx, "RSA Verify", saltlen))
1111
                return 0;
1112
#endif
1113
18
            return 1;
1114
16.6k
        }
1115
0
        default:
1116
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
1117
0
                "Only X.931, PKCS#1 v1.5 or PSS padding allowed");
1118
0
            return 0;
1119
31.0k
        }
1120
31.0k
    } else {
1121
0
        int ret;
1122
1123
0
        if (!setup_tbuf(prsactx))
1124
0
            return 0;
1125
0
        ret = RSA_public_decrypt((int)siglen, sig, prsactx->tbuf, prsactx->rsa,
1126
0
            prsactx->pad_mode);
1127
0
        if (ret <= 0) {
1128
0
            ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1129
0
            return 0;
1130
0
        }
1131
0
        rslen = (size_t)ret;
1132
0
    }
1133
1134
0
    if ((rslen != tbslen) || memcmp(tbs, prsactx->tbuf, rslen))
1135
0
        return 0;
1136
1137
0
    return 1;
1138
0
}
1139
1140
static int rsa_verify_set_sig(void *vprsactx,
1141
    const unsigned char *sig, size_t siglen)
1142
29.1k
{
1143
29.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1144
29.1k
    OSSL_PARAM params[2];
1145
1146
29.1k
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
1147
29.1k
        (unsigned char *)sig, siglen);
1148
29.1k
    params[1] = OSSL_PARAM_construct_end();
1149
29.1k
    return rsa_sigalg_set_ctx_params(prsactx, params);
1150
29.1k
}
1151
1152
static int rsa_verify_message_final(void *vprsactx)
1153
29.1k
{
1154
29.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1155
29.1k
    unsigned char digest[EVP_MAX_MD_SIZE];
1156
29.1k
    unsigned int dlen = 0;
1157
1158
29.1k
    if (!ossl_prov_is_running() || prsactx == NULL)
1159
0
        return 0;
1160
29.1k
    if (prsactx->mdctx == NULL)
1161
0
        return 0;
1162
29.1k
    if (!prsactx->flag_allow_final) {
1163
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FINAL_CALL_OUT_OF_ORDER);
1164
0
        return 0;
1165
0
    }
1166
1167
    /*
1168
     * The digests used here are all known (see rsa_get_md_nid()), so they
1169
     * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
1170
     */
1171
29.1k
    if (!EVP_DigestFinal_ex(prsactx->mdctx, digest, &dlen))
1172
0
        return 0;
1173
1174
29.1k
    prsactx->flag_allow_update = 0;
1175
29.1k
    prsactx->flag_allow_final = 0;
1176
29.1k
    prsactx->flag_allow_oneshot = 0;
1177
1178
29.1k
    return rsa_verify_directly(prsactx, prsactx->sig, prsactx->siglen,
1179
29.1k
        digest, dlen);
1180
29.1k
}
1181
1182
/*
1183
 * If verifying a message, digest tbs and verify the result.
1184
 * Otherwise, verify tbs directly.
1185
 */
1186
static int rsa_verify(void *vprsactx,
1187
    const unsigned char *sig, size_t siglen,
1188
    const unsigned char *tbs, size_t tbslen)
1189
1.91k
{
1190
1.91k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1191
1192
1.91k
    if (!ossl_prov_is_running() || prsactx == NULL)
1193
0
        return 0;
1194
1.91k
    if (!prsactx->flag_allow_oneshot) {
1195
0
        ERR_raise(ERR_LIB_PROV, PROV_R_ONESHOT_CALL_OUT_OF_ORDER);
1196
0
        return 0;
1197
0
    }
1198
1199
1.91k
    if (prsactx->operation == EVP_PKEY_OP_VERIFYMSG)
1200
0
        return rsa_verify_set_sig(prsactx, sig, siglen)
1201
0
            && rsa_signverify_message_update(prsactx, tbs, tbslen)
1202
0
            && rsa_verify_message_final(prsactx);
1203
1.91k
    return rsa_verify_directly(prsactx, sig, siglen, tbs, tbslen);
1204
1.91k
}
1205
1206
/* DigestSign/DigestVerify wrappers */
1207
1208
static int rsa_digest_signverify_init(void *vprsactx, const char *mdname,
1209
    void *vrsa, const OSSL_PARAM params[],
1210
    int operation, const char *desc)
1211
60.4k
{
1212
60.4k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1213
1214
#ifdef FIPS_MODULE
1215
    if (prsactx != NULL)
1216
        prsactx->verify_message = 1;
1217
#endif
1218
1219
60.4k
    if (!rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
1220
60.4k
            operation, desc))
1221
51
        return 0;
1222
1223
60.4k
    if (mdname != NULL
1224
        /* was rsa_setup_md already called in rsa_signverify_init()? */
1225
60.4k
        && (mdname[0] == '\0' || OPENSSL_strcasecmp(prsactx->mdname, mdname) != 0)
1226
51.5k
        && !rsa_setup_md(prsactx, mdname, prsactx->propq, desc))
1227
102
        return 0;
1228
1229
60.3k
    prsactx->flag_allow_md = 0;
1230
1231
60.3k
    if (prsactx->mdctx == NULL) {
1232
60.3k
        prsactx->mdctx = EVP_MD_CTX_new();
1233
60.3k
        if (prsactx->mdctx == NULL)
1234
0
            goto error;
1235
60.3k
    }
1236
1237
60.3k
    if (!EVP_DigestInit_ex2(prsactx->mdctx, prsactx->md, params))
1238
0
        goto error;
1239
1240
60.3k
    return 1;
1241
1242
0
error:
1243
0
    EVP_MD_CTX_free(prsactx->mdctx);
1244
0
    prsactx->mdctx = NULL;
1245
0
    return 0;
1246
60.3k
}
1247
1248
static int rsa_digest_sign_init(void *vprsactx, const char *mdname,
1249
    void *vrsa, const OSSL_PARAM params[])
1250
31.1k
{
1251
31.1k
    if (!ossl_prov_is_running())
1252
0
        return 0;
1253
31.1k
    return rsa_digest_signverify_init(vprsactx, mdname, vrsa,
1254
31.1k
        params, EVP_PKEY_OP_SIGNMSG,
1255
31.1k
        "RSA Digest Sign Init");
1256
31.1k
}
1257
1258
static int rsa_digest_sign_update(void *vprsactx, const unsigned char *data,
1259
    size_t datalen)
1260
6.34k
{
1261
6.34k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1262
1263
6.34k
    if (prsactx == NULL)
1264
0
        return 0;
1265
    /* Sigalg implementations shouldn't do digest_sign */
1266
6.34k
    if (prsactx->flag_sigalg)
1267
0
        return 0;
1268
1269
6.34k
    return rsa_signverify_message_update(prsactx, data, datalen);
1270
6.34k
}
1271
1272
static int rsa_digest_sign_final(void *vprsactx, unsigned char *sig,
1273
    size_t *siglen, size_t sigsize)
1274
12.6k
{
1275
12.6k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1276
12.6k
    int ok = 0;
1277
1278
12.6k
    if (prsactx == NULL)
1279
0
        return 0;
1280
    /* Sigalg implementations shouldn't do digest_sign */
1281
12.6k
    if (prsactx->flag_sigalg)
1282
0
        return 0;
1283
1284
12.6k
    if (rsa_sign_message_final(prsactx, sig, siglen, sigsize))
1285
12.6k
        ok = 1;
1286
1287
12.6k
    prsactx->flag_allow_md = 1;
1288
1289
12.6k
    return ok;
1290
12.6k
}
1291
1292
static int rsa_digest_verify_init(void *vprsactx, const char *mdname,
1293
    void *vrsa, const OSSL_PARAM params[])
1294
29.3k
{
1295
29.3k
    if (!ossl_prov_is_running())
1296
0
        return 0;
1297
29.3k
    return rsa_digest_signverify_init(vprsactx, mdname, vrsa,
1298
29.3k
        params, EVP_PKEY_OP_VERIFYMSG,
1299
29.3k
        "RSA Digest Verify Init");
1300
29.3k
}
1301
1302
static int rsa_digest_verify_update(void *vprsactx, const unsigned char *data,
1303
    size_t datalen)
1304
29.1k
{
1305
29.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1306
1307
29.1k
    if (prsactx == NULL)
1308
0
        return 0;
1309
    /* Sigalg implementations shouldn't do digest_sign */
1310
29.1k
    if (prsactx->flag_sigalg)
1311
0
        return 0;
1312
1313
29.1k
    return rsa_signverify_message_update(prsactx, data, datalen);
1314
29.1k
}
1315
1316
int rsa_digest_verify_final(void *vprsactx, const unsigned char *sig,
1317
    size_t siglen)
1318
29.1k
{
1319
29.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1320
29.1k
    int ok = 0;
1321
1322
29.1k
    if (prsactx == NULL)
1323
0
        return 0;
1324
    /* Sigalg implementations shouldn't do digest_verify */
1325
29.1k
    if (prsactx->flag_sigalg)
1326
0
        return 0;
1327
1328
29.1k
    if (rsa_verify_set_sig(prsactx, sig, siglen)
1329
29.1k
        && rsa_verify_message_final(vprsactx))
1330
612
        ok = 1;
1331
1332
29.1k
    prsactx->flag_allow_md = 1;
1333
1334
29.1k
    return ok;
1335
29.1k
}
1336
1337
static void rsa_freectx(void *vprsactx)
1338
97.9k
{
1339
97.9k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1340
1341
97.9k
    if (prsactx == NULL)
1342
0
        return;
1343
1344
97.9k
    EVP_MD_CTX_free(prsactx->mdctx);
1345
97.9k
    EVP_MD_free(prsactx->md);
1346
97.9k
    EVP_MD_free(prsactx->mgf1_md);
1347
97.9k
    OPENSSL_free(prsactx->sig);
1348
97.9k
    OPENSSL_free(prsactx->propq);
1349
97.9k
    free_tbuf(prsactx);
1350
97.9k
    RSA_free(prsactx->rsa);
1351
1352
97.9k
    OPENSSL_clear_free(prsactx, sizeof(*prsactx));
1353
97.9k
}
1354
1355
static void *rsa_dupctx(void *vprsactx)
1356
35.4k
{
1357
35.4k
    PROV_RSA_CTX *srcctx = (PROV_RSA_CTX *)vprsactx;
1358
35.4k
    PROV_RSA_CTX *dstctx;
1359
1360
35.4k
    if (!ossl_prov_is_running())
1361
0
        return NULL;
1362
1363
35.4k
    dstctx = OPENSSL_zalloc(sizeof(*srcctx));
1364
35.4k
    if (dstctx == NULL)
1365
0
        return NULL;
1366
1367
35.4k
    *dstctx = *srcctx;
1368
35.4k
    dstctx->rsa = NULL;
1369
35.4k
    dstctx->md = NULL;
1370
35.4k
    dstctx->mgf1_md = NULL;
1371
35.4k
    dstctx->mdctx = NULL;
1372
35.4k
    dstctx->tbuf = NULL;
1373
35.4k
    dstctx->propq = NULL;
1374
35.4k
    dstctx->sig = NULL;
1375
1376
35.4k
    if (srcctx->rsa != NULL && !RSA_up_ref(srcctx->rsa))
1377
0
        goto err;
1378
35.4k
    dstctx->rsa = srcctx->rsa;
1379
1380
35.4k
    if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
1381
0
        goto err;
1382
35.4k
    dstctx->md = srcctx->md;
1383
1384
35.4k
    if (srcctx->mgf1_md != NULL && !EVP_MD_up_ref(srcctx->mgf1_md))
1385
0
        goto err;
1386
35.4k
    dstctx->mgf1_md = srcctx->mgf1_md;
1387
1388
35.4k
    if (srcctx->mdctx != NULL) {
1389
35.4k
        dstctx->mdctx = EVP_MD_CTX_new();
1390
35.4k
        if (dstctx->mdctx == NULL
1391
35.4k
            || !EVP_MD_CTX_copy_ex(dstctx->mdctx, srcctx->mdctx))
1392
0
            goto err;
1393
35.4k
    }
1394
1395
35.4k
    if (srcctx->propq != NULL) {
1396
0
        dstctx->propq = OPENSSL_strdup(srcctx->propq);
1397
0
        if (dstctx->propq == NULL)
1398
0
            goto err;
1399
0
    }
1400
1401
35.4k
    if (srcctx->sig != NULL) {
1402
0
        dstctx->sig = OPENSSL_memdup(srcctx->sig, srcctx->siglen);
1403
0
        if (dstctx->sig == NULL)
1404
0
            goto err;
1405
0
    }
1406
1407
35.4k
    return dstctx;
1408
0
err:
1409
0
    rsa_freectx(dstctx);
1410
0
    return NULL;
1411
35.4k
}
1412
1413
/* clang-format off */
1414
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1415
#ifndef rsa_get_ctx_params_list
1416
static ossl_unused const OSSL_PARAM rsa_get_ctx_params_list[] = {
1417
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
1418
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1419
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL),
1420
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
1421
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1422
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1423
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL),
1424
# if defined(FIPS_MODULE)
1425
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE, NULL),
1426
# endif
1427
# if defined(FIPS_MODULE)
1428
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR, NULL),
1429
# endif
1430
    OSSL_PARAM_END
1431
};
1432
#endif
1433
1434
#ifndef rsa_get_ctx_params_st
1435
struct rsa_get_ctx_params_st {
1436
    OSSL_PARAM *algid;
1437
    OSSL_PARAM *digest;
1438
# if defined(FIPS_MODULE)
1439
    OSSL_PARAM *ind;
1440
# endif
1441
    OSSL_PARAM *mgf1;
1442
    OSSL_PARAM *pad;
1443
    OSSL_PARAM *slen;
1444
# if defined(FIPS_MODULE)
1445
    OSSL_PARAM *verify;
1446
# endif
1447
};
1448
#endif
1449
1450
#ifndef rsa_get_ctx_params_decoder
1451
static ossl_unused int rsa_get_ctx_params_decoder
1452
    (const OSSL_PARAM *p, struct rsa_get_ctx_params_st *r)
1453
388
{
1454
388
    const char *s;
1455
1456
388
    memset(r, 0, sizeof(*r));
1457
388
    if (p != NULL)
1458
776
        for (; (s = p->key) != NULL; p++)
1459
388
            switch(s[0]) {
1460
0
            default:
1461
0
                break;
1462
0
            case 'a':
1463
0
                if (ossl_likely(strcmp("lgorithm-id", s + 1) == 0)) {
1464
                    /* OSSL_SIGNATURE_PARAM_ALGORITHM_ID */
1465
0
                    if (ossl_unlikely(r->algid != NULL)) {
1466
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1467
0
                                       "param %s is repeated", s);
1468
0
                        return 0;
1469
0
                    }
1470
0
                    r->algid = (OSSL_PARAM *)p;
1471
0
                }
1472
0
                break;
1473
388
            case 'd':
1474
388
                if (ossl_likely(strcmp("igest", s + 1) == 0)) {
1475
                    /* OSSL_SIGNATURE_PARAM_DIGEST */
1476
388
                    if (ossl_unlikely(r->digest != NULL)) {
1477
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1478
0
                                       "param %s is repeated", s);
1479
0
                        return 0;
1480
0
                    }
1481
388
                    r->digest = (OSSL_PARAM *)p;
1482
388
                }
1483
388
                break;
1484
388
            case 'f':
1485
# if defined(FIPS_MODULE)
1486
                if (ossl_likely(strcmp("ips-indicator", s + 1) == 0)) {
1487
                    /* OSSL_SIGNATURE_PARAM_FIPS_APPROVED_INDICATOR */
1488
                    if (ossl_unlikely(r->ind != NULL)) {
1489
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1490
                                       "param %s is repeated", s);
1491
                        return 0;
1492
                    }
1493
                    r->ind = (OSSL_PARAM *)p;
1494
                }
1495
# endif
1496
0
                break;
1497
0
            case 'm':
1498
0
                if (ossl_likely(strcmp("gf1-digest", s + 1) == 0)) {
1499
                    /* OSSL_SIGNATURE_PARAM_MGF1_DIGEST */
1500
0
                    if (ossl_unlikely(r->mgf1 != NULL)) {
1501
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1502
0
                                       "param %s is repeated", s);
1503
0
                        return 0;
1504
0
                    }
1505
0
                    r->mgf1 = (OSSL_PARAM *)p;
1506
0
                }
1507
0
                break;
1508
0
            case 'p':
1509
0
                if (ossl_likely(strcmp("ad-mode", s + 1) == 0)) {
1510
                    /* OSSL_SIGNATURE_PARAM_PAD_MODE */
1511
0
                    if (ossl_unlikely(r->pad != NULL)) {
1512
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1513
0
                                       "param %s is repeated", s);
1514
0
                        return 0;
1515
0
                    }
1516
0
                    r->pad = (OSSL_PARAM *)p;
1517
0
                }
1518
0
                break;
1519
0
            case 's':
1520
0
                if (ossl_likely(strcmp("altlen", s + 1) == 0)) {
1521
                    /* OSSL_SIGNATURE_PARAM_PSS_SALTLEN */
1522
0
                    if (ossl_unlikely(r->slen != NULL)) {
1523
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1524
0
                                       "param %s is repeated", s);
1525
0
                        return 0;
1526
0
                    }
1527
0
                    r->slen = (OSSL_PARAM *)p;
1528
0
                }
1529
0
                break;
1530
0
            case 'v':
1531
# if defined(FIPS_MODULE)
1532
                if (ossl_likely(strcmp("erify-message", s + 1) == 0)) {
1533
                    /* OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE */
1534
                    if (ossl_unlikely(r->verify != NULL)) {
1535
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1536
                                       "param %s is repeated", s);
1537
                        return 0;
1538
                    }
1539
                    r->verify = (OSSL_PARAM *)p;
1540
                }
1541
# endif
1542
0
                break;
1543
388
            }
1544
388
    return 1;
1545
388
}
1546
#endif
1547
/* End of machine generated */
1548
/* clang-format on */
1549
1550
static int rsa_get_ctx_params(void *vprsactx, OSSL_PARAM *params)
1551
{
1552
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1553
    struct rsa_get_ctx_params_st p;
1554
1555
    if (prsactx == NULL || !rsa_get_ctx_params_decoder(params, &p))
1556
        return 0;
1557
1558
    if (p.algid != NULL) {
1559
        /* The Algorithm Identifier of the combined signature algorithm */
1560
        unsigned char aid_buf[128];
1561
        unsigned char *aid;
1562
        size_t aid_len;
1563
1564
        aid = rsa_generate_signature_aid(prsactx, aid_buf,
1565
            sizeof(aid_buf), &aid_len);
1566
        if (aid == NULL || !OSSL_PARAM_set_octet_string(p.algid, aid, aid_len))
1567
            return 0;
1568
    }
1569
1570
    if (p.pad != NULL) {
1571
        if (p.pad->data_type != OSSL_PARAM_UTF8_STRING) {
1572
            if (!OSSL_PARAM_set_int(p.pad, prsactx->pad_mode))
1573
                return 0;
1574
        } else {
1575
            int i;
1576
            const char *word = NULL;
1577
1578
            for (i = 0; padding_item[i].id != 0; i++) {
1579
                if (prsactx->pad_mode == (int)padding_item[i].id) {
1580
                    word = padding_item[i].ptr;
1581
                    break;
1582
                }
1583
            }
1584
1585
            if (word != NULL) {
1586
                if (!OSSL_PARAM_set_utf8_string(p.pad, word))
1587
                    return 0;
1588
            } else {
1589
                ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
1590
            }
1591
        }
1592
    }
1593
1594
    if (p.digest != NULL && !OSSL_PARAM_set_utf8_string(p.digest, prsactx->mdname))
1595
        return 0;
1596
1597
    if (p.mgf1 != NULL && !OSSL_PARAM_set_utf8_string(p.mgf1, prsactx->mgf1_mdname))
1598
        return 0;
1599
1600
    if (p.slen != NULL) {
1601
        if (p.slen->data_type != OSSL_PARAM_UTF8_STRING) {
1602
            if (!OSSL_PARAM_set_int(p.slen, prsactx->saltlen))
1603
                return 0;
1604
        } else {
1605
            const char *value = NULL;
1606
1607
            switch (prsactx->saltlen) {
1608
            case RSA_PSS_SALTLEN_DIGEST:
1609
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST;
1610
                break;
1611
            case RSA_PSS_SALTLEN_MAX:
1612
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_MAX;
1613
                break;
1614
            case RSA_PSS_SALTLEN_AUTO:
1615
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO;
1616
                break;
1617
            case RSA_PSS_SALTLEN_AUTO_DIGEST_MAX:
1618
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX;
1619
                break;
1620
            default: {
1621
                int len = BIO_snprintf(p.slen->data, p.slen->data_size, "%d",
1622
                    prsactx->saltlen);
1623
1624
                if (len <= 0)
1625
                    return 0;
1626
                p.slen->return_size = len;
1627
                break;
1628
            }
1629
            }
1630
            if (value != NULL
1631
                && !OSSL_PARAM_set_utf8_string(p.slen, value))
1632
                return 0;
1633
        }
1634
    }
1635
1636
#ifdef FIPS_MODULE
1637
    if (p.verify != NULL && !OSSL_PARAM_set_uint(p.verify, prsactx->verify_message))
1638
        return 0;
1639
#endif
1640
1641
    if (!OSSL_FIPS_IND_GET_CTX_FROM_PARAM_CONDITIONAL(prsactx, p.ind,
1642
            prsactx->verify_message))
1643
        return 0;
1644
    return 1;
1645
}
1646
1647
static const OSSL_PARAM *rsa_gettable_ctx_params(ossl_unused void *vprsactx,
1648
    ossl_unused void *provctx)
1649
0
{
1650
0
    return rsa_get_ctx_params_list;
1651
0
}
1652
1653
#ifdef FIPS_MODULE
1654
static int rsa_x931_padding_allowed(PROV_RSA_CTX *ctx)
1655
{
1656
    if ((ctx->operation
1657
            & (EVP_PKEY_OP_SIGNMSG | EVP_PKEY_OP_SIGN))
1658
        != 0) {
1659
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE2,
1660
                ctx->libctx,
1661
                "RSA Sign set ctx", "X931 Padding",
1662
                ossl_fips_config_rsa_sign_x931_disallowed)) {
1663
            ERR_raise(ERR_LIB_PROV,
1664
                PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
1665
            return 0;
1666
        }
1667
    }
1668
    return 1;
1669
}
1670
#endif
1671
1672
/* clang-format off */
1673
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1674
#ifndef rsa_set_ctx_params_list
1675
static ossl_unused const OSSL_PARAM rsa_set_ctx_params_list[] = {
1676
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
1677
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
1678
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1679
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL),
1680
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1681
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES, NULL, 0),
1682
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1683
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL),
1684
# if defined(FIPS_MODULE)
1685
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
1686
# endif
1687
# if defined(FIPS_MODULE)
1688
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
1689
# endif
1690
# if defined(FIPS_MODULE)
1691
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK, NULL),
1692
# endif
1693
# if defined(FIPS_MODULE)
1694
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK, NULL),
1695
# endif
1696
    OSSL_PARAM_END
1697
};
1698
#endif
1699
1700
#ifndef rsa_set_ctx_params_st
1701
struct rsa_set_ctx_params_st {
1702
    OSSL_PARAM *digest;
1703
# if defined(FIPS_MODULE)
1704
    OSSL_PARAM *ind_d;
1705
# endif
1706
# if defined(FIPS_MODULE)
1707
    OSSL_PARAM *ind_k;
1708
# endif
1709
# if defined(FIPS_MODULE)
1710
    OSSL_PARAM *ind_slen;
1711
# endif
1712
# if defined(FIPS_MODULE)
1713
    OSSL_PARAM *ind_xpad;
1714
# endif
1715
    OSSL_PARAM *mgf1;
1716
    OSSL_PARAM *mgf1pq;
1717
    OSSL_PARAM *pad;
1718
    OSSL_PARAM *propq;
1719
    OSSL_PARAM *slen;
1720
};
1721
#endif
1722
1723
#ifndef rsa_set_ctx_params_decoder
1724
static ossl_unused int rsa_set_ctx_params_decoder
1725
    (const OSSL_PARAM *p, struct rsa_set_ctx_params_st *r)
1726
10.6k
{
1727
10.6k
    const char *s;
1728
1729
10.6k
    memset(r, 0, sizeof(*r));
1730
10.6k
    if (p != NULL)
1731
29.3k
        for (; (s = p->key) != NULL; p++)
1732
18.7k
            switch(s[0]) {
1733
8.12k
            default:
1734
8.12k
                break;
1735
10.0k
            case 'd':
1736
10.0k
                switch(s[1]) {
1737
0
                default:
1738
0
                    break;
1739
10.0k
                case 'i':
1740
10.0k
                    switch(s[2]) {
1741
0
                    default:
1742
0
                        break;
1743
10.0k
                    case 'g':
1744
10.0k
                        switch(s[3]) {
1745
0
                        default:
1746
0
                            break;
1747
10.0k
                        case 'e':
1748
10.0k
                            switch(s[4]) {
1749
0
                            default:
1750
0
                                break;
1751
10.0k
                            case 's':
1752
10.0k
                                switch(s[5]) {
1753
0
                                default:
1754
0
                                    break;
1755
10.0k
                                case 't':
1756
10.0k
                                    switch(s[6]) {
1757
0
                                    default:
1758
0
                                        break;
1759
0
                                    case '-':
1760
# if defined(FIPS_MODULE)
1761
                                        if (ossl_likely(strcmp("check", s + 7) == 0)) {
1762
                                            /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
1763
                                            if (ossl_unlikely(r->ind_d != NULL)) {
1764
                                                ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1765
                                                               "param %s is repeated", s);
1766
                                                return 0;
1767
                                            }
1768
                                            r->ind_d = (OSSL_PARAM *)p;
1769
                                        }
1770
# endif
1771
0
                                        break;
1772
10.0k
                                    case '\0':
1773
10.0k
                                        if (ossl_unlikely(r->digest != NULL)) {
1774
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1775
0
                                                           "param %s is repeated", s);
1776
0
                                            return 0;
1777
0
                                        }
1778
10.0k
                                        r->digest = (OSSL_PARAM *)p;
1779
10.0k
                                    }
1780
10.0k
                                }
1781
10.0k
                            }
1782
10.0k
                        }
1783
10.0k
                    }
1784
10.0k
                }
1785
10.0k
                break;
1786
10.0k
            case 'k':
1787
# if defined(FIPS_MODULE)
1788
                if (ossl_likely(strcmp("ey-check", s + 1) == 0)) {
1789
                    /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
1790
                    if (ossl_unlikely(r->ind_k != NULL)) {
1791
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1792
                                       "param %s is repeated", s);
1793
                        return 0;
1794
                    }
1795
                    r->ind_k = (OSSL_PARAM *)p;
1796
                }
1797
# endif
1798
0
                break;
1799
185
            case 'm':
1800
185
                switch(s[1]) {
1801
0
                default:
1802
0
                    break;
1803
185
                case 'g':
1804
185
                    switch(s[2]) {
1805
0
                    default:
1806
0
                        break;
1807
185
                    case 'f':
1808
185
                        switch(s[3]) {
1809
0
                        default:
1810
0
                            break;
1811
185
                        case '1':
1812
185
                            switch(s[4]) {
1813
0
                            default:
1814
0
                                break;
1815
185
                            case '-':
1816
185
                                switch(s[5]) {
1817
0
                                default:
1818
0
                                    break;
1819
185
                                case 'd':
1820
185
                                    if (ossl_likely(strcmp("igest", s + 6) == 0)) {
1821
                                        /* OSSL_SIGNATURE_PARAM_MGF1_DIGEST */
1822
185
                                        if (ossl_unlikely(r->mgf1 != NULL)) {
1823
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1824
0
                                                           "param %s is repeated", s);
1825
0
                                            return 0;
1826
0
                                        }
1827
185
                                        r->mgf1 = (OSSL_PARAM *)p;
1828
185
                                    }
1829
185
                                    break;
1830
185
                                case 'p':
1831
0
                                    if (ossl_likely(strcmp("roperties", s + 6) == 0)) {
1832
                                        /* OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES */
1833
0
                                        if (ossl_unlikely(r->mgf1pq != NULL)) {
1834
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1835
0
                                                           "param %s is repeated", s);
1836
0
                                            return 0;
1837
0
                                        }
1838
0
                                        r->mgf1pq = (OSSL_PARAM *)p;
1839
0
                                    }
1840
185
                                }
1841
185
                            }
1842
185
                        }
1843
185
                    }
1844
185
                }
1845
185
                break;
1846
185
            case 'p':
1847
185
                switch(s[1]) {
1848
0
                default:
1849
0
                    break;
1850
185
                case 'a':
1851
185
                    if (ossl_likely(strcmp("d-mode", s + 2) == 0)) {
1852
                        /* OSSL_SIGNATURE_PARAM_PAD_MODE */
1853
185
                        if (ossl_unlikely(r->pad != NULL)) {
1854
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1855
0
                                           "param %s is repeated", s);
1856
0
                            return 0;
1857
0
                        }
1858
185
                        r->pad = (OSSL_PARAM *)p;
1859
185
                    }
1860
185
                    break;
1861
185
                case 'r':
1862
0
                    if (ossl_likely(strcmp("operties", s + 2) == 0)) {
1863
                        /* OSSL_SIGNATURE_PARAM_PROPERTIES */
1864
0
                        if (ossl_unlikely(r->propq != NULL)) {
1865
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1866
0
                                           "param %s is repeated", s);
1867
0
                            return 0;
1868
0
                        }
1869
0
                        r->propq = (OSSL_PARAM *)p;
1870
0
                    }
1871
185
                }
1872
185
                break;
1873
185
            case 'r':
1874
# if defined(FIPS_MODULE)
1875
                if (ossl_likely(strcmp("sa-pss-saltlen-check", s + 1) == 0)) {
1876
                    /* OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK */
1877
                    if (ossl_unlikely(r->ind_slen != NULL)) {
1878
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1879
                                       "param %s is repeated", s);
1880
                        return 0;
1881
                    }
1882
                    r->ind_slen = (OSSL_PARAM *)p;
1883
                }
1884
# endif
1885
0
                break;
1886
185
            case 's':
1887
185
                switch(s[1]) {
1888
0
                default:
1889
0
                    break;
1890
185
                case 'a':
1891
185
                    if (ossl_likely(strcmp("ltlen", s + 2) == 0)) {
1892
                        /* OSSL_SIGNATURE_PARAM_PSS_SALTLEN */
1893
185
                        if (ossl_unlikely(r->slen != NULL)) {
1894
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1895
0
                                           "param %s is repeated", s);
1896
0
                            return 0;
1897
0
                        }
1898
185
                        r->slen = (OSSL_PARAM *)p;
1899
185
                    }
1900
185
                    break;
1901
185
                case 'i':
1902
# if defined(FIPS_MODULE)
1903
                    if (ossl_likely(strcmp("gn-x931-pad-check", s + 2) == 0)) {
1904
                        /* OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK */
1905
                        if (ossl_unlikely(r->ind_xpad != NULL)) {
1906
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1907
                                           "param %s is repeated", s);
1908
                            return 0;
1909
                        }
1910
                        r->ind_xpad = (OSSL_PARAM *)p;
1911
                    }
1912
# endif
1913
0
                    break;
1914
185
                }
1915
185
                break;
1916
18.7k
            }
1917
10.6k
    return 1;
1918
10.6k
}
1919
#endif
1920
/* End of machine generated */
1921
/* clang-format on */
1922
1923
#define rsa_set_ctx_params_no_digest_st rsa_set_ctx_params_st
1924
1925
/* clang-format off */
1926
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
1927
#ifndef rsa_set_ctx_params_no_digest_list
1928
static ossl_unused const OSSL_PARAM rsa_set_ctx_params_no_digest_list[] = {
1929
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1930
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL),
1931
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1932
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES, NULL, 0),
1933
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1934
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL),
1935
# if defined(FIPS_MODULE)
1936
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK, NULL),
1937
# endif
1938
# if defined(FIPS_MODULE)
1939
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK, NULL),
1940
# endif
1941
# if defined(FIPS_MODULE)
1942
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK, NULL),
1943
# endif
1944
# if defined(FIPS_MODULE)
1945
    OSSL_PARAM_int(OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK, NULL),
1946
# endif
1947
    OSSL_PARAM_END
1948
};
1949
#endif
1950
1951
#ifndef rsa_set_ctx_params_no_digest_st
1952
struct rsa_set_ctx_params_no_digest_st {
1953
# if defined(FIPS_MODULE)
1954
    OSSL_PARAM *ind_d;
1955
# endif
1956
# if defined(FIPS_MODULE)
1957
    OSSL_PARAM *ind_k;
1958
# endif
1959
# if defined(FIPS_MODULE)
1960
    OSSL_PARAM *ind_slen;
1961
# endif
1962
# if defined(FIPS_MODULE)
1963
    OSSL_PARAM *ind_xpad;
1964
# endif
1965
    OSSL_PARAM *mgf1;
1966
    OSSL_PARAM *mgf1pq;
1967
    OSSL_PARAM *pad;
1968
    OSSL_PARAM *slen;
1969
};
1970
#endif
1971
1972
#ifndef rsa_set_ctx_params_no_digest_decoder
1973
static ossl_unused int rsa_set_ctx_params_no_digest_decoder
1974
    (const OSSL_PARAM *p, struct rsa_set_ctx_params_no_digest_st *r)
1975
31.2k
{
1976
31.2k
    const char *s;
1977
1978
31.2k
    memset(r, 0, sizeof(*r));
1979
31.2k
    if (p != NULL)
1980
62.4k
        for (; (s = p->key) != NULL; p++)
1981
31.2k
            switch(s[0]) {
1982
0
            default:
1983
0
                break;
1984
0
            case 'd':
1985
# if defined(FIPS_MODULE)
1986
                if (ossl_likely(strcmp("igest-check", s + 1) == 0)) {
1987
                    /* OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK */
1988
                    if (ossl_unlikely(r->ind_d != NULL)) {
1989
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
1990
                                       "param %s is repeated", s);
1991
                        return 0;
1992
                    }
1993
                    r->ind_d = (OSSL_PARAM *)p;
1994
                }
1995
# endif
1996
0
                break;
1997
0
            case 'k':
1998
# if defined(FIPS_MODULE)
1999
                if (ossl_likely(strcmp("ey-check", s + 1) == 0)) {
2000
                    /* OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK */
2001
                    if (ossl_unlikely(r->ind_k != NULL)) {
2002
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2003
                                       "param %s is repeated", s);
2004
                        return 0;
2005
                    }
2006
                    r->ind_k = (OSSL_PARAM *)p;
2007
                }
2008
# endif
2009
0
                break;
2010
2.33k
            case 'm':
2011
2.33k
                switch(s[1]) {
2012
0
                default:
2013
0
                    break;
2014
2.33k
                case 'g':
2015
2.33k
                    switch(s[2]) {
2016
0
                    default:
2017
0
                        break;
2018
2.33k
                    case 'f':
2019
2.33k
                        switch(s[3]) {
2020
0
                        default:
2021
0
                            break;
2022
2.33k
                        case '1':
2023
2.33k
                            switch(s[4]) {
2024
0
                            default:
2025
0
                                break;
2026
2.33k
                            case '-':
2027
2.33k
                                switch(s[5]) {
2028
0
                                default:
2029
0
                                    break;
2030
2.33k
                                case 'd':
2031
2.33k
                                    if (ossl_likely(strcmp("igest", s + 6) == 0)) {
2032
                                        /* OSSL_SIGNATURE_PARAM_MGF1_DIGEST */
2033
2.33k
                                        if (ossl_unlikely(r->mgf1 != NULL)) {
2034
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2035
0
                                                           "param %s is repeated", s);
2036
0
                                            return 0;
2037
0
                                        }
2038
2.33k
                                        r->mgf1 = (OSSL_PARAM *)p;
2039
2.33k
                                    }
2040
2.33k
                                    break;
2041
2.33k
                                case 'p':
2042
0
                                    if (ossl_likely(strcmp("roperties", s + 6) == 0)) {
2043
                                        /* OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES */
2044
0
                                        if (ossl_unlikely(r->mgf1pq != NULL)) {
2045
0
                                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2046
0
                                                           "param %s is repeated", s);
2047
0
                                            return 0;
2048
0
                                        }
2049
0
                                        r->mgf1pq = (OSSL_PARAM *)p;
2050
0
                                    }
2051
2.33k
                                }
2052
2.33k
                            }
2053
2.33k
                        }
2054
2.33k
                    }
2055
2.33k
                }
2056
2.33k
                break;
2057
14.4k
            case 'p':
2058
14.4k
                if (ossl_likely(strcmp("ad-mode", s + 1) == 0)) {
2059
                    /* OSSL_SIGNATURE_PARAM_PAD_MODE */
2060
14.4k
                    if (ossl_unlikely(r->pad != NULL)) {
2061
0
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2062
0
                                       "param %s is repeated", s);
2063
0
                        return 0;
2064
0
                    }
2065
14.4k
                    r->pad = (OSSL_PARAM *)p;
2066
14.4k
                }
2067
14.4k
                break;
2068
14.4k
            case 'r':
2069
# if defined(FIPS_MODULE)
2070
                if (ossl_likely(strcmp("sa-pss-saltlen-check", s + 1) == 0)) {
2071
                    /* OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK */
2072
                    if (ossl_unlikely(r->ind_slen != NULL)) {
2073
                        ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2074
                                       "param %s is repeated", s);
2075
                        return 0;
2076
                    }
2077
                    r->ind_slen = (OSSL_PARAM *)p;
2078
                }
2079
# endif
2080
0
                break;
2081
14.4k
            case 's':
2082
14.4k
                switch(s[1]) {
2083
0
                default:
2084
0
                    break;
2085
14.4k
                case 'a':
2086
14.4k
                    if (ossl_likely(strcmp("ltlen", s + 2) == 0)) {
2087
                        /* OSSL_SIGNATURE_PARAM_PSS_SALTLEN */
2088
14.4k
                        if (ossl_unlikely(r->slen != NULL)) {
2089
0
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2090
0
                                           "param %s is repeated", s);
2091
0
                            return 0;
2092
0
                        }
2093
14.4k
                        r->slen = (OSSL_PARAM *)p;
2094
14.4k
                    }
2095
14.4k
                    break;
2096
14.4k
                case 'i':
2097
# if defined(FIPS_MODULE)
2098
                    if (ossl_likely(strcmp("gn-x931-pad-check", s + 2) == 0)) {
2099
                        /* OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK */
2100
                        if (ossl_unlikely(r->ind_xpad != NULL)) {
2101
                            ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2102
                                           "param %s is repeated", s);
2103
                            return 0;
2104
                        }
2105
                        r->ind_xpad = (OSSL_PARAM *)p;
2106
                    }
2107
# endif
2108
0
                    break;
2109
14.4k
                }
2110
14.4k
                break;
2111
31.2k
            }
2112
31.2k
    return 1;
2113
31.2k
}
2114
#endif
2115
/* End of machine generated */
2116
/* clang-format on */
2117
2118
static int rsa_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
2119
22.2k
{
2120
22.2k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2121
22.2k
    struct rsa_set_ctx_params_st p;
2122
22.2k
    int pad_mode;
2123
22.2k
    int saltlen;
2124
22.2k
    char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = NULL;
2125
22.2k
    char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = NULL;
2126
22.2k
    char mgf1mdname[OSSL_MAX_NAME_SIZE] = "", *pmgf1mdname = NULL;
2127
22.2k
    char mgf1mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmgf1mdprops = NULL;
2128
2129
22.2k
    if (prsactx == NULL)
2130
0
        return 0;
2131
    /* The processing code below doesn't handle no parameters properly */
2132
22.2k
    if (ossl_param_is_empty(params))
2133
13.0k
        return 1;
2134
2135
9.23k
    if (prsactx->flag_allow_md) {
2136
0
        if (!rsa_set_ctx_params_decoder(params, &p))
2137
0
            return 0;
2138
9.23k
    } else {
2139
9.23k
        if (!rsa_set_ctx_params_no_digest_decoder(params, &p))
2140
0
            return 0;
2141
9.23k
    }
2142
2143
9.23k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE0,
2144
9.23k
            p.ind_k))
2145
0
        return 0;
2146
2147
9.23k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE1,
2148
9.23k
            p.ind_d))
2149
0
        return 0;
2150
2151
9.23k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE2,
2152
9.23k
            p.ind_xpad))
2153
0
        return 0;
2154
2155
9.23k
    if (!OSSL_FIPS_IND_SET_CTX_FROM_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE3,
2156
9.23k
            p.ind_slen))
2157
0
        return 0;
2158
2159
9.23k
    pad_mode = prsactx->pad_mode;
2160
9.23k
    saltlen = prsactx->saltlen;
2161
2162
9.23k
    if (p.digest != NULL) {
2163
0
        pmdname = mdname;
2164
0
        if (!OSSL_PARAM_get_utf8_string(p.digest, &pmdname, sizeof(mdname)))
2165
0
            return 0;
2166
2167
0
        if (p.propq != NULL) {
2168
0
            pmdprops = mdprops;
2169
0
            if (!OSSL_PARAM_get_utf8_string(p.propq,
2170
0
                    &pmdprops, sizeof(mdprops)))
2171
0
                return 0;
2172
0
        }
2173
0
    }
2174
2175
9.23k
    if (p.pad != NULL) {
2176
4.08k
        const char *err_extra_text = NULL;
2177
2178
4.08k
        if (p.pad->data_type != OSSL_PARAM_UTF8_STRING) {
2179
            /* Support for legacy pad mode number */
2180
4.08k
            if (!OSSL_PARAM_get_int(p.pad, &pad_mode))
2181
0
                return 0;
2182
4.08k
        } else {
2183
0
            int i;
2184
2185
0
            if (p.pad->data == NULL)
2186
0
                return 0;
2187
2188
0
            for (i = 0; padding_item[i].id != 0; i++) {
2189
0
                if (strcmp(p.pad->data, padding_item[i].ptr) == 0) {
2190
0
                    pad_mode = padding_item[i].id;
2191
0
                    break;
2192
0
                }
2193
0
            }
2194
0
        }
2195
2196
4.08k
        switch (pad_mode) {
2197
0
        case RSA_PKCS1_OAEP_PADDING:
2198
            /*
2199
             * OAEP padding is for asymmetric cipher only so is not compatible
2200
             * with signature use.
2201
             */
2202
0
            err_extra_text = "OAEP padding not allowed for signing / verifying";
2203
0
            goto bad_pad;
2204
4.08k
        case RSA_PKCS1_PSS_PADDING:
2205
4.08k
            if ((prsactx->operation
2206
4.08k
                    & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG
2207
4.08k
                        | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYMSG))
2208
4.08k
                == 0) {
2209
0
                err_extra_text = "PSS padding only allowed for sign and verify operations";
2210
0
                goto bad_pad;
2211
0
            }
2212
4.08k
            break;
2213
4.08k
        case RSA_PKCS1_PADDING:
2214
0
            err_extra_text = "PKCS#1 padding not allowed with RSA-PSS";
2215
0
            goto cont;
2216
0
        case RSA_NO_PADDING:
2217
0
            err_extra_text = "No padding not allowed with RSA-PSS";
2218
0
            goto cont;
2219
0
        case RSA_X931_PADDING:
2220
#ifdef FIPS_MODULE
2221
            /* X9.31 only allows sizes of 1024 + 256 * s (bits) */
2222
            if ((RSA_bits(prsactx->rsa) & 0xFF) != 0) {
2223
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
2224
                return 0;
2225
            }
2226
            /* RSA Signing with X9.31 padding is not allowed in FIPS 140-3 */
2227
            if (!rsa_x931_padding_allowed(prsactx))
2228
                return 0;
2229
#endif
2230
0
            err_extra_text = "X.931 padding not allowed with RSA-PSS";
2231
0
        cont:
2232
0
            if (RSA_test_flags(prsactx->rsa,
2233
0
                    RSA_FLAG_TYPE_MASK)
2234
0
                == RSA_FLAG_TYPE_RSA)
2235
0
                break;
2236
            /* FALLTHRU */
2237
0
        default:
2238
0
        bad_pad:
2239
0
            if (err_extra_text == NULL)
2240
0
                ERR_raise(ERR_LIB_PROV,
2241
0
                    PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
2242
0
            else
2243
0
                ERR_raise_data(ERR_LIB_PROV,
2244
0
                    PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE,
2245
0
                    err_extra_text);
2246
0
            return 0;
2247
4.08k
        }
2248
4.08k
    }
2249
2250
9.23k
    if (p.slen != NULL) {
2251
4.08k
        if (pad_mode != RSA_PKCS1_PSS_PADDING) {
2252
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_NOT_SUPPORTED,
2253
0
                "PSS saltlen can only be specified if "
2254
0
                "PSS padding has been specified first");
2255
0
            return 0;
2256
0
        }
2257
2258
4.08k
        if (p.slen->data_type != OSSL_PARAM_UTF8_STRING) {
2259
            /* Support for legacy pad mode number */
2260
0
            if (!OSSL_PARAM_get_int(p.slen, &saltlen))
2261
0
                return 0;
2262
4.08k
        } else {
2263
4.08k
            if (strcmp(p.slen->data, OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST) == 0)
2264
3.01k
                saltlen = RSA_PSS_SALTLEN_DIGEST;
2265
1.07k
            else if (strcmp(p.slen->data, OSSL_PKEY_RSA_PSS_SALT_LEN_MAX) == 0)
2266
0
                saltlen = RSA_PSS_SALTLEN_MAX;
2267
1.07k
            else if (strcmp(p.slen->data, OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO) == 0)
2268
0
                saltlen = RSA_PSS_SALTLEN_AUTO;
2269
1.07k
            else if (strcmp(p.slen->data, OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX) == 0)
2270
0
                saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
2271
1.07k
            else
2272
1.07k
                saltlen = atoi(p.slen->data);
2273
4.08k
        }
2274
2275
        /*
2276
         * RSA_PSS_SALTLEN_AUTO_DIGEST_MAX seems curiously named in this check.
2277
         * Contrary to what it's name suggests, it's the currently lowest
2278
         * saltlen number possible.
2279
         */
2280
4.08k
        if (saltlen < RSA_PSS_SALTLEN_AUTO_DIGEST_MAX) {
2281
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
2282
0
            return 0;
2283
0
        }
2284
2285
4.08k
        if (rsa_pss_restricted(prsactx)) {
2286
43
            switch (saltlen) {
2287
0
            case RSA_PSS_SALTLEN_AUTO:
2288
0
            case RSA_PSS_SALTLEN_AUTO_DIGEST_MAX:
2289
0
                if ((prsactx->operation
2290
0
                        & (EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYMSG))
2291
0
                    == 0) {
2292
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH,
2293
0
                        "Cannot use autodetected salt length");
2294
0
                    return 0;
2295
0
                }
2296
0
                break;
2297
0
            case RSA_PSS_SALTLEN_DIGEST:
2298
0
                if (prsactx->min_saltlen > EVP_MD_get_size(prsactx->md)) {
2299
0
                    ERR_raise_data(ERR_LIB_PROV,
2300
0
                        PROV_R_PSS_SALTLEN_TOO_SMALL,
2301
0
                        "Should be more than %d, but would be "
2302
0
                        "set to match digest size (%d)",
2303
0
                        prsactx->min_saltlen,
2304
0
                        EVP_MD_get_size(prsactx->md));
2305
0
                    return 0;
2306
0
                }
2307
0
                break;
2308
43
            default:
2309
43
                if (saltlen >= 0 && saltlen < prsactx->min_saltlen) {
2310
0
                    ERR_raise_data(ERR_LIB_PROV,
2311
0
                        PROV_R_PSS_SALTLEN_TOO_SMALL,
2312
0
                        "Should be more than %d, "
2313
0
                        "but would be set to %d",
2314
0
                        prsactx->min_saltlen, saltlen);
2315
0
                    return 0;
2316
0
                }
2317
43
            }
2318
43
        }
2319
4.08k
    }
2320
2321
9.23k
    if (p.mgf1 != NULL) {
2322
1.07k
        pmgf1mdname = mgf1mdname;
2323
1.07k
        if (!OSSL_PARAM_get_utf8_string(p.mgf1, &pmgf1mdname, sizeof(mgf1mdname)))
2324
0
            return 0;
2325
2326
1.07k
        if (p.mgf1pq != NULL) {
2327
0
            pmgf1mdprops = mgf1mdprops;
2328
0
            if (!OSSL_PARAM_get_utf8_string(p.mgf1pq,
2329
0
                    &pmgf1mdprops, sizeof(mgf1mdprops)))
2330
0
                return 0;
2331
0
        }
2332
2333
1.07k
        if (pad_mode != RSA_PKCS1_PSS_PADDING) {
2334
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MGF1_MD);
2335
0
            return 0;
2336
0
        }
2337
1.07k
    }
2338
2339
9.23k
    prsactx->saltlen = saltlen;
2340
9.23k
    prsactx->pad_mode = pad_mode;
2341
2342
9.23k
    if (prsactx->md == NULL && pmdname == NULL
2343
0
        && pad_mode == RSA_PKCS1_PSS_PADDING)
2344
0
        pmdname = RSA_DEFAULT_DIGEST_NAME;
2345
2346
9.23k
    if (pmgf1mdname != NULL
2347
1.07k
        && !rsa_setup_mgf1_md(prsactx, pmgf1mdname, pmgf1mdprops))
2348
0
        return 0;
2349
2350
9.23k
    if (pmdname != NULL) {
2351
0
        if (!rsa_setup_md(prsactx, pmdname, pmdprops, "RSA Sign Set Ctx"))
2352
0
            return 0;
2353
9.23k
    } else {
2354
9.23k
        if (!rsa_check_padding(prsactx, NULL, NULL, prsactx->mdnid))
2355
0
            return 0;
2356
9.23k
    }
2357
9.23k
    return 1;
2358
9.23k
}
2359
2360
static const OSSL_PARAM *rsa_settable_ctx_params(void *vprsactx,
2361
    ossl_unused void *provctx)
2362
50.8k
{
2363
50.8k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2364
2365
50.8k
    if (prsactx != NULL && !prsactx->flag_allow_md)
2366
50.3k
        return rsa_set_ctx_params_no_digest_list;
2367
573
    return rsa_set_ctx_params_list;
2368
50.8k
}
2369
2370
static int rsa_get_ctx_md_params(void *vprsactx, OSSL_PARAM *params)
2371
0
{
2372
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2373
2374
0
    if (prsactx->mdctx == NULL)
2375
0
        return 0;
2376
2377
0
    return EVP_MD_CTX_get_params(prsactx->mdctx, params);
2378
0
}
2379
2380
static const OSSL_PARAM *rsa_gettable_ctx_md_params(void *vprsactx)
2381
0
{
2382
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2383
2384
0
    if (prsactx->md == NULL)
2385
0
        return 0;
2386
2387
0
    return EVP_MD_gettable_ctx_params(prsactx->md);
2388
0
}
2389
2390
static int rsa_set_ctx_md_params(void *vprsactx, const OSSL_PARAM params[])
2391
0
{
2392
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2393
2394
0
    if (prsactx->mdctx == NULL)
2395
0
        return 0;
2396
2397
0
    return EVP_MD_CTX_set_params(prsactx->mdctx, params);
2398
0
}
2399
2400
static const OSSL_PARAM *rsa_settable_ctx_md_params(void *vprsactx)
2401
0
{
2402
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2403
2404
0
    if (prsactx->md == NULL)
2405
0
        return 0;
2406
2407
0
    return EVP_MD_settable_ctx_params(prsactx->md);
2408
0
}
2409
2410
const OSSL_DISPATCH ossl_rsa_signature_functions[] = {
2411
    { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))rsa_newctx },
2412
    { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))rsa_sign_init },
2413
    { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))rsa_sign },
2414
    { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))rsa_verify_init },
2415
    { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))rsa_verify },
2416
    { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT,
2417
        (void (*)(void))rsa_verify_recover_init },
2418
    { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER,
2419
        (void (*)(void))rsa_verify_recover },
2420
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
2421
        (void (*)(void))rsa_digest_sign_init },
2422
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
2423
        (void (*)(void))rsa_digest_sign_update },
2424
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
2425
        (void (*)(void))rsa_digest_sign_final },
2426
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
2427
        (void (*)(void))rsa_digest_verify_init },
2428
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
2429
        (void (*)(void))rsa_digest_verify_update },
2430
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
2431
        (void (*)(void))rsa_digest_verify_final },
2432
    { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))rsa_freectx },
2433
    { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))rsa_dupctx },
2434
    { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))rsa_get_ctx_params },
2435
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
2436
        (void (*)(void))rsa_gettable_ctx_params },
2437
    { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))rsa_set_ctx_params },
2438
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
2439
        (void (*)(void))rsa_settable_ctx_params },
2440
    { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
2441
        (void (*)(void))rsa_get_ctx_md_params },
2442
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
2443
        (void (*)(void))rsa_gettable_ctx_md_params },
2444
    { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
2445
        (void (*)(void))rsa_set_ctx_md_params },
2446
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
2447
        (void (*)(void))rsa_settable_ctx_md_params },
2448
    OSSL_DISPATCH_END
2449
};
2450
2451
/* ------------------------------------------------------------------ */
2452
2453
/*
2454
 * So called sigalgs (composite RSA+hash) implemented below.  They
2455
 * are pretty much hard coded, and rely on the hash implementation
2456
 * being available as per what OPENSSL_NO_ macros allow.
2457
 */
2458
2459
static OSSL_FUNC_signature_query_key_types_fn rsa_sigalg_query_key_types;
2460
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_sigalg_settable_ctx_params;
2461
static OSSL_FUNC_signature_set_ctx_params_fn rsa_sigalg_set_ctx_params;
2462
2463
/*
2464
 * rsa_sigalg_signverify_init() is almost like rsa_digest_signverify_init(),
2465
 * just doesn't allow fetching an MD from whatever the user chooses.
2466
 */
2467
static int rsa_sigalg_signverify_init(void *vprsactx, void *vrsa,
2468
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
2469
    const OSSL_PARAM params[],
2470
    const char *mdname,
2471
    int operation, int pad_mode,
2472
    const char *desc)
2473
0
{
2474
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2475
2476
0
    if (!ossl_prov_is_running())
2477
0
        return 0;
2478
2479
0
    if (!rsa_signverify_init(prsactx, vrsa, set_ctx_params, params, operation,
2480
0
            desc))
2481
0
        return 0;
2482
2483
    /* PSS is currently not supported as a sigalg */
2484
0
    if (prsactx->pad_mode == RSA_PKCS1_PSS_PADDING) {
2485
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
2486
0
        return 0;
2487
0
    }
2488
2489
0
    if (!rsa_setup_md(prsactx, mdname, NULL, desc))
2490
0
        return 0;
2491
2492
0
    prsactx->pad_mode = pad_mode;
2493
0
    prsactx->flag_sigalg = 1;
2494
0
    prsactx->flag_allow_md = 0;
2495
2496
0
    if (prsactx->mdctx == NULL) {
2497
0
        prsactx->mdctx = EVP_MD_CTX_new();
2498
0
        if (prsactx->mdctx == NULL)
2499
0
            goto error;
2500
0
    }
2501
2502
0
    if (!EVP_DigestInit_ex2(prsactx->mdctx, prsactx->md, params))
2503
0
        goto error;
2504
2505
0
    return 1;
2506
2507
0
error:
2508
0
    EVP_MD_CTX_free(prsactx->mdctx);
2509
0
    prsactx->mdctx = NULL;
2510
0
    return 0;
2511
0
}
2512
2513
static const char **rsa_sigalg_query_key_types(void)
2514
0
{
2515
0
    static const char *keytypes[] = { "RSA", NULL };
2516
2517
0
    return keytypes;
2518
0
}
2519
2520
/* clang-format off */
2521
/* Machine generated by util/perl/OpenSSL/paramnames.pm */
2522
#ifndef rsa_sigalg_set_ctx_params_list
2523
static ossl_unused const OSSL_PARAM rsa_sigalg_set_ctx_params_list[] = {
2524
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
2525
    OSSL_PARAM_END
2526
};
2527
#endif
2528
2529
#ifndef rsa_sigalg_set_ctx_params_st
2530
struct rsa_sigalg_set_ctx_params_st {
2531
    OSSL_PARAM *sig;
2532
};
2533
#endif
2534
2535
#ifndef rsa_sigalg_set_ctx_params_decoder
2536
static ossl_unused int rsa_sigalg_set_ctx_params_decoder
2537
    (const OSSL_PARAM *p, struct rsa_sigalg_set_ctx_params_st *r)
2538
18.8k
{
2539
18.8k
    const char *s;
2540
2541
18.8k
    memset(r, 0, sizeof(*r));
2542
18.8k
    if (p != NULL)
2543
37.7k
        for (; (s = p->key) != NULL; p++)
2544
18.8k
            if (ossl_likely(strcmp("signature", s + 0) == 0)) {
2545
                /* OSSL_SIGNATURE_PARAM_SIGNATURE */
2546
18.8k
                if (ossl_unlikely(r->sig != NULL)) {
2547
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_REPEATED_PARAMETER,
2548
0
                                   "param %s is repeated", s);
2549
0
                    return 0;
2550
0
                }
2551
18.8k
                r->sig = (OSSL_PARAM *)p;
2552
18.8k
            }
2553
18.8k
    return 1;
2554
18.8k
}
2555
#endif
2556
/* End of machine generated */
2557
/* clang-format on */
2558
2559
static const OSSL_PARAM *rsa_sigalg_settable_ctx_params(void *vprsactx,
2560
    ossl_unused void *provctx)
2561
6
{
2562
6
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2563
2564
6
    if (prsactx != NULL && prsactx->operation == EVP_PKEY_OP_VERIFYMSG)
2565
0
        return rsa_sigalg_set_ctx_params_list;
2566
6
    return NULL;
2567
6
}
2568
2569
static int rsa_sigalg_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
2570
18.8k
{
2571
18.8k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2572
18.8k
    struct rsa_sigalg_set_ctx_params_st p;
2573
2574
18.8k
    if (prsactx == NULL || !rsa_sigalg_set_ctx_params_decoder(params, &p))
2575
0
        return 0;
2576
2577
18.8k
    if (prsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
2578
18.8k
        if (p.sig != NULL) {
2579
18.8k
            OPENSSL_free(prsactx->sig);
2580
18.8k
            prsactx->sig = NULL;
2581
18.8k
            prsactx->siglen = 0;
2582
18.8k
            if (!OSSL_PARAM_get_octet_string(p.sig, (void **)&prsactx->sig,
2583
18.8k
                    0, &prsactx->siglen))
2584
0
                return 0;
2585
18.8k
        }
2586
18.8k
    }
2587
18.8k
    return 1;
2588
18.8k
}
2589
2590
#define IMPL_RSA_SIGALG(md, MD)                                       \
2591
    static OSSL_FUNC_signature_sign_init_fn rsa_##md##_sign_init;     \
2592
    static OSSL_FUNC_signature_sign_message_init_fn                   \
2593
        rsa_##md##_sign_message_init;                                 \
2594
    static OSSL_FUNC_signature_verify_init_fn rsa_##md##_verify_init; \
2595
    static OSSL_FUNC_signature_verify_message_init_fn                 \
2596
        rsa_##md##_verify_message_init;                               \
2597
                                                                      \
2598
    static int                                                        \
2599
    rsa_##md##_sign_init(void *vprsactx, void *vrsa,                  \
2600
        const OSSL_PARAM params[])                                    \
2601
0
    {                                                                 \
2602
0
        static const char desc[] = "RSA Sigalg Sign Init";            \
2603
0
                                                                      \
2604
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2605
0
            rsa_sigalg_set_ctx_params,                                \
2606
0
            params, MD,                                               \
2607
0
            EVP_PKEY_OP_SIGN,                                         \
2608
0
            RSA_PKCS1_PADDING,                                        \
2609
0
            desc);                                                    \
2610
0
    }                                                                 \
Unexecuted instantiation: rsa_sig.c:rsa_ripemd160_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha1_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha224_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha256_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha384_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_224_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_256_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_224_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_256_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_384_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_512_sign_init
Unexecuted instantiation: rsa_sig.c:rsa_sm3_sign_init
2611
                                                                      \
2612
    static int                                                        \
2613
    rsa_##md##_sign_message_init(void *vprsactx, void *vrsa,          \
2614
        const OSSL_PARAM params[])                                    \
2615
0
    {                                                                 \
2616
0
        static const char desc[] = "RSA Sigalg Sign Message Init";    \
2617
0
                                                                      \
2618
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2619
0
            rsa_sigalg_set_ctx_params,                                \
2620
0
            params, MD,                                               \
2621
0
            EVP_PKEY_OP_SIGNMSG,                                      \
2622
0
            RSA_PKCS1_PADDING,                                        \
2623
0
            desc);                                                    \
2624
0
    }                                                                 \
Unexecuted instantiation: rsa_sig.c:rsa_ripemd160_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha1_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha224_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha256_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha384_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_224_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_256_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_224_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_256_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_384_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_512_sign_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sm3_sign_message_init
2625
                                                                      \
2626
    static int                                                        \
2627
    rsa_##md##_verify_init(void *vprsactx, void *vrsa,                \
2628
        const OSSL_PARAM params[])                                    \
2629
0
    {                                                                 \
2630
0
        static const char desc[] = "RSA Sigalg Verify Init";          \
2631
0
                                                                      \
2632
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2633
0
            rsa_sigalg_set_ctx_params,                                \
2634
0
            params, MD,                                               \
2635
0
            EVP_PKEY_OP_VERIFY,                                       \
2636
0
            RSA_PKCS1_PADDING,                                        \
2637
0
            desc);                                                    \
2638
0
    }                                                                 \
Unexecuted instantiation: rsa_sig.c:rsa_ripemd160_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha1_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha224_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha256_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha384_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_224_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_256_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_224_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_256_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_384_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_512_verify_init
Unexecuted instantiation: rsa_sig.c:rsa_sm3_verify_init
2639
                                                                      \
2640
    static int                                                        \
2641
    rsa_##md##_verify_recover_init(void *vprsactx, void *vrsa,        \
2642
        const OSSL_PARAM params[])                                    \
2643
0
    {                                                                 \
2644
0
        static const char desc[] = "RSA Sigalg Verify Recover Init";  \
2645
0
                                                                      \
2646
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2647
0
            rsa_sigalg_set_ctx_params,                                \
2648
0
            params, MD,                                               \
2649
0
            EVP_PKEY_OP_VERIFYRECOVER,                                \
2650
0
            RSA_PKCS1_PADDING,                                        \
2651
0
            desc);                                                    \
2652
0
    }                                                                 \
Unexecuted instantiation: rsa_sig.c:rsa_ripemd160_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha1_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha224_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha256_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha384_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_224_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_256_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_224_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_256_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_384_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_512_verify_recover_init
Unexecuted instantiation: rsa_sig.c:rsa_sm3_verify_recover_init
2653
                                                                      \
2654
    static int                                                        \
2655
    rsa_##md##_verify_message_init(void *vprsactx, void *vrsa,        \
2656
        const OSSL_PARAM params[])                                    \
2657
0
    {                                                                 \
2658
0
        static const char desc[] = "RSA Sigalg Verify Message Init";  \
2659
0
                                                                      \
2660
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2661
0
            rsa_sigalg_set_ctx_params,                                \
2662
0
            params, MD,                                               \
2663
0
            EVP_PKEY_OP_VERIFYMSG,                                    \
2664
0
            RSA_PKCS1_PADDING,                                        \
2665
0
            desc);                                                    \
2666
0
    }                                                                 \
Unexecuted instantiation: rsa_sig.c:rsa_ripemd160_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha1_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha224_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha256_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha384_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_224_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha512_256_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_224_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_256_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_384_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sha3_512_verify_message_init
Unexecuted instantiation: rsa_sig.c:rsa_sm3_verify_message_init
2667
                                                                      \
2668
    const OSSL_DISPATCH ossl_rsa_##md##_signature_functions[] = {     \
2669
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))rsa_newctx },   \
2670
        { OSSL_FUNC_SIGNATURE_SIGN_INIT,                              \
2671
            (void (*)(void))rsa_##md##_sign_init },                   \
2672
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))rsa_sign },       \
2673
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                      \
2674
            (void (*)(void))rsa_##md##_sign_message_init },           \
2675
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                    \
2676
            (void (*)(void))rsa_signverify_message_update },          \
2677
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                     \
2678
            (void (*)(void))rsa_sign_message_final },                 \
2679
        { OSSL_FUNC_SIGNATURE_VERIFY_INIT,                            \
2680
            (void (*)(void))rsa_##md##_verify_init },                 \
2681
        { OSSL_FUNC_SIGNATURE_VERIFY,                                 \
2682
            (void (*)(void))rsa_verify },                             \
2683
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                    \
2684
            (void (*)(void))rsa_##md##_verify_message_init },         \
2685
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                  \
2686
            (void (*)(void))rsa_signverify_message_update },          \
2687
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                   \
2688
            (void (*)(void))rsa_verify_message_final },               \
2689
        { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT,                    \
2690
            (void (*)(void))rsa_##md##_verify_recover_init },         \
2691
        { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER,                         \
2692
            (void (*)(void))rsa_verify_recover },                     \
2693
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))rsa_freectx }, \
2694
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))rsa_dupctx },   \
2695
        { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES,                        \
2696
            (void (*)(void))rsa_sigalg_query_key_types },             \
2697
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                         \
2698
            (void (*)(void))rsa_get_ctx_params },                     \
2699
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                    \
2700
            (void (*)(void))rsa_gettable_ctx_params },                \
2701
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                         \
2702
            (void (*)(void))rsa_sigalg_set_ctx_params },              \
2703
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                    \
2704
            (void (*)(void))rsa_sigalg_settable_ctx_params },         \
2705
        OSSL_DISPATCH_END                                             \
2706
    }
2707
2708
#if !defined(OPENSSL_NO_RMD160) && !defined(FIPS_MODULE)
2709
IMPL_RSA_SIGALG(ripemd160, "RIPEMD160");
2710
#endif
2711
IMPL_RSA_SIGALG(sha1, "SHA1");
2712
IMPL_RSA_SIGALG(sha224, "SHA2-224");
2713
IMPL_RSA_SIGALG(sha256, "SHA2-256");
2714
IMPL_RSA_SIGALG(sha384, "SHA2-384");
2715
IMPL_RSA_SIGALG(sha512, "SHA2-512");
2716
IMPL_RSA_SIGALG(sha512_224, "SHA2-512/224");
2717
IMPL_RSA_SIGALG(sha512_256, "SHA2-512/256");
2718
IMPL_RSA_SIGALG(sha3_224, "SHA3-224");
2719
IMPL_RSA_SIGALG(sha3_256, "SHA3-256");
2720
IMPL_RSA_SIGALG(sha3_384, "SHA3-384");
2721
IMPL_RSA_SIGALG(sha3_512, "SHA3-512");
2722
#if !defined(OPENSSL_NO_SM3) && !defined(FIPS_MODULE)
2723
IMPL_RSA_SIGALG(sm3, "SM3");
2724
#endif