/src/openssl/crypto/rsa/rsa_local.h
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright 2006-2024 The OpenSSL Project Authors. All Rights Reserved. |
3 | | * |
4 | | * Licensed under the Apache License 2.0 (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 | | #ifndef OSSL_CRYPTO_RSA_LOCAL_H |
11 | | #define OSSL_CRYPTO_RSA_LOCAL_H |
12 | | |
13 | | #include "internal/refcount.h" |
14 | | #include "crypto/rsa.h" |
15 | | |
16 | 0 | #define RSA_MAX_PRIME_NUM 5 |
17 | | |
18 | | typedef struct rsa_prime_info_st { |
19 | | BIGNUM *r; |
20 | | BIGNUM *d; |
21 | | BIGNUM *t; |
22 | | /* save product of primes prior to this one */ |
23 | | BIGNUM *pp; |
24 | | BN_MONT_CTX *m; |
25 | | } RSA_PRIME_INFO; |
26 | | |
27 | | DECLARE_ASN1_ITEM(RSA_PRIME_INFO) |
28 | | DEFINE_STACK_OF(RSA_PRIME_INFO) |
29 | | |
30 | | #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) |
31 | | struct rsa_acvp_test_st { |
32 | | /* optional inputs */ |
33 | | BIGNUM *Xp1; |
34 | | BIGNUM *Xp2; |
35 | | BIGNUM *Xq1; |
36 | | BIGNUM *Xq2; |
37 | | BIGNUM *Xp; |
38 | | BIGNUM *Xq; |
39 | | |
40 | | /* optional outputs */ |
41 | | BIGNUM *p1; |
42 | | BIGNUM *p2; |
43 | | BIGNUM *q1; |
44 | | BIGNUM *q2; |
45 | | }; |
46 | | #endif |
47 | | |
48 | | struct rsa_st { |
49 | | /* |
50 | | * #legacy |
51 | | * The first field is used to pickup errors where this is passed |
52 | | * instead of an EVP_PKEY. It is always zero. |
53 | | * THIS MUST REMAIN THE FIRST FIELD. |
54 | | */ |
55 | | int dummy_zero; |
56 | | |
57 | | OSSL_LIB_CTX *libctx; |
58 | | int32_t version; |
59 | | const RSA_METHOD *meth; |
60 | | /* functional reference if 'meth' is ENGINE-provided */ |
61 | | ENGINE *engine; |
62 | | BIGNUM *n; |
63 | | BIGNUM *e; |
64 | | BIGNUM *d; |
65 | | BIGNUM *p; |
66 | | BIGNUM *q; |
67 | | BIGNUM *dmp1; |
68 | | BIGNUM *dmq1; |
69 | | BIGNUM *iqmp; |
70 | | |
71 | | /* |
72 | | * If a PSS only key this contains the parameter restrictions. |
73 | | * There are two structures for the same thing, used in different cases. |
74 | | */ |
75 | | /* This is used uniquely by OpenSSL provider implementations. */ |
76 | | RSA_PSS_PARAMS_30 pss_params; |
77 | | |
78 | | #if defined(FIPS_MODULE) && !defined(OPENSSL_NO_ACVP_TESTS) |
79 | | RSA_ACVP_TEST *acvp_test; |
80 | | #endif |
81 | | |
82 | | #ifndef FIPS_MODULE |
83 | | /* This is used uniquely by rsa_ameth.c and rsa_pmeth.c. */ |
84 | | RSA_PSS_PARAMS *pss; |
85 | | /* for multi-prime RSA, defined in RFC 8017 */ |
86 | | STACK_OF(RSA_PRIME_INFO) *prime_infos; |
87 | | /* Be careful using this if the RSA structure is shared */ |
88 | | CRYPTO_EX_DATA ex_data; |
89 | | #endif |
90 | | CRYPTO_REF_COUNT references; |
91 | | int flags; |
92 | | /* Used to cache montgomery values */ |
93 | | BN_MONT_CTX *_method_mod_n; |
94 | | BN_MONT_CTX *_method_mod_p; |
95 | | BN_MONT_CTX *_method_mod_q; |
96 | | BN_BLINDING *blinding; |
97 | | BN_BLINDING *mt_blinding; |
98 | | CRYPTO_RWLOCK *lock; |
99 | | |
100 | | int dirty_cnt; |
101 | | }; |
102 | | |
103 | | struct rsa_meth_st { |
104 | | char *name; |
105 | | int (*rsa_pub_enc) (int flen, const unsigned char *from, |
106 | | unsigned char *to, RSA *rsa, int padding); |
107 | | int (*rsa_pub_dec) (int flen, const unsigned char *from, |
108 | | unsigned char *to, RSA *rsa, int padding); |
109 | | int (*rsa_priv_enc) (int flen, const unsigned char *from, |
110 | | unsigned char *to, RSA *rsa, int padding); |
111 | | int (*rsa_priv_dec) (int flen, const unsigned char *from, |
112 | | unsigned char *to, RSA *rsa, int padding); |
113 | | /* Can be null */ |
114 | | int (*rsa_mod_exp) (BIGNUM *r0, const BIGNUM *I, RSA *rsa, BN_CTX *ctx); |
115 | | /* Can be null */ |
116 | | int (*bn_mod_exp) (BIGNUM *r, const BIGNUM *a, const BIGNUM *p, |
117 | | const BIGNUM *m, BN_CTX *ctx, BN_MONT_CTX *m_ctx); |
118 | | /* called at new */ |
119 | | int (*init) (RSA *rsa); |
120 | | /* called at free */ |
121 | | int (*finish) (RSA *rsa); |
122 | | /* RSA_METHOD_FLAG_* things */ |
123 | | int flags; |
124 | | /* may be needed! */ |
125 | | char *app_data; |
126 | | /* |
127 | | * New sign and verify functions: some libraries don't allow arbitrary |
128 | | * data to be signed/verified: this allows them to be used. Note: for |
129 | | * this to work the RSA_public_decrypt() and RSA_private_encrypt() should |
130 | | * *NOT* be used. RSA_sign(), RSA_verify() should be used instead. |
131 | | */ |
132 | | int (*rsa_sign) (int type, |
133 | | const unsigned char *m, unsigned int m_length, |
134 | | unsigned char *sigret, unsigned int *siglen, |
135 | | const RSA *rsa); |
136 | | int (*rsa_verify) (int dtype, const unsigned char *m, |
137 | | unsigned int m_length, const unsigned char *sigbuf, |
138 | | unsigned int siglen, const RSA *rsa); |
139 | | /* |
140 | | * If this callback is NULL, the builtin software RSA key-gen will be |
141 | | * used. This is for behavioural compatibility whilst the code gets |
142 | | * rewired, but one day it would be nice to assume there are no such |
143 | | * things as "builtin software" implementations. |
144 | | */ |
145 | | int (*rsa_keygen) (RSA *rsa, int bits, BIGNUM *e, BN_GENCB *cb); |
146 | | int (*rsa_multi_prime_keygen) (RSA *rsa, int bits, int primes, |
147 | | BIGNUM *e, BN_GENCB *cb); |
148 | | }; |
149 | | |
150 | | /* Macros to test if a pkey or ctx is for a PSS key */ |
151 | 0 | #define pkey_is_pss(pkey) (pkey->ameth->pkey_id == EVP_PKEY_RSA_PSS) |
152 | 0 | #define pkey_ctx_is_pss(ctx) (ctx->pmeth->pkey_id == EVP_PKEY_RSA_PSS) |
153 | | int ossl_rsa_multiprime_derive(RSA *rsa, int bits, int primes, |
154 | | BIGNUM *e_value, |
155 | | STACK_OF(BIGNUM) *factors, STACK_OF(BIGNUM) *exps, |
156 | | STACK_OF(BIGNUM) *coeffs); |
157 | | |
158 | | RSA_PSS_PARAMS *ossl_rsa_pss_params_create(const EVP_MD *sigmd, |
159 | | const EVP_MD *mgf1md, int saltlen); |
160 | | int ossl_rsa_pss_get_param(const RSA_PSS_PARAMS *pss, const EVP_MD **pmd, |
161 | | const EVP_MD **pmgf1md, int *psaltlen); |
162 | | /* internal function to clear and free multi-prime parameters */ |
163 | | void ossl_rsa_multip_info_free_ex(RSA_PRIME_INFO *pinfo); |
164 | | void ossl_rsa_multip_info_free(RSA_PRIME_INFO *pinfo); |
165 | | RSA_PRIME_INFO *ossl_rsa_multip_info_new(void); |
166 | | int ossl_rsa_multip_calc_product(RSA *rsa); |
167 | | int ossl_rsa_multip_cap(int bits); |
168 | | |
169 | | int ossl_rsa_sp800_56b_validate_strength(int nbits, int strength); |
170 | | int ossl_rsa_check_pminusq_diff(BIGNUM *diff, const BIGNUM *p, const BIGNUM *q, |
171 | | int nbits); |
172 | | int ossl_rsa_get_lcm(BN_CTX *ctx, const BIGNUM *p, const BIGNUM *q, |
173 | | BIGNUM *lcm, BIGNUM *gcd, BIGNUM *p1, BIGNUM *q1, |
174 | | BIGNUM *p1q1); |
175 | | |
176 | | int ossl_rsa_check_public_exponent(const BIGNUM *e); |
177 | | int ossl_rsa_check_private_exponent(const RSA *rsa, int nbits, BN_CTX *ctx); |
178 | | int ossl_rsa_check_prime_factor(BIGNUM *p, BIGNUM *e, int nbits, BN_CTX *ctx); |
179 | | int ossl_rsa_check_prime_factor_range(const BIGNUM *p, int nbits, BN_CTX *ctx); |
180 | | int ossl_rsa_check_crt_components(const RSA *rsa, BN_CTX *ctx); |
181 | | |
182 | | int ossl_rsa_sp800_56b_pairwise_test(RSA *rsa, BN_CTX *ctx); |
183 | | int ossl_rsa_sp800_56b_check_public(const RSA *rsa); |
184 | | int ossl_rsa_sp800_56b_check_private(const RSA *rsa); |
185 | | int ossl_rsa_sp800_56b_check_keypair(const RSA *rsa, const BIGNUM *efixed, |
186 | | int strength, int nbits); |
187 | | int ossl_rsa_sp800_56b_generate_key(RSA *rsa, int nbits, const BIGNUM *efixed, |
188 | | BN_GENCB *cb); |
189 | | |
190 | | int ossl_rsa_sp800_56b_derive_params_from_pq(RSA *rsa, int nbits, |
191 | | const BIGNUM *e, BN_CTX *ctx); |
192 | | int ossl_rsa_fips186_4_gen_prob_primes(RSA *rsa, RSA_ACVP_TEST *test, |
193 | | int nbits, const BIGNUM *e, BN_CTX *ctx, |
194 | | BN_GENCB *cb); |
195 | | |
196 | | int ossl_rsa_padding_add_PKCS1_type_2_ex(OSSL_LIB_CTX *libctx, unsigned char *to, |
197 | | int tlen, const unsigned char *from, |
198 | | int flen); |
199 | | |
200 | | #endif /* OSSL_CRYPTO_RSA_LOCAL_H */ |