1 /* 2 * Copyright 2019-2025 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the Apache License 2.0 (the "License"). You may not use 5 * this file except in compliance with the License. You can obtain a copy 6 * in the file LICENSE in the source distribution or at 7 * https://www.openssl.org/source/license.html 8 */ 9 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/cryptlib.h" 28 #include "internal/fips.h" 29 #include "internal/param_build_set.h" 30 31 static OSSL_FUNC_keymgmt_new_fn rsa_newdata; 32 static OSSL_FUNC_keymgmt_new_fn rsapss_newdata; 33 static OSSL_FUNC_keymgmt_gen_init_fn rsa_gen_init; 34 static OSSL_FUNC_keymgmt_gen_init_fn rsapss_gen_init; 35 static OSSL_FUNC_keymgmt_gen_set_params_fn rsa_gen_set_params; 36 static OSSL_FUNC_keymgmt_gen_settable_params_fn rsa_gen_settable_params; 37 static OSSL_FUNC_keymgmt_gen_settable_params_fn rsapss_gen_settable_params; 38 static OSSL_FUNC_keymgmt_gen_fn rsa_gen; 39 static OSSL_FUNC_keymgmt_gen_cleanup_fn rsa_gen_cleanup; 40 static OSSL_FUNC_keymgmt_load_fn rsa_load; 41 static OSSL_FUNC_keymgmt_load_fn rsapss_load; 42 static OSSL_FUNC_keymgmt_free_fn rsa_freedata; 43 static OSSL_FUNC_keymgmt_get_params_fn rsa_get_params; 44 static OSSL_FUNC_keymgmt_gettable_params_fn rsa_gettable_params; 45 static OSSL_FUNC_keymgmt_has_fn rsa_has; 46 static OSSL_FUNC_keymgmt_match_fn rsa_match; 47 static OSSL_FUNC_keymgmt_validate_fn rsa_validate; 48 static OSSL_FUNC_keymgmt_import_fn rsa_import; 49 static OSSL_FUNC_keymgmt_import_types_fn rsa_import_types; 50 static OSSL_FUNC_keymgmt_export_fn rsa_export; 51 static OSSL_FUNC_keymgmt_export_types_fn rsa_export_types; 52 static OSSL_FUNC_keymgmt_query_operation_name_fn rsa_query_operation_name; 53 static OSSL_FUNC_keymgmt_dup_fn rsa_dup; 54 55 #define RSA_DEFAULT_MD "SHA256" 56 #define RSA_POSSIBLE_SELECTIONS \ 57 (OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) 58 59 DEFINE_STACK_OF(BIGNUM) 60 DEFINE_SPECIAL_STACK_OF_CONST(BIGNUM_const, BIGNUM) 61 62 static int pss_params_fromdata(RSA_PSS_PARAMS_30 *pss_params, int *defaults_set, 63 const OSSL_PARAM params[], int rsa_type, 64 OSSL_LIB_CTX *libctx) 65 { 66 if (!ossl_rsa_pss_params_30_fromdata(pss_params, defaults_set, 67 params, libctx)) 68 return 0; 69 70 /* If not a PSS type RSA, sending us PSS parameters is wrong */ 71 if (rsa_type != RSA_FLAG_TYPE_RSASSAPSS 72 && !ossl_rsa_pss_params_30_is_unrestricted(pss_params)) 73 return 0; 74 75 return 1; 76 } 77 78 static void *rsa_newdata(void *provctx) 79 { 80 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx); 81 RSA *rsa; 82 83 if (!ossl_prov_is_running()) 84 return NULL; 85 86 rsa = ossl_rsa_new_with_ctx(libctx); 87 if (rsa != NULL) { 88 RSA_clear_flags(rsa, RSA_FLAG_TYPE_MASK); 89 RSA_set_flags(rsa, RSA_FLAG_TYPE_RSA); 90 } 91 return rsa; 92 } 93 94 static void *rsapss_newdata(void *provctx) 95 { 96 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx); 97 RSA *rsa; 98 99 if (!ossl_prov_is_running()) 100 return NULL; 101 102 rsa = ossl_rsa_new_with_ctx(libctx); 103 if (rsa != NULL) { 104 RSA_clear_flags(rsa, RSA_FLAG_TYPE_MASK); 105 RSA_set_flags(rsa, RSA_FLAG_TYPE_RSASSAPSS); 106 } 107 return rsa; 108 } 109 110 static void rsa_freedata(void *keydata) 111 { 112 RSA_free(keydata); 113 } 114 115 static int rsa_has(const void *keydata, int selection) 116 { 117 const RSA *rsa = keydata; 118 int ok = 1; 119 120 if (rsa == NULL || !ossl_prov_is_running()) 121 return 0; 122 if ((selection & RSA_POSSIBLE_SELECTIONS) == 0) 123 return 1; /* the selection is not missing */ 124 125 /* OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS are always available even if empty */ 126 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) 127 ok = ok && (RSA_get0_n(rsa) != NULL); 128 if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) 129 ok = ok && (RSA_get0_e(rsa) != NULL); 130 if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) 131 ok = ok && (RSA_get0_d(rsa) != NULL); 132 return ok; 133 } 134 135 static int rsa_match(const void *keydata1, const void *keydata2, int selection) 136 { 137 const RSA *rsa1 = keydata1; 138 const RSA *rsa2 = keydata2; 139 int ok = 1; 140 141 if (!ossl_prov_is_running()) 142 return 0; 143 144 /* There is always an |e| */ 145 ok = ok && BN_cmp(RSA_get0_e(rsa1), RSA_get0_e(rsa2)) == 0; 146 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) { 147 int key_checked = 0; 148 149 if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) { 150 const BIGNUM *pa = RSA_get0_n(rsa1); 151 const BIGNUM *pb = RSA_get0_n(rsa2); 152 153 if (pa != NULL && pb != NULL) { 154 ok = ok && BN_cmp(pa, pb) == 0; 155 key_checked = 1; 156 } 157 } 158 if (!key_checked 159 && (selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) { 160 const BIGNUM *pa = RSA_get0_d(rsa1); 161 const BIGNUM *pb = RSA_get0_d(rsa2); 162 163 if (pa != NULL && pb != NULL) { 164 ok = ok && BN_cmp(pa, pb) == 0; 165 key_checked = 1; 166 } 167 } 168 ok = ok && key_checked; 169 } 170 return ok; 171 } 172 173 static int rsa_import(void *keydata, int selection, const OSSL_PARAM params[]) 174 { 175 RSA *rsa = keydata; 176 int rsa_type; 177 int ok = 1; 178 int pss_defaults_set = 0; 179 180 if (!ossl_prov_is_running() || rsa == NULL) 181 return 0; 182 183 if ((selection & RSA_POSSIBLE_SELECTIONS) == 0) 184 return 0; 185 186 rsa_type = RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK); 187 188 if ((selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) != 0) 189 ok = ok && pss_params_fromdata(ossl_rsa_get0_pss_params_30(rsa), &pss_defaults_set, params, rsa_type, ossl_rsa_get0_libctx(rsa)); 190 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) { 191 int include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0; 192 193 ok = ok && ossl_rsa_fromdata(rsa, params, include_private); 194 } 195 196 return ok; 197 } 198 199 static int rsa_export(void *keydata, int selection, 200 OSSL_CALLBACK *param_callback, void *cbarg) 201 { 202 RSA *rsa = keydata; 203 const RSA_PSS_PARAMS_30 *pss_params = ossl_rsa_get0_pss_params_30(rsa); 204 OSSL_PARAM_BLD *tmpl; 205 OSSL_PARAM *params = NULL; 206 int ok = 1; 207 208 if (!ossl_prov_is_running() || rsa == NULL) 209 return 0; 210 211 if ((selection & RSA_POSSIBLE_SELECTIONS) == 0) 212 return 0; 213 214 tmpl = OSSL_PARAM_BLD_new(); 215 if (tmpl == NULL) 216 return 0; 217 218 if ((selection & OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS) != 0) 219 ok = ok && (ossl_rsa_pss_params_30_is_unrestricted(pss_params) || ossl_rsa_pss_params_30_todata(pss_params, tmpl, NULL)); 220 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) { 221 int include_private = selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY ? 1 : 0; 222 223 ok = ok && ossl_rsa_todata(rsa, tmpl, NULL, include_private); 224 } 225 226 if (!ok || (params = OSSL_PARAM_BLD_to_param(tmpl)) == NULL) { 227 ok = 0; 228 goto err; 229 } 230 231 ok = param_callback(params, cbarg); 232 OSSL_PARAM_free(params); 233 err: 234 OSSL_PARAM_BLD_free(tmpl); 235 return ok; 236 } 237 238 #ifdef FIPS_MODULE 239 /* In fips mode there are no multi-primes. */ 240 #define RSA_KEY_MP_TYPES() \ 241 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR1, NULL, 0), \ 242 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR2, NULL, 0), \ 243 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT1, NULL, 0), \ 244 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT2, NULL, 0), \ 245 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT1, NULL, 0), 246 #else 247 /* 248 * We allow up to 10 prime factors (starting with p, q). 249 * NOTE: there is only 9 OSSL_PKEY_PARAM_RSA_COEFFICIENT 250 */ 251 #define RSA_KEY_MP_TYPES() \ 252 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR1, NULL, 0), \ 253 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR2, NULL, 0), \ 254 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR3, NULL, 0), \ 255 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR4, NULL, 0), \ 256 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR5, NULL, 0), \ 257 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR6, NULL, 0), \ 258 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR7, NULL, 0), \ 259 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR8, NULL, 0), \ 260 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR9, NULL, 0), \ 261 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_FACTOR10, NULL, 0), \ 262 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT1, NULL, 0), \ 263 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT2, NULL, 0), \ 264 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT3, NULL, 0), \ 265 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT4, NULL, 0), \ 266 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT5, NULL, 0), \ 267 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT6, NULL, 0), \ 268 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT7, NULL, 0), \ 269 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT8, NULL, 0), \ 270 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT9, NULL, 0), \ 271 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_EXPONENT10, NULL, 0), \ 272 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT1, NULL, 0), \ 273 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT2, NULL, 0), \ 274 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT3, NULL, 0), \ 275 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT4, NULL, 0), \ 276 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT5, NULL, 0), \ 277 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT6, NULL, 0), \ 278 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT7, NULL, 0), \ 279 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT8, NULL, 0), \ 280 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_COEFFICIENT9, NULL, 0), 281 #endif 282 283 #define RSA_KEY_TYPES() \ 284 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_N, NULL, 0), \ 285 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_E, NULL, 0), \ 286 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_D, NULL, 0), \ 287 RSA_KEY_MP_TYPES() 288 289 /* 290 * This provider can export everything in an RSA key, so we use the exact 291 * same type description for export as for import. Other providers might 292 * choose to import full keys, but only export the public parts, and will 293 * therefore have the importkey_types and importkey_types functions return 294 * different arrays. 295 */ 296 static const OSSL_PARAM rsa_key_types[] = { 297 RSA_KEY_TYPES() 298 OSSL_PARAM_END 299 }; 300 /* 301 * We lied about the amount of factors, exponents and coefficients, the 302 * export and import functions can really deal with an infinite amount 303 * of these numbers. However, RSA keys with too many primes are futile, 304 * so we at least pretend to have some limits. 305 */ 306 307 static const OSSL_PARAM *rsa_imexport_types(int selection) 308 { 309 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) 310 return rsa_key_types; 311 return NULL; 312 } 313 314 static const OSSL_PARAM *rsa_import_types(int selection) 315 { 316 return rsa_imexport_types(selection); 317 } 318 319 static const OSSL_PARAM *rsa_export_types(int selection) 320 { 321 return rsa_imexport_types(selection); 322 } 323 324 static int rsa_get_params(void *key, OSSL_PARAM params[]) 325 { 326 RSA *rsa = key; 327 const RSA_PSS_PARAMS_30 *pss_params = ossl_rsa_get0_pss_params_30(rsa); 328 int rsa_type = RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK); 329 OSSL_PARAM *p; 330 int empty = RSA_get0_n(rsa) == NULL; 331 332 if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_BITS)) != NULL 333 && (empty || !OSSL_PARAM_set_int(p, RSA_bits(rsa)))) 334 return 0; 335 if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_SECURITY_BITS)) != NULL 336 && (empty || !OSSL_PARAM_set_int(p, RSA_security_bits(rsa)))) 337 return 0; 338 if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_MAX_SIZE)) != NULL 339 && (empty || !OSSL_PARAM_set_int(p, RSA_size(rsa)))) 340 return 0; 341 342 /* 343 * For restricted RSA-PSS keys, we ignore the default digest request. 344 * With RSA-OAEP keys, this may need to be amended. 345 */ 346 if ((p = OSSL_PARAM_locate(params, OSSL_PKEY_PARAM_DEFAULT_DIGEST)) != NULL 347 && (rsa_type != RSA_FLAG_TYPE_RSASSAPSS 348 || ossl_rsa_pss_params_30_is_unrestricted(pss_params))) { 349 if (!OSSL_PARAM_set_utf8_string(p, RSA_DEFAULT_MD)) 350 return 0; 351 } 352 353 /* 354 * For non-RSA-PSS keys, we ignore the mandatory digest request. 355 * With RSA-OAEP keys, this may need to be amended. 356 */ 357 if ((p = OSSL_PARAM_locate(params, 358 OSSL_PKEY_PARAM_MANDATORY_DIGEST)) 359 != NULL 360 && rsa_type == RSA_FLAG_TYPE_RSASSAPSS 361 && !ossl_rsa_pss_params_30_is_unrestricted(pss_params)) { 362 const char *mdname = ossl_rsa_oaeppss_nid2name(ossl_rsa_pss_params_30_hashalg(pss_params)); 363 364 if (mdname == NULL || !OSSL_PARAM_set_utf8_string(p, mdname)) 365 return 0; 366 } 367 return (rsa_type != RSA_FLAG_TYPE_RSASSAPSS 368 || ossl_rsa_pss_params_30_todata(pss_params, NULL, params)) 369 && ossl_rsa_todata(rsa, NULL, params, 1); 370 } 371 372 static const OSSL_PARAM rsa_params[] = { 373 OSSL_PARAM_int(OSSL_PKEY_PARAM_BITS, NULL), 374 OSSL_PARAM_int(OSSL_PKEY_PARAM_SECURITY_BITS, NULL), 375 OSSL_PARAM_int(OSSL_PKEY_PARAM_MAX_SIZE, NULL), 376 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_DEFAULT_DIGEST, NULL, 0), 377 RSA_KEY_TYPES() 378 OSSL_PARAM_END 379 }; 380 381 static const OSSL_PARAM *rsa_gettable_params(void *provctx) 382 { 383 return rsa_params; 384 } 385 386 static int rsa_validate(const void *keydata, int selection, int checktype) 387 { 388 const RSA *rsa = keydata; 389 int ok = 1; 390 391 if (!ossl_prov_is_running()) 392 return 0; 393 394 if ((selection & RSA_POSSIBLE_SELECTIONS) == 0) 395 return 1; /* nothing to validate */ 396 397 /* If the whole key is selected, we do a pairwise validation */ 398 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) 399 == OSSL_KEYMGMT_SELECT_KEYPAIR) { 400 ok = ok && ossl_rsa_validate_pairwise(rsa); 401 } else { 402 if ((selection & OSSL_KEYMGMT_SELECT_PRIVATE_KEY) != 0) 403 ok = ok && ossl_rsa_validate_private(rsa); 404 if ((selection & OSSL_KEYMGMT_SELECT_PUBLIC_KEY) != 0) 405 ok = ok && ossl_rsa_validate_public(rsa); 406 } 407 return ok; 408 } 409 410 struct rsa_gen_ctx { 411 OSSL_LIB_CTX *libctx; 412 const char *propq; 413 414 int rsa_type; 415 416 size_t nbits; 417 BIGNUM *pub_exp; 418 size_t primes; 419 420 /* For PSS */ 421 RSA_PSS_PARAMS_30 pss_params; 422 int pss_defaults_set; 423 424 /* For generation callback */ 425 OSSL_CALLBACK *cb; 426 void *cbarg; 427 428 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 429 /* ACVP test parameters */ 430 OSSL_PARAM *acvp_test_params; 431 #endif 432 }; 433 434 static int rsa_gencb(int p, int n, BN_GENCB *cb) 435 { 436 struct rsa_gen_ctx *gctx = BN_GENCB_get_arg(cb); 437 OSSL_PARAM params[] = { OSSL_PARAM_END, OSSL_PARAM_END, OSSL_PARAM_END }; 438 439 params[0] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_POTENTIAL, &p); 440 params[1] = OSSL_PARAM_construct_int(OSSL_GEN_PARAM_ITERATION, &n); 441 return gctx->cb(params, gctx->cbarg); 442 } 443 444 static void *gen_init(void *provctx, int selection, int rsa_type, 445 const OSSL_PARAM params[]) 446 { 447 OSSL_LIB_CTX *libctx = PROV_LIBCTX_OF(provctx); 448 struct rsa_gen_ctx *gctx = NULL; 449 450 if (!ossl_prov_is_running()) 451 return NULL; 452 453 if ((selection & OSSL_KEYMGMT_SELECT_KEYPAIR) == 0) 454 return NULL; 455 456 if ((gctx = OPENSSL_zalloc(sizeof(*gctx))) != NULL) { 457 gctx->libctx = libctx; 458 if ((gctx->pub_exp = BN_new()) == NULL 459 || !BN_set_word(gctx->pub_exp, RSA_F4)) { 460 goto err; 461 } 462 gctx->nbits = 2048; 463 gctx->primes = RSA_DEFAULT_PRIME_NUM; 464 gctx->rsa_type = rsa_type; 465 } else { 466 goto err; 467 } 468 469 if (!rsa_gen_set_params(gctx, params)) 470 goto err; 471 return gctx; 472 473 err: 474 if (gctx != NULL) 475 BN_free(gctx->pub_exp); 476 OPENSSL_free(gctx); 477 return NULL; 478 } 479 480 static void *rsa_gen_init(void *provctx, int selection, 481 const OSSL_PARAM params[]) 482 { 483 return gen_init(provctx, selection, RSA_FLAG_TYPE_RSA, params); 484 } 485 486 static void *rsapss_gen_init(void *provctx, int selection, 487 const OSSL_PARAM params[]) 488 { 489 return gen_init(provctx, selection, RSA_FLAG_TYPE_RSASSAPSS, params); 490 } 491 492 /* 493 * This function is common for all RSA sub-types, to detect possible 494 * misuse, such as PSS parameters being passed when a plain RSA key 495 * is generated. 496 */ 497 static int rsa_gen_set_params(void *genctx, const OSSL_PARAM params[]) 498 { 499 struct rsa_gen_ctx *gctx = genctx; 500 const OSSL_PARAM *p; 501 502 if (ossl_param_is_empty(params)) 503 return 1; 504 505 if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_BITS)) != NULL) { 506 if (!OSSL_PARAM_get_size_t(p, &gctx->nbits)) 507 return 0; 508 if (gctx->nbits < RSA_MIN_MODULUS_BITS) { 509 ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SIZE_TOO_SMALL); 510 return 0; 511 } 512 } 513 if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_PRIMES)) != NULL 514 && !OSSL_PARAM_get_size_t(p, &gctx->primes)) 515 return 0; 516 if ((p = OSSL_PARAM_locate_const(params, OSSL_PKEY_PARAM_RSA_E)) != NULL 517 && !OSSL_PARAM_get_BN(p, &gctx->pub_exp)) 518 return 0; 519 /* Only attempt to get PSS parameters when generating an RSA-PSS key */ 520 if (gctx->rsa_type == RSA_FLAG_TYPE_RSASSAPSS 521 && !pss_params_fromdata(&gctx->pss_params, &gctx->pss_defaults_set, params, 522 gctx->rsa_type, gctx->libctx)) 523 return 0; 524 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 525 /* Any ACVP test related parameters are copied into a params[] */ 526 if (!ossl_rsa_acvp_test_gen_params_new(&gctx->acvp_test_params, params)) 527 return 0; 528 #endif 529 return 1; 530 } 531 532 #define rsa_gen_basic \ 533 OSSL_PARAM_size_t(OSSL_PKEY_PARAM_RSA_BITS, NULL), \ 534 OSSL_PARAM_size_t(OSSL_PKEY_PARAM_RSA_PRIMES, NULL), \ 535 OSSL_PARAM_BN(OSSL_PKEY_PARAM_RSA_E, NULL, 0) 536 537 /* 538 * The following must be kept in sync with ossl_rsa_pss_params_30_fromdata() 539 * in crypto/rsa/rsa_backend.c 540 */ 541 #define rsa_gen_pss \ 542 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_RSA_DIGEST, NULL, 0), \ 543 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_RSA_DIGEST_PROPS, NULL, 0), \ 544 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_RSA_MASKGENFUNC, NULL, 0), \ 545 OSSL_PARAM_utf8_string(OSSL_PKEY_PARAM_RSA_MGF1_DIGEST, NULL, 0), \ 546 OSSL_PARAM_int(OSSL_PKEY_PARAM_RSA_PSS_SALTLEN, NULL) 547 548 static const OSSL_PARAM *rsa_gen_settable_params(ossl_unused void *genctx, 549 ossl_unused void *provctx) 550 { 551 static OSSL_PARAM settable[] = { 552 rsa_gen_basic, 553 OSSL_PARAM_END 554 }; 555 556 return settable; 557 } 558 559 static const OSSL_PARAM *rsapss_gen_settable_params(ossl_unused void *genctx, 560 ossl_unused void *provctx) 561 { 562 static OSSL_PARAM settable[] = { 563 rsa_gen_basic, 564 rsa_gen_pss, 565 OSSL_PARAM_END 566 }; 567 568 return settable; 569 } 570 571 static void *rsa_gen(void *genctx, OSSL_CALLBACK *osslcb, void *cbarg) 572 { 573 struct rsa_gen_ctx *gctx = genctx; 574 RSA *rsa = NULL, *rsa_tmp = NULL; 575 BN_GENCB *gencb = NULL; 576 577 if (!ossl_prov_is_running() || gctx == NULL) 578 return NULL; 579 580 switch (gctx->rsa_type) { 581 case RSA_FLAG_TYPE_RSA: 582 /* For plain RSA keys, PSS parameters must not be set */ 583 if (!ossl_rsa_pss_params_30_is_unrestricted(&gctx->pss_params)) 584 goto err; 585 break; 586 case RSA_FLAG_TYPE_RSASSAPSS: 587 /* 588 * For plain RSA-PSS keys, PSS parameters may be set but don't have 589 * to, so not check. 590 */ 591 break; 592 default: 593 /* Unsupported RSA key sub-type... */ 594 return NULL; 595 } 596 597 if ((rsa_tmp = ossl_rsa_new_with_ctx(gctx->libctx)) == NULL) 598 return NULL; 599 600 gctx->cb = osslcb; 601 gctx->cbarg = cbarg; 602 gencb = BN_GENCB_new(); 603 if (gencb != NULL) 604 BN_GENCB_set(gencb, rsa_gencb, genctx); 605 606 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 607 if (gctx->acvp_test_params != NULL) { 608 if (!ossl_rsa_acvp_test_set_params(rsa_tmp, gctx->acvp_test_params)) 609 goto err; 610 } 611 #endif 612 613 if (!RSA_generate_multi_prime_key(rsa_tmp, 614 (int)gctx->nbits, (int)gctx->primes, 615 gctx->pub_exp, gencb)) 616 goto err; 617 618 if (!ossl_rsa_pss_params_30_copy(ossl_rsa_get0_pss_params_30(rsa_tmp), 619 &gctx->pss_params)) 620 goto err; 621 622 RSA_clear_flags(rsa_tmp, RSA_FLAG_TYPE_MASK); 623 RSA_set_flags(rsa_tmp, gctx->rsa_type); 624 625 rsa = rsa_tmp; 626 rsa_tmp = NULL; 627 err: 628 BN_GENCB_free(gencb); 629 RSA_free(rsa_tmp); 630 return rsa; 631 } 632 633 static void rsa_gen_cleanup(void *genctx) 634 { 635 struct rsa_gen_ctx *gctx = genctx; 636 637 if (gctx == NULL) 638 return; 639 #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) 640 ossl_rsa_acvp_test_gen_params_free(gctx->acvp_test_params); 641 gctx->acvp_test_params = NULL; 642 #endif 643 BN_clear_free(gctx->pub_exp); 644 OPENSSL_free(gctx); 645 } 646 647 static void *common_load(const void *reference, size_t reference_sz, 648 int expected_rsa_type) 649 { 650 RSA *rsa = NULL; 651 652 if (ossl_prov_is_running() && reference_sz == sizeof(rsa)) { 653 /* The contents of the reference is the address to our object */ 654 rsa = *(RSA **)reference; 655 656 if (RSA_test_flags(rsa, RSA_FLAG_TYPE_MASK) != expected_rsa_type) 657 return NULL; 658 659 /* We grabbed, so we detach it */ 660 *(RSA **)reference = NULL; 661 return rsa; 662 } 663 return NULL; 664 } 665 666 static void *rsa_load(const void *reference, size_t reference_sz) 667 { 668 return common_load(reference, reference_sz, RSA_FLAG_TYPE_RSA); 669 } 670 671 static void *rsapss_load(const void *reference, size_t reference_sz) 672 { 673 return common_load(reference, reference_sz, RSA_FLAG_TYPE_RSASSAPSS); 674 } 675 676 static void *rsa_dup(const void *keydata_from, int selection) 677 { 678 if (ossl_prov_is_running() 679 /* do not allow creating empty keys by duplication */ 680 && (selection & OSSL_KEYMGMT_SELECT_KEYPAIR) != 0) 681 return ossl_rsa_dup(keydata_from, selection); 682 return NULL; 683 } 684 685 /* For any RSA key, we use the "RSA" algorithms regardless of sub-type. */ 686 static const char *rsa_query_operation_name(int operation_id) 687 { 688 return "RSA"; 689 } 690 691 const OSSL_DISPATCH ossl_rsa_keymgmt_functions[] = { 692 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))rsa_newdata }, 693 { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))rsa_gen_init }, 694 { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS, 695 (void (*)(void))rsa_gen_set_params }, 696 { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS, 697 (void (*)(void))rsa_gen_settable_params }, 698 { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))rsa_gen }, 699 { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))rsa_gen_cleanup }, 700 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))rsa_load }, 701 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))rsa_freedata }, 702 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))rsa_get_params }, 703 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))rsa_gettable_params }, 704 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))rsa_has }, 705 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))rsa_match }, 706 { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))rsa_validate }, 707 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_import }, 708 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))rsa_import_types }, 709 { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))rsa_export }, 710 { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))rsa_export_types }, 711 { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))rsa_dup }, 712 OSSL_DISPATCH_END 713 }; 714 715 const OSSL_DISPATCH ossl_rsapss_keymgmt_functions[] = { 716 { OSSL_FUNC_KEYMGMT_NEW, (void (*)(void))rsapss_newdata }, 717 { OSSL_FUNC_KEYMGMT_GEN_INIT, (void (*)(void))rsapss_gen_init }, 718 { OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS, (void (*)(void))rsa_gen_set_params }, 719 { OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS, 720 (void (*)(void))rsapss_gen_settable_params }, 721 { OSSL_FUNC_KEYMGMT_GEN, (void (*)(void))rsa_gen }, 722 { OSSL_FUNC_KEYMGMT_GEN_CLEANUP, (void (*)(void))rsa_gen_cleanup }, 723 { OSSL_FUNC_KEYMGMT_LOAD, (void (*)(void))rsapss_load }, 724 { OSSL_FUNC_KEYMGMT_FREE, (void (*)(void))rsa_freedata }, 725 { OSSL_FUNC_KEYMGMT_GET_PARAMS, (void (*)(void))rsa_get_params }, 726 { OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS, (void (*)(void))rsa_gettable_params }, 727 { OSSL_FUNC_KEYMGMT_HAS, (void (*)(void))rsa_has }, 728 { OSSL_FUNC_KEYMGMT_MATCH, (void (*)(void))rsa_match }, 729 { OSSL_FUNC_KEYMGMT_VALIDATE, (void (*)(void))rsa_validate }, 730 { OSSL_FUNC_KEYMGMT_IMPORT, (void (*)(void))rsa_import }, 731 { OSSL_FUNC_KEYMGMT_IMPORT_TYPES, (void (*)(void))rsa_import_types }, 732 { OSSL_FUNC_KEYMGMT_EXPORT, (void (*)(void))rsa_export }, 733 { OSSL_FUNC_KEYMGMT_EXPORT_TYPES, (void (*)(void))rsa_export_types }, 734 { OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME, 735 (void (*)(void))rsa_query_operation_name }, 736 { OSSL_FUNC_KEYMGMT_DUP, (void (*)(void))rsa_dup }, 737 OSSL_DISPATCH_END 738 }; 739