Coverage Report

Created: 2023-06-08 06:41

/src/openssl111/crypto/rsa/rsa_chk.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 1999-2017 The OpenSSL Project Authors. All Rights Reserved.
3
 *
4
 * Licensed under the OpenSSL license (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
#include <openssl/bn.h>
11
#include <openssl/err.h>
12
#include "rsa_local.h"
13
14
int RSA_check_key(const RSA *key)
15
0
{
16
0
    return RSA_check_key_ex(key, NULL);
17
0
}
18
19
int RSA_check_key_ex(const RSA *key, BN_GENCB *cb)
20
0
{
21
0
    BIGNUM *i, *j, *k, *l, *m;
22
0
    BN_CTX *ctx;
23
0
    int ret = 1, ex_primes = 0, idx;
24
0
    RSA_PRIME_INFO *pinfo;
25
26
0
    if (key->p == NULL || key->q == NULL || key->n == NULL
27
0
            || key->e == NULL || key->d == NULL) {
28
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_VALUE_MISSING);
29
0
        return 0;
30
0
    }
31
32
    /* multi-prime? */
33
0
    if (key->version == RSA_ASN1_VERSION_MULTI) {
34
0
        ex_primes = sk_RSA_PRIME_INFO_num(key->prime_infos);
35
0
        if (ex_primes <= 0
36
0
                || (ex_primes + 2) > rsa_multip_cap(BN_num_bits(key->n))) {
37
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_INVALID_MULTI_PRIME_KEY);
38
0
            return 0;
39
0
        }
40
0
    }
41
42
0
    i = BN_new();
43
0
    j = BN_new();
44
0
    k = BN_new();
45
0
    l = BN_new();
46
0
    m = BN_new();
47
0
    ctx = BN_CTX_new();
48
0
    if (i == NULL || j == NULL || k == NULL || l == NULL
49
0
            || m == NULL || ctx == NULL) {
50
0
        ret = -1;
51
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, ERR_R_MALLOC_FAILURE);
52
0
        goto err;
53
0
    }
54
55
0
    if (BN_is_one(key->e)) {
56
0
        ret = 0;
57
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_BAD_E_VALUE);
58
0
    }
59
0
    if (!BN_is_odd(key->e)) {
60
0
        ret = 0;
61
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_BAD_E_VALUE);
62
0
    }
63
64
    /* p prime? */
65
0
    if (BN_is_prime_ex(key->p, BN_prime_checks, NULL, cb) != 1) {
66
0
        ret = 0;
67
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_P_NOT_PRIME);
68
0
    }
69
70
    /* q prime? */
71
0
    if (BN_is_prime_ex(key->q, BN_prime_checks, NULL, cb) != 1) {
72
0
        ret = 0;
73
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_Q_NOT_PRIME);
74
0
    }
75
76
    /* r_i prime? */
77
0
    for (idx = 0; idx < ex_primes; idx++) {
78
0
        pinfo = sk_RSA_PRIME_INFO_value(key->prime_infos, idx);
79
0
        if (BN_is_prime_ex(pinfo->r, BN_prime_checks, NULL, cb) != 1) {
80
0
            ret = 0;
81
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_MP_R_NOT_PRIME);
82
0
        }
83
0
    }
84
85
    /* n = p*q * r_3...r_i? */
86
0
    if (!BN_mul(i, key->p, key->q, ctx)) {
87
0
        ret = -1;
88
0
        goto err;
89
0
    }
90
0
    for (idx = 0; idx < ex_primes; idx++) {
91
0
        pinfo = sk_RSA_PRIME_INFO_value(key->prime_infos, idx);
92
0
        if (!BN_mul(i, i, pinfo->r, ctx)) {
93
0
            ret = -1;
94
0
            goto err;
95
0
        }
96
0
    }
97
0
    if (BN_cmp(i, key->n) != 0) {
98
0
        ret = 0;
99
0
        if (ex_primes)
100
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX,
101
0
                   RSA_R_N_DOES_NOT_EQUAL_PRODUCT_OF_PRIMES);
102
0
        else
103
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_N_DOES_NOT_EQUAL_P_Q);
104
0
    }
105
106
    /* d*e = 1  mod \lambda(n)? */
107
0
    if (!BN_sub(i, key->p, BN_value_one())) {
108
0
        ret = -1;
109
0
        goto err;
110
0
    }
111
0
    if (!BN_sub(j, key->q, BN_value_one())) {
112
0
        ret = -1;
113
0
        goto err;
114
0
    }
115
116
    /* now compute k = \lambda(n) = LCM(i, j, r_3 - 1...) */
117
0
    if (!BN_mul(l, i, j, ctx)) {
118
0
        ret = -1;
119
0
        goto err;
120
0
    }
121
0
    if (!BN_gcd(m, i, j, ctx)) {
122
0
        ret = -1;
123
0
        goto err;
124
0
    }
125
0
    for (idx = 0; idx < ex_primes; idx++) {
126
0
        pinfo = sk_RSA_PRIME_INFO_value(key->prime_infos, idx);
127
0
        if (!BN_sub(k, pinfo->r, BN_value_one())) {
128
0
            ret = -1;
129
0
            goto err;
130
0
        }
131
0
        if (!BN_mul(l, l, k, ctx)) {
132
0
            ret = -1;
133
0
            goto err;
134
0
        }
135
0
        if (!BN_gcd(m, m, k, ctx)) {
136
0
            ret = -1;
137
0
            goto err;
138
0
        }
139
0
    }
140
0
    if (!BN_div(k, NULL, l, m, ctx)) { /* remainder is 0 */
141
0
        ret = -1;
142
0
        goto err;
143
0
    }
144
0
    if (!BN_mod_mul(i, key->d, key->e, k, ctx)) {
145
0
        ret = -1;
146
0
        goto err;
147
0
    }
148
149
0
    if (!BN_is_one(i)) {
150
0
        ret = 0;
151
0
        RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_D_E_NOT_CONGRUENT_TO_1);
152
0
    }
153
154
0
    if (key->dmp1 != NULL && key->dmq1 != NULL && key->iqmp != NULL) {
155
        /* dmp1 = d mod (p-1)? */
156
0
        if (!BN_sub(i, key->p, BN_value_one())) {
157
0
            ret = -1;
158
0
            goto err;
159
0
        }
160
0
        if (!BN_mod(j, key->d, i, ctx)) {
161
0
            ret = -1;
162
0
            goto err;
163
0
        }
164
0
        if (BN_cmp(j, key->dmp1) != 0) {
165
0
            ret = 0;
166
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_DMP1_NOT_CONGRUENT_TO_D);
167
0
        }
168
169
        /* dmq1 = d mod (q-1)? */
170
0
        if (!BN_sub(i, key->q, BN_value_one())) {
171
0
            ret = -1;
172
0
            goto err;
173
0
        }
174
0
        if (!BN_mod(j, key->d, i, ctx)) {
175
0
            ret = -1;
176
0
            goto err;
177
0
        }
178
0
        if (BN_cmp(j, key->dmq1) != 0) {
179
0
            ret = 0;
180
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_DMQ1_NOT_CONGRUENT_TO_D);
181
0
        }
182
183
        /* iqmp = q^-1 mod p? */
184
0
        if (!BN_mod_inverse(i, key->q, key->p, ctx)) {
185
0
            ret = -1;
186
0
            goto err;
187
0
        }
188
0
        if (BN_cmp(i, key->iqmp) != 0) {
189
0
            ret = 0;
190
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_IQMP_NOT_INVERSE_OF_Q);
191
0
        }
192
0
    }
193
194
0
    for (idx = 0; idx < ex_primes; idx++) {
195
0
        pinfo = sk_RSA_PRIME_INFO_value(key->prime_infos, idx);
196
        /* d_i = d mod (r_i - 1)? */
197
0
        if (!BN_sub(i, pinfo->r, BN_value_one())) {
198
0
            ret = -1;
199
0
            goto err;
200
0
        }
201
0
        if (!BN_mod(j, key->d, i, ctx)) {
202
0
            ret = -1;
203
0
            goto err;
204
0
        }
205
0
        if (BN_cmp(j, pinfo->d) != 0) {
206
0
            ret = 0;
207
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_MP_EXPONENT_NOT_CONGRUENT_TO_D);
208
0
        }
209
        /* t_i = R_i ^ -1 mod r_i ? */
210
0
        if (!BN_mod_inverse(i, pinfo->pp, pinfo->r, ctx)) {
211
0
            ret = -1;
212
0
            goto err;
213
0
        }
214
0
        if (BN_cmp(i, pinfo->t) != 0) {
215
0
            ret = 0;
216
0
            RSAerr(RSA_F_RSA_CHECK_KEY_EX, RSA_R_MP_COEFFICIENT_NOT_INVERSE_OF_R);
217
0
        }
218
0
    }
219
220
0
 err:
221
0
    BN_free(i);
222
0
    BN_free(j);
223
0
    BN_free(k);
224
0
    BN_free(l);
225
0
    BN_free(m);
226
0
    BN_CTX_free(ctx);
227
0
    return ret;
228
0
}