Coverage Report

Created: 2026-09-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl35/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
10
/*
11
 * RSA low level APIs are deprecated for public use, but still ok for
12
 * internal use.
13
 */
14
#include "internal/deprecated.h"
15
16
#include <string.h>
17
#include <openssl/crypto.h>
18
#include <openssl/core_dispatch.h>
19
#include <openssl/core_names.h>
20
#include <openssl/err.h>
21
#include <openssl/obj_mac.h>
22
#include <openssl/rsa.h>
23
#include <openssl/params.h>
24
#include <openssl/evp.h>
25
#include <openssl/proverr.h>
26
#include "internal/cryptlib.h"
27
#include "internal/nelem.h"
28
#include "internal/sizes.h"
29
#include "crypto/rsa.h"
30
#include "prov/providercommon.h"
31
#include "prov/implementations.h"
32
#include "prov/provider_ctx.h"
33
#include "prov/der_rsa.h"
34
#include "prov/securitycheck.h"
35
36
0
#define RSA_DEFAULT_DIGEST_NAME OSSL_DIGEST_NAME_SHA1
37
38
static OSSL_FUNC_signature_newctx_fn rsa_newctx;
39
static OSSL_FUNC_signature_sign_init_fn rsa_sign_init;
40
static OSSL_FUNC_signature_verify_init_fn rsa_verify_init;
41
static OSSL_FUNC_signature_verify_recover_init_fn rsa_verify_recover_init;
42
static OSSL_FUNC_signature_sign_fn rsa_sign;
43
static OSSL_FUNC_signature_sign_message_update_fn rsa_signverify_message_update;
44
static OSSL_FUNC_signature_sign_message_final_fn rsa_sign_message_final;
45
static OSSL_FUNC_signature_verify_fn rsa_verify;
46
static OSSL_FUNC_signature_verify_recover_fn rsa_verify_recover;
47
static OSSL_FUNC_signature_verify_message_update_fn rsa_signverify_message_update;
48
static OSSL_FUNC_signature_verify_message_final_fn rsa_verify_message_final;
49
static OSSL_FUNC_signature_digest_sign_init_fn rsa_digest_sign_init;
50
static OSSL_FUNC_signature_digest_sign_update_fn rsa_digest_sign_update;
51
static OSSL_FUNC_signature_digest_sign_final_fn rsa_digest_sign_final;
52
static OSSL_FUNC_signature_digest_verify_init_fn rsa_digest_verify_init;
53
static OSSL_FUNC_signature_digest_verify_update_fn rsa_digest_verify_update;
54
static OSSL_FUNC_signature_digest_verify_final_fn rsa_digest_verify_final;
55
static OSSL_FUNC_signature_freectx_fn rsa_freectx;
56
static OSSL_FUNC_signature_dupctx_fn rsa_dupctx;
57
static OSSL_FUNC_signature_query_key_types_fn rsa_sigalg_query_key_types;
58
static OSSL_FUNC_signature_get_ctx_params_fn rsa_get_ctx_params;
59
static OSSL_FUNC_signature_gettable_ctx_params_fn rsa_gettable_ctx_params;
60
static OSSL_FUNC_signature_set_ctx_params_fn rsa_set_ctx_params;
61
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_settable_ctx_params;
62
static OSSL_FUNC_signature_get_ctx_md_params_fn rsa_get_ctx_md_params;
63
static OSSL_FUNC_signature_gettable_ctx_md_params_fn rsa_gettable_ctx_md_params;
64
static OSSL_FUNC_signature_set_ctx_md_params_fn rsa_set_ctx_md_params;
65
static OSSL_FUNC_signature_settable_ctx_md_params_fn rsa_settable_ctx_md_params;
66
static OSSL_FUNC_signature_set_ctx_params_fn rsa_sigalg_set_ctx_params;
67
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_sigalg_settable_ctx_params;
68
69
static OSSL_ITEM padding_item[] = {
70
    { RSA_PKCS1_PADDING, OSSL_PKEY_RSA_PAD_MODE_PKCSV15 },
71
    { RSA_NO_PADDING, OSSL_PKEY_RSA_PAD_MODE_NONE },
72
    { RSA_X931_PADDING, OSSL_PKEY_RSA_PAD_MODE_X931 },
73
    { RSA_PKCS1_PSS_PADDING, OSSL_PKEY_RSA_PAD_MODE_PSS },
74
    { 0, NULL }
75
};
76
77
/*
78
 * What's passed as an actual key is defined by the KEYMGMT interface.
79
 * We happen to know that our KEYMGMT simply passes RSA structures, so
80
 * we use that here too.
81
 */
82
83
typedef struct {
84
    OSSL_LIB_CTX *libctx;
85
    char *propq;
86
    RSA *rsa;
87
    int operation;
88
89
    /*
90
     * Flag to determine if a full sigalg is run (1) or if a composable
91
     * signature algorithm is run (0).
92
     *
93
     * When a full sigalg is run (1), this currently affects the following
94
     * other flags, which are to remain untouched after their initialization:
95
     *
96
     * - flag_allow_md (initialized to 0)
97
     */
98
    unsigned int flag_sigalg : 1;
99
    /*
100
     * Flag to determine if the hash function can be changed (1) or not (0)
101
     * Because it's dangerous to change during a DigestSign or DigestVerify
102
     * operation, this flag is cleared by their Init function, and set again
103
     * by their Final function.
104
     * Implementations of full sigalgs (such as RSA-SHA256) hard-code this
105
     * flag to not allow changes (0).
106
     */
107
    unsigned int flag_allow_md : 1;
108
    unsigned int mgf1_md_set : 1;
109
    /*
110
     * Flags to say what are the possible next external calls in what
111
     * constitutes the life cycle of an algorithm.  The relevant calls are:
112
     * - init
113
     * - update
114
     * - final
115
     * - oneshot
116
     * All other external calls are regarded as utilitarian and are allowed
117
     * at any time (they may be affected by other flags, like flag_allow_md,
118
     * though).
119
     */
120
    unsigned int flag_allow_update : 1;
121
    unsigned int flag_allow_final : 1;
122
    unsigned int flag_allow_oneshot : 1;
123
124
    /* main digest */
125
    EVP_MD *md;
126
    EVP_MD_CTX *mdctx;
127
    int mdnid;
128
    char mdname[OSSL_MAX_NAME_SIZE]; /* Purely informational */
129
130
    /* RSA padding mode */
131
    int pad_mode;
132
    /* message digest for MGF1 */
133
    EVP_MD *mgf1_md;
134
    int mgf1_mdnid;
135
    char mgf1_mdname[OSSL_MAX_NAME_SIZE]; /* Purely informational */
136
    /* PSS salt length */
137
    int saltlen;
138
    /* Minimum salt length or -1 if no PSS parameter restriction */
139
    int min_saltlen;
140
141
    /* Signature, for verification */
142
    unsigned char *sig;
143
    size_t siglen;
144
145
#ifdef FIPS_MODULE
146
    /*
147
     * FIPS 140-3 IG 2.4.B mandates that verification based on a digest of a
148
     * message is not permitted.  However, signing based on a digest is still
149
     * permitted.
150
     */
151
    int verify_message;
152
#endif
153
154
    /* Temp buffer */
155
    unsigned char *tbuf;
156
157
    OSSL_FIPS_IND_DECLARE
158
} PROV_RSA_CTX;
159
160
/* True if PSS parameters are restricted */
161
46.8k
#define rsa_pss_restricted(prsactx) (prsactx->min_saltlen != -1)
162
163
static size_t rsa_get_md_size(const PROV_RSA_CTX *prsactx)
164
26.7k
{
165
26.7k
    int md_size;
166
167
26.7k
    if (prsactx->md != NULL) {
168
26.7k
        md_size = EVP_MD_get_size(prsactx->md);
169
26.7k
        if (md_size <= 0)
170
0
            return 0;
171
26.7k
        return md_size;
172
26.7k
    }
173
0
    return 0;
174
26.7k
}
175
176
static int rsa_check_padding(const PROV_RSA_CTX *prsactx,
177
    const char *mdname, const char *mgf1_mdname,
178
    int mdnid)
179
87.3k
{
180
87.3k
    switch (prsactx->pad_mode) {
181
0
    case RSA_NO_PADDING:
182
0
        if (mdname != NULL || mdnid != NID_undef) {
183
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE);
184
0
            return 0;
185
0
        }
186
0
        break;
187
0
    case RSA_X931_PADDING:
188
0
        if (RSA_X931_hash_id(mdnid) == -1) {
189
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_X931_DIGEST);
190
0
            return 0;
191
0
        }
192
0
        break;
193
42.0k
    case RSA_PKCS1_PSS_PADDING:
194
42.0k
        if (rsa_pss_restricted(prsactx))
195
1.80k
            if ((mdname != NULL && !EVP_MD_is_a(prsactx->md, mdname))
196
1.77k
                || (mgf1_mdname != NULL
197
437
                    && !EVP_MD_is_a(prsactx->mgf1_md, mgf1_mdname))) {
198
26
                ERR_raise(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED);
199
26
                return 0;
200
26
            }
201
42.0k
        break;
202
45.2k
    default:
203
45.2k
        break;
204
87.3k
    }
205
206
87.3k
    return 1;
207
87.3k
}
208
209
static int rsa_check_parameters(PROV_RSA_CTX *prsactx, int min_saltlen)
210
505
{
211
505
    if (prsactx->pad_mode == RSA_PKCS1_PSS_PADDING) {
212
505
        int max_saltlen;
213
214
        /* See if minimum salt length exceeds maximum possible */
215
505
        max_saltlen = RSA_size(prsactx->rsa) - EVP_MD_get_size(prsactx->md);
216
505
        if ((RSA_bits(prsactx->rsa) & 0x7) == 1)
217
174
            max_saltlen--;
218
505
        if (min_saltlen < 0 || min_saltlen > max_saltlen) {
219
24
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
220
24
            return 0;
221
24
        }
222
481
        prsactx->min_saltlen = min_saltlen;
223
481
    }
224
481
    return 1;
225
505
}
226
227
static void *rsa_newctx(void *provctx, const char *propq)
228
45.8k
{
229
45.8k
    PROV_RSA_CTX *prsactx = NULL;
230
45.8k
    char *propq_copy = NULL;
231
232
45.8k
    if (!ossl_prov_is_running())
233
0
        return NULL;
234
235
45.8k
    if ((prsactx = OPENSSL_zalloc(sizeof(PROV_RSA_CTX))) == NULL
236
45.8k
        || (propq != NULL
237
0
            && (propq_copy = OPENSSL_strdup(propq)) == NULL)) {
238
0
        OPENSSL_free(prsactx);
239
0
        return NULL;
240
0
    }
241
242
45.8k
    OSSL_FIPS_IND_INIT(prsactx)
243
45.8k
    prsactx->libctx = PROV_LIBCTX_OF(provctx);
244
45.8k
    prsactx->flag_allow_md = 1;
245
#ifdef FIPS_MODULE
246
    prsactx->verify_message = 1;
247
#endif
248
45.8k
    prsactx->propq = propq_copy;
249
    /* Maximum up to digest length for sign, auto for verify */
250
45.8k
    prsactx->saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
251
45.8k
    prsactx->min_saltlen = -1;
252
45.8k
    return prsactx;
253
45.8k
}
254
255
static int rsa_pss_compute_saltlen(PROV_RSA_CTX *ctx)
256
0
{
257
0
    int saltlen = ctx->saltlen;
258
0
    int saltlenMax = -1;
259
260
    /* FIPS 186-4 section 5 "The RSA Digital Signature Algorithm", subsection
261
     * 5.5 "PKCS #1" says: "For RSASSA-PSS […] the length (in bytes) of the
262
     * salt (sLen) shall satisfy 0 <= sLen <= hLen, where hLen is the length of
263
     * the hash function output block (in bytes)."
264
     *
265
     * Provide a way to use at most the digest length, so that the default does
266
     * not violate FIPS 186-4. */
267
0
    if (saltlen == RSA_PSS_SALTLEN_DIGEST) {
268
0
        if ((saltlen = EVP_MD_get_size(ctx->md)) <= 0) {
269
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
270
0
            return -1;
271
0
        }
272
0
    } else if (saltlen == RSA_PSS_SALTLEN_AUTO_DIGEST_MAX) {
273
0
        saltlen = RSA_PSS_SALTLEN_MAX;
274
0
        if ((saltlenMax = EVP_MD_get_size(ctx->md)) <= 0) {
275
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
276
0
            return -1;
277
0
        }
278
0
    }
279
0
    if (saltlen == RSA_PSS_SALTLEN_MAX || saltlen == RSA_PSS_SALTLEN_AUTO) {
280
0
        int mdsize, rsasize;
281
282
0
        if ((mdsize = EVP_MD_get_size(ctx->md)) <= 0) {
283
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST);
284
0
            return -1;
285
0
        }
286
0
        if ((rsasize = RSA_size(ctx->rsa)) <= 2 || rsasize - 2 < mdsize) {
287
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY);
288
0
            return -1;
289
0
        }
290
0
        saltlen = rsasize - mdsize - 2;
291
0
        if ((RSA_bits(ctx->rsa) & 0x7) == 1)
292
0
            saltlen--;
293
0
        if (saltlenMax >= 0 && saltlen > saltlenMax)
294
0
            saltlen = saltlenMax;
295
0
    }
296
0
    if (saltlen < 0) {
297
0
        ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
298
0
        return -1;
299
0
    } else if (saltlen < ctx->min_saltlen) {
300
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_PSS_SALTLEN_TOO_SMALL,
301
0
            "minimum salt length: %d, actual salt length: %d",
302
0
            ctx->min_saltlen, saltlen);
303
0
        return -1;
304
0
    }
305
0
    return saltlen;
306
0
}
307
308
static unsigned char *rsa_generate_signature_aid(PROV_RSA_CTX *ctx,
309
    unsigned char *aid_buf,
310
    size_t buf_len,
311
    size_t *aid_len)
312
0
{
313
0
    WPACKET pkt;
314
0
    unsigned char *aid = NULL;
315
0
    int saltlen;
316
0
    RSA_PSS_PARAMS_30 pss_params;
317
0
    int ret;
318
319
0
    if (!WPACKET_init_der(&pkt, aid_buf, buf_len)) {
320
0
        ERR_raise(ERR_LIB_PROV, ERR_R_CRYPTO_LIB);
321
0
        return NULL;
322
0
    }
323
324
0
    switch (ctx->pad_mode) {
325
0
    case RSA_PKCS1_PADDING:
326
0
        ret = ossl_DER_w_algorithmIdentifier_MDWithRSAEncryption(&pkt, -1,
327
0
            ctx->mdnid);
328
329
0
        if (ret > 0) {
330
0
            break;
331
0
        } else if (ret == 0) {
332
0
            ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
333
0
            goto cleanup;
334
0
        }
335
0
        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
336
0
            "Algorithm ID generation - md NID: %d",
337
0
            ctx->mdnid);
338
0
        goto cleanup;
339
0
    case RSA_PKCS1_PSS_PADDING:
340
0
        saltlen = rsa_pss_compute_saltlen(ctx);
341
0
        if (saltlen < 0)
342
0
            goto cleanup;
343
0
        if (!ossl_rsa_pss_params_30_set_defaults(&pss_params)
344
0
            || !ossl_rsa_pss_params_30_set_hashalg(&pss_params, ctx->mdnid)
345
0
            || !ossl_rsa_pss_params_30_set_maskgenhashalg(&pss_params,
346
0
                ctx->mgf1_mdnid)
347
0
            || !ossl_rsa_pss_params_30_set_saltlen(&pss_params, saltlen)
348
0
            || !ossl_DER_w_algorithmIdentifier_RSA_PSS(&pkt, -1,
349
0
                RSA_FLAG_TYPE_RSASSAPSS,
350
0
                &pss_params)) {
351
0
            ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
352
0
            goto cleanup;
353
0
        }
354
0
        break;
355
0
    default:
356
0
        ERR_raise_data(ERR_LIB_PROV, ERR_R_UNSUPPORTED,
357
0
            "Algorithm ID generation - pad mode: %d",
358
0
            ctx->pad_mode);
359
0
        goto cleanup;
360
0
    }
361
0
    if (WPACKET_finish(&pkt)) {
362
0
        WPACKET_get_total_written(&pkt, aid_len);
363
0
        aid = WPACKET_get_curr(&pkt);
364
0
    }
365
0
cleanup:
366
0
    WPACKET_cleanup(&pkt);
367
0
    return aid;
368
0
}
369
370
static int rsa_setup_md(PROV_RSA_CTX *ctx, const char *mdname,
371
    const char *mdprops, const char *desc)
372
45.9k
{
373
45.9k
    EVP_MD *md = NULL;
374
375
45.9k
    if (mdprops == NULL)
376
45.9k
        mdprops = ctx->propq;
377
378
45.9k
    if (mdname != NULL) {
379
45.9k
        int md_nid;
380
45.9k
        size_t mdname_len = strlen(mdname);
381
382
45.9k
        md = EVP_MD_fetch(ctx->libctx, mdname, mdprops);
383
384
45.9k
        if (md == NULL) {
385
65
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
386
65
                "%s could not be fetched", mdname);
387
65
            goto err;
388
65
        }
389
45.8k
        md_nid = ossl_digest_rsa_sign_get_md_nid(md);
390
45.8k
        if (md_nid == NID_undef) {
391
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
392
0
                "digest=%s", mdname);
393
0
            goto err;
394
0
        }
395
        /*
396
         * XOF digests are not allowed except for RSA PSS.
397
         * We don't support XOF digests with RSA PSS (yet), so just fail.
398
         * When we do support them, uncomment the second clause.
399
         */
400
45.8k
        if (EVP_MD_xof(md)
401
45.8k
            /* && ctx->pad_mode != RSA_PKCS1_PSS_PADDING */) {
402
0
            ERR_raise(ERR_LIB_PROV, PROV_R_XOF_DIGESTS_NOT_ALLOWED);
403
0
            goto err;
404
0
        }
405
#ifdef FIPS_MODULE
406
        {
407
            int sha1_allowed
408
                = ((ctx->operation
409
                       & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG))
410
                    == 0);
411
412
            if (!ossl_fips_ind_digest_sign_check(OSSL_FIPS_IND_GET(ctx),
413
                    OSSL_FIPS_IND_SETTABLE1,
414
                    ctx->libctx,
415
                    md_nid, sha1_allowed, 1, desc,
416
                    ossl_fips_config_signature_digest_check))
417
                goto err;
418
        }
419
#endif
420
421
45.8k
        if (!rsa_check_padding(ctx, mdname, NULL, md_nid))
422
26
            goto err;
423
45.8k
        if (mdname_len >= sizeof(ctx->mdname)) {
424
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
425
0
                "%s exceeds name buffer length", mdname);
426
0
            goto err;
427
0
        }
428
429
45.8k
        if (!ctx->flag_allow_md) {
430
0
            if (ctx->mdname[0] != '\0' && !EVP_MD_is_a(md, ctx->mdname)) {
431
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
432
0
                    "digest %s != %s", mdname, ctx->mdname);
433
0
                goto err;
434
0
            }
435
0
            EVP_MD_free(md);
436
0
            return 1;
437
0
        }
438
439
45.8k
        if (!ctx->mgf1_md_set) {
440
45.3k
            if (!EVP_MD_up_ref(md)) {
441
0
                goto err;
442
0
            }
443
45.3k
            EVP_MD_free(ctx->mgf1_md);
444
45.3k
            ctx->mgf1_md = md;
445
45.3k
            ctx->mgf1_mdnid = md_nid;
446
45.3k
            OPENSSL_strlcpy(ctx->mgf1_mdname, mdname, sizeof(ctx->mgf1_mdname));
447
45.3k
        }
448
449
45.8k
        EVP_MD_CTX_free(ctx->mdctx);
450
45.8k
        EVP_MD_free(ctx->md);
451
452
45.8k
        ctx->mdctx = NULL;
453
45.8k
        ctx->md = md;
454
45.8k
        ctx->mdnid = md_nid;
455
45.8k
        OPENSSL_strlcpy(ctx->mdname, mdname, sizeof(ctx->mdname));
456
45.8k
    }
457
458
45.8k
    return 1;
459
91
err:
460
91
    EVP_MD_free(md);
461
91
    return 0;
462
45.9k
}
463
464
static int rsa_setup_mgf1_md(PROV_RSA_CTX *ctx, const char *mdname,
465
    const char *mdprops)
466
3.33k
{
467
3.33k
    size_t len;
468
3.33k
    EVP_MD *md = NULL;
469
3.33k
    int mdnid;
470
471
3.33k
    if (mdprops == NULL)
472
3.33k
        mdprops = ctx->propq;
473
474
3.33k
    if ((md = EVP_MD_fetch(ctx->libctx, mdname, mdprops)) == NULL) {
475
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
476
0
            "%s could not be fetched", mdname);
477
0
        return 0;
478
0
    }
479
    /* The default for mgf1 is SHA1 - so allow SHA1 */
480
3.33k
    if ((mdnid = ossl_digest_rsa_sign_get_md_nid(md)) <= 0
481
3.33k
        || !rsa_check_padding(ctx, NULL, mdname, mdnid)) {
482
0
        if (mdnid <= 0)
483
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_DIGEST_NOT_ALLOWED,
484
0
                "digest=%s", mdname);
485
0
        EVP_MD_free(md);
486
0
        return 0;
487
0
    }
488
3.33k
    len = OPENSSL_strlcpy(ctx->mgf1_mdname, mdname, sizeof(ctx->mgf1_mdname));
489
3.33k
    if (len >= sizeof(ctx->mgf1_mdname)) {
490
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
491
0
            "%s exceeds name buffer length", mdname);
492
0
        EVP_MD_free(md);
493
0
        return 0;
494
0
    }
495
496
3.33k
    EVP_MD_free(ctx->mgf1_md);
497
3.33k
    ctx->mgf1_md = md;
498
3.33k
    ctx->mgf1_mdnid = mdnid;
499
3.33k
    ctx->mgf1_md_set = 1;
500
3.33k
    return 1;
501
3.33k
}
502
503
static int
504
rsa_signverify_init(PROV_RSA_CTX *prsactx, void *vrsa,
505
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
506
    const OSSL_PARAM params[], int operation,
507
    const char *desc)
508
45.8k
{
509
45.8k
    int protect;
510
511
45.8k
    if (!ossl_prov_is_running() || prsactx == NULL)
512
0
        return 0;
513
514
45.8k
    if (vrsa == NULL && prsactx->rsa == NULL) {
515
0
        ERR_raise(ERR_LIB_PROV, PROV_R_NO_KEY_SET);
516
0
        return 0;
517
0
    }
518
519
45.8k
    if (vrsa != NULL) {
520
45.8k
        if (!RSA_up_ref(vrsa))
521
0
            return 0;
522
45.8k
        RSA_free(prsactx->rsa);
523
45.8k
        prsactx->rsa = vrsa;
524
45.8k
    }
525
45.8k
    if (!ossl_rsa_key_op_get_protect(prsactx->rsa, operation, &protect))
526
0
        return 0;
527
528
45.8k
    prsactx->operation = operation;
529
45.8k
    prsactx->flag_allow_update = 1;
530
45.8k
    prsactx->flag_allow_final = 1;
531
45.8k
    prsactx->flag_allow_oneshot = 1;
532
533
    /* Maximize up to digest length for sign, auto for verify */
534
45.8k
    prsactx->saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
535
45.8k
    prsactx->min_saltlen = -1;
536
537
45.8k
    switch (RSA_test_flags(prsactx->rsa, RSA_FLAG_TYPE_MASK)) {
538
45.3k
    case RSA_FLAG_TYPE_RSA:
539
45.3k
        prsactx->pad_mode = RSA_PKCS1_PADDING;
540
45.3k
        break;
541
534
    case RSA_FLAG_TYPE_RSASSAPSS:
542
534
        prsactx->pad_mode = RSA_PKCS1_PSS_PADDING;
543
544
534
        {
545
534
            const RSA_PSS_PARAMS_30 *pss = ossl_rsa_get0_pss_params_30(prsactx->rsa);
546
547
534
            if (!ossl_rsa_pss_params_30_is_unrestricted(pss)) {
548
509
                int md_nid = ossl_rsa_pss_params_30_hashalg(pss);
549
509
                int mgf1md_nid = ossl_rsa_pss_params_30_maskgenhashalg(pss);
550
509
                int min_saltlen = ossl_rsa_pss_params_30_saltlen(pss);
551
509
                const char *mdname, *mgf1mdname;
552
509
                size_t len;
553
554
509
                mdname = ossl_rsa_oaeppss_nid2name(md_nid);
555
509
                mgf1mdname = ossl_rsa_oaeppss_nid2name(mgf1md_nid);
556
557
509
                if (mdname == NULL) {
558
2
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
559
2
                        "PSS restrictions lack hash algorithm");
560
2
                    return 0;
561
2
                }
562
507
                if (mgf1mdname == NULL) {
563
2
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
564
2
                        "PSS restrictions lack MGF1 hash algorithm");
565
2
                    return 0;
566
2
                }
567
568
505
                len = OPENSSL_strlcpy(prsactx->mdname, mdname,
569
505
                    sizeof(prsactx->mdname));
570
505
                if (len >= sizeof(prsactx->mdname)) {
571
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
572
0
                        "hash algorithm name too long");
573
0
                    return 0;
574
0
                }
575
505
                len = OPENSSL_strlcpy(prsactx->mgf1_mdname, mgf1mdname,
576
505
                    sizeof(prsactx->mgf1_mdname));
577
505
                if (len >= sizeof(prsactx->mgf1_mdname)) {
578
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST,
579
0
                        "MGF1 hash algorithm name too long");
580
0
                    return 0;
581
0
                }
582
505
                prsactx->saltlen = min_saltlen;
583
584
                /* call rsa_setup_mgf1_md before rsa_setup_md to avoid duplication */
585
505
                if (!rsa_setup_mgf1_md(prsactx, mgf1mdname, prsactx->propq)
586
505
                    || !rsa_setup_md(prsactx, mdname, prsactx->propq, desc)
587
505
                    || !rsa_check_parameters(prsactx, min_saltlen))
588
24
                    return 0;
589
505
            }
590
534
        }
591
592
506
        break;
593
506
    default:
594
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
595
0
        return 0;
596
45.8k
    }
597
598
45.8k
    OSSL_FIPS_IND_SET_APPROVED(prsactx)
599
45.8k
    if (!set_ctx_params(prsactx, params))
600
4
        return 0;
601
#ifdef FIPS_MODULE
602
    if (!ossl_fips_ind_rsa_key_check(OSSL_FIPS_IND_GET(prsactx),
603
            OSSL_FIPS_IND_SETTABLE0, prsactx->libctx,
604
            prsactx->rsa, desc, protect))
605
        return 0;
606
#endif
607
45.8k
    return 1;
608
45.8k
}
609
610
static int setup_tbuf(PROV_RSA_CTX *ctx)
611
17.6k
{
612
17.6k
    if (ctx->tbuf != NULL)
613
0
        return 1;
614
17.6k
    if ((ctx->tbuf = OPENSSL_malloc(RSA_size(ctx->rsa))) == NULL)
615
18
        return 0;
616
17.6k
    return 1;
617
17.6k
}
618
619
static void clean_tbuf(PROV_RSA_CTX *ctx)
620
74.4k
{
621
74.4k
    if (ctx->tbuf != NULL)
622
18.9k
        OPENSSL_cleanse(ctx->tbuf, RSA_size(ctx->rsa));
623
74.4k
}
624
625
static void free_tbuf(PROV_RSA_CTX *ctx)
626
73.1k
{
627
73.1k
    clean_tbuf(ctx);
628
73.1k
    OPENSSL_free(ctx->tbuf);
629
73.1k
    ctx->tbuf = NULL;
630
73.1k
}
631
632
#ifdef FIPS_MODULE
633
static int rsa_pss_saltlen_check_passed(PROV_RSA_CTX *ctx, const char *algoname, int saltlen)
634
{
635
    int mdsize = rsa_get_md_size(ctx);
636
    /*
637
     * Perform the check if the salt length is compliant to FIPS 186-5.
638
     *
639
     * According to FIPS 186-5 5.4 (g), the salt length shall be between zero
640
     * and the output block length of the digest function (inclusive).
641
     */
642
    int approved = (saltlen >= 0 && saltlen <= mdsize);
643
644
    if (!approved) {
645
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE3,
646
                ctx->libctx,
647
                algoname, "PSS Salt Length",
648
                ossl_fips_config_rsa_pss_saltlen_check)) {
649
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
650
            return 0;
651
        }
652
    }
653
654
    return 1;
655
}
656
#endif
657
658
static int rsa_sign_init(void *vprsactx, void *vrsa, const OSSL_PARAM params[])
659
0
{
660
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
661
662
#ifdef FIPS_MODULE
663
    if (prsactx != NULL)
664
        prsactx->verify_message = 1;
665
#endif
666
667
0
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
668
0
        EVP_PKEY_OP_SIGN, "RSA Sign Init");
669
0
}
670
671
/*
672
 * Sign tbs without digesting it first.  This is suitable for "primitive"
673
 * signing and signing the digest of a message, i.e. should be used with
674
 * implementations of the keytype related algorithms.
675
 */
676
static int rsa_sign_directly(PROV_RSA_CTX *prsactx,
677
    unsigned char *sig, size_t *siglen, size_t sigsize,
678
    const unsigned char *tbs, size_t tbslen)
679
10.3k
{
680
10.3k
    int ret;
681
10.3k
    size_t rsasize = RSA_size(prsactx->rsa);
682
10.3k
    size_t mdsize = rsa_get_md_size(prsactx);
683
684
10.3k
    if (!ossl_prov_is_running())
685
0
        return 0;
686
687
10.3k
    if (sig == NULL) {
688
5.19k
        *siglen = rsasize;
689
5.19k
        return 1;
690
5.19k
    }
691
692
5.19k
    if (sigsize < rsasize) {
693
0
        ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SIGNATURE_SIZE,
694
0
            "is %zu, should be at least %zu", sigsize, rsasize);
695
0
        return 0;
696
0
    }
697
698
5.19k
    if (mdsize != 0) {
699
5.19k
        if (tbslen != mdsize) {
700
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
701
0
            return 0;
702
0
        }
703
704
5.19k
#ifndef FIPS_MODULE
705
5.19k
        if (EVP_MD_is_a(prsactx->md, OSSL_DIGEST_NAME_MDC2)) {
706
0
            unsigned int sltmp;
707
708
0
            if (prsactx->pad_mode != RSA_PKCS1_PADDING) {
709
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
710
0
                    "only PKCS#1 padding supported with MDC2");
711
0
                return 0;
712
0
            }
713
0
            ret = RSA_sign_ASN1_OCTET_STRING(0, tbs, tbslen, sig, &sltmp,
714
0
                prsactx->rsa);
715
716
0
            if (ret <= 0) {
717
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
718
0
                return 0;
719
0
            }
720
0
            ret = sltmp;
721
0
            goto end;
722
0
        }
723
5.19k
#endif
724
5.19k
        switch (prsactx->pad_mode) {
725
0
        case RSA_X931_PADDING:
726
0
            if ((size_t)RSA_size(prsactx->rsa) < tbslen + 1) {
727
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL,
728
0
                    "RSA key size = %d, expected minimum = %d",
729
0
                    RSA_size(prsactx->rsa), tbslen + 1);
730
0
                return 0;
731
0
            }
732
0
            if (!setup_tbuf(prsactx)) {
733
0
                ERR_raise(ERR_LIB_PROV, ERR_R_PROV_LIB);
734
0
                return 0;
735
0
            }
736
0
            memcpy(prsactx->tbuf, tbs, tbslen);
737
0
            prsactx->tbuf[tbslen] = RSA_X931_hash_id(prsactx->mdnid);
738
0
            ret = RSA_private_encrypt(tbslen + 1, prsactx->tbuf,
739
0
                sig, prsactx->rsa, RSA_X931_PADDING);
740
0
            clean_tbuf(prsactx);
741
0
            break;
742
3.88k
        case RSA_PKCS1_PADDING: {
743
3.88k
            unsigned int sltmp;
744
745
3.88k
            ret = RSA_sign(prsactx->mdnid, tbs, tbslen, sig, &sltmp,
746
3.88k
                prsactx->rsa);
747
3.88k
            if (ret <= 0) {
748
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
749
0
                return 0;
750
0
            }
751
3.88k
            ret = sltmp;
752
3.88k
        } break;
753
754
1.30k
        case RSA_PKCS1_PSS_PADDING: {
755
1.30k
            int saltlen;
756
757
            /* Check PSS restrictions */
758
1.30k
            if (rsa_pss_restricted(prsactx)) {
759
0
                switch (prsactx->saltlen) {
760
0
                case RSA_PSS_SALTLEN_DIGEST:
761
0
                    if (prsactx->min_saltlen > EVP_MD_get_size(prsactx->md)) {
762
0
                        ERR_raise_data(ERR_LIB_PROV,
763
0
                            PROV_R_PSS_SALTLEN_TOO_SMALL,
764
0
                            "minimum salt length set to %d, "
765
0
                            "but the digest only gives %d",
766
0
                            prsactx->min_saltlen,
767
0
                            EVP_MD_get_size(prsactx->md));
768
0
                        return 0;
769
0
                    }
770
                    /* FALLTHRU */
771
0
                default:
772
0
                    if (prsactx->saltlen >= 0
773
0
                        && prsactx->saltlen < prsactx->min_saltlen) {
774
0
                        ERR_raise_data(ERR_LIB_PROV,
775
0
                            PROV_R_PSS_SALTLEN_TOO_SMALL,
776
0
                            "minimum salt length set to %d, but the"
777
0
                            "actual salt length is only set to %d",
778
0
                            prsactx->min_saltlen,
779
0
                            prsactx->saltlen);
780
0
                        return 0;
781
0
                    }
782
0
                    break;
783
0
                }
784
0
            }
785
1.30k
            if (!setup_tbuf(prsactx))
786
0
                return 0;
787
1.30k
            saltlen = prsactx->saltlen;
788
1.30k
            if (!ossl_rsa_padding_add_PKCS1_PSS_mgf1(prsactx->rsa,
789
1.30k
                    prsactx->tbuf, tbs,
790
1.30k
                    prsactx->md, prsactx->mgf1_md,
791
1.30k
                    &saltlen)) {
792
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
793
0
                return 0;
794
0
            }
795
#ifdef FIPS_MODULE
796
            if (!rsa_pss_saltlen_check_passed(prsactx, "RSA Sign", saltlen))
797
                return 0;
798
#endif
799
1.30k
            ret = RSA_private_encrypt(RSA_size(prsactx->rsa), prsactx->tbuf,
800
1.30k
                sig, prsactx->rsa, RSA_NO_PADDING);
801
1.30k
            clean_tbuf(prsactx);
802
1.30k
        } break;
803
804
0
        default:
805
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
806
0
                "Only X.931, PKCS#1 v1.5 or PSS padding allowed");
807
0
            return 0;
808
5.19k
        }
809
5.19k
    } else {
810
0
        ret = RSA_private_encrypt(tbslen, tbs, sig, prsactx->rsa,
811
0
            prsactx->pad_mode);
812
0
    }
813
814
5.19k
#ifndef FIPS_MODULE
815
5.19k
end:
816
5.19k
#endif
817
5.19k
    if (ret <= 0) {
818
0
        ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
819
0
        return 0;
820
0
    }
821
822
5.19k
    *siglen = ret;
823
5.19k
    return 1;
824
5.19k
}
825
826
static int rsa_signverify_message_update(void *vprsactx,
827
    const unsigned char *data,
828
    size_t datalen)
829
27.2k
{
830
27.2k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
831
832
27.2k
    if (prsactx == NULL || prsactx->mdctx == NULL)
833
0
        return 0;
834
835
27.2k
    if (!prsactx->flag_allow_update) {
836
0
        ERR_raise(ERR_LIB_PROV, PROV_R_UPDATE_CALL_OUT_OF_ORDER);
837
0
        return 0;
838
0
    }
839
27.2k
    prsactx->flag_allow_oneshot = 0;
840
841
27.2k
    return EVP_DigestUpdate(prsactx->mdctx, data, datalen);
842
27.2k
}
843
844
static int rsa_sign_message_final(void *vprsactx, unsigned char *sig,
845
    size_t *siglen, size_t sigsize)
846
10.3k
{
847
10.3k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
848
10.3k
    unsigned char digest[EVP_MAX_MD_SIZE];
849
10.3k
    unsigned int dlen = 0;
850
851
10.3k
    if (!ossl_prov_is_running() || prsactx == NULL)
852
0
        return 0;
853
10.3k
    if (prsactx->mdctx == NULL)
854
0
        return 0;
855
10.3k
    if (!prsactx->flag_allow_final) {
856
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FINAL_CALL_OUT_OF_ORDER);
857
0
        return 0;
858
0
    }
859
860
    /*
861
     * If sig is NULL then we're just finding out the sig size. Other fields
862
     * are ignored. Defer to rsa_sign.
863
     */
864
10.3k
    if (sig != NULL) {
865
        /*
866
         * The digests used here are all known (see rsa_get_md_nid()), so they
867
         * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
868
         */
869
5.19k
        if (!EVP_DigestFinal_ex(prsactx->mdctx, digest, &dlen))
870
0
            return 0;
871
872
5.19k
        prsactx->flag_allow_update = 0;
873
5.19k
        prsactx->flag_allow_oneshot = 0;
874
5.19k
        prsactx->flag_allow_final = 0;
875
5.19k
    }
876
877
10.3k
    return rsa_sign_directly(prsactx, sig, siglen, sigsize, digest, dlen);
878
10.3k
}
879
880
/*
881
 * If signing a message, digest tbs and sign the result.
882
 * Otherwise, sign tbs directly.
883
 */
884
static int rsa_sign(void *vprsactx, unsigned char *sig, size_t *siglen,
885
    size_t sigsize, const unsigned char *tbs, size_t tbslen)
886
0
{
887
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
888
889
0
    if (!ossl_prov_is_running() || prsactx == NULL)
890
0
        return 0;
891
0
    if (!prsactx->flag_allow_oneshot) {
892
0
        ERR_raise(ERR_LIB_PROV, PROV_R_ONESHOT_CALL_OUT_OF_ORDER);
893
0
        return 0;
894
0
    }
895
896
0
    if (prsactx->operation == EVP_PKEY_OP_SIGNMSG) {
897
        /*
898
         * If |sig| is NULL, the caller is only looking for the sig length.
899
         * DO NOT update the input in this case.
900
         */
901
0
        if (sig == NULL)
902
0
            return rsa_sign_message_final(prsactx, sig, siglen, sigsize);
903
904
0
        return rsa_signverify_message_update(prsactx, tbs, tbslen)
905
0
            && rsa_sign_message_final(prsactx, sig, siglen, sigsize);
906
0
    }
907
0
    return rsa_sign_directly(prsactx, sig, siglen, sigsize, tbs, tbslen);
908
0
}
909
910
static int rsa_verify_recover_init(void *vprsactx, void *vrsa,
911
    const OSSL_PARAM params[])
912
0
{
913
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
914
915
#ifdef FIPS_MODULE
916
    if (prsactx != NULL)
917
        prsactx->verify_message = 0;
918
#endif
919
920
0
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
921
0
        EVP_PKEY_OP_VERIFYRECOVER, "RSA VerifyRecover Init");
922
0
}
923
924
/*
925
 * There is no message variant of verify recover, so no need for
926
 * 'rsa_verify_recover_directly', just use this function, er, directly.
927
 */
928
static int rsa_verify_recover(void *vprsactx,
929
    unsigned char *rout, size_t *routlen,
930
    size_t routsize,
931
    const unsigned char *sig, size_t siglen)
932
0
{
933
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
934
0
    int ret;
935
936
0
    if (!ossl_prov_is_running())
937
0
        return 0;
938
939
0
    if (rout == NULL) {
940
0
        *routlen = RSA_size(prsactx->rsa);
941
0
        return 1;
942
0
    }
943
944
0
    if (prsactx->md != NULL) {
945
0
        switch (prsactx->pad_mode) {
946
0
        case RSA_X931_PADDING:
947
0
            if (!setup_tbuf(prsactx))
948
0
                return 0;
949
0
            ret = RSA_public_decrypt(siglen, sig, prsactx->tbuf, prsactx->rsa,
950
0
                RSA_X931_PADDING);
951
0
            if (ret <= 0) {
952
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
953
0
                return 0;
954
0
            }
955
0
            ret--;
956
0
            if (prsactx->tbuf[ret] != RSA_X931_hash_id(prsactx->mdnid)) {
957
0
                ERR_raise(ERR_LIB_PROV, PROV_R_ALGORITHM_MISMATCH);
958
0
                return 0;
959
0
            }
960
0
            if (ret != EVP_MD_get_size(prsactx->md)) {
961
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH,
962
0
                    "Should be %d, but got %d",
963
0
                    EVP_MD_get_size(prsactx->md), ret);
964
0
                return 0;
965
0
            }
966
967
0
            *routlen = ret;
968
0
            if (rout != prsactx->tbuf) {
969
0
                if (routsize < (size_t)ret) {
970
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
971
0
                        "buffer size is %d, should be %d",
972
0
                        routsize, ret);
973
0
                    return 0;
974
0
                }
975
0
                memcpy(rout, prsactx->tbuf, ret);
976
0
            }
977
0
            break;
978
979
0
        case RSA_PKCS1_PADDING: {
980
0
            int mdsize = EVP_MD_get_size(prsactx->md);
981
0
            size_t sltmp;
982
983
0
            if (mdsize <= 0) {
984
0
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH);
985
0
                return 0;
986
0
            }
987
0
            if (routsize < (size_t)mdsize) {
988
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
989
0
                    "buffer size is %d, should be %d",
990
0
                    routsize, mdsize);
991
0
                return 0;
992
0
            }
993
0
            ret = ossl_rsa_verify(prsactx->mdnid, NULL, 0, rout, &sltmp,
994
0
                sig, siglen, prsactx->rsa);
995
0
            if (ret <= 0) {
996
0
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
997
0
                return 0;
998
0
            }
999
0
            ret = sltmp;
1000
0
        } break;
1001
1002
0
        default:
1003
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
1004
0
                "Only X.931 or PKCS#1 v1.5 padding allowed");
1005
0
            return 0;
1006
0
        }
1007
0
    } else {
1008
0
        int rsasize = RSA_size(prsactx->rsa);
1009
1010
0
        if (routsize < (size_t)rsasize) {
1011
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL,
1012
0
                "buffer size is %d, should be %d",
1013
0
                routsize, rsasize);
1014
0
            return 0;
1015
0
        }
1016
0
        ret = RSA_public_decrypt((int)siglen, sig, rout, prsactx->rsa,
1017
0
            prsactx->pad_mode);
1018
        /*
1019
         * RSA_public_decrypt() returns -1 on error and otherwise the number
1020
         * of recovered bytes, which may legitimately be zero for a raw
1021
         * PKCS#1 v1.5 signature that encodes an empty payload.  Treat only
1022
         * a negative result as an error.
1023
         */
1024
0
        if (ret < 0) {
1025
0
            ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1026
0
            return 0;
1027
0
        }
1028
0
    }
1029
0
    *routlen = ret;
1030
0
    return 1;
1031
0
}
1032
1033
static int rsa_verify_init(void *vprsactx, void *vrsa,
1034
    const OSSL_PARAM params[])
1035
677
{
1036
677
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1037
1038
#ifdef FIPS_MODULE
1039
    if (prsactx != NULL)
1040
        prsactx->verify_message = 0;
1041
#endif
1042
1043
677
    return rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
1044
677
        EVP_PKEY_OP_VERIFY, "RSA Verify Init");
1045
677
}
1046
1047
static int rsa_verify_directly(PROV_RSA_CTX *prsactx,
1048
    const unsigned char *sig, size_t siglen,
1049
    const unsigned char *tbs, size_t tbslen)
1050
22.7k
{
1051
22.7k
    size_t rslen;
1052
1053
22.7k
    if (!ossl_prov_is_running())
1054
0
        return 0;
1055
22.7k
    if (prsactx->md != NULL) {
1056
22.7k
        switch (prsactx->pad_mode) {
1057
6.34k
        case RSA_PKCS1_PADDING:
1058
6.34k
            if (!RSA_verify(prsactx->mdnid, tbs, tbslen, sig, siglen,
1059
6.34k
                    prsactx->rsa)) {
1060
5.82k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1061
5.82k
                return 0;
1062
5.82k
            }
1063
523
            return 1;
1064
0
        case RSA_X931_PADDING:
1065
0
            if (!setup_tbuf(prsactx))
1066
0
                return 0;
1067
0
            if (rsa_verify_recover(prsactx, prsactx->tbuf, &rslen, 0,
1068
0
                    sig, siglen)
1069
0
                <= 0)
1070
0
                return 0;
1071
0
            break;
1072
16.3k
        case RSA_PKCS1_PSS_PADDING: {
1073
16.3k
            int ret;
1074
16.3k
            int saltlen;
1075
16.3k
            size_t mdsize;
1076
1077
            /*
1078
             * We need to check this for the RSA_verify_PKCS1_PSS_mgf1()
1079
             * call
1080
             */
1081
16.3k
            mdsize = rsa_get_md_size(prsactx);
1082
16.3k
            if (tbslen != mdsize) {
1083
0
                ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_DIGEST_LENGTH,
1084
0
                    "Should be %d, but got %d",
1085
0
                    mdsize, tbslen);
1086
0
                return 0;
1087
0
            }
1088
1089
16.3k
            if (!setup_tbuf(prsactx))
1090
18
                return 0;
1091
16.3k
            ret = RSA_public_decrypt(siglen, sig, prsactx->tbuf,
1092
16.3k
                prsactx->rsa, RSA_NO_PADDING);
1093
16.3k
            if (ret <= 0) {
1094
4.20k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1095
4.20k
                return 0;
1096
4.20k
            }
1097
12.1k
            saltlen = prsactx->saltlen;
1098
12.1k
            ret = ossl_rsa_verify_PKCS1_PSS_mgf1(prsactx->rsa, tbs,
1099
12.1k
                prsactx->md, prsactx->mgf1_md,
1100
12.1k
                prsactx->tbuf,
1101
12.1k
                &saltlen);
1102
12.1k
            if (ret <= 0) {
1103
12.1k
                ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1104
12.1k
                return 0;
1105
12.1k
            }
1106
#ifdef FIPS_MODULE
1107
            if (!rsa_pss_saltlen_check_passed(prsactx, "RSA Verify", saltlen))
1108
                return 0;
1109
#endif
1110
4
            return 1;
1111
12.1k
        }
1112
0
        default:
1113
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_PADDING_MODE,
1114
0
                "Only X.931, PKCS#1 v1.5 or PSS padding allowed");
1115
0
            return 0;
1116
22.7k
        }
1117
22.7k
    } else {
1118
0
        int ret;
1119
1120
0
        if (!setup_tbuf(prsactx))
1121
0
            return 0;
1122
0
        ret = RSA_public_decrypt(siglen, sig, prsactx->tbuf, prsactx->rsa,
1123
0
            prsactx->pad_mode);
1124
0
        if (ret <= 0) {
1125
0
            ERR_raise(ERR_LIB_PROV, ERR_R_RSA_LIB);
1126
0
            return 0;
1127
0
        }
1128
0
        rslen = (size_t)ret;
1129
0
    }
1130
1131
0
    if ((rslen != tbslen) || memcmp(tbs, prsactx->tbuf, rslen))
1132
0
        return 0;
1133
1134
0
    return 1;
1135
0
}
1136
1137
static int rsa_verify_set_sig(void *vprsactx,
1138
    const unsigned char *sig, size_t siglen)
1139
22.0k
{
1140
22.0k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1141
22.0k
    OSSL_PARAM params[2];
1142
1143
22.0k
    params[0] = OSSL_PARAM_construct_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE,
1144
22.0k
        (unsigned char *)sig, siglen);
1145
22.0k
    params[1] = OSSL_PARAM_construct_end();
1146
22.0k
    return rsa_sigalg_set_ctx_params(prsactx, params);
1147
22.0k
}
1148
1149
static int rsa_verify_message_final(void *vprsactx)
1150
22.0k
{
1151
22.0k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1152
22.0k
    unsigned char digest[EVP_MAX_MD_SIZE];
1153
22.0k
    unsigned int dlen = 0;
1154
1155
22.0k
    if (!ossl_prov_is_running() || prsactx == NULL)
1156
0
        return 0;
1157
22.0k
    if (prsactx->mdctx == NULL)
1158
0
        return 0;
1159
22.0k
    if (!prsactx->flag_allow_final) {
1160
0
        ERR_raise(ERR_LIB_PROV, PROV_R_FINAL_CALL_OUT_OF_ORDER);
1161
0
        return 0;
1162
0
    }
1163
1164
    /*
1165
     * The digests used here are all known (see rsa_get_md_nid()), so they
1166
     * should not exceed the internal buffer size of EVP_MAX_MD_SIZE.
1167
     */
1168
22.0k
    if (!EVP_DigestFinal_ex(prsactx->mdctx, digest, &dlen))
1169
0
        return 0;
1170
1171
22.0k
    prsactx->flag_allow_update = 0;
1172
22.0k
    prsactx->flag_allow_final = 0;
1173
22.0k
    prsactx->flag_allow_oneshot = 0;
1174
1175
22.0k
    return rsa_verify_directly(prsactx, prsactx->sig, prsactx->siglen,
1176
22.0k
        digest, dlen);
1177
22.0k
}
1178
1179
/*
1180
 * If verifying a message, digest tbs and verify the result.
1181
 * Otherwise, verify tbs directly.
1182
 */
1183
static int rsa_verify(void *vprsactx,
1184
    const unsigned char *sig, size_t siglen,
1185
    const unsigned char *tbs, size_t tbslen)
1186
677
{
1187
677
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1188
1189
677
    if (!ossl_prov_is_running() || prsactx == NULL)
1190
0
        return 0;
1191
677
    if (!prsactx->flag_allow_oneshot) {
1192
0
        ERR_raise(ERR_LIB_PROV, PROV_R_ONESHOT_CALL_OUT_OF_ORDER);
1193
0
        return 0;
1194
0
    }
1195
1196
677
    if (prsactx->operation == EVP_PKEY_OP_VERIFYMSG)
1197
0
        return rsa_verify_set_sig(prsactx, sig, siglen)
1198
0
            && rsa_signverify_message_update(prsactx, tbs, tbslen)
1199
0
            && rsa_verify_message_final(prsactx);
1200
677
    return rsa_verify_directly(prsactx, sig, siglen, tbs, tbslen);
1201
677
}
1202
1203
/* DigestSign/DigestVerify wrappers */
1204
1205
static int rsa_digest_signverify_init(void *vprsactx, const char *mdname,
1206
    void *vrsa, const OSSL_PARAM params[],
1207
    int operation, const char *desc)
1208
45.2k
{
1209
45.2k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1210
1211
#ifdef FIPS_MODULE
1212
    if (prsactx != NULL)
1213
        prsactx->verify_message = 1;
1214
#endif
1215
1216
45.2k
    if (!rsa_signverify_init(prsactx, vrsa, rsa_set_ctx_params, params,
1217
45.2k
            operation, desc))
1218
32
        return 0;
1219
1220
45.1k
    if (mdname != NULL
1221
        /* was rsa_setup_md already called in rsa_signverify_init()? */
1222
45.1k
        && (mdname[0] == '\0' || OPENSSL_strcasecmp(prsactx->mdname, mdname) != 0)
1223
39.3k
        && !rsa_setup_md(prsactx, mdname, prsactx->propq, desc))
1224
87
        return 0;
1225
1226
45.0k
    prsactx->flag_allow_md = 0;
1227
1228
45.0k
    if (prsactx->mdctx == NULL) {
1229
45.0k
        prsactx->mdctx = EVP_MD_CTX_new();
1230
45.0k
        if (prsactx->mdctx == NULL)
1231
0
            goto error;
1232
45.0k
    }
1233
1234
45.0k
    if (!EVP_DigestInit_ex2(prsactx->mdctx, prsactx->md, params))
1235
0
        goto error;
1236
1237
45.0k
    return 1;
1238
1239
0
error:
1240
0
    EVP_MD_CTX_free(prsactx->mdctx);
1241
0
    prsactx->mdctx = NULL;
1242
0
    return 0;
1243
45.0k
}
1244
1245
static int rsa_digest_sign_init(void *vprsactx, const char *mdname,
1246
    void *vrsa, const OSSL_PARAM params[])
1247
23.0k
{
1248
23.0k
    if (!ossl_prov_is_running())
1249
0
        return 0;
1250
23.0k
    return rsa_digest_signverify_init(vprsactx, mdname, vrsa,
1251
23.0k
        params, EVP_PKEY_OP_SIGNMSG,
1252
23.0k
        "RSA Digest Sign Init");
1253
23.0k
}
1254
1255
static int rsa_digest_sign_update(void *vprsactx, const unsigned char *data,
1256
    size_t datalen)
1257
5.19k
{
1258
5.19k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1259
1260
5.19k
    if (prsactx == NULL)
1261
0
        return 0;
1262
    /* Sigalg implementations shouldn't do digest_sign */
1263
5.19k
    if (prsactx->flag_sigalg)
1264
0
        return 0;
1265
1266
5.19k
    return rsa_signverify_message_update(prsactx, data, datalen);
1267
5.19k
}
1268
1269
static int rsa_digest_sign_final(void *vprsactx, unsigned char *sig,
1270
    size_t *siglen, size_t sigsize)
1271
10.3k
{
1272
10.3k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1273
10.3k
    int ok = 0;
1274
1275
10.3k
    if (prsactx == NULL)
1276
0
        return 0;
1277
    /* Sigalg implementations shouldn't do digest_sign */
1278
10.3k
    if (prsactx->flag_sigalg)
1279
0
        return 0;
1280
1281
10.3k
    if (rsa_sign_message_final(prsactx, sig, siglen, sigsize))
1282
10.3k
        ok = 1;
1283
1284
10.3k
    prsactx->flag_allow_md = 1;
1285
1286
10.3k
    return ok;
1287
10.3k
}
1288
1289
static int rsa_digest_verify_init(void *vprsactx, const char *mdname,
1290
    void *vrsa, const OSSL_PARAM params[])
1291
22.1k
{
1292
22.1k
    if (!ossl_prov_is_running())
1293
0
        return 0;
1294
22.1k
    return rsa_digest_signverify_init(vprsactx, mdname, vrsa,
1295
22.1k
        params, EVP_PKEY_OP_VERIFYMSG,
1296
22.1k
        "RSA Digest Verify Init");
1297
22.1k
}
1298
1299
static int rsa_digest_verify_update(void *vprsactx, const unsigned char *data,
1300
    size_t datalen)
1301
22.0k
{
1302
22.0k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1303
1304
22.0k
    if (prsactx == NULL)
1305
0
        return 0;
1306
    /* Sigalg implementations shouldn't do digest_sign */
1307
22.0k
    if (prsactx->flag_sigalg)
1308
0
        return 0;
1309
1310
22.0k
    return rsa_signverify_message_update(prsactx, data, datalen);
1311
22.0k
}
1312
1313
int rsa_digest_verify_final(void *vprsactx, const unsigned char *sig,
1314
    size_t siglen)
1315
22.0k
{
1316
22.0k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1317
22.0k
    int ok = 0;
1318
1319
22.0k
    if (prsactx == NULL)
1320
0
        return 0;
1321
    /* Sigalg implementations shouldn't do digest_verify */
1322
22.0k
    if (prsactx->flag_sigalg)
1323
0
        return 0;
1324
1325
22.0k
    if (rsa_verify_set_sig(prsactx, sig, siglen)
1326
22.0k
        && rsa_verify_message_final(vprsactx))
1327
489
        ok = 1;
1328
1329
22.0k
    prsactx->flag_allow_md = 1;
1330
1331
22.0k
    return ok;
1332
22.0k
}
1333
1334
static void rsa_freectx(void *vprsactx)
1335
73.1k
{
1336
73.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1337
1338
73.1k
    if (prsactx == NULL)
1339
0
        return;
1340
1341
73.1k
    EVP_MD_CTX_free(prsactx->mdctx);
1342
73.1k
    EVP_MD_free(prsactx->md);
1343
73.1k
    EVP_MD_free(prsactx->mgf1_md);
1344
73.1k
    OPENSSL_free(prsactx->sig);
1345
73.1k
    OPENSSL_free(prsactx->propq);
1346
73.1k
    free_tbuf(prsactx);
1347
73.1k
    RSA_free(prsactx->rsa);
1348
1349
73.1k
    OPENSSL_clear_free(prsactx, sizeof(*prsactx));
1350
73.1k
}
1351
1352
static void *rsa_dupctx(void *vprsactx)
1353
27.2k
{
1354
27.2k
    PROV_RSA_CTX *srcctx = (PROV_RSA_CTX *)vprsactx;
1355
27.2k
    PROV_RSA_CTX *dstctx;
1356
1357
27.2k
    if (!ossl_prov_is_running())
1358
0
        return NULL;
1359
1360
27.2k
    dstctx = OPENSSL_zalloc(sizeof(*srcctx));
1361
27.2k
    if (dstctx == NULL)
1362
0
        return NULL;
1363
1364
27.2k
    *dstctx = *srcctx;
1365
27.2k
    dstctx->rsa = NULL;
1366
27.2k
    dstctx->md = NULL;
1367
27.2k
    dstctx->mgf1_md = NULL;
1368
27.2k
    dstctx->mdctx = NULL;
1369
27.2k
    dstctx->tbuf = NULL;
1370
27.2k
    dstctx->propq = NULL;
1371
27.2k
    dstctx->sig = NULL;
1372
1373
27.2k
    if (srcctx->rsa != NULL && !RSA_up_ref(srcctx->rsa))
1374
0
        goto err;
1375
27.2k
    dstctx->rsa = srcctx->rsa;
1376
1377
27.2k
    if (srcctx->md != NULL && !EVP_MD_up_ref(srcctx->md))
1378
0
        goto err;
1379
27.2k
    dstctx->md = srcctx->md;
1380
1381
27.2k
    if (srcctx->mgf1_md != NULL && !EVP_MD_up_ref(srcctx->mgf1_md))
1382
0
        goto err;
1383
27.2k
    dstctx->mgf1_md = srcctx->mgf1_md;
1384
1385
27.2k
    if (srcctx->mdctx != NULL) {
1386
27.2k
        dstctx->mdctx = EVP_MD_CTX_new();
1387
27.2k
        if (dstctx->mdctx == NULL
1388
27.2k
            || !EVP_MD_CTX_copy_ex(dstctx->mdctx, srcctx->mdctx))
1389
0
            goto err;
1390
27.2k
    }
1391
1392
27.2k
    if (srcctx->propq != NULL) {
1393
0
        dstctx->propq = OPENSSL_strdup(srcctx->propq);
1394
0
        if (dstctx->propq == NULL)
1395
0
            goto err;
1396
0
    }
1397
1398
27.2k
    if (srcctx->sig != NULL) {
1399
0
        dstctx->sig = OPENSSL_memdup(srcctx->sig, srcctx->siglen);
1400
0
        if (dstctx->sig == NULL)
1401
0
            goto err;
1402
0
    }
1403
1404
27.2k
    return dstctx;
1405
0
err:
1406
0
    rsa_freectx(dstctx);
1407
0
    return NULL;
1408
27.2k
}
1409
1410
static int rsa_get_ctx_params(void *vprsactx, OSSL_PARAM *params)
1411
0
{
1412
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1413
0
    OSSL_PARAM *p;
1414
1415
0
    if (prsactx == NULL)
1416
0
        return 0;
1417
1418
0
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_ALGORITHM_ID);
1419
0
    if (p != NULL) {
1420
        /* The Algorithm Identifier of the combined signature algorithm */
1421
0
        unsigned char aid_buf[128];
1422
0
        unsigned char *aid;
1423
0
        size_t aid_len;
1424
1425
0
        aid = rsa_generate_signature_aid(prsactx, aid_buf,
1426
0
            sizeof(aid_buf), &aid_len);
1427
0
        if (aid == NULL || !OSSL_PARAM_set_octet_string(p, aid, aid_len))
1428
0
            return 0;
1429
0
    }
1430
1431
0
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_PAD_MODE);
1432
0
    if (p != NULL)
1433
0
        switch (p->data_type) {
1434
0
        case OSSL_PARAM_INTEGER:
1435
0
            if (!OSSL_PARAM_set_int(p, prsactx->pad_mode))
1436
0
                return 0;
1437
0
            break;
1438
0
        case OSSL_PARAM_UTF8_STRING: {
1439
0
            int i;
1440
0
            const char *word = NULL;
1441
1442
0
            for (i = 0; padding_item[i].id != 0; i++) {
1443
0
                if (prsactx->pad_mode == (int)padding_item[i].id) {
1444
0
                    word = padding_item[i].ptr;
1445
0
                    break;
1446
0
                }
1447
0
            }
1448
1449
0
            if (word != NULL) {
1450
0
                if (!OSSL_PARAM_set_utf8_string(p, word))
1451
0
                    return 0;
1452
0
            } else {
1453
0
                ERR_raise(ERR_LIB_PROV, ERR_R_INTERNAL_ERROR);
1454
0
            }
1455
0
        } break;
1456
0
        default:
1457
0
            return 0;
1458
0
        }
1459
1460
0
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_DIGEST);
1461
0
    if (p != NULL && !OSSL_PARAM_set_utf8_string(p, prsactx->mdname))
1462
0
        return 0;
1463
1464
0
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_MGF1_DIGEST);
1465
0
    if (p != NULL && !OSSL_PARAM_set_utf8_string(p, prsactx->mgf1_mdname))
1466
0
        return 0;
1467
1468
0
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_PSS_SALTLEN);
1469
0
    if (p != NULL) {
1470
0
        if (p->data_type == OSSL_PARAM_INTEGER) {
1471
0
            if (!OSSL_PARAM_set_int(p, prsactx->saltlen))
1472
0
                return 0;
1473
0
        } else if (p->data_type == OSSL_PARAM_UTF8_STRING) {
1474
0
            const char *value = NULL;
1475
1476
0
            switch (prsactx->saltlen) {
1477
0
            case RSA_PSS_SALTLEN_DIGEST:
1478
0
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST;
1479
0
                break;
1480
0
            case RSA_PSS_SALTLEN_MAX:
1481
0
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_MAX;
1482
0
                break;
1483
0
            case RSA_PSS_SALTLEN_AUTO:
1484
0
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO;
1485
0
                break;
1486
0
            case RSA_PSS_SALTLEN_AUTO_DIGEST_MAX:
1487
0
                value = OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX;
1488
0
                break;
1489
0
            default: {
1490
0
                int len = BIO_snprintf(p->data, p->data_size, "%d",
1491
0
                    prsactx->saltlen);
1492
1493
0
                if (len <= 0)
1494
0
                    return 0;
1495
0
                p->return_size = len;
1496
0
                break;
1497
0
            }
1498
0
            }
1499
0
            if (value != NULL
1500
0
                && !OSSL_PARAM_set_utf8_string(p, value))
1501
0
                return 0;
1502
0
        }
1503
0
    }
1504
1505
#ifdef FIPS_MODULE
1506
    p = OSSL_PARAM_locate(params, OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE);
1507
    if (p != NULL && !OSSL_PARAM_set_uint(p, prsactx->verify_message))
1508
        return 0;
1509
#endif
1510
1511
0
    if (!OSSL_FIPS_IND_GET_CTX_PARAM(prsactx, params))
1512
0
        return 0;
1513
0
    return 1;
1514
0
}
1515
1516
static const OSSL_PARAM known_gettable_ctx_params[] = {
1517
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_ALGORITHM_ID, NULL, 0),
1518
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1519
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
1520
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1521
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1522
#ifdef FIPS_MODULE
1523
    OSSL_PARAM_uint(OSSL_SIGNATURE_PARAM_FIPS_VERIFY_MESSAGE, NULL),
1524
#endif
1525
    OSSL_FIPS_IND_GETTABLE_CTX_PARAM()
1526
        OSSL_PARAM_END
1527
};
1528
1529
static const OSSL_PARAM *rsa_gettable_ctx_params(ossl_unused void *vprsactx,
1530
    ossl_unused void *provctx)
1531
0
{
1532
0
    return known_gettable_ctx_params;
1533
0
}
1534
1535
#ifdef FIPS_MODULE
1536
static int rsa_x931_padding_allowed(PROV_RSA_CTX *ctx)
1537
{
1538
    if ((ctx->operation
1539
            & (EVP_PKEY_OP_SIGNMSG | EVP_PKEY_OP_SIGN))
1540
        != 0) {
1541
        if (!OSSL_FIPS_IND_ON_UNAPPROVED(ctx, OSSL_FIPS_IND_SETTABLE2,
1542
                ctx->libctx,
1543
                "RSA Sign set ctx", "X931 Padding",
1544
                ossl_fips_config_rsa_sign_x931_disallowed)) {
1545
            ERR_raise(ERR_LIB_PROV,
1546
                PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
1547
            return 0;
1548
        }
1549
    }
1550
    return 1;
1551
}
1552
#endif
1553
1554
static int rsa_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
1555
16.1k
{
1556
16.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1557
16.1k
    const OSSL_PARAM *p;
1558
16.1k
    int pad_mode;
1559
16.1k
    int saltlen;
1560
16.1k
    char mdname[OSSL_MAX_NAME_SIZE] = "", *pmdname = NULL;
1561
16.1k
    char mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmdprops = NULL;
1562
16.1k
    char mgf1mdname[OSSL_MAX_NAME_SIZE] = "", *pmgf1mdname = NULL;
1563
16.1k
    char mgf1mdprops[OSSL_MAX_PROPQUERY_SIZE] = "", *pmgf1mdprops = NULL;
1564
1565
16.1k
    if (prsactx == NULL)
1566
0
        return 0;
1567
16.1k
    if (ossl_param_is_empty(params))
1568
8.73k
        return 1;
1569
1570
7.44k
    if (!OSSL_FIPS_IND_SET_CTX_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE0, params,
1571
7.44k
            OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK))
1572
0
        return 0;
1573
1574
7.44k
    if (!OSSL_FIPS_IND_SET_CTX_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE1, params,
1575
7.44k
            OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK))
1576
0
        return 0;
1577
1578
7.44k
    if (!OSSL_FIPS_IND_SET_CTX_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE2, params,
1579
7.44k
            OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK))
1580
0
        return 0;
1581
1582
7.44k
    if (!OSSL_FIPS_IND_SET_CTX_PARAM(prsactx, OSSL_FIPS_IND_SETTABLE3, params,
1583
7.44k
            OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK))
1584
0
        return 0;
1585
1586
7.44k
    pad_mode = prsactx->pad_mode;
1587
7.44k
    saltlen = prsactx->saltlen;
1588
1589
7.44k
    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_DIGEST);
1590
7.44k
    if (p != NULL) {
1591
0
        const OSSL_PARAM *propsp = OSSL_PARAM_locate_const(params,
1592
0
            OSSL_SIGNATURE_PARAM_PROPERTIES);
1593
1594
0
        pmdname = mdname;
1595
0
        if (!OSSL_PARAM_get_utf8_string(p, &pmdname, sizeof(mdname)))
1596
0
            return 0;
1597
1598
0
        if (propsp != NULL) {
1599
0
            pmdprops = mdprops;
1600
0
            if (!OSSL_PARAM_get_utf8_string(propsp,
1601
0
                    &pmdprops, sizeof(mdprops)))
1602
0
                return 0;
1603
0
        }
1604
0
    }
1605
1606
7.44k
    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PAD_MODE);
1607
7.44k
    if (p != NULL) {
1608
3.48k
        const char *err_extra_text = NULL;
1609
1610
3.48k
        switch (p->data_type) {
1611
3.48k
        case OSSL_PARAM_INTEGER: /* Support for legacy pad mode number */
1612
3.48k
            if (!OSSL_PARAM_get_int(p, &pad_mode))
1613
0
                return 0;
1614
3.48k
            break;
1615
3.48k
        case OSSL_PARAM_UTF8_STRING: {
1616
0
            int i;
1617
1618
0
            if (p->data == NULL)
1619
0
                return 0;
1620
1621
0
            for (i = 0; padding_item[i].id != 0; i++) {
1622
0
                if (strcmp(p->data, padding_item[i].ptr) == 0) {
1623
0
                    pad_mode = padding_item[i].id;
1624
0
                    break;
1625
0
                }
1626
0
            }
1627
0
        } break;
1628
0
        default:
1629
0
            return 0;
1630
3.48k
        }
1631
1632
3.48k
        switch (pad_mode) {
1633
0
        case RSA_PKCS1_OAEP_PADDING:
1634
            /*
1635
             * OAEP padding is for asymmetric cipher only so is not compatible
1636
             * with signature use.
1637
             */
1638
0
            err_extra_text = "OAEP padding not allowed for signing / verifying";
1639
0
            goto bad_pad;
1640
3.48k
        case RSA_PKCS1_PSS_PADDING:
1641
3.48k
            if ((prsactx->operation
1642
3.48k
                    & (EVP_PKEY_OP_SIGN | EVP_PKEY_OP_SIGNMSG
1643
3.48k
                        | EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYMSG))
1644
3.48k
                == 0) {
1645
0
                err_extra_text = "PSS padding only allowed for sign and verify operations";
1646
0
                goto bad_pad;
1647
0
            }
1648
3.48k
            break;
1649
3.48k
        case RSA_PKCS1_PADDING:
1650
0
            err_extra_text = "PKCS#1 padding not allowed with RSA-PSS";
1651
0
            goto cont;
1652
0
        case RSA_NO_PADDING:
1653
0
            err_extra_text = "No padding not allowed with RSA-PSS";
1654
0
            goto cont;
1655
0
        case RSA_X931_PADDING:
1656
#ifdef FIPS_MODULE
1657
            /* X9.31 only allows sizes of 1024 + 256 * s (bits) */
1658
            if ((RSA_bits(prsactx->rsa) & 0xFF) != 0) {
1659
                ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
1660
                return 0;
1661
            }
1662
            /* RSA Signing with X9.31 padding is not allowed in FIPS 140-3 */
1663
            if (!rsa_x931_padding_allowed(prsactx))
1664
                return 0;
1665
#endif
1666
0
            err_extra_text = "X.931 padding not allowed with RSA-PSS";
1667
0
        cont:
1668
0
            if (RSA_test_flags(prsactx->rsa,
1669
0
                    RSA_FLAG_TYPE_MASK)
1670
0
                == RSA_FLAG_TYPE_RSA)
1671
0
                break;
1672
            /* FALLTHRU */
1673
0
        default:
1674
0
        bad_pad:
1675
0
            if (err_extra_text == NULL)
1676
0
                ERR_raise(ERR_LIB_PROV,
1677
0
                    PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE);
1678
0
            else
1679
0
                ERR_raise_data(ERR_LIB_PROV,
1680
0
                    PROV_R_ILLEGAL_OR_UNSUPPORTED_PADDING_MODE,
1681
0
                    err_extra_text);
1682
0
            return 0;
1683
3.48k
        }
1684
3.48k
    }
1685
1686
7.44k
    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_PSS_SALTLEN);
1687
7.44k
    if (p != NULL) {
1688
3.48k
        if (pad_mode != RSA_PKCS1_PSS_PADDING) {
1689
0
            ERR_raise_data(ERR_LIB_PROV, PROV_R_NOT_SUPPORTED,
1690
0
                "PSS saltlen can only be specified if "
1691
0
                "PSS padding has been specified first");
1692
0
            return 0;
1693
0
        }
1694
1695
3.48k
        switch (p->data_type) {
1696
0
        case OSSL_PARAM_INTEGER: /* Support for legacy pad mode number */
1697
0
            if (!OSSL_PARAM_get_int(p, &saltlen))
1698
0
                return 0;
1699
0
            break;
1700
3.48k
        case OSSL_PARAM_UTF8_STRING:
1701
3.48k
            if (strcmp(p->data, OSSL_PKEY_RSA_PSS_SALT_LEN_DIGEST) == 0)
1702
3.01k
                saltlen = RSA_PSS_SALTLEN_DIGEST;
1703
475
            else if (strcmp(p->data, OSSL_PKEY_RSA_PSS_SALT_LEN_MAX) == 0)
1704
0
                saltlen = RSA_PSS_SALTLEN_MAX;
1705
475
            else if (strcmp(p->data, OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO) == 0)
1706
0
                saltlen = RSA_PSS_SALTLEN_AUTO;
1707
475
            else if (strcmp(p->data, OSSL_PKEY_RSA_PSS_SALT_LEN_AUTO_DIGEST_MAX) == 0)
1708
0
                saltlen = RSA_PSS_SALTLEN_AUTO_DIGEST_MAX;
1709
475
            else
1710
475
                saltlen = atoi(p->data);
1711
3.48k
            break;
1712
0
        default:
1713
0
            return 0;
1714
3.48k
        }
1715
1716
        /*
1717
         * RSA_PSS_SALTLEN_AUTO_DIGEST_MAX seems curiously named in this check.
1718
         * Contrary to what it's name suggests, it's the currently lowest
1719
         * saltlen number possible.
1720
         */
1721
3.48k
        if (saltlen < RSA_PSS_SALTLEN_AUTO_DIGEST_MAX) {
1722
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH);
1723
0
            return 0;
1724
0
        }
1725
1726
3.48k
        if (rsa_pss_restricted(prsactx)) {
1727
284
            switch (saltlen) {
1728
0
            case RSA_PSS_SALTLEN_AUTO:
1729
0
            case RSA_PSS_SALTLEN_AUTO_DIGEST_MAX:
1730
0
                if ((prsactx->operation
1731
0
                        & (EVP_PKEY_OP_VERIFY | EVP_PKEY_OP_VERIFYMSG))
1732
0
                    == 0) {
1733
0
                    ERR_raise_data(ERR_LIB_PROV, PROV_R_INVALID_SALT_LENGTH,
1734
0
                        "Cannot use autodetected salt length");
1735
0
                    return 0;
1736
0
                }
1737
0
                break;
1738
10
            case RSA_PSS_SALTLEN_DIGEST:
1739
10
                if (prsactx->min_saltlen > EVP_MD_get_size(prsactx->md)) {
1740
4
                    ERR_raise_data(ERR_LIB_PROV,
1741
4
                        PROV_R_PSS_SALTLEN_TOO_SMALL,
1742
4
                        "Should be more than %d, but would be "
1743
4
                        "set to match digest size (%d)",
1744
4
                        prsactx->min_saltlen,
1745
4
                        EVP_MD_get_size(prsactx->md));
1746
4
                    return 0;
1747
4
                }
1748
6
                break;
1749
274
            default:
1750
274
                if (saltlen >= 0 && saltlen < prsactx->min_saltlen) {
1751
0
                    ERR_raise_data(ERR_LIB_PROV,
1752
0
                        PROV_R_PSS_SALTLEN_TOO_SMALL,
1753
0
                        "Should be more than %d, "
1754
0
                        "but would be set to %d",
1755
0
                        prsactx->min_saltlen, saltlen);
1756
0
                    return 0;
1757
0
                }
1758
284
            }
1759
284
        }
1760
3.48k
    }
1761
1762
7.44k
    p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_MGF1_DIGEST);
1763
7.44k
    if (p != NULL) {
1764
475
        const OSSL_PARAM *propsp = OSSL_PARAM_locate_const(params,
1765
475
            OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES);
1766
1767
475
        pmgf1mdname = mgf1mdname;
1768
475
        if (!OSSL_PARAM_get_utf8_string(p, &pmgf1mdname, sizeof(mgf1mdname)))
1769
0
            return 0;
1770
1771
475
        if (propsp != NULL) {
1772
0
            pmgf1mdprops = mgf1mdprops;
1773
0
            if (!OSSL_PARAM_get_utf8_string(propsp,
1774
0
                    &pmgf1mdprops, sizeof(mgf1mdprops)))
1775
0
                return 0;
1776
0
        }
1777
1778
475
        if (pad_mode != RSA_PKCS1_PSS_PADDING) {
1779
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_MGF1_MD);
1780
0
            return 0;
1781
0
        }
1782
475
    }
1783
1784
7.44k
    prsactx->saltlen = saltlen;
1785
7.44k
    prsactx->pad_mode = pad_mode;
1786
1787
7.44k
    if (prsactx->md == NULL && pmdname == NULL
1788
0
        && pad_mode == RSA_PKCS1_PSS_PADDING)
1789
0
        pmdname = RSA_DEFAULT_DIGEST_NAME;
1790
1791
7.44k
    if (pmgf1mdname != NULL
1792
475
        && !rsa_setup_mgf1_md(prsactx, pmgf1mdname, pmgf1mdprops))
1793
0
        return 0;
1794
1795
7.44k
    if (pmdname != NULL) {
1796
0
        if (!rsa_setup_md(prsactx, pmdname, pmdprops, "RSA Sign Set Ctx"))
1797
0
            return 0;
1798
7.44k
    } else {
1799
7.44k
        if (!rsa_check_padding(prsactx, NULL, NULL, prsactx->mdnid))
1800
0
            return 0;
1801
7.44k
    }
1802
7.44k
    return 1;
1803
7.44k
}
1804
1805
static const OSSL_PARAM settable_ctx_params[] = {
1806
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_DIGEST, NULL, 0),
1807
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PROPERTIES, NULL, 0),
1808
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1809
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1810
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES, NULL, 0),
1811
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1812
    OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK)
1813
        OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK)
1814
            OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK)
1815
                OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK)
1816
                    OSSL_PARAM_END
1817
};
1818
1819
static const OSSL_PARAM settable_ctx_params_no_digest[] = {
1820
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PAD_MODE, NULL, 0),
1821
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_DIGEST, NULL, 0),
1822
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_MGF1_PROPERTIES, NULL, 0),
1823
    OSSL_PARAM_utf8_string(OSSL_SIGNATURE_PARAM_PSS_SALTLEN, NULL, 0),
1824
    OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_KEY_CHECK)
1825
        OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_DIGEST_CHECK)
1826
            OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_RSA_PSS_SALTLEN_CHECK)
1827
                OSSL_FIPS_IND_SETTABLE_CTX_PARAM(OSSL_SIGNATURE_PARAM_FIPS_SIGN_X931_PAD_CHECK)
1828
                    OSSL_PARAM_END
1829
};
1830
1831
static const OSSL_PARAM *rsa_settable_ctx_params(void *vprsactx,
1832
    ossl_unused void *provctx)
1833
38.1k
{
1834
38.1k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1835
1836
38.1k
    if (prsactx != NULL && !prsactx->flag_allow_md)
1837
38.1k
        return settable_ctx_params_no_digest;
1838
15
    return settable_ctx_params;
1839
38.1k
}
1840
1841
static int rsa_get_ctx_md_params(void *vprsactx, OSSL_PARAM *params)
1842
0
{
1843
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1844
1845
0
    if (prsactx->mdctx == NULL)
1846
0
        return 0;
1847
1848
0
    return EVP_MD_CTX_get_params(prsactx->mdctx, params);
1849
0
}
1850
1851
static const OSSL_PARAM *rsa_gettable_ctx_md_params(void *vprsactx)
1852
0
{
1853
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1854
1855
0
    if (prsactx->md == NULL)
1856
0
        return 0;
1857
1858
0
    return EVP_MD_gettable_ctx_params(prsactx->md);
1859
0
}
1860
1861
static int rsa_set_ctx_md_params(void *vprsactx, const OSSL_PARAM params[])
1862
0
{
1863
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1864
1865
0
    if (prsactx->mdctx == NULL)
1866
0
        return 0;
1867
1868
0
    return EVP_MD_CTX_set_params(prsactx->mdctx, params);
1869
0
}
1870
1871
static const OSSL_PARAM *rsa_settable_ctx_md_params(void *vprsactx)
1872
0
{
1873
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1874
1875
0
    if (prsactx->md == NULL)
1876
0
        return 0;
1877
1878
0
    return EVP_MD_settable_ctx_params(prsactx->md);
1879
0
}
1880
1881
const OSSL_DISPATCH ossl_rsa_signature_functions[] = {
1882
    { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))rsa_newctx },
1883
    { OSSL_FUNC_SIGNATURE_SIGN_INIT, (void (*)(void))rsa_sign_init },
1884
    { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))rsa_sign },
1885
    { OSSL_FUNC_SIGNATURE_VERIFY_INIT, (void (*)(void))rsa_verify_init },
1886
    { OSSL_FUNC_SIGNATURE_VERIFY, (void (*)(void))rsa_verify },
1887
    { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT,
1888
        (void (*)(void))rsa_verify_recover_init },
1889
    { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER,
1890
        (void (*)(void))rsa_verify_recover },
1891
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_INIT,
1892
        (void (*)(void))rsa_digest_sign_init },
1893
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_UPDATE,
1894
        (void (*)(void))rsa_digest_sign_update },
1895
    { OSSL_FUNC_SIGNATURE_DIGEST_SIGN_FINAL,
1896
        (void (*)(void))rsa_digest_sign_final },
1897
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_INIT,
1898
        (void (*)(void))rsa_digest_verify_init },
1899
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_UPDATE,
1900
        (void (*)(void))rsa_digest_verify_update },
1901
    { OSSL_FUNC_SIGNATURE_DIGEST_VERIFY_FINAL,
1902
        (void (*)(void))rsa_digest_verify_final },
1903
    { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))rsa_freectx },
1904
    { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))rsa_dupctx },
1905
    { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS, (void (*)(void))rsa_get_ctx_params },
1906
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,
1907
        (void (*)(void))rsa_gettable_ctx_params },
1908
    { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS, (void (*)(void))rsa_set_ctx_params },
1909
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,
1910
        (void (*)(void))rsa_settable_ctx_params },
1911
    { OSSL_FUNC_SIGNATURE_GET_CTX_MD_PARAMS,
1912
        (void (*)(void))rsa_get_ctx_md_params },
1913
    { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_MD_PARAMS,
1914
        (void (*)(void))rsa_gettable_ctx_md_params },
1915
    { OSSL_FUNC_SIGNATURE_SET_CTX_MD_PARAMS,
1916
        (void (*)(void))rsa_set_ctx_md_params },
1917
    { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_MD_PARAMS,
1918
        (void (*)(void))rsa_settable_ctx_md_params },
1919
    OSSL_DISPATCH_END
1920
};
1921
1922
/* ------------------------------------------------------------------ */
1923
1924
/*
1925
 * So called sigalgs (composite RSA+hash) implemented below.  They
1926
 * are pretty much hard coded, and rely on the hash implementation
1927
 * being available as per what OPENSSL_NO_ macros allow.
1928
 */
1929
1930
static OSSL_FUNC_signature_query_key_types_fn rsa_sigalg_query_key_types;
1931
static OSSL_FUNC_signature_settable_ctx_params_fn rsa_sigalg_settable_ctx_params;
1932
static OSSL_FUNC_signature_set_ctx_params_fn rsa_sigalg_set_ctx_params;
1933
1934
/*
1935
 * rsa_sigalg_signverify_init() is almost like rsa_digest_signverify_init(),
1936
 * just doesn't allow fetching an MD from whatever the user chooses.
1937
 */
1938
static int rsa_sigalg_signverify_init(void *vprsactx, void *vrsa,
1939
    OSSL_FUNC_signature_set_ctx_params_fn *set_ctx_params,
1940
    const OSSL_PARAM params[],
1941
    const char *mdname,
1942
    int operation, int pad_mode,
1943
    const char *desc)
1944
0
{
1945
0
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
1946
1947
0
    if (!ossl_prov_is_running())
1948
0
        return 0;
1949
1950
0
    if (!rsa_signverify_init(prsactx, vrsa, set_ctx_params, params, operation,
1951
0
            desc))
1952
0
        return 0;
1953
1954
    /* PSS is currently not supported as a sigalg */
1955
0
    if (prsactx->pad_mode == RSA_PKCS1_PSS_PADDING) {
1956
0
        ERR_raise(ERR_LIB_PROV, PROV_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
1957
0
        return 0;
1958
0
    }
1959
1960
0
    if (!rsa_setup_md(prsactx, mdname, NULL, desc))
1961
0
        return 0;
1962
1963
0
    prsactx->pad_mode = pad_mode;
1964
0
    prsactx->flag_sigalg = 1;
1965
0
    prsactx->flag_allow_md = 0;
1966
1967
0
    if (prsactx->mdctx == NULL) {
1968
0
        prsactx->mdctx = EVP_MD_CTX_new();
1969
0
        if (prsactx->mdctx == NULL)
1970
0
            goto error;
1971
0
    }
1972
1973
0
    if (!EVP_DigestInit_ex2(prsactx->mdctx, prsactx->md, params))
1974
0
        goto error;
1975
1976
0
    return 1;
1977
1978
0
error:
1979
0
    EVP_MD_CTX_free(prsactx->mdctx);
1980
0
    prsactx->mdctx = NULL;
1981
0
    return 0;
1982
0
}
1983
1984
static const char **rsa_sigalg_query_key_types(void)
1985
0
{
1986
0
    static const char *keytypes[] = { "RSA", NULL };
1987
1988
0
    return keytypes;
1989
0
}
1990
1991
static const OSSL_PARAM settable_sigalg_ctx_params[] = {
1992
    OSSL_PARAM_octet_string(OSSL_SIGNATURE_PARAM_SIGNATURE, NULL, 0),
1993
    OSSL_PARAM_END
1994
};
1995
1996
static const OSSL_PARAM *rsa_sigalg_settable_ctx_params(void *vprsactx,
1997
    ossl_unused void *provctx)
1998
5
{
1999
5
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2000
2001
5
    if (prsactx != NULL && prsactx->operation == EVP_PKEY_OP_VERIFYMSG)
2002
0
        return settable_sigalg_ctx_params;
2003
5
    return NULL;
2004
5
}
2005
2006
static int rsa_sigalg_set_ctx_params(void *vprsactx, const OSSL_PARAM params[])
2007
4.53k
{
2008
4.53k
    PROV_RSA_CTX *prsactx = (PROV_RSA_CTX *)vprsactx;
2009
4.53k
    const OSSL_PARAM *p;
2010
2011
4.53k
    if (prsactx == NULL)
2012
0
        return 0;
2013
4.53k
    if (ossl_param_is_empty(params))
2014
0
        return 1;
2015
2016
4.53k
    if (prsactx->operation == EVP_PKEY_OP_VERIFYMSG) {
2017
4.53k
        p = OSSL_PARAM_locate_const(params, OSSL_SIGNATURE_PARAM_SIGNATURE);
2018
4.53k
        if (p != NULL) {
2019
4.53k
            OPENSSL_free(prsactx->sig);
2020
4.53k
            prsactx->sig = NULL;
2021
4.53k
            prsactx->siglen = 0;
2022
4.53k
            if (!OSSL_PARAM_get_octet_string(p, (void **)&prsactx->sig,
2023
4.53k
                    0, &prsactx->siglen))
2024
0
                return 0;
2025
4.53k
        }
2026
4.53k
    }
2027
4.53k
    return 1;
2028
4.53k
}
2029
2030
#define IMPL_RSA_SIGALG(md, MD)                                       \
2031
    static OSSL_FUNC_signature_sign_init_fn rsa_##md##_sign_init;     \
2032
    static OSSL_FUNC_signature_sign_message_init_fn                   \
2033
        rsa_##md##_sign_message_init;                                 \
2034
    static OSSL_FUNC_signature_verify_init_fn rsa_##md##_verify_init; \
2035
    static OSSL_FUNC_signature_verify_message_init_fn                 \
2036
        rsa_##md##_verify_message_init;                               \
2037
                                                                      \
2038
    static int                                                        \
2039
    rsa_##md##_sign_init(void *vprsactx, void *vrsa,                  \
2040
        const OSSL_PARAM params[])                                    \
2041
0
    {                                                                 \
2042
0
        static const char desc[] = "RSA Sigalg Sign Init";            \
2043
0
                                                                      \
2044
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2045
0
            rsa_sigalg_set_ctx_params,                                \
2046
0
            params, #MD,                                              \
2047
0
            EVP_PKEY_OP_SIGN,                                         \
2048
0
            RSA_PKCS1_PADDING,                                        \
2049
0
            desc);                                                    \
2050
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
2051
                                                                      \
2052
    static int                                                        \
2053
    rsa_##md##_sign_message_init(void *vprsactx, void *vrsa,          \
2054
        const OSSL_PARAM params[])                                    \
2055
0
    {                                                                 \
2056
0
        static const char desc[] = "RSA Sigalg Sign Message Init";    \
2057
0
                                                                      \
2058
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2059
0
            rsa_sigalg_set_ctx_params,                                \
2060
0
            params, #MD,                                              \
2061
0
            EVP_PKEY_OP_SIGNMSG,                                      \
2062
0
            RSA_PKCS1_PADDING,                                        \
2063
0
            desc);                                                    \
2064
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
2065
                                                                      \
2066
    static int                                                        \
2067
    rsa_##md##_verify_init(void *vprsactx, void *vrsa,                \
2068
        const OSSL_PARAM params[])                                    \
2069
0
    {                                                                 \
2070
0
        static const char desc[] = "RSA Sigalg Verify Init";          \
2071
0
                                                                      \
2072
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2073
0
            rsa_sigalg_set_ctx_params,                                \
2074
0
            params, #MD,                                              \
2075
0
            EVP_PKEY_OP_VERIFY,                                       \
2076
0
            RSA_PKCS1_PADDING,                                        \
2077
0
            desc);                                                    \
2078
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
2079
                                                                      \
2080
    static int                                                        \
2081
    rsa_##md##_verify_recover_init(void *vprsactx, void *vrsa,        \
2082
        const OSSL_PARAM params[])                                    \
2083
0
    {                                                                 \
2084
0
        static const char desc[] = "RSA Sigalg Verify Recover Init";  \
2085
0
                                                                      \
2086
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2087
0
            rsa_sigalg_set_ctx_params,                                \
2088
0
            params, #MD,                                              \
2089
0
            EVP_PKEY_OP_VERIFYRECOVER,                                \
2090
0
            RSA_PKCS1_PADDING,                                        \
2091
0
            desc);                                                    \
2092
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
2093
                                                                      \
2094
    static int                                                        \
2095
    rsa_##md##_verify_message_init(void *vprsactx, void *vrsa,        \
2096
        const OSSL_PARAM params[])                                    \
2097
0
    {                                                                 \
2098
0
        static const char desc[] = "RSA Sigalg Verify Message Init";  \
2099
0
                                                                      \
2100
0
        return rsa_sigalg_signverify_init(vprsactx, vrsa,             \
2101
0
            rsa_sigalg_set_ctx_params,                                \
2102
0
            params, #MD,                                              \
2103
0
            EVP_PKEY_OP_VERIFYMSG,                                    \
2104
0
            RSA_PKCS1_PADDING,                                        \
2105
0
            desc);                                                    \
2106
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
2107
                                                                      \
2108
    const OSSL_DISPATCH ossl_rsa_##md##_signature_functions[] = {     \
2109
        { OSSL_FUNC_SIGNATURE_NEWCTX, (void (*)(void))rsa_newctx },   \
2110
        { OSSL_FUNC_SIGNATURE_SIGN_INIT,                              \
2111
            (void (*)(void))rsa_##md##_sign_init },                   \
2112
        { OSSL_FUNC_SIGNATURE_SIGN, (void (*)(void))rsa_sign },       \
2113
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_INIT,                      \
2114
            (void (*)(void))rsa_##md##_sign_message_init },           \
2115
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_UPDATE,                    \
2116
            (void (*)(void))rsa_signverify_message_update },          \
2117
        { OSSL_FUNC_SIGNATURE_SIGN_MESSAGE_FINAL,                     \
2118
            (void (*)(void))rsa_sign_message_final },                 \
2119
        { OSSL_FUNC_SIGNATURE_VERIFY_INIT,                            \
2120
            (void (*)(void))rsa_##md##_verify_init },                 \
2121
        { OSSL_FUNC_SIGNATURE_VERIFY,                                 \
2122
            (void (*)(void))rsa_verify },                             \
2123
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_INIT,                    \
2124
            (void (*)(void))rsa_##md##_verify_message_init },         \
2125
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_UPDATE,                  \
2126
            (void (*)(void))rsa_signverify_message_update },          \
2127
        { OSSL_FUNC_SIGNATURE_VERIFY_MESSAGE_FINAL,                   \
2128
            (void (*)(void))rsa_verify_message_final },               \
2129
        { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER_INIT,                    \
2130
            (void (*)(void))rsa_##md##_verify_recover_init },         \
2131
        { OSSL_FUNC_SIGNATURE_VERIFY_RECOVER,                         \
2132
            (void (*)(void))rsa_verify_recover },                     \
2133
        { OSSL_FUNC_SIGNATURE_FREECTX, (void (*)(void))rsa_freectx }, \
2134
        { OSSL_FUNC_SIGNATURE_DUPCTX, (void (*)(void))rsa_dupctx },   \
2135
        { OSSL_FUNC_SIGNATURE_QUERY_KEY_TYPES,                        \
2136
            (void (*)(void))rsa_sigalg_query_key_types },             \
2137
        { OSSL_FUNC_SIGNATURE_GET_CTX_PARAMS,                         \
2138
            (void (*)(void))rsa_get_ctx_params },                     \
2139
        { OSSL_FUNC_SIGNATURE_GETTABLE_CTX_PARAMS,                    \
2140
            (void (*)(void))rsa_gettable_ctx_params },                \
2141
        { OSSL_FUNC_SIGNATURE_SET_CTX_PARAMS,                         \
2142
            (void (*)(void))rsa_sigalg_set_ctx_params },              \
2143
        { OSSL_FUNC_SIGNATURE_SETTABLE_CTX_PARAMS,                    \
2144
            (void (*)(void))rsa_sigalg_settable_ctx_params },         \
2145
        OSSL_DISPATCH_END                                             \
2146
    }
2147
2148
/* clang-format off */
2149
#if !defined(OPENSSL_NO_RMD160) && !defined(FIPS_MODULE)
2150
IMPL_RSA_SIGALG(ripemd160, RIPEMD160);
2151
#endif
2152
IMPL_RSA_SIGALG(sha1, SHA1);
2153
IMPL_RSA_SIGALG(sha224, SHA2-224);
2154
IMPL_RSA_SIGALG(sha256, SHA2-256);
2155
IMPL_RSA_SIGALG(sha384, SHA2-384);
2156
IMPL_RSA_SIGALG(sha512, SHA2-512);
2157
IMPL_RSA_SIGALG(sha512_224, SHA2-512/224);
2158
IMPL_RSA_SIGALG(sha512_256, SHA2-512/256);
2159
IMPL_RSA_SIGALG(sha3_224, SHA3-224);
2160
IMPL_RSA_SIGALG(sha3_256, SHA3-256);
2161
IMPL_RSA_SIGALG(sha3_384, SHA3-384);
2162
IMPL_RSA_SIGALG(sha3_512, SHA3-512);
2163
#if !defined(OPENSSL_NO_SM3) && !defined(FIPS_MODULE)
2164
IMPL_RSA_SIGALG(sm3, SM3);
2165
#endif
2166
/* clang-format on */