Coverage Report

Created: 2025-08-28 07:07

/src/openssl32/crypto/rsa/rsa_mp.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved.
3
 * Copyright 2017 BaishanCloud. All rights reserved.
4
 *
5
 * Licensed under the Apache License 2.0 (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 <openssl/err.h>
13
#include "rsa_local.h"
14
15
void ossl_rsa_multip_info_free_ex(RSA_PRIME_INFO *pinfo)
16
284k
{
17
    /* free pp and pinfo only */
18
284k
    BN_clear_free(pinfo->pp);
19
284k
    OPENSSL_free(pinfo);
20
284k
}
21
22
void ossl_rsa_multip_info_free(RSA_PRIME_INFO *pinfo)
23
284k
{
24
    /* free an RSA_PRIME_INFO structure */
25
284k
    BN_clear_free(pinfo->r);
26
284k
    BN_clear_free(pinfo->d);
27
284k
    BN_clear_free(pinfo->t);
28
284k
    ossl_rsa_multip_info_free_ex(pinfo);
29
284k
}
30
31
RSA_PRIME_INFO *ossl_rsa_multip_info_new(void)
32
0
{
33
0
    RSA_PRIME_INFO *pinfo;
34
35
    /* create an RSA_PRIME_INFO structure */
36
0
    if ((pinfo = OPENSSL_zalloc(sizeof(RSA_PRIME_INFO))) == NULL)
37
0
        return NULL;
38
0
    if ((pinfo->r = BN_secure_new()) == NULL)
39
0
        goto err;
40
0
    if ((pinfo->d = BN_secure_new()) == NULL)
41
0
        goto err;
42
0
    if ((pinfo->t = BN_secure_new()) == NULL)
43
0
        goto err;
44
0
    if ((pinfo->pp = BN_secure_new()) == NULL)
45
0
        goto err;
46
47
0
    return pinfo;
48
49
0
 err:
50
0
    BN_free(pinfo->r);
51
0
    BN_free(pinfo->d);
52
0
    BN_free(pinfo->t);
53
0
    BN_free(pinfo->pp);
54
0
    OPENSSL_free(pinfo);
55
0
    return NULL;
56
0
}
57
58
/* Refill products of primes */
59
int ossl_rsa_multip_calc_product(RSA *rsa)
60
6.32k
{
61
6.32k
    RSA_PRIME_INFO *pinfo;
62
6.32k
    BIGNUM *p1 = NULL, *p2 = NULL;
63
6.32k
    BN_CTX *ctx = NULL;
64
6.32k
    int i, rv = 0, ex_primes;
65
66
6.32k
    if ((ex_primes = sk_RSA_PRIME_INFO_num(rsa->prime_infos)) <= 0) {
67
        /* invalid */
68
64
        goto err;
69
64
    }
70
71
6.26k
    if ((ctx = BN_CTX_new()) == NULL)
72
0
        goto err;
73
74
    /* calculate pinfo->pp = p * q for first 'extra' prime */
75
6.26k
    p1 = rsa->p;
76
6.26k
    p2 = rsa->q;
77
78
213k
    for (i = 0; i < ex_primes; i++) {
79
207k
        pinfo = sk_RSA_PRIME_INFO_value(rsa->prime_infos, i);
80
207k
        if (pinfo->pp == NULL) {
81
207k
            pinfo->pp = BN_secure_new();
82
207k
            if (pinfo->pp == NULL)
83
0
                goto err;
84
207k
        }
85
207k
        if (!BN_mul(pinfo->pp, p1, p2, ctx))
86
0
            goto err;
87
        /* save previous one */
88
207k
        p1 = pinfo->pp;
89
207k
        p2 = pinfo->r;
90
207k
    }
91
92
6.26k
    rv = 1;
93
6.32k
 err:
94
6.32k
    BN_CTX_free(ctx);
95
6.32k
    return rv;
96
6.26k
}
97
98
int ossl_rsa_multip_cap(int bits)
99
1.74k
{
100
1.74k
    int cap = 5;
101
102
1.74k
    if (bits < 1024)
103
1.05k
        cap = 2;
104
698
    else if (bits < 4096)
105
391
        cap = 3;
106
307
    else if (bits < 8192)
107
300
        cap = 4;
108
109
1.74k
    if (cap > RSA_MAX_PRIME_NUM)
110
0
        cap = RSA_MAX_PRIME_NUM;
111
112
1.74k
    return cap;
113
1.74k
}