xref: /freebsd/crypto/openssl/crypto/rsa/rsa_gen.c (revision e7be843b4a162e68651d3911f0357ed464915629)
1 /*
2  * Copyright 1995-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  * NB: these functions have been "upgraded", the deprecated versions (which
12  * are compatibility wrappers using these functions) are in rsa_depr.c. -
13  * Geoff
14  */
15 
16 /*
17  * RSA low level APIs are deprecated for public use, but still ok for
18  * internal use.
19  */
20 #include "internal/deprecated.h"
21 
22 #include <stdio.h>
23 #include <time.h>
24 #include "internal/cryptlib.h"
25 #include <openssl/bn.h>
26 #include <openssl/self_test.h>
27 #include "prov/providercommon.h"
28 #include "rsa_local.h"
29 
30 static int rsa_keygen_pairwise_test(RSA *rsa, OSSL_CALLBACK *cb, void *cbarg);
31 static int rsa_keygen(OSSL_LIB_CTX *libctx, RSA *rsa, int bits, int primes,
32                       BIGNUM *e_value, BN_GENCB *cb, int pairwise_test);
33 
34 /*
35  * NB: this wrapper would normally be placed in rsa_lib.c and the static
36  * implementation would probably be in rsa_eay.c. Nonetheless, is kept here
37  * so that we don't introduce a new linker dependency. Eg. any application
38  * that wasn't previously linking object code related to key-generation won't
39  * have to now just because key-generation is part of RSA_METHOD.
40  */
RSA_generate_key_ex(RSA * rsa,int bits,BIGNUM * e_value,BN_GENCB * cb)41 int RSA_generate_key_ex(RSA *rsa, int bits, BIGNUM *e_value, BN_GENCB *cb)
42 {
43     if (rsa->meth->rsa_keygen != NULL)
44         return rsa->meth->rsa_keygen(rsa, bits, e_value, cb);
45 
46     return RSA_generate_multi_prime_key(rsa, bits, RSA_DEFAULT_PRIME_NUM,
47                                         e_value, cb);
48 }
49 
RSA_generate_multi_prime_key(RSA * rsa,int bits,int primes,BIGNUM * e_value,BN_GENCB * cb)50 int RSA_generate_multi_prime_key(RSA *rsa, int bits, int primes,
51                                  BIGNUM *e_value, BN_GENCB *cb)
52 {
53 #ifndef FIPS_MODULE
54     /* multi-prime is only supported with the builtin key generation */
55     if (rsa->meth->rsa_multi_prime_keygen != NULL) {
56         return rsa->meth->rsa_multi_prime_keygen(rsa, bits, primes,
57                                                  e_value, cb);
58     } else if (rsa->meth->rsa_keygen != NULL) {
59         /*
60          * However, if rsa->meth implements only rsa_keygen, then we
61          * have to honour it in 2-prime case and assume that it wouldn't
62          * know what to do with multi-prime key generated by builtin
63          * subroutine...
64          */
65         if (primes == 2)
66             return rsa->meth->rsa_keygen(rsa, bits, e_value, cb);
67         else
68             return 0;
69     }
70 #endif /* FIPS_MODULE */
71     return rsa_keygen(rsa->libctx, rsa, bits, primes, e_value, cb, 0);
72 }
73 
DEFINE_STACK_OF(BIGNUM)74 DEFINE_STACK_OF(BIGNUM)
75 
76 /*
77  * Given input values, q, p, n, d and e, derive the exponents
78  * and coefficients for each prime in this key, placing the result
79  * on their respective exps and coeffs stacks
80  */
81 #ifndef FIPS_MODULE
82 int ossl_rsa_multiprime_derive(RSA *rsa, int bits, int primes,
83                                BIGNUM *e_value,
84                                STACK_OF(BIGNUM) *factors,
85                                STACK_OF(BIGNUM) *exps,
86                                STACK_OF(BIGNUM) *coeffs)
87 {
88     STACK_OF(BIGNUM) *pplist = NULL, *pdlist = NULL;
89     BIGNUM *factor = NULL, *newpp = NULL, *newpd = NULL;
90     BIGNUM *dval = NULL, *newexp = NULL, *newcoeff = NULL;
91     BIGNUM *p = NULL, *q = NULL;
92     BIGNUM *dmp1 = NULL, *dmq1 = NULL, *iqmp = NULL;
93     BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL;
94     BN_CTX *ctx = NULL;
95     BIGNUM *tmp = NULL;
96     int i;
97     int ret = 0;
98 
99     ctx = BN_CTX_new_ex(rsa->libctx);
100     if (ctx == NULL)
101         goto err;
102 
103     BN_CTX_start(ctx);
104 
105     pplist = sk_BIGNUM_new_null();
106     if (pplist == NULL)
107         goto err;
108 
109     pdlist = sk_BIGNUM_new_null();
110     if (pdlist == NULL)
111         goto err;
112 
113     r0 = BN_CTX_get(ctx);
114     r1 = BN_CTX_get(ctx);
115     r2 = BN_CTX_get(ctx);
116 
117     if (r2 == NULL)
118         goto err;
119 
120     BN_set_flags(r0, BN_FLG_CONSTTIME);
121     BN_set_flags(r1, BN_FLG_CONSTTIME);
122     BN_set_flags(r2, BN_FLG_CONSTTIME);
123 
124     if (BN_copy(r1, rsa->n) == NULL)
125         goto err;
126 
127     p = sk_BIGNUM_value(factors, 0);
128     q = sk_BIGNUM_value(factors, 1);
129 
130     /* Build list of partial products of primes */
131     for (i = 0; i < sk_BIGNUM_num(factors); i++) {
132         switch (i) {
133         case 0:
134             /* our first prime, p */
135             if (!BN_sub(r2, p, BN_value_one()))
136                 goto err;
137             BN_set_flags(r2, BN_FLG_CONSTTIME);
138             if (BN_mod_inverse(r1, r2, rsa->e, ctx) == NULL)
139                 goto err;
140             break;
141         case 1:
142             /* second prime q */
143             if (!BN_mul(r1, p, q, ctx))
144                 goto err;
145             tmp = BN_dup(r1);
146             if (tmp == NULL)
147                 goto err;
148             if (!sk_BIGNUM_insert(pplist, tmp, sk_BIGNUM_num(pplist)))
149                 goto err;
150             tmp = NULL;
151             break;
152         default:
153             factor = sk_BIGNUM_value(factors, i);
154             /* all other primes */
155             if (!BN_mul(r1, r1, factor, ctx))
156                 goto err;
157             tmp = BN_dup(r1);
158             if (tmp == NULL)
159                 goto err;
160             if (!sk_BIGNUM_insert(pplist, tmp, sk_BIGNUM_num(pplist)))
161                 goto err;
162             tmp = NULL;
163             break;
164         }
165     }
166 
167     /* build list of relative d values */
168     /* p -1 */
169     if (!BN_sub(r1, p, BN_value_one()))
170         goto err;
171     if (!BN_sub(r2, q, BN_value_one()))
172         goto err;
173     if (!BN_mul(r0, r1, r2, ctx))
174         goto err;
175     for (i = 2; i < sk_BIGNUM_num(factors); i++) {
176         factor = sk_BIGNUM_value(factors, i);
177         dval = BN_new();
178         if (dval == NULL)
179             goto err;
180         BN_set_flags(dval, BN_FLG_CONSTTIME);
181         if (!BN_sub(dval, factor, BN_value_one()))
182             goto err;
183         if (!BN_mul(r0, r0, dval, ctx))
184             goto err;
185         if (!sk_BIGNUM_insert(pdlist, dval, sk_BIGNUM_num(pdlist)))
186             goto err;
187         dval = NULL;
188     }
189 
190     /* Calculate dmp1, dmq1 and additional exponents */
191     dmp1 = BN_secure_new();
192     if (dmp1 == NULL)
193         goto err;
194     dmq1 = BN_secure_new();
195     if (dmq1 == NULL)
196         goto err;
197 
198     if (!BN_mod(dmp1, rsa->d, r1, ctx))
199         goto err;
200     if (!sk_BIGNUM_insert(exps, dmp1, sk_BIGNUM_num(exps)))
201         goto err;
202     dmp1 = NULL;
203 
204     if (!BN_mod(dmq1, rsa->d, r2, ctx))
205         goto err;
206     if (!sk_BIGNUM_insert(exps, dmq1, sk_BIGNUM_num(exps)))
207         goto err;
208     dmq1 = NULL;
209 
210     for (i = 2; i < sk_BIGNUM_num(factors); i++) {
211         newpd = sk_BIGNUM_value(pdlist, i - 2);
212         newexp = BN_new();
213         if (newexp == NULL)
214             goto err;
215         if (!BN_mod(newexp, rsa->d, newpd, ctx))
216             goto err;
217         if (!sk_BIGNUM_insert(exps, newexp, sk_BIGNUM_num(exps)))
218             goto err;
219         newexp = NULL;
220     }
221 
222     /* Calculate iqmp and additional coefficients */
223     iqmp = BN_new();
224     if (iqmp == NULL)
225         goto err;
226 
227     if (BN_mod_inverse(iqmp, sk_BIGNUM_value(factors, 1),
228                        sk_BIGNUM_value(factors, 0), ctx) == NULL)
229         goto err;
230     if (!sk_BIGNUM_insert(coeffs, iqmp, sk_BIGNUM_num(coeffs)))
231         goto err;
232     iqmp = NULL;
233 
234     for (i = 2; i < sk_BIGNUM_num(factors); i++) {
235         newpp = sk_BIGNUM_value(pplist, i - 2);
236         newcoeff = BN_new();
237         if (newcoeff == NULL)
238             goto err;
239         if (BN_mod_inverse(newcoeff, newpp, sk_BIGNUM_value(factors, i),
240                            ctx) == NULL)
241             goto err;
242         if (!sk_BIGNUM_insert(coeffs, newcoeff, sk_BIGNUM_num(coeffs)))
243             goto err;
244         newcoeff = NULL;
245     }
246 
247     ret = 1;
248  err:
249     BN_free(newcoeff);
250     BN_free(newexp);
251     BN_free(dval);
252     BN_free(tmp);
253     sk_BIGNUM_pop_free(pplist, BN_free);
254     sk_BIGNUM_pop_free(pdlist, BN_free);
255     BN_CTX_end(ctx);
256     BN_CTX_free(ctx);
257     BN_clear_free(dmp1);
258     BN_clear_free(dmq1);
259     BN_clear_free(iqmp);
260     return ret;
261 }
262 
rsa_multiprime_keygen(RSA * rsa,int bits,int primes,BIGNUM * e_value,BN_GENCB * cb)263 static int rsa_multiprime_keygen(RSA *rsa, int bits, int primes,
264                                  BIGNUM *e_value, BN_GENCB *cb)
265 {
266     BIGNUM *r0 = NULL, *r1 = NULL, *r2 = NULL, *tmp, *tmp2, *prime;
267     int n = 0, bitsr[RSA_MAX_PRIME_NUM], bitse = 0;
268     int i = 0, quo = 0, rmd = 0, adj = 0, retries = 0;
269     RSA_PRIME_INFO *pinfo = NULL;
270     STACK_OF(RSA_PRIME_INFO) *prime_infos = NULL;
271     STACK_OF(BIGNUM) *factors = NULL;
272     STACK_OF(BIGNUM) *exps = NULL;
273     STACK_OF(BIGNUM) *coeffs = NULL;
274     BN_CTX *ctx = NULL;
275     BN_ULONG bitst = 0;
276     unsigned long error = 0;
277     int ok = -1;
278 
279     if (bits < RSA_MIN_MODULUS_BITS) {
280         ERR_raise(ERR_LIB_RSA, RSA_R_KEY_SIZE_TOO_SMALL);
281         return 0;
282     }
283     if (e_value == NULL) {
284         ERR_raise(ERR_LIB_RSA, RSA_R_BAD_E_VALUE);
285         return 0;
286     }
287     /* A bad value for e can cause infinite loops */
288     if (!ossl_rsa_check_public_exponent(e_value)) {
289         ERR_raise(ERR_LIB_RSA, RSA_R_PUB_EXPONENT_OUT_OF_RANGE);
290         return 0;
291     }
292 
293     if (primes < RSA_DEFAULT_PRIME_NUM || primes > ossl_rsa_multip_cap(bits)) {
294         ERR_raise(ERR_LIB_RSA, RSA_R_KEY_PRIME_NUM_INVALID);
295         return 0;
296     }
297 
298     factors = sk_BIGNUM_new_null();
299     if (factors == NULL)
300         return 0;
301 
302     exps = sk_BIGNUM_new_null();
303     if (exps == NULL)
304         goto err;
305 
306     coeffs = sk_BIGNUM_new_null();
307     if (coeffs == NULL)
308         goto err;
309 
310     ctx = BN_CTX_new_ex(rsa->libctx);
311     if (ctx == NULL)
312         goto err;
313     BN_CTX_start(ctx);
314     r0 = BN_CTX_get(ctx);
315     r1 = BN_CTX_get(ctx);
316     r2 = BN_CTX_get(ctx);
317     if (r2 == NULL)
318         goto err;
319 
320     /* divide bits into 'primes' pieces evenly */
321     quo = bits / primes;
322     rmd = bits % primes;
323 
324     for (i = 0; i < primes; i++)
325         bitsr[i] = (i < rmd) ? quo + 1 : quo;
326 
327     rsa->dirty_cnt++;
328 
329     /* We need the RSA components non-NULL */
330     if (!rsa->n && ((rsa->n = BN_new()) == NULL))
331         goto err;
332     if (!rsa->d && ((rsa->d = BN_secure_new()) == NULL))
333         goto err;
334     BN_set_flags(rsa->d, BN_FLG_CONSTTIME);
335     if (!rsa->e && ((rsa->e = BN_new()) == NULL))
336         goto err;
337     if (!rsa->p && ((rsa->p = BN_secure_new()) == NULL))
338         goto err;
339     BN_set_flags(rsa->p, BN_FLG_CONSTTIME);
340     if (!rsa->q && ((rsa->q = BN_secure_new()) == NULL))
341         goto err;
342     BN_set_flags(rsa->q, BN_FLG_CONSTTIME);
343 
344     /* initialize multi-prime components */
345     if (primes > RSA_DEFAULT_PRIME_NUM) {
346         rsa->version = RSA_ASN1_VERSION_MULTI;
347         prime_infos = sk_RSA_PRIME_INFO_new_reserve(NULL, primes - 2);
348         if (prime_infos == NULL)
349             goto err;
350         if (rsa->prime_infos != NULL) {
351             /* could this happen? */
352             sk_RSA_PRIME_INFO_pop_free(rsa->prime_infos,
353                                        ossl_rsa_multip_info_free);
354         }
355         rsa->prime_infos = prime_infos;
356 
357         /* prime_info from 2 to |primes| -1 */
358         for (i = 2; i < primes; i++) {
359             pinfo = ossl_rsa_multip_info_new();
360             if (pinfo == NULL)
361                 goto err;
362             (void)sk_RSA_PRIME_INFO_push(prime_infos, pinfo);
363         }
364     }
365 
366     if (BN_copy(rsa->e, e_value) == NULL)
367         goto err;
368 
369     /* generate p, q and other primes (if any) */
370     for (i = 0; i < primes; i++) {
371         adj = 0;
372         retries = 0;
373 
374         if (i == 0) {
375             prime = rsa->p;
376         } else if (i == 1) {
377             prime = rsa->q;
378         } else {
379             pinfo = sk_RSA_PRIME_INFO_value(prime_infos, i - 2);
380             prime = pinfo->r;
381         }
382         BN_set_flags(prime, BN_FLG_CONSTTIME);
383 
384         for (;;) {
385  redo:
386             if (!BN_generate_prime_ex2(prime, bitsr[i] + adj, 0, NULL, NULL,
387                                        cb, ctx))
388                 goto err;
389             /*
390              * prime should not be equal to p, q, r_3...
391              * (those primes prior to this one)
392              */
393             {
394                 int j;
395 
396                 for (j = 0; j < i; j++) {
397                     BIGNUM *prev_prime;
398 
399                     if (j == 0)
400                         prev_prime = rsa->p;
401                     else if (j == 1)
402                         prev_prime = rsa->q;
403                     else
404                         prev_prime = sk_RSA_PRIME_INFO_value(prime_infos,
405                                                              j - 2)->r;
406 
407                     if (!BN_cmp(prime, prev_prime)) {
408                         goto redo;
409                     }
410                 }
411             }
412             if (!BN_sub(r2, prime, BN_value_one()))
413                 goto err;
414             ERR_set_mark();
415             BN_set_flags(r2, BN_FLG_CONSTTIME);
416             if (BN_mod_inverse(r1, r2, rsa->e, ctx) != NULL) {
417                 /* GCD == 1 since inverse exists */
418                 break;
419             }
420             error = ERR_peek_last_error();
421             if (ERR_GET_LIB(error) == ERR_LIB_BN
422                 && ERR_GET_REASON(error) == BN_R_NO_INVERSE) {
423                 /* GCD != 1 */
424                 ERR_pop_to_mark();
425             } else {
426                 goto err;
427             }
428             if (!BN_GENCB_call(cb, 2, n++))
429                 goto err;
430         }
431 
432         bitse += bitsr[i];
433 
434         /* calculate n immediately to see if it's sufficient */
435         if (i == 1) {
436             /* we get at least 2 primes */
437             if (!BN_mul(r1, rsa->p, rsa->q, ctx))
438                 goto err;
439         } else if (i != 0) {
440             /* modulus n = p * q * r_3 * r_4 ... */
441             if (!BN_mul(r1, rsa->n, prime, ctx))
442                 goto err;
443         } else {
444             /* i == 0, do nothing */
445             if (!BN_GENCB_call(cb, 3, i))
446                 goto err;
447             tmp = BN_dup(prime);
448             if (tmp == NULL)
449                 goto err;
450             if (!sk_BIGNUM_insert(factors, tmp, sk_BIGNUM_num(factors)))
451                 goto err;
452             continue;
453         }
454 
455         /*
456          * if |r1|, product of factors so far, is not as long as expected
457          * (by checking the first 4 bits are less than 0x9 or greater than
458          * 0xF). If so, re-generate the last prime.
459          *
460          * NOTE: This actually can't happen in two-prime case, because of
461          * the way factors are generated.
462          *
463          * Besides, another consideration is, for multi-prime case, even the
464          * length modulus is as long as expected, the modulus could start at
465          * 0x8, which could be utilized to distinguish a multi-prime private
466          * key by using the modulus in a certificate. This is also covered
467          * by checking the length should not be less than 0x9.
468          */
469         if (!BN_rshift(r2, r1, bitse - 4))
470             goto err;
471         bitst = BN_get_word(r2);
472 
473         if (bitst < 0x9 || bitst > 0xF) {
474             /*
475              * For keys with more than 4 primes, we attempt longer factor to
476              * meet length requirement.
477              *
478              * Otherwise, we just re-generate the prime with the same length.
479              *
480              * This strategy has the following goals:
481              *
482              * 1. 1024-bit factors are efficient when using 3072 and 4096-bit key
483              * 2. stay the same logic with normal 2-prime key
484              */
485             bitse -= bitsr[i];
486             if (!BN_GENCB_call(cb, 2, n++))
487                 goto err;
488             if (primes > 4) {
489                 if (bitst < 0x9)
490                     adj++;
491                 else
492                     adj--;
493             } else if (retries == 4) {
494                 /*
495                  * re-generate all primes from scratch, mainly used
496                  * in 4 prime case to avoid long loop. Max retry times
497                  * is set to 4.
498                  */
499                 i = -1;
500                 bitse = 0;
501                 sk_BIGNUM_pop_free(factors, BN_clear_free);
502                 factors = sk_BIGNUM_new_null();
503                 if (factors == NULL)
504                     goto err;
505                 continue;
506             }
507             retries++;
508             goto redo;
509         }
510         /* save product of primes for further use, for multi-prime only */
511         if (i > 1 && BN_copy(pinfo->pp, rsa->n) == NULL)
512             goto err;
513         if (BN_copy(rsa->n, r1) == NULL)
514             goto err;
515         if (!BN_GENCB_call(cb, 3, i))
516             goto err;
517         tmp = BN_dup(prime);
518         if (tmp == NULL)
519             goto err;
520         if (!sk_BIGNUM_insert(factors, tmp, sk_BIGNUM_num(factors)))
521             goto err;
522     }
523 
524     if (BN_cmp(rsa->p, rsa->q) < 0) {
525         tmp = rsa->p;
526         rsa->p = rsa->q;
527         rsa->q = tmp;
528         /* mirror this in our factor stack */
529         if (!sk_BIGNUM_insert(factors, sk_BIGNUM_delete(factors, 0), 1))
530             goto err;
531     }
532 
533     /* calculate d */
534 
535     /* p - 1 */
536     if (!BN_sub(r1, rsa->p, BN_value_one()))
537         goto err;
538     /* q - 1 */
539     if (!BN_sub(r2, rsa->q, BN_value_one()))
540         goto err;
541     /* (p - 1)(q - 1) */
542     if (!BN_mul(r0, r1, r2, ctx))
543         goto err;
544     /* multi-prime */
545     for (i = 2; i < primes; i++) {
546         pinfo = sk_RSA_PRIME_INFO_value(prime_infos, i - 2);
547         /* save r_i - 1 to pinfo->d temporarily */
548         if (!BN_sub(pinfo->d, pinfo->r, BN_value_one()))
549             goto err;
550         if (!BN_mul(r0, r0, pinfo->d, ctx))
551             goto err;
552     }
553 
554 
555     BN_set_flags(r0, BN_FLG_CONSTTIME);
556     if (BN_mod_inverse(rsa->d, rsa->e, r0, ctx) == NULL) {
557         goto err;               /* d */
558     }
559 
560     /* derive any missing exponents and coefficients */
561     if (!ossl_rsa_multiprime_derive(rsa, bits, primes, e_value,
562                                     factors, exps, coeffs))
563         goto err;
564 
565     /*
566      * first 2 factors/exps are already tracked in p/q/dmq1/dmp1
567      * and the first coeff is in iqmp, so pop those off the stack
568      * Note, the first 2 factors/exponents are already tracked by p and q
569      * assign dmp1/dmq1 and iqmp
570      * the remaining pinfo values are separately allocated, so copy and delete
571      * those
572      */
573     BN_clear_free(sk_BIGNUM_delete(factors, 0));
574     BN_clear_free(sk_BIGNUM_delete(factors, 0));
575     rsa->dmp1 = sk_BIGNUM_delete(exps, 0);
576     rsa->dmq1 = sk_BIGNUM_delete(exps, 0);
577     rsa->iqmp = sk_BIGNUM_delete(coeffs, 0);
578     for (i = 2; i < primes; i++) {
579         pinfo = sk_RSA_PRIME_INFO_value(prime_infos, i - 2);
580         tmp = sk_BIGNUM_delete(factors, 0);
581         BN_copy(pinfo->r, tmp);
582         BN_clear_free(tmp);
583         tmp = sk_BIGNUM_delete(exps, 0);
584         tmp2 = BN_copy(pinfo->d, tmp);
585         BN_clear_free(tmp);
586         if (tmp2 == NULL)
587             goto err;
588         tmp = sk_BIGNUM_delete(coeffs, 0);
589         tmp2 = BN_copy(pinfo->t, tmp);
590         BN_clear_free(tmp);
591         if (tmp2 == NULL)
592             goto err;
593     }
594     ok = 1;
595  err:
596     sk_BIGNUM_free(factors);
597     sk_BIGNUM_free(exps);
598     sk_BIGNUM_free(coeffs);
599     if (ok == -1) {
600         ERR_raise(ERR_LIB_RSA, ERR_R_BN_LIB);
601         ok = 0;
602     }
603     BN_CTX_end(ctx);
604     BN_CTX_free(ctx);
605     return ok;
606 }
607 #endif /* FIPS_MODULE */
608 
rsa_keygen(OSSL_LIB_CTX * libctx,RSA * rsa,int bits,int primes,BIGNUM * e_value,BN_GENCB * cb,int pairwise_test)609 static int rsa_keygen(OSSL_LIB_CTX *libctx, RSA *rsa, int bits, int primes,
610                       BIGNUM *e_value, BN_GENCB *cb, int pairwise_test)
611 {
612     int ok = 0;
613 
614 #ifdef FIPS_MODULE
615     ok = ossl_rsa_sp800_56b_generate_key(rsa, bits, e_value, cb);
616     pairwise_test = 1; /* FIPS MODE needs to always run the pairwise test */
617 #else
618     /*
619      * Only multi-prime keys or insecure keys with a small key length or a
620      * public exponent <= 2^16 will use the older rsa_multiprime_keygen().
621      */
622     if (primes == 2
623             && bits >= 2048
624             && (e_value == NULL || BN_num_bits(e_value) > 16))
625         ok = ossl_rsa_sp800_56b_generate_key(rsa, bits, e_value, cb);
626     else
627         ok = rsa_multiprime_keygen(rsa, bits, primes, e_value, cb);
628 #endif /* FIPS_MODULE */
629 
630     if (pairwise_test && ok > 0) {
631         OSSL_CALLBACK *stcb = NULL;
632         void *stcbarg = NULL;
633 
634         OSSL_SELF_TEST_get_callback(libctx, &stcb, &stcbarg);
635         ok = rsa_keygen_pairwise_test(rsa, stcb, stcbarg);
636         if (!ok) {
637             ossl_set_error_state(OSSL_SELF_TEST_TYPE_PCT);
638             /* Clear intermediate results */
639             BN_clear_free(rsa->d);
640             BN_clear_free(rsa->p);
641             BN_clear_free(rsa->q);
642             BN_clear_free(rsa->dmp1);
643             BN_clear_free(rsa->dmq1);
644             BN_clear_free(rsa->iqmp);
645             rsa->d = NULL;
646             rsa->p = NULL;
647             rsa->q = NULL;
648             rsa->dmp1 = NULL;
649             rsa->dmq1 = NULL;
650             rsa->iqmp = NULL;
651         }
652     }
653     return ok;
654 }
655 
656 /*
657  * AS10.35 (and its VEs/TEs) of the FIPS 140-3 standard requires a PCT for every
658  * generated key pair. There are 3 options:
659  * 1) If the key pair is to be used for key transport (asymmetric cipher), the
660  *    PCT consists of encrypting a plaintext, verifying that the result
661  *    (ciphertext) is not equal to the plaintext, decrypting the ciphertext, and
662  *    verifying that the result is equal to the plaintext.
663  * 2) If the key pair is to be used for digital signatures, the PCT consists of
664  *    computing and verifying a signature.
665  * 3) If the key pair is to be used for key agreement, the exact PCT is defined
666  *    in the applicable standards. For RSA-based schemes, this is defined in
667  *    SP 800-56Br2 (Section 6.4.1.1) as:
668  *    "The owner shall perform a pair-wise consistency test by verifying that m
669  *    = (m^e)^d mod n for some integer m satisfying 1 < m < (n - 1)."
670  *
671  * OpenSSL implements all three use cases: RSA-OAEP for key transport,
672  * RSA signatures with PKCS#1 v1.5 or PSS padding, and KAS-IFC-SSC (KAS1/KAS2)
673  * using RSASVE.
674  *
675  * According to FIPS 140-3 IG 10.3.A, if at the time when the PCT is performed
676  * the keys' intended usage is not known, then any of the three PCTs described
677  * in AS10.35 shall be performed on this key pair.
678  *
679  * Because of this allowance from the IG, the simplest option is 3, i.e.
680  * RSA_public_encrypt() and RSA_private_decrypt() with RSA_NO_PADDING.
681  */
rsa_keygen_pairwise_test(RSA * rsa,OSSL_CALLBACK * cb,void * cbarg)682 static int rsa_keygen_pairwise_test(RSA *rsa, OSSL_CALLBACK *cb, void *cbarg)
683 {
684     int ret = 0;
685     unsigned int plaintxt_len;
686     unsigned char *plaintxt = NULL;
687     unsigned int ciphertxt_len;
688     unsigned char *ciphertxt = NULL;
689     unsigned char *decoded = NULL;
690     unsigned int decoded_len;
691     int padding = RSA_NO_PADDING;
692     OSSL_SELF_TEST *st = NULL;
693 
694     st = OSSL_SELF_TEST_new(cb, cbarg);
695     if (st == NULL)
696         goto err;
697     OSSL_SELF_TEST_onbegin(st, OSSL_SELF_TEST_TYPE_PCT,
698                            OSSL_SELF_TEST_DESC_PCT_RSA);
699 
700     /*
701      * For RSA_NO_PADDING, RSA_public_encrypt() and RSA_private_decrypt()
702      * require the 'to' and 'from' parameters to have equal length and a
703      * maximum of RSA_size() - allocate space for plaintxt, ciphertxt, and
704      * decoded.
705      */
706     plaintxt_len = RSA_size(rsa);
707     plaintxt = OPENSSL_zalloc(plaintxt_len * 3);
708     if (plaintxt == NULL)
709         goto err;
710     ciphertxt = plaintxt + plaintxt_len;
711     decoded = ciphertxt + plaintxt_len;
712 
713     /* SP 800-56Br2 Section 6.4.1.1 requires that plaintext is greater than 1 */
714     plaintxt[plaintxt_len - 1] = 2;
715 
716     ciphertxt_len = RSA_public_encrypt(plaintxt_len, plaintxt, ciphertxt, rsa,
717                                        padding);
718     if (ciphertxt_len <= 0)
719         goto err;
720 
721     OSSL_SELF_TEST_oncorrupt_byte(st, ciphertxt);
722 
723     decoded_len = RSA_private_decrypt(ciphertxt_len, ciphertxt, decoded, rsa,
724                                       padding);
725     if (decoded_len != plaintxt_len
726         || memcmp(decoded, plaintxt,  decoded_len) != 0)
727         goto err;
728 
729     ret = 1;
730 err:
731     OSSL_SELF_TEST_onend(st, ret);
732     OSSL_SELF_TEST_free(st);
733     OPENSSL_free(plaintxt);
734 
735     return ret;
736 }
737