7e38179b97d4d06224e4713f11310607d04ac13a
[openssl.git] / crypto / rsa / rsa_mp.c
1 /*
2  * Copyright 2017 The OpenSSL Project Authors. All Rights Reserved.
3  * Copyright 2017 BaishanCloud. All rights reserved.
4  *
5  * Licensed under the OpenSSL license (the "License").  You may not use
6  * this file except in compliance with the License.  You can obtain a copy
7  * in the file LICENSE in the source distribution or at
8  * https://www.openssl.org/source/license.html
9  */
10
11 #include <openssl/bn.h>
12 #include "rsa_locl.h"
13
14 void rsa_multip_info_free_ex(RSA_PRIME_INFO *pinfo)
15 {
16     /* free pp and pinfo only */
17     BN_clear_free(pinfo->pp);
18     OPENSSL_free(pinfo);
19 }
20
21 void rsa_multip_info_free(RSA_PRIME_INFO *pinfo)
22 {
23     /* free a RSA_PRIME_INFO structure */
24     BN_clear_free(pinfo->r);
25     BN_clear_free(pinfo->d);
26     BN_clear_free(pinfo->t);
27     rsa_multip_info_free_ex(pinfo);
28 }
29
30 RSA_PRIME_INFO *rsa_multip_info_new(void)
31 {
32     RSA_PRIME_INFO *pinfo;
33
34     /* create a RSA_PRIME_INFO structure */
35     pinfo = OPENSSL_zalloc(sizeof(RSA_PRIME_INFO));
36     if (pinfo == NULL)
37         return NULL;
38     if ((pinfo->r = BN_secure_new()) == NULL)
39         goto err;
40     if ((pinfo->d = BN_secure_new()) == NULL)
41         goto err;
42     if ((pinfo->t = BN_secure_new()) == NULL)
43         goto err;
44     if ((pinfo->pp = BN_secure_new()) == NULL)
45         goto err;
46
47     return pinfo;
48
49  err:
50     BN_free(pinfo->r);
51     BN_free(pinfo->d);
52     BN_free(pinfo->t);
53     BN_free(pinfo->pp);
54     OPENSSL_free(pinfo);
55     return NULL;
56 }
57
58 /* Refill products of primes */
59 int rsa_multip_calc_product(RSA *rsa)
60 {
61     RSA_PRIME_INFO *pinfo;
62     BIGNUM *p1 = NULL, *p2 = NULL;
63     BN_CTX *ctx = NULL;
64     int i, rv = 0, ex_primes;
65
66     if ((ex_primes = sk_RSA_PRIME_INFO_num(rsa->prime_infos)) <= 0) {
67         /* invalid */
68         goto err;
69     }
70
71     if ((ctx = BN_CTX_new()) == NULL)
72         goto err;
73
74     /* calculate pinfo->pp = p * q for first 'extra' prime */
75     p1 = rsa->p;
76     p2 = rsa->q;
77
78     for (i = 0; i < ex_primes; i++) {
79         pinfo = sk_RSA_PRIME_INFO_value(rsa->prime_infos, i);
80         if (pinfo->pp == NULL) {
81             pinfo->pp = BN_secure_new();
82             if (pinfo->pp == NULL)
83                 goto err;
84         }
85         if (!BN_mul(pinfo->pp, p1, p2, ctx))
86             goto err;
87         /* save previous one */
88         p1 = pinfo->pp;
89         p2 = pinfo->r;
90     }
91
92     rv = 1;
93  err:
94     BN_CTX_free(ctx);
95     return rv;
96 }
97
98 int rsa_multip_cap(int bits)
99 {
100     int cap = 5;
101
102     if (bits < 1024)
103         cap = 2;
104     else if (bits < 4096)
105         cap = 3;
106     else if (bits < 8192)
107         cap = 4;
108
109     if (cap > RSA_MAX_PRIME_NUM)
110         cap = RSA_MAX_PRIME_NUM;
111
112     return cap;
113 }