Coverage Report

Created: 2026-09-12 06:55

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/providers/implementations/keymgmt/rsa_kmgmt.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 <openssl/core_dispatch.h>
17
#include <openssl/core_names.h>
18
#include <openssl/bn.h>
19
#include <openssl/err.h>
20
#include <openssl/rsa.h>
21
#include <openssl/evp.h>
22
#include <openssl/proverr.h>
23
#include "prov/implementations.h"
24
#include "prov/providercommon.h"
25
#include "prov/provider_ctx.h"
26
#include "crypto/rsa.h"
27
#include "crypto/rsa_params.h"
28
#include "crypto/cryptlib.h"
29
#include "internal/fips.h"
30
#include "internal/param_build_set.h"
31
32
static OSSL_FUNC_keymgmt_new_fn rsa_newdata;
33
static OSSL_FUNC_keymgmt_new_ex_fn rsa_newdata_ex;
34
static OSSL_FUNC_keymgmt_new_fn rsapss_newdata;
35
static OSSL_FUNC_keymgmt_new_ex_fn rsapss_newdata_ex;
36
static OSSL_FUNC_keymgmt_gen_init_fn rsa_gen_init;
37
static OSSL_FUNC_keymgmt_gen_init_fn rsapss_gen_init;
38
static OSSL_FUNC_keymgmt_gen_set_params_fn rsa_gen_set_params;
39
static OSSL_FUNC_keymgmt_gen_settable_params_fn rsa_gen_settable_params;
40
static OSSL_FUNC_keymgmt_gen_settable_params_fn rsapss_gen_settable_params;
41
static OSSL_FUNC_keymgmt_gen_fn rsa_gen;
42
static OSSL_FUNC_keymgmt_gen_cleanup_fn rsa_gen_cleanup;
43
static OSSL_FUNC_keymgmt_load_fn rsa_load;
44
static OSSL_FUNC_keymgmt_load_fn rsapss_load;
45
static OSSL_FUNC_keymgmt_free_fn rsa_freedata;
46
static OSSL_FUNC_keymgmt_get_params_fn rsa_get_params;
47
static OSSL_FUNC_keymgmt_get_params_fn rsapss_get_params;
48
static OSSL_FUNC_keymgmt_gettable_params_fn rsa_gettable_params;
49
static OSSL_FUNC_keymgmt_gettable_params_fn rsapss_gettable_params;
50
static OSSL_FUNC_keymgmt_has_fn rsa_has;
51
static OSSL_FUNC_keymgmt_match_fn rsa_match;
52
static OSSL_FUNC_keymgmt_validate_fn rsa_validate;
53
static OSSL_FUNC_keymgmt_import_fn rsa_import;
54
static OSSL_FUNC_keymgmt_import_types_fn rsa_import_types;
55
static OSSL_FUNC_keymgmt_import_types_fn rsapss_import_types;
56
static OSSL_FUNC_keymgmt_export_fn rsa_export;
57
static OSSL_FUNC_keymgmt_export_types_fn rsa_export_types;
58
static OSSL_FUNC_keymgmt_export_types_fn rsapss_export_types;
59
static OSSL_FUNC_keymgmt_query_operation_name_fn rsa_query_operation_name;
60
static OSSL_FUNC_keymgmt_dup_fn rsa_dup;
61
62
0
#define RSA_DEFAULT_MD "SHA256"
63
#define RSA_POSSIBLE_SELECTIONS \
64
155k
    (OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS)
65
66
DEFINE_STACK_OF(BIGNUM)
67
DEFINE_SPECIAL_STACK_OF_CONST(BIGNUM_const, BIGNUM)
68
69
static int pss_params_fromdata(RSA_PSS_PARAMS_30 *pss_params, int *defaults_set,
70
    const RSA_PARAMS *p, int rsa_type,
71
    OSSL_LIB_CTX *libctx)
72
0
{
73
0
    if (!ossl_rsa_pss_params_30_fromdata_parsed(pss_params, defaults_set,
74
0
            p, libctx))
75
0
        return 0;
76
77
    /* If not a PSS type RSA, sending us PSS parameters is wrong */
78
0
    if (rsa_type != RSA_FLAG_TYPE_RSASSAPSS
79
0
        && !ossl_rsa_pss_params_30_is_unrestricted(pss_params))
80
0
        return 0;
81
82
0
    return 1;
83
0
}
84
85
/*
86
 * If the application actually created a legacy RSA object and assigned it to
87
 * the EVP_PKEY, then we get hold of that object here. We return 0 if we hit
88
 * a fatal error or 1 otherwise. We may return 1 but with *rsa set to NULL.
89
 */
90
static int get_legacy_rsa_object(OSSL_LIB_CTX *libctx, RSA **rsa, const OSSL_PARAM params[])
91
11.4k
{
92
11.4k
#ifndef FIPS_MODULE
93
11.4k
    const OSSL_PARAM *p;
94
95
11.4k
    if (params == NULL)
96
0
        return 1;
97
11.4k
    p = OSSL_PARAM_locate_const(params, "legacy-object");
98
11.4k
    if (p == NULL)
99
0
        return 1;
100
    /*
101
     * This only works because we are in the default provider. We are not
102
     * normally allowed to pass complex objects across the provider boundary
103
     * like this.
104
     */
105
11.4k
    if (OSSL_PARAM_get_octet_ptr(p, (const void **)rsa, NULL) && *rsa != NULL) {
106
11.4k
        if (ossl_lib_ctx_get_concrete(ossl_rsa_get0_libctx(*rsa)) != ossl_lib_ctx_get_concrete(libctx)) {
107
0
            *rsa = NULL;
108
0
            return 1;
109
0
        }
110
11.4k
        if (!RSA_up_ref(*rsa))
111
0
            return 0;
112
11.4k
    }
113
11.4k
#endif
114
115
11.4k
    return 1;
116
11.4k
}
117
118
static void *rsa_newdata_ex(void *provctx, const OSSL_PARAM params[])
119
11.4k
{
120
11.4k
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
121
11.4k
    RSA *rsa = NULL;
122
123
11.4k
    if (!ossl_prov_is_running())
124
0
        return NULL;
125
126
11.4k
    if (!get_legacy_rsa_object(libctx, &rsa, params))
127
0
        return NULL;
128
129
11.4k
    if (rsa == NULL) {
130
0
        rsa = ossl_rsa_new_with_ctx(libctx);
131
0
        if (rsa != NULL) {
132
0
            RSA_clear_flags(rsa, RSA_FLAG_TYPE_MASK);
133
0
            RSA_set_flags(rsa, RSA_FLAG_TYPE_RSA);
134
0
        }
135
0
    }
136
137
11.4k
    return rsa;
138
11.4k
}
139
140
static void *rsa_newdata(void *provctx)
141
{
142
    return rsa_newdata_ex(provctx, NULL);
143
}
144
145
static void *rsapss_newdata_ex(void *provctx, const OSSL_PARAM params[])
146
0
{
147
0
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
148
0
    RSA *rsa = NULL;
149
150
0
    if (!ossl_prov_is_running())
151
0
        return NULL;
152
153
0
    if (!get_legacy_rsa_object(libctx, &rsa, params))
154
0
        return NULL;
155
156
0
    if (rsa == NULL) {
157
0
        rsa = ossl_rsa_new_with_ctx(libctx);
158
0
        if (rsa != NULL) {
159
0
            RSA_clear_flags(rsa, RSA_FLAG_TYPE_MASK);
160
0
            RSA_set_flags(rsa, RSA_FLAG_TYPE_RSASSAPSS);
161
0
        }
162
0
    }
163
164
0
    return rsa;
165
0
}
166
167
static void *rsapss_newdata(void *provctx)
168
0
{
169
0
    return rsapss_newdata_ex(provctx, NULL);
170
0
}
171
172
static void rsa_freedata(void *keydata)
173
175k
{
174
175k
    RSA_free(keydata);
175
175k
}
176
177
static int rsa_has(const void *keydata, int selection)
178
144k
{
179
144k
    const RSA *rsa = keydata;
180
144k
    int ok = 1;
181
182
144k
    if (rsa == NULL || !ossl_prov_is_running())
183
0
        return 0;
184
144k
    if ((selection & RSA_POSSIBLE_SELECTIONS) == 0)
185
74.0k
        return 1; /* the selection is not missing */
186
187
    /* OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS are always available even if empty */
188
70.6k
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
189
70.6k
        ok = ok && (RSA_get0_n(rsa) != NULL);
190
70.6k
    if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
191
51.7k
        ok = ok && (RSA_get0_e(rsa) != NULL);
192
70.6k
    if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
193
18.9k
        ok = ok && (RSA_get0_d(rsa) != NULL);
194
70.6k
    return ok;
195
144k
}
196
197
static int rsa_match(const void *keydata1, const void *keydata2, int selection)
198
86.1k
{
199
86.1k
    const RSA *rsa1 = keydata1;
200
86.1k
    const RSA *rsa2 = keydata2;
201
86.1k
    int ok = 1;
202
203
86.1k
    if (!ossl_prov_is_running())
204
0
        return 0;
205
206
    /* There is always an |e| */
207
86.1k
    ok = ok && BN_cmp(RSA_get0_e(rsa1), RSA_get0_e(rsa2)) == 0;
208
86.1k
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
209
44.4k
        int key_checked = 0;
210
211
44.4k
        if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) {
212
44.4k
            const BIGNUM *pa = RSA_get0_n(rsa1);
213
44.4k
            const BIGNUM *pb = RSA_get0_n(rsa2);
214
215
44.4k
            if (pa != NULL && pb != NULL) {
216
44.4k
                ok = ok && BN_cmp(pa, pb) == 0;
217
44.4k
                key_checked = 1;
218
44.4k
            }
219
44.4k
        }
220
44.4k
        if (!key_checked
221
0
            && (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) {
222
0
            const BIGNUM *pa = RSA_get0_d(rsa1);
223
0
            const BIGNUM *pb = RSA_get0_d(rsa2);
224
225
0
            if (pa != NULL && pb != NULL) {
226
0
                ok = ok && BN_cmp(pa, pb) == 0;
227
0
                key_checked = 1;
228
0
            }
229
0
        }
230
44.4k
        ok = ok && key_checked;
231
44.4k
    }
232
86.1k
    return ok;
233
86.1k
}
234
235
enum {
236
    RSA_IMEXPORT_TYPE_NONE = 0,
237
    RSA_IMEXPORT_TYPE_OTHER = 1,
238
    RSA_IMEXPORT_TYPE_KEY = 2,
239
    RSA_IMEXPORT_TYPE_ALL = RSA_IMEXPORT_TYPE_OTHER | RSA_IMEXPORT_TYPE_KEY,
240
    RSA_IMEXPORT_TYPE_COUNT
241
};
242
243
typedef int (*rsa_import_types_decoder_fn)(const OSSL_PARAM *, RSA_PARAMS *);
244
245
struct rsa_imexport_types_st {
246
    const OSSL_PARAM *import_types;
247
    rsa_import_types_decoder_fn import_decoder;
248
    const OSSL_PARAM *export_types;
249
};
250
251
static const struct rsa_imexport_types_st
252
    rsa_imexport_types[RSA_IMEXPORT_TYPE_COUNT]
253
    = {
254
          [RSA_IMEXPORT_TYPE_OTHER] = {
255
              rsa_other_import_types_list,
256
              rsa_other_import_types_decoder,
257
              rsa_other_export_types_list,
258
          },
259
          [RSA_IMEXPORT_TYPE_KEY] = {
260
              rsa_key_import_types_list,
261
              rsa_key_import_types_decoder,
262
              rsa_key_export_types_list,
263
          },
264
          [RSA_IMEXPORT_TYPE_ALL] = {
265
              rsa_all_import_types_list,
266
              rsa_all_import_types_decoder,
267
              rsa_all_export_types_list,
268
          },
269
      };
270
271
static const struct rsa_imexport_types_st
272
    rsapss_imexport_types[RSA_IMEXPORT_TYPE_COUNT]
273
    = {
274
          [RSA_IMEXPORT_TYPE_OTHER] = {
275
              rsapss_other_import_types_list,
276
              rsapss_other_import_types_decoder,
277
              rsapss_other_export_types_list,
278
          },
279
          [RSA_IMEXPORT_TYPE_KEY] = {
280
              rsapss_key_import_types_list,
281
              rsapss_key_import_types_decoder,
282
              rsapss_key_export_types_list,
283
          },
284
          [RSA_IMEXPORT_TYPE_ALL] = {
285
              rsapss_all_import_types_list,
286
              rsapss_all_import_types_decoder,
287
              rsapss_all_export_types_list,
288
          },
289
      };
290
291
static int rsa_imexport_type_select(int selection)
292
0
{
293
0
    int type_select = RSA_IMEXPORT_TYPE_NONE;
294
295
0
    if ((selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) != 0)
296
0
        type_select |= RSA_IMEXPORT_TYPE_OTHER;
297
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
298
0
        type_select |= RSA_IMEXPORT_TYPE_KEY;
299
0
    return type_select;
300
0
}
301
302
static int rsa_import(void *keydata, int selection, const OSSL_PARAM params[])
303
0
{
304
0
    RSA *rsa = keydata;
305
0
    RSA_PARAMS p;
306
0
    const struct rsa_imexport_types_st *types;
307
0
    int type_select;
308
0
    int rsa_type;
309
0
    int ok = 1;
310
0
    int pss_defaults_set = 0;
311
312
0
    if (!ossl_prov_is_running() || rsa == NULL)
313
0
        return 0;
314
315
0
    type_select = rsa_imexport_type_select(selection);
316
0
    rsa_type = RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK);
317
0
    types = rsa_type == RSA_FLAG_TYPE_RSASSAPSS
318
0
        ? rsapss_imexport_types
319
0
        : rsa_imexport_types;
320
0
    if (type_select == RSA_IMEXPORT_TYPE_NONE
321
0
        || !types[type_select].import_decoder(params, &p))
322
0
        return 0;
323
324
0
    if ((selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) != 0)
325
0
        ok = ok && pss_params_fromdata(ossl_rsa_get0_pss_params_30(rsa), &pss_defaults_set, &p, rsa_type, ossl_rsa_get0_libctx(rsa));
326
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
327
0
        int include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
328
329
0
        ok = ok && ossl_rsa_fromdata_parsed(rsa, &p, include_private);
330
0
    }
331
332
0
    return ok;
333
0
}
334
335
static int rsa_export(void *keydata, int selection,
336
    OSSL_CALLBACK *param_callback, void *cbarg)
337
14.0k
{
338
14.0k
    RSA *rsa = keydata;
339
14.0k
    const RSA_PSS_PARAMS_30 *pss_params = ossl_rsa_get0_pss_params_30(rsa);
340
14.0k
    OSSL_PARAM_BLD *tmpl;
341
14.0k
    OSSL_PARAM *params = NULL;
342
14.0k
    int type_select;
343
14.0k
    int ok = 1;
344
345
14.0k
    if (!ossl_prov_is_running() || rsa == NULL)
346
0
        return 0;
347
348
14.0k
    type_select = rsa_imexport_type_select(selection);
349
14.0k
    if (type_select == RSA_IMEXPORT_TYPE_NONE)
350
0
        return 0;
351
352
14.0k
    tmpl = OSSL_PARAM_BLD_new();
353
14.0k
    if (tmpl == NULL)
354
0
        return 0;
355
356
14.0k
    if ((selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) != 0)
357
14.0k
        ok = ok && (ossl_rsa_pss_params_30_is_unrestricted(pss_params) || ossl_rsa_pss_params_30_todata(pss_params, tmpl, NULL));
358
14.0k
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) {
359
14.0k
        int include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0;
360
361
14.0k
        ok = ok && ossl_rsa_todata(rsa, tmpl, NULL, include_private);
362
14.0k
    }
363
364
14.0k
    if (!ok || (params = OSSL_PARAM_BLD_to_param(tmpl)) == NULL) {
365
0
        ok = 0;
366
0
        goto err;
367
0
    }
368
369
14.0k
    ok = param_callback(params, cbarg);
370
14.0k
    OSSL_PARAM_clear_free(params);
371
14.0k
err:
372
14.0k
    OSSL_PARAM_BLD_free(tmpl);
373
14.0k
    return ok;
374
14.0k
}
375
376
static const OSSL_PARAM *rsa_import_types(int selection)
377
0
{
378
0
    return rsa_imexport_types[rsa_imexport_type_select(selection)].import_types;
379
0
}
380
381
static const OSSL_PARAM *rsapss_import_types(int selection)
382
0
{
383
0
    return rsapss_imexport_types[rsa_imexport_type_select(selection)]
384
0
        .import_types;
385
0
}
386
387
static const OSSL_PARAM *rsa_export_types(int selection)
388
0
{
389
0
    return rsa_imexport_types[rsa_imexport_type_select(selection)].export_types;
390
0
}
391
392
static const OSSL_PARAM *rsapss_export_types(int selection)
393
0
{
394
0
    return rsapss_imexport_types[rsa_imexport_type_select(selection)]
395
0
        .export_types;
396
0
}
397
398
typedef int (*rsa_get_params_decoder_fn)(const OSSL_PARAM *, RSA_PARAMS *);
399
400
static int common_get_params(void *key, OSSL_PARAM params[],
401
    rsa_get_params_decoder_fn decoder)
402
34.5k
{
403
34.5k
    RSA *rsa = key;
404
34.5k
    RSA_PARAMS p;
405
34.5k
    const RSA_PSS_PARAMS_30 *pss_params;
406
34.5k
    int rsa_type, empty;
407
408
34.5k
    if (rsa == NULL || !decoder(params, &p))
409
0
        return 0;
410
34.5k
    pss_params = ossl_rsa_get0_pss_params_30(rsa);
411
34.5k
    rsa_type = RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK);
412
34.5k
    empty = RSA_get0_n(rsa) == NULL;
413
414
34.5k
    if (p.bits != NULL && (empty || !OSSL_PARAM_set_int(p.bits, RSA_bits(rsa))))
415
0
        return 0;
416
34.5k
    if (p.secbits != NULL
417
34.5k
        && (empty || !OSSL_PARAM_set_int(p.secbits, RSA_security_bits(rsa))))
418
0
        return 0;
419
34.5k
    if (p.maxsize != NULL
420
34.5k
        && (empty || !OSSL_PARAM_set_int(p.maxsize, RSA_size(rsa))))
421
0
        return 0;
422
34.5k
    if (p.seccat != NULL)
423
34.5k
        if (!OSSL_PARAM_set_int(p.seccat, 0))
424
0
            return 0;
425
426
    /*
427
     * For restricted RSA-PSS keys, we ignore the default digest request.
428
     * With RSA-OAEP keys, this may need to be amended.
429
     */
430
34.5k
    if (p.default_digest != NULL
431
0
        && (rsa_type != RSA_FLAG_TYPE_RSASSAPSS
432
0
            || ossl_rsa_pss_params_30_is_unrestricted(pss_params))) {
433
0
        if (!OSSL_PARAM_set_utf8_string(p.default_digest, RSA_DEFAULT_MD))
434
0
            return 0;
435
0
    }
436
437
    /*
438
     * For non-RSA-PSS keys, we ignore the mandatory digest request.
439
     * With RSA-OAEP keys, this may need to be amended.
440
     */
441
34.5k
    if (p.mandatory_digest != NULL
442
0
        && rsa_type == RSA_FLAG_TYPE_RSASSAPSS
443
0
        && !ossl_rsa_pss_params_30_is_unrestricted(pss_params)) {
444
0
        const char *mdname = ossl_rsa_oaeppss_nid2name(ossl_rsa_pss_params_30_hashalg(pss_params));
445
446
0
        if (mdname == NULL
447
0
            || !OSSL_PARAM_set_utf8_string(p.mandatory_digest, mdname))
448
0
            return 0;
449
0
    }
450
34.5k
    return (rsa_type != RSA_FLAG_TYPE_RSASSAPSS
451
5.97k
               || ossl_rsa_pss_params_30_todata_parsed(pss_params, NULL, &p))
452
34.5k
        && ossl_rsa_todata_parsed(rsa, NULL, &p, 1);
453
34.5k
}
454
455
static int rsa_get_params(void *key, OSSL_PARAM params[])
456
28.6k
{
457
28.6k
    return common_get_params(key, params, rsa_get_params_decoder);
458
28.6k
}
459
460
static int rsapss_get_params(void *key, OSSL_PARAM params[])
461
5.97k
{
462
5.97k
    return common_get_params(key, params, rsapss_get_params_decoder);
463
5.97k
}
464
465
static const OSSL_PARAM *rsa_gettable_params(void *provctx)
466
0
{
467
0
    return rsa_get_params_list;
468
0
}
469
470
static const OSSL_PARAM *rsapss_gettable_params(void *provctx)
471
0
{
472
0
    return rsapss_get_params_list;
473
0
}
474
475
static int rsa_validate(const void *keydata, int selection, int checktype)
476
10.3k
{
477
10.3k
    const RSA *rsa = keydata;
478
10.3k
    int ok = 1;
479
480
10.3k
    if (!ossl_prov_is_running())
481
0
        return 0;
482
483
10.3k
    if ((selection & RSA_POSSIBLE_SELECTIONS) == 0)
484
0
        return 1; /* nothing to validate */
485
486
    /* If the whole key is selected, we do a pairwise validation */
487
10.3k
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR)
488
10.3k
        == OSSL_KEYMGMT_SELECT_KEYPAIR) {
489
2.31k
        ok = ok && ossl_rsa_validate_pairwise(rsa);
490
8.02k
    } else {
491
8.02k
        if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0)
492
2.31k
            ok = ok && ossl_rsa_validate_private(rsa);
493
8.02k
        if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0)
494
2.85k
            ok = ok && ossl_rsa_validate_public(rsa);
495
8.02k
    }
496
10.3k
    return ok;
497
10.3k
}
498
499
struct rsa_gen_ctx {
500
    OSSL_LIB_CTX *libctx;
501
    const char *propq;
502
503
    int rsa_type;
504
505
    size_t nbits;
506
    BIGNUM *pub_exp;
507
    size_t primes;
508
509
    /* For PSS */
510
    RSA_PSS_PARAMS_30 pss_params;
511
    int pss_defaults_set;
512
513
    /* For generation callback */
514
    OSSL_CALLBACK *cb;
515
    void *cbarg;
516
517
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
518
    /* ACVP test parameters */
519
    OSSL_PARAM *acvp_test_params;
520
#endif
521
    uint32_t a, b;
522
};
523
524
static int rsa_gencb(int p, int n, BN_GENCB *cb)
525
0
{
526
0
    struct rsa_gen_ctx *gctx = BN_GENCB_get_arg(cb);
527
0
    OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END };
528
529
0
    params[0] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_POTENTIAL, &p);
530
0
    params[1] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_ITERATION, &n);
531
0
    return gctx->cb(params, gctx->cbarg);
532
0
}
533
534
static void *gen_init(void *provctx, int selection, int rsa_type,
535
    const OSSL_PARAM params[])
536
0
{
537
0
    OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx);
538
0
    struct rsa_gen_ctx *gctx = NULL;
539
540
0
    if (!ossl_prov_is_running())
541
0
        return NULL;
542
543
0
    if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0)
544
0
        return NULL;
545
546
0
    if ((gctx = OPENSSL_zalloc(sizeof(*gctx))) != NULL) {
547
0
        gctx->libctx = libctx;
548
0
        if ((gctx->pub_exp = BN_new()) == NULL
549
0
            || !BN_set_word(gctx->pub_exp, RSA_F4)) {
550
0
            goto err;
551
0
        }
552
0
        gctx->nbits = 2048;
553
0
        gctx->primes = RSA_DEFAULT_PRIME_NUM;
554
0
        gctx->rsa_type = rsa_type;
555
0
    } else {
556
0
        goto err;
557
0
    }
558
559
0
    if (!rsa_gen_set_params(gctx, params))
560
0
        goto err;
561
0
    return gctx;
562
563
0
err:
564
0
    if (gctx != NULL)
565
0
        BN_free(gctx->pub_exp);
566
0
    OPENSSL_free(gctx);
567
0
    return NULL;
568
0
}
569
570
static void *rsa_gen_init(void *provctx, int selection,
571
    const OSSL_PARAM params[])
572
0
{
573
0
    return gen_init(provctx, selection, RSA_FLAG_TYPE_RSA, params);
574
0
}
575
576
static void *rsapss_gen_init(void *provctx, int selection,
577
    const OSSL_PARAM params[])
578
0
{
579
0
    return gen_init(provctx, selection, RSA_FLAG_TYPE_RSASSAPSS, params);
580
0
}
581
582
/*
583
 * This function is common for all RSA sub-types, to detect possible
584
 * misuse, such as PSS parameters being passed when a plain RSA key
585
 * is generated.
586
 */
587
static int rsa_gen_set_params(void *genctx, const OSSL_PARAM params[])
588
0
{
589
0
    struct rsa_gen_ctx *gctx = genctx;
590
0
    RSA_PARAMS p;
591
592
0
    if (gctx == NULL)
593
0
        return 0;
594
0
    switch (gctx->rsa_type) {
595
0
    case RSA_FLAG_TYPE_RSA:
596
0
        if (!rsa_gen_set_params_decoder(params, &p))
597
0
            return 0;
598
0
        break;
599
0
    case RSA_FLAG_TYPE_RSASSAPSS:
600
0
        if (!rsapss_gen_set_params_decoder(params, &p))
601
0
            return 0;
602
0
        break;
603
0
    default:
604
0
        return 0;
605
0
    }
606
607
0
    if (p.bits != NULL) {
608
0
        if (!OSSL_PARAM_get_size_t(p.bits, &gctx->nbits))
609
0
            return 0;
610
0
        if (gctx->nbits < RSA_MIN_MODULUS_BITS) {
611
0
            ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL);
612
0
            return 0;
613
0
        }
614
0
    }
615
0
    if (p.primes != NULL && !OSSL_PARAM_get_size_t(p.primes, &gctx->primes))
616
0
        return 0;
617
0
    if (p.e != NULL && !OSSL_PARAM_get_BN(p.e, &gctx->pub_exp))
618
0
        return 0;
619
0
    if (p.a != NULL) {
620
0
        if (!OSSL_PARAM_get_uint32(p.a, &gctx->a))
621
0
            return 0;
622
        /* a is an optional value that should be one of (0, 1, 3, 5, 7) */
623
0
        if (gctx->a != 0 && (gctx->a > 7 || (gctx->a & 1) == 0)) {
624
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DATA);
625
0
            return 0;
626
0
        }
627
0
    }
628
0
    if (p.b != NULL) {
629
0
        if (!OSSL_PARAM_get_uint32(p.b, &gctx->b))
630
0
            return 0;
631
        /* b is an optional value that should be one of (0, 1, 3, 5, 7) */
632
0
        if (gctx->b != 0 && (gctx->b > 7 || (gctx->b & 1) == 0)) {
633
0
            ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_DATA);
634
0
            return 0;
635
0
        }
636
0
    }
637
638
    /* Only attempt to get PSS parameters when generating an RSA-PSS key */
639
0
    if (gctx->rsa_type == RSA_FLAG_TYPE_RSASSAPSS
640
0
        && !pss_params_fromdata(&gctx->pss_params, &gctx->pss_defaults_set, &p,
641
0
            gctx->rsa_type, gctx->libctx))
642
0
        return 0;
643
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
644
    /* Any ACVP test related parameters are copied into a params[] */
645
    if (!ossl_rsa_acvp_test_gen_params_new_parsed(&gctx->acvp_test_params, &p))
646
        return 0;
647
#endif
648
0
    return 1;
649
0
}
650
651
static const OSSL_PARAM *rsa_gen_settable_params(ossl_unused void *genctx,
652
    ossl_unused void *provctx)
653
0
{
654
0
    return rsa_gen_set_params_list;
655
0
}
656
657
static const OSSL_PARAM *rsapss_gen_settable_params(ossl_unused void *genctx,
658
    ossl_unused void *provctx)
659
0
{
660
0
    return rsapss_gen_set_params_list;
661
0
}
662
663
static void *rsa_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cbarg)
664
0
{
665
0
    struct rsa_gen_ctx *gctx = genctx;
666
0
    RSA *rsa = NULL, *rsa_tmp = NULL;
667
0
    BN_GENCB *gencb = NULL;
668
669
0
    if (!ossl_prov_is_running() || gctx == NULL)
670
0
        return NULL;
671
672
0
    switch (gctx->rsa_type) {
673
0
    case RSA_FLAG_TYPE_RSA:
674
        /* For plain RSA keys, PSS parameters must not be set */
675
0
        if (!ossl_rsa_pss_params_30_is_unrestricted(&gctx->pss_params))
676
0
            goto err;
677
0
        break;
678
0
    case RSA_FLAG_TYPE_RSASSAPSS:
679
        /*
680
         * For plain RSA-PSS keys, PSS parameters may be set but don't have
681
         * to, so not check.
682
         */
683
0
        break;
684
0
    default:
685
        /* Unsupported RSA key sub-type... */
686
0
        return NULL;
687
0
    }
688
689
0
    if ((rsa_tmp = ossl_rsa_new_with_ctx(gctx->libctx)) == NULL)
690
0
        return NULL;
691
692
0
    gctx->cb = osslcb;
693
0
    gctx->cbarg = cbarg;
694
0
    gencb = BN_GENCB_new();
695
0
    if (gencb != NULL)
696
0
        BN_GENCB_set(gencb, rsa_gencb, genctx);
697
698
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
699
    if (gctx->acvp_test_params != NULL) {
700
        if (!ossl_rsa_acvp_test_set_params(rsa_tmp, gctx->acvp_test_params))
701
            goto err;
702
    }
703
#endif
704
705
0
    if (!ossl_rsa_generate_multi_prime_key(rsa_tmp,
706
0
            (int)gctx->nbits, (int)gctx->primes,
707
0
            gctx->pub_exp, gencb,
708
0
            gctx->a, gctx->b))
709
0
        goto err;
710
711
0
    if (!ossl_rsa_pss_params_30_copy(ossl_rsa_get0_pss_params_30(rsa_tmp),
712
0
            &gctx->pss_params))
713
0
        goto err;
714
715
0
    RSA_clear_flags(rsa_tmp, RSA_FLAG_TYPE_MASK);
716
0
    RSA_set_flags(rsa_tmp, gctx->rsa_type);
717
718
0
    rsa = rsa_tmp;
719
0
    rsa_tmp = NULL;
720
0
err:
721
0
    BN_GENCB_free(gencb);
722
0
    RSA_free(rsa_tmp);
723
0
    return rsa;
724
0
}
725
726
static void rsa_gen_cleanup(void *genctx)
727
0
{
728
0
    struct rsa_gen_ctx *gctx = genctx;
729
730
0
    if (gctx == NULL)
731
0
        return;
732
#if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS)
733
    ossl_rsa_acvp_test_gen_params_free(gctx->acvp_test_params);
734
    gctx->acvp_test_params = NULL;
735
#endif
736
0
    BN_clear_free(gctx->pub_exp);
737
0
    OPENSSL_free(gctx);
738
0
}
739
740
static void *common_load(const void *reference, size_t reference_sz,
741
    int expected_rsa_type)
742
135k
{
743
135k
    RSA *rsa = NULL;
744
745
135k
    if (ossl_prov_is_running() && reference_sz == sizeof(rsa)) {
746
        /* The contents of the reference is the address to our object */
747
135k
        rsa = *(RSA **)reference;
748
749
135k
        if (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK) != expected_rsa_type)
750
0
            return NULL;
751
752
        /* We grabbed, so we detach it */
753
135k
        *(RSA **)reference = NULL;
754
135k
        return rsa;
755
135k
    }
756
0
    return NULL;
757
135k
}
758
759
static void *rsa_load(const void *reference, size_t reference_sz)
760
115k
{
761
115k
    return common_load(reference, reference_sz, RSA_FLAG_TYPE_RSA);
762
115k
}
763
764
static void *rsapss_load(const void *reference, size_t reference_sz)
765
19.4k
{
766
19.4k
    return common_load(reference, reference_sz, RSA_FLAG_TYPE_RSASSAPSS);
767
19.4k
}
768
769
static void *rsa_dup(const void *keydata_from, int selection)
770
2.85k
{
771
2.85k
    if (ossl_prov_is_running()
772
        /* do not allow creating empty keys by duplication */
773
2.85k
        && (selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0)
774
2.85k
        return ossl_rsa_dup(keydata_from, selection);
775
0
    return NULL;
776
2.85k
}
777
778
/* For any RSA key, we use the "RSA" algorithms regardless of sub-type. */
779
static const char *rsa_query_operation_name(int operation_id)
780
534
{
781
534
    return "RSA";
782
534
}
783
784
const OSSL_DISPATCH ossl_rsa_keymgmt_functions[] = {
785
    { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))rsa_newdata },
786
    { OSSL_FUNC_KEYMGMT_NEW_EX, (void (*)(void))rsa_newdata_ex },
787
    { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))rsa_gen_init },
788
    { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS,
789
        (void (*)(void))rsa_gen_set_params },
790
    { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS,
791
        (void (*)(void))rsa_gen_settable_params },
792
    { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))rsa_gen },
793
    { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))rsa_gen_cleanup },
794
    { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))rsa_load },
795
    { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))rsa_freedata },
796
    { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))rsa_get_params },
797
    { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))rsa_gettable_params },
798
    { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))rsa_has },
799
    { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))rsa_match },
800
    { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))rsa_validate },
801
    { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_import },
802
    { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))rsa_import_types },
803
    { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))rsa_export },
804
    { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))rsa_export_types },
805
    { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))rsa_dup },
806
    OSSL_DISPATCH_END
807
};
808
809
const OSSL_DISPATCH ossl_rsapss_keymgmt_functions[] = {
810
    { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))rsapss_newdata },
811
    { OSSL_FUNC_KEYMGMT_NEW_EX, (void (*)(void))rsapss_newdata_ex },
812
    { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))rsapss_gen_init },
813
    { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS, (void (*)(void))rsa_gen_set_params },
814
    { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS,
815
        (void (*)(void))rsapss_gen_settable_params },
816
    { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))rsa_gen },
817
    { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))rsa_gen_cleanup },
818
    { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))rsapss_load },
819
    { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))rsa_freedata },
820
    { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))rsapss_get_params },
821
    { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS,
822
        (void (*)(void))rsapss_gettable_params },
823
    { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))rsa_has },
824
    { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))rsa_match },
825
    { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))rsa_validate },
826
    { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_import },
827
    { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))rsapss_import_types },
828
    { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))rsa_export },
829
    { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))rsapss_export_types },
830
    { OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME,
831
        (void (*)(void))rsa_query_operation_name },
832
    { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))rsa_dup },
833
    OSSL_DISPATCH_END
834
};