Coverage Report

Created: 2025-06-13 06:57

/src/openssl/crypto/rsa/rsa_mp.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2017-2024 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
0
{
17
    /* free pp and pinfo only */
18
0
    BN_clear_free(pinfo->pp);
19
0
    OPENSSL_free(pinfo);
20
0
}
21
22
void ossl_rsa_multip_info_free(RSA_PRIME_INFO *pinfo)
23
0
{
24
    /* free an RSA_PRIME_INFO structure */
25
0
    BN_clear_free(pinfo->r);
26
0
    BN_clear_free(pinfo->d);
27
0
    BN_clear_free(pinfo->t);
28
0
    ossl_rsa_multip_info_free_ex(pinfo);
29
0
}
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
0
{
61
0
    RSA_PRIME_INFO *pinfo;
62
0
    BIGNUM *p1 = NULL, *p2 = NULL;
63
0
    BN_CTX *ctx = NULL;
64
0
    int i, rv = 0, ex_primes;
65
66
0
    if ((ex_primes = sk_RSA_PRIME_INFO_num(rsa->prime_infos)) <= 0) {
67
        /* invalid */
68
0
        goto err;
69
0
    }
70
71
0
    if ((ctx = BN_CTX_new()) == NULL)
72
0
        goto err;
73
74
    /* calculate pinfo->pp = p * q for first 'extra' prime */
75
0
    p1 = rsa->p;
76
0
    p2 = rsa->q;
77
78
0
    for (i = 0; i < ex_primes; i++) {
79
0
        pinfo = sk_RSA_PRIME_INFO_value(rsa->prime_infos, i);
80
0
        if (pinfo->pp == NULL) {
81
0
            pinfo->pp = BN_secure_new();
82
0
            if (pinfo->pp == NULL)
83
0
                goto err;
84
0
        }
85
0
        if (!BN_mul(pinfo->pp, p1, p2, ctx))
86
0
            goto err;
87
        /* save previous one */
88
0
        p1 = pinfo->pp;
89
0
        p2 = pinfo->r;
90
0
    }
91
92
0
    rv = 1;
93
0
 err:
94
0
    BN_CTX_free(ctx);
95
0
    return rv;
96
0
}
97
98
int ossl_rsa_multip_cap(int bits)
99
0
{
100
0
    int cap = RSA_MAX_PRIME_NUM;
101
102
0
    if (bits < 1024)
103
0
        cap = 2;
104
0
    else if (bits < 4096)
105
0
        cap = 3;
106
0
    else if (bits < 8192)
107
0
        cap = 4;
108
109
0
    if (cap > RSA_MAX_PRIME_NUM)
110
0
        cap = RSA_MAX_PRIME_NUM;
111
112
0
    return cap;
113
0
}