1 | /** |
2 | * \file rsa_alt_helpers.h |
3 | * |
4 | * \brief Context-independent RSA helper functions |
5 | * |
6 | * This module declares some RSA-related helper functions useful when |
7 | * implementing the RSA interface. These functions are provided in a separate |
8 | * compilation unit in order to make it easy for designers of alternative RSA |
9 | * implementations to use them in their own code, as it is conceived that the |
10 | * functionality they provide will be necessary for most complete |
11 | * implementations. |
12 | * |
13 | * End-users of Mbed TLS who are not providing their own alternative RSA |
14 | * implementations should not use these functions directly, and should instead |
15 | * use only the functions declared in rsa.h. |
16 | * |
17 | * The interface provided by this module will be maintained through LTS (Long |
18 | * Term Support) branches of Mbed TLS, but may otherwise be subject to change, |
19 | * and must be considered an internal interface of the library. |
20 | * |
21 | * There are two classes of helper functions: |
22 | * |
23 | * (1) Parameter-generating helpers. These are: |
24 | * - mbedtls_rsa_deduce_primes |
25 | * - mbedtls_rsa_deduce_private_exponent |
26 | * - mbedtls_rsa_deduce_crt |
27 | * Each of these functions takes a set of core RSA parameters and |
28 | * generates some other, or CRT related parameters. |
29 | * |
30 | * (2) Parameter-checking helpers. These are: |
31 | * - mbedtls_rsa_validate_params |
32 | * - mbedtls_rsa_validate_crt |
33 | * They take a set of core or CRT related RSA parameters and check their |
34 | * validity. |
35 | * |
36 | */ |
37 | /* |
38 | * Copyright The Mbed TLS Contributors |
39 | * SPDX-License-Identifier: Apache-2.0 |
40 | * |
41 | * Licensed under the Apache License, Version 2.0 (the "License"); you may |
42 | * not use this file except in compliance with the License. |
43 | * You may obtain a copy of the License at |
44 | * |
45 | * http://www.apache.org/licenses/LICENSE-2.0 |
46 | * |
47 | * Unless required by applicable law or agreed to in writing, software |
48 | * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
49 | * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
50 | * See the License for the specific language governing permissions and |
51 | * limitations under the License. |
52 | * |
53 | */ |
54 | |
55 | #ifndef MBEDTLS_RSA_INTERNAL_H |
56 | #define MBEDTLS_RSA_INTERNAL_H |
57 | |
58 | #include "mbedtls/build_info.h" |
59 | |
60 | #include "mbedtls/bignum.h" |
61 | |
62 | #ifdef __cplusplus |
63 | extern "C" { |
64 | #endif |
65 | |
66 | |
67 | /** |
68 | * \brief Compute RSA prime moduli P, Q from public modulus N=PQ |
69 | * and a pair of private and public key. |
70 | * |
71 | * \note This is a 'static' helper function not operating on |
72 | * an RSA context. Alternative implementations need not |
73 | * overwrite it. |
74 | * |
75 | * \param N RSA modulus N = PQ, with P, Q to be found |
76 | * \param E RSA public exponent |
77 | * \param D RSA private exponent |
78 | * \param P Pointer to MPI holding first prime factor of N on success |
79 | * \param Q Pointer to MPI holding second prime factor of N on success |
80 | * |
81 | * \return |
82 | * - 0 if successful. In this case, P and Q constitute a |
83 | * factorization of N. |
84 | * - A non-zero error code otherwise. |
85 | * |
86 | * \note It is neither checked that P, Q are prime nor that |
87 | * D, E are modular inverses wrt. P-1 and Q-1. For that, |
88 | * use the helper function \c mbedtls_rsa_validate_params. |
89 | * |
90 | */ |
91 | int mbedtls_rsa_deduce_primes( mbedtls_mpi const *N, mbedtls_mpi const *E, |
92 | mbedtls_mpi const *D, |
93 | mbedtls_mpi *P, mbedtls_mpi *Q ); |
94 | |
95 | /** |
96 | * \brief Compute RSA private exponent from |
97 | * prime moduli and public key. |
98 | * |
99 | * \note This is a 'static' helper function not operating on |
100 | * an RSA context. Alternative implementations need not |
101 | * overwrite it. |
102 | * |
103 | * \param P First prime factor of RSA modulus |
104 | * \param Q Second prime factor of RSA modulus |
105 | * \param E RSA public exponent |
106 | * \param D Pointer to MPI holding the private exponent on success. |
107 | * |
108 | * \return |
109 | * - 0 if successful. In this case, D is set to a simultaneous |
110 | * modular inverse of E modulo both P-1 and Q-1. |
111 | * - A non-zero error code otherwise. |
112 | * |
113 | * \note This function does not check whether P and Q are primes. |
114 | * |
115 | */ |
116 | int mbedtls_rsa_deduce_private_exponent( mbedtls_mpi const *P, |
117 | mbedtls_mpi const *Q, |
118 | mbedtls_mpi const *E, |
119 | mbedtls_mpi *D ); |
120 | |
121 | |
122 | /** |
123 | * \brief Generate RSA-CRT parameters |
124 | * |
125 | * \note This is a 'static' helper function not operating on |
126 | * an RSA context. Alternative implementations need not |
127 | * overwrite it. |
128 | * |
129 | * \param P First prime factor of N |
130 | * \param Q Second prime factor of N |
131 | * \param D RSA private exponent |
132 | * \param DP Output variable for D modulo P-1 |
133 | * \param DQ Output variable for D modulo Q-1 |
134 | * \param QP Output variable for the modular inverse of Q modulo P. |
135 | * |
136 | * \return 0 on success, non-zero error code otherwise. |
137 | * |
138 | * \note This function does not check whether P, Q are |
139 | * prime and whether D is a valid private exponent. |
140 | * |
141 | */ |
142 | int mbedtls_rsa_deduce_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, |
143 | const mbedtls_mpi *D, mbedtls_mpi *DP, |
144 | mbedtls_mpi *DQ, mbedtls_mpi *QP ); |
145 | |
146 | |
147 | /** |
148 | * \brief Check validity of core RSA parameters |
149 | * |
150 | * \note This is a 'static' helper function not operating on |
151 | * an RSA context. Alternative implementations need not |
152 | * overwrite it. |
153 | * |
154 | * \param N RSA modulus N = PQ |
155 | * \param P First prime factor of N |
156 | * \param Q Second prime factor of N |
157 | * \param D RSA private exponent |
158 | * \param E RSA public exponent |
159 | * \param f_rng PRNG to be used for primality check, or NULL |
160 | * \param p_rng PRNG context for f_rng, or NULL |
161 | * |
162 | * \return |
163 | * - 0 if the following conditions are satisfied |
164 | * if all relevant parameters are provided: |
165 | * - P prime if f_rng != NULL (%) |
166 | * - Q prime if f_rng != NULL (%) |
167 | * - 1 < N = P * Q |
168 | * - 1 < D, E < N |
169 | * - D and E are modular inverses modulo P-1 and Q-1 |
170 | * (%) This is only done if MBEDTLS_GENPRIME is defined. |
171 | * - A non-zero error code otherwise. |
172 | * |
173 | * \note The function can be used with a restricted set of arguments |
174 | * to perform specific checks only. E.g., calling it with |
175 | * (-,P,-,-,-) and a PRNG amounts to a primality check for P. |
176 | */ |
177 | int mbedtls_rsa_validate_params( const mbedtls_mpi *N, const mbedtls_mpi *P, |
178 | const mbedtls_mpi *Q, const mbedtls_mpi *D, |
179 | const mbedtls_mpi *E, |
180 | int (*f_rng)(void *, unsigned char *, size_t), |
181 | void *p_rng ); |
182 | |
183 | /** |
184 | * \brief Check validity of RSA CRT parameters |
185 | * |
186 | * \note This is a 'static' helper function not operating on |
187 | * an RSA context. Alternative implementations need not |
188 | * overwrite it. |
189 | * |
190 | * \param P First prime factor of RSA modulus |
191 | * \param Q Second prime factor of RSA modulus |
192 | * \param D RSA private exponent |
193 | * \param DP MPI to check for D modulo P-1 |
194 | * \param DQ MPI to check for D modulo P-1 |
195 | * \param QP MPI to check for the modular inverse of Q modulo P. |
196 | * |
197 | * \return |
198 | * - 0 if the following conditions are satisfied: |
199 | * - D = DP mod P-1 if P, D, DP != NULL |
200 | * - Q = DQ mod P-1 if P, D, DQ != NULL |
201 | * - QP = Q^-1 mod P if P, Q, QP != NULL |
202 | * - \c MBEDTLS_ERR_RSA_KEY_CHECK_FAILED if check failed, |
203 | * potentially including \c MBEDTLS_ERR_MPI_XXX if some |
204 | * MPI calculations failed. |
205 | * - \c MBEDTLS_ERR_RSA_BAD_INPUT_DATA if insufficient |
206 | * data was provided to check DP, DQ or QP. |
207 | * |
208 | * \note The function can be used with a restricted set of arguments |
209 | * to perform specific checks only. E.g., calling it with the |
210 | * parameters (P, -, D, DP, -, -) will check DP = D mod P-1. |
211 | */ |
212 | int mbedtls_rsa_validate_crt( const mbedtls_mpi *P, const mbedtls_mpi *Q, |
213 | const mbedtls_mpi *D, const mbedtls_mpi *DP, |
214 | const mbedtls_mpi *DQ, const mbedtls_mpi *QP ); |
215 | |
216 | #ifdef __cplusplus |
217 | } |
218 | #endif |
219 | |
220 | #endif /* rsa_alt_helpers.h */ |
221 | |