blob: 57a2cb2c8199f654cca2738282c602808386a9c4 [file] [log] [blame]
Adam Langley95c29f32014-06-20 12:00:00 -07001/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
2 * All rights reserved.
3 *
4 * This package is an SSL implementation written
5 * by Eric Young (eay@cryptsoft.com).
6 * The implementation was written so as to conform with Netscapes SSL.
7 *
8 * This library is free for commercial and non-commercial use as long as
9 * the following conditions are aheared to. The following conditions
10 * apply to all code found in this distribution, be it the RC4, RSA,
11 * lhash, DES, etc., code; not just the SSL code. The SSL documentation
12 * included with this distribution is covered by the same copyright terms
13 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
14 *
15 * Copyright remains Eric Young's, and as such any Copyright notices in
16 * the code are not to be removed.
17 * If this package is used in a product, Eric Young should be given attribution
18 * as the author of the parts of the library used.
19 * This can be in the form of a textual message at program startup or
20 * in documentation (online or textual) provided with the package.
21 *
22 * Redistribution and use in source and binary forms, with or without
23 * modification, are permitted provided that the following conditions
24 * are met:
25 * 1. Redistributions of source code must retain the copyright
26 * notice, this list of conditions and the following disclaimer.
27 * 2. Redistributions in binary form must reproduce the above copyright
28 * notice, this list of conditions and the following disclaimer in the
29 * documentation and/or other materials provided with the distribution.
30 * 3. All advertising materials mentioning features or use of this software
31 * must display the following acknowledgement:
32 * "This product includes cryptographic software written by
33 * Eric Young (eay@cryptsoft.com)"
34 * The word 'cryptographic' can be left out if the rouines from the library
35 * being used are not cryptographic related :-).
36 * 4. If you include any Windows specific code (or a derivative thereof) from
37 * the apps directory (application code) you must include an acknowledgement:
38 * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
39 *
40 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
41 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
44 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
45 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
46 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
48 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
49 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
50 * SUCH DAMAGE.
51 *
52 * The licence and distribution terms for any publically available version or
53 * derivative of this code cannot be changed. i.e. this code cannot simply be
54 * copied and put under another distribution licence
55 * [including the GNU Public Licence.] */
56
57#ifndef OPENSSL_HEADER_RSA_H
58#define OPENSSL_HEADER_RSA_H
59
60#include <openssl/base.h>
61
62#include <openssl/engine.h>
63#include <openssl/ex_data.h>
Adam Langley683d7bd2015-04-13 11:04:14 -070064#include <openssl/thread.h>
Adam Langley95c29f32014-06-20 12:00:00 -070065
66#if defined(__cplusplus)
67extern "C" {
68#endif
69
70
David Benjamin4512b792017-08-18 19:21:50 -040071// rsa.h contains functions for handling encryption and signature using RSA.
Adam Langley95c29f32014-06-20 12:00:00 -070072
73
David Benjamin4512b792017-08-18 19:21:50 -040074// Allocation and destruction.
David Benjamin2556f8b2018-08-24 14:58:18 -050075//
76// An |RSA| object represents a public or private RSA key. A given object may be
77// used concurrently on multiple threads by non-mutating functions, provided no
78// other thread is concurrently calling a mutating function. Unless otherwise
79// documented, functions which take a |const| pointer are non-mutating and
80// functions which take a non-|const| pointer are mutating.
Adam Langley95c29f32014-06-20 12:00:00 -070081
David Benjamin2556f8b2018-08-24 14:58:18 -050082// RSA_new returns a new, empty |RSA| object or NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070083OPENSSL_EXPORT RSA *RSA_new(void);
Adam Langley95c29f32014-06-20 12:00:00 -070084
David Benjamin4512b792017-08-18 19:21:50 -040085// RSA_new_method acts the same as |RSA_new| but takes an explicit |ENGINE|.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070086OPENSSL_EXPORT RSA *RSA_new_method(const ENGINE *engine);
Adam Langley95c29f32014-06-20 12:00:00 -070087
David Benjamin4512b792017-08-18 19:21:50 -040088// RSA_free decrements the reference count of |rsa| and frees it if the
89// reference count drops to zero.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070090OPENSSL_EXPORT void RSA_free(RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -070091
David Benjamin2556f8b2018-08-24 14:58:18 -050092// RSA_up_ref increments the reference count of |rsa| and returns one. It does
93// not mutate |rsa| for thread-safety purposes and may be used concurrently.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -070094OPENSSL_EXPORT int RSA_up_ref(RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -070095
96
David Benjamin4512b792017-08-18 19:21:50 -040097// Properties.
David Benjamin5a915032016-08-09 11:04:24 -040098
David Benjamin8dc226c2017-11-21 20:33:36 -050099// RSA_bits returns the size of |rsa|, in bits.
100OPENSSL_EXPORT unsigned RSA_bits(const RSA *rsa);
101
David Benjamin7e43e2e2020-02-07 14:06:42 -0500102// RSA_get0_n returns |rsa|'s public modulus.
103OPENSSL_EXPORT const BIGNUM *RSA_get0_n(const RSA *rsa);
104
105// RSA_get0_e returns |rsa|'s public exponent.
106OPENSSL_EXPORT const BIGNUM *RSA_get0_e(const RSA *rsa);
107
108// RSA_get0_d returns |rsa|'s private exponent. If |rsa| is a public key, this
109// value will be NULL.
110OPENSSL_EXPORT const BIGNUM *RSA_get0_d(const RSA *rsa);
111
112// RSA_get0_p returns |rsa|'s first private prime factor. If |rsa| is a public
113// key or lacks its prime factors, this value will be NULL.
114OPENSSL_EXPORT const BIGNUM *RSA_get0_p(const RSA *rsa);
115
116// RSA_get0_q returns |rsa|'s second private prime factor. If |rsa| is a public
117// key or lacks its prime factors, this value will be NULL.
118OPENSSL_EXPORT const BIGNUM *RSA_get0_q(const RSA *rsa);
119
120// RSA_get0_dmp1 returns d (mod p-1) for |rsa|. If |rsa| is a public key or
121// lacks CRT parameters, this value will be NULL.
122OPENSSL_EXPORT const BIGNUM *RSA_get0_dmp1(const RSA *rsa);
123
124// RSA_get0_dmq1 returns d (mod q-1) for |rsa|. If |rsa| is a public key or
125// lacks CRT parameters, this value will be NULL.
126OPENSSL_EXPORT const BIGNUM *RSA_get0_dmq1(const RSA *rsa);
127
128// RSA_get0_iqmp returns q^-1 (mod p). If |rsa| is a public key or lacks CRT
129// parameters, this value will be NULL.
130OPENSSL_EXPORT const BIGNUM *RSA_get0_iqmp(const RSA *rsa);
131
David Benjamin4512b792017-08-18 19:21:50 -0400132// RSA_get0_key sets |*out_n|, |*out_e|, and |*out_d|, if non-NULL, to |rsa|'s
133// modulus, public exponent, and private exponent, respectively. If |rsa| is a
134// public key, the private exponent will be set to NULL.
David Benjamin5a915032016-08-09 11:04:24 -0400135OPENSSL_EXPORT void RSA_get0_key(const RSA *rsa, const BIGNUM **out_n,
136 const BIGNUM **out_e, const BIGNUM **out_d);
137
David Benjamin4512b792017-08-18 19:21:50 -0400138// RSA_get0_factors sets |*out_p| and |*out_q|, if non-NULL, to |rsa|'s prime
139// factors. If |rsa| is a public key, they will be set to NULL.
David Benjamin5a915032016-08-09 11:04:24 -0400140OPENSSL_EXPORT void RSA_get0_factors(const RSA *rsa, const BIGNUM **out_p,
141 const BIGNUM **out_q);
142
David Benjamin4512b792017-08-18 19:21:50 -0400143// RSA_get0_crt_params sets |*out_dmp1|, |*out_dmq1|, and |*out_iqmp|, if
144// non-NULL, to |rsa|'s CRT parameters. These are d (mod p-1), d (mod q-1) and
145// q^-1 (mod p), respectively. If |rsa| is a public key, each parameter will be
146// set to NULL.
David Benjamin5a915032016-08-09 11:04:24 -0400147OPENSSL_EXPORT void RSA_get0_crt_params(const RSA *rsa, const BIGNUM **out_dmp1,
148 const BIGNUM **out_dmq1,
149 const BIGNUM **out_iqmp);
150
David Benjamin81f030b2016-08-12 14:48:19 -0400151// RSA_set0_key sets |rsa|'s modulus, public exponent, and private exponent to
152// |n|, |e|, and |d| respectively, if non-NULL. On success, it takes ownership
153// of each argument and returns one. Otherwise, it returns zero.
154//
155// |d| may be NULL, but |n| and |e| must either be non-NULL or already
156// configured on |rsa|.
David Benjamin08805fe2018-01-23 16:48:53 -0500157//
158// It is an error to call this function after |rsa| has been used for a
159// cryptographic operation. Construct a new |RSA| object instead.
David Benjamin81f030b2016-08-12 14:48:19 -0400160OPENSSL_EXPORT int RSA_set0_key(RSA *rsa, BIGNUM *n, BIGNUM *e, BIGNUM *d);
161
162// RSA_set0_factors sets |rsa|'s prime factors to |p| and |q|, if non-NULL, and
163// takes ownership of them. On success, it takes ownership of each argument and
164// returns one. Otherwise, it returns zero.
165//
166// Each argument must either be non-NULL or already configured on |rsa|.
David Benjamin08805fe2018-01-23 16:48:53 -0500167//
168// It is an error to call this function after |rsa| has been used for a
169// cryptographic operation. Construct a new |RSA| object instead.
David Benjamin81f030b2016-08-12 14:48:19 -0400170OPENSSL_EXPORT int RSA_set0_factors(RSA *rsa, BIGNUM *p, BIGNUM *q);
171
172// RSA_set0_crt_params sets |rsa|'s CRT parameters to |dmp1|, |dmq1|, and
173// |iqmp|, if non-NULL, and takes ownership of them. On success, it takes
174// ownership of its parameters and returns one. Otherwise, it returns zero.
175//
176// Each argument must either be non-NULL or already configured on |rsa|.
David Benjamin08805fe2018-01-23 16:48:53 -0500177//
178// It is an error to call this function after |rsa| has been used for a
179// cryptographic operation. Construct a new |RSA| object instead.
David Benjamin81f030b2016-08-12 14:48:19 -0400180OPENSSL_EXPORT int RSA_set0_crt_params(RSA *rsa, BIGNUM *dmp1, BIGNUM *dmq1,
181 BIGNUM *iqmp);
182
David Benjamin5a915032016-08-09 11:04:24 -0400183
David Benjamin4512b792017-08-18 19:21:50 -0400184// Key generation.
Adam Langley95c29f32014-06-20 12:00:00 -0700185
David Benjamin4512b792017-08-18 19:21:50 -0400186// RSA_generate_key_ex generates a new RSA key where the modulus has size
187// |bits| and the public exponent is |e|. If unsure, |RSA_F4| is a good value
188// for |e|. If |cb| is not NULL then it is called during the key generation
189// process. In addition to the calls documented for |BN_generate_prime_ex|, it
190// is called with event=2 when the n'th prime is rejected as unsuitable and
191// with event=3 when a suitable value for |p| is found.
192//
193// It returns one on success or zero on error.
Adam Langley9a547e12018-11-14 07:38:07 -0800194OPENSSL_EXPORT int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700195 BN_GENCB *cb);
Adam Langley95c29f32014-06-20 12:00:00 -0700196
David Benjamin4512b792017-08-18 19:21:50 -0400197// RSA_generate_key_fips behaves like |RSA_generate_key_ex| but performs
198// additional checks for FIPS compliance. The public exponent is always 65537
199// and |bits| must be either 2048 or 3072.
Steven Valdez467d3222017-05-16 14:35:22 -0400200OPENSSL_EXPORT int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb);
201
Adam Langley95c29f32014-06-20 12:00:00 -0700202
David Benjamin4512b792017-08-18 19:21:50 -0400203// Encryption / Decryption
David Benjamin2556f8b2018-08-24 14:58:18 -0500204//
205// These functions are considered non-mutating for thread-safety purposes and
206// may be used concurrently.
Adam Langley95c29f32014-06-20 12:00:00 -0700207
David Benjamin92812cb2018-09-03 16:20:09 -0500208// RSA_PKCS1_PADDING denotes PKCS#1 v1.5 padding. When used with encryption,
209// this is RSAES-PKCS1-v1_5. When used with signing, this is RSASSA-PKCS1-v1_5.
Adam Langley95c29f32014-06-20 12:00:00 -0700210#define RSA_PKCS1_PADDING 1
David Benjamin92812cb2018-09-03 16:20:09 -0500211
212// RSA_NO_PADDING denotes a raw RSA operation.
Adam Langley95c29f32014-06-20 12:00:00 -0700213#define RSA_NO_PADDING 3
David Benjamin92812cb2018-09-03 16:20:09 -0500214
215// RSA_PKCS1_OAEP_PADDING denotes the RSAES-OAEP encryption scheme.
Adam Langley95c29f32014-06-20 12:00:00 -0700216#define RSA_PKCS1_OAEP_PADDING 4
David Benjamin92812cb2018-09-03 16:20:09 -0500217
218// RSA_PKCS1_PSS_PADDING denotes the RSASSA-PSS signature scheme. This value may
219// not be passed into |RSA_sign_raw|, only |EVP_PKEY_CTX_set_rsa_padding|. See
220// also |RSA_sign_pss_mgf1| and |RSA_verify_pss_mgf1|.
Adam Langley95c29f32014-06-20 12:00:00 -0700221#define RSA_PKCS1_PSS_PADDING 6
222
David Benjamin4512b792017-08-18 19:21:50 -0400223// RSA_encrypt encrypts |in_len| bytes from |in| to the public key from |rsa|
224// and writes, at most, |max_out| bytes of encrypted data to |out|. The
225// |max_out| argument must be, at least, |RSA_size| in order to ensure success.
226//
227// It returns 1 on success or zero on error.
228//
229// The |padding| argument must be one of the |RSA_*_PADDING| values. If in
230// doubt, use |RSA_PKCS1_OAEP_PADDING| for new protocols but
231// |RSA_PKCS1_PADDING| is most common.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700232OPENSSL_EXPORT int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out,
233 size_t max_out, const uint8_t *in, size_t in_len,
234 int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700235
David Benjamin4512b792017-08-18 19:21:50 -0400236// RSA_decrypt decrypts |in_len| bytes from |in| with the private key from
237// |rsa| and writes, at most, |max_out| bytes of plaintext to |out|. The
238// |max_out| argument must be, at least, |RSA_size| in order to ensure success.
239//
240// It returns 1 on success or zero on error.
241//
242// The |padding| argument must be one of the |RSA_*_PADDING| values. If in
243// doubt, use |RSA_PKCS1_OAEP_PADDING| for new protocols.
244//
245// Passing |RSA_PKCS1_PADDING| into this function is deprecated and insecure. If
246// implementing a protocol using RSAES-PKCS1-V1_5, use |RSA_NO_PADDING| and then
247// check padding in constant-time combined with a swap to a random session key
248// or other mitigation. See "Chosen Ciphertext Attacks Against Protocols Based
249// on the RSA Encryption Standard PKCS #1", Daniel Bleichenbacher, Advances in
250// Cryptology (Crypto '98).
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700251OPENSSL_EXPORT int RSA_decrypt(RSA *rsa, size_t *out_len, uint8_t *out,
252 size_t max_out, const uint8_t *in, size_t in_len,
253 int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700254
David Benjamin4512b792017-08-18 19:21:50 -0400255// RSA_public_encrypt encrypts |flen| bytes from |from| to the public key in
256// |rsa| and writes the encrypted data to |to|. The |to| buffer must have at
257// least |RSA_size| bytes of space. It returns the number of bytes written, or
258// -1 on error. The |padding| argument must be one of the |RSA_*_PADDING|
259// values. If in doubt, use |RSA_PKCS1_OAEP_PADDING| for new protocols but
260// |RSA_PKCS1_PADDING| is most common.
261//
262// WARNING: this function is dangerous because it breaks the usual return value
263// convention. Use |RSA_encrypt| instead.
Matt Braithwaite978f16e2015-10-19 13:38:36 -0700264OPENSSL_EXPORT int RSA_public_encrypt(size_t flen, const uint8_t *from,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700265 uint8_t *to, RSA *rsa, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700266
David Benjamin4512b792017-08-18 19:21:50 -0400267// RSA_private_decrypt decrypts |flen| bytes from |from| with the public key in
268// |rsa| and writes the plaintext to |to|. The |to| buffer must have at least
269// |RSA_size| bytes of space. It returns the number of bytes written, or -1 on
270// error. The |padding| argument must be one of the |RSA_*_PADDING| values. If
271// in doubt, use |RSA_PKCS1_OAEP_PADDING| for new protocols. Passing
272// |RSA_PKCS1_PADDING| into this function is deprecated and insecure. See
273// |RSA_decrypt|.
274//
275// WARNING: this function is dangerous because it breaks the usual return value
276// convention. Use |RSA_decrypt| instead.
David Benjamin79c59a32015-09-19 13:35:39 -0400277OPENSSL_EXPORT int RSA_private_decrypt(size_t flen, const uint8_t *from,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700278 uint8_t *to, RSA *rsa, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700279
280
David Benjamin4512b792017-08-18 19:21:50 -0400281// Signing / Verification
David Benjamin2556f8b2018-08-24 14:58:18 -0500282//
283// These functions are considered non-mutating for thread-safety purposes and
284// may be used concurrently.
Adam Langley95c29f32014-06-20 12:00:00 -0700285
David Benjamin940475d2021-05-13 18:45:52 -0400286// RSA_sign signs |digest_len| bytes of digest from |digest| with |rsa| using
David Benjamin4512b792017-08-18 19:21:50 -0400287// RSASSA-PKCS1-v1_5. It writes, at most, |RSA_size(rsa)| bytes to |out|. On
288// successful return, the actual number of bytes written is written to
289// |*out_len|.
290//
David Benjamin940475d2021-05-13 18:45:52 -0400291// The |hash_nid| argument identifies the hash function used to calculate
292// |digest| and is embedded in the resulting signature. For example, it might be
David Benjamin4512b792017-08-18 19:21:50 -0400293// |NID_sha256|.
294//
295// It returns 1 on success and zero on error.
David Benjamin4512b792017-08-18 19:21:50 -0400296//
David Benjamin940475d2021-05-13 18:45:52 -0400297// WARNING: |digest| must be the result of hashing the data to be signed with
298// |hash_nid|. Passing unhashed inputs will not result in a secure signature
299// scheme.
300OPENSSL_EXPORT int RSA_sign(int hash_nid, const uint8_t *digest,
301 unsigned digest_len, uint8_t *out,
302 unsigned *out_len, RSA *rsa);
303
304// RSA_sign_pss_mgf1 signs |digest_len| bytes from |digest| with the public key
305// from |rsa| using RSASSA-PSS with MGF1 as the mask generation function. It
306// writes, at most, |max_out| bytes of signature data to |out|. The |max_out|
307// argument must be, at least, |RSA_size| in order to ensure success. It returns
308// 1 on success or zero on error.
309//
310// The |md| and |mgf1_md| arguments identify the hash used to calculate |digest|
David Benjamin4512b792017-08-18 19:21:50 -0400311// and the MGF1 hash, respectively. If |mgf1_md| is NULL, |md| is
312// used.
313//
314// |salt_len| specifies the expected salt length in bytes. If |salt_len| is -1,
315// then the salt length is the same as the hash length. If -2, then the salt
316// length is maximal given the size of |rsa|. If unsure, use -1.
David Benjamin940475d2021-05-13 18:45:52 -0400317//
318// WARNING: |digest| must be the result of hashing the data to be signed with
319// |md|. Passing unhashed inputs will not result in a secure signature scheme.
David Benjamin79d18bc2017-05-02 14:34:09 -0400320OPENSSL_EXPORT int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out,
David Benjamin940475d2021-05-13 18:45:52 -0400321 size_t max_out, const uint8_t *digest,
322 size_t digest_len, const EVP_MD *md,
David Benjamin79d18bc2017-05-02 14:34:09 -0400323 const EVP_MD *mgf1_md, int salt_len);
324
David Benjamin940475d2021-05-13 18:45:52 -0400325// RSA_sign_raw performs the private key portion of computing a signature with
326// |rsa|. It writes, at most, |max_out| bytes of signature data to |out|. The
327// |max_out| argument must be, at least, |RSA_size| in order to ensure the
328// output fits. It returns 1 on success or zero on error.
David Benjamin4512b792017-08-18 19:21:50 -0400329//
David Benjamin940475d2021-05-13 18:45:52 -0400330// If |padding| is |RSA_PKCS1_PADDING|, this function wraps |in| with the
331// padding portion of RSASSA-PKCS1-v1_5 and then performs the raw private key
332// operation. The caller is responsible for hashing the input and wrapping it in
333// a DigestInfo structure.
David Benjamin4512b792017-08-18 19:21:50 -0400334//
David Benjamin940475d2021-05-13 18:45:52 -0400335// If |padding| is |RSA_NO_PADDING|, this function only performs the raw private
336// key operation, interpreting |in| as a integer modulo n. The caller is
337// responsible for hashing the input and encoding it for the signature scheme
338// being implemented.
339//
340// WARNING: This function is a building block for a signature scheme, not a
341// complete one. |in| must be the result of hashing and encoding the data as
342// needed for the scheme being implemented. Passing in arbitrary inputs will not
343// result in a secure signature scheme.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700344OPENSSL_EXPORT int RSA_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
345 size_t max_out, const uint8_t *in,
346 size_t in_len, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700347
David Benjamin4512b792017-08-18 19:21:50 -0400348// RSA_verify verifies that |sig_len| bytes from |sig| are a valid,
David Benjamin940475d2021-05-13 18:45:52 -0400349// RSASSA-PKCS1-v1_5 signature of |digest_len| bytes at |digest| by |rsa|.
David Benjamin4512b792017-08-18 19:21:50 -0400350//
David Benjamin940475d2021-05-13 18:45:52 -0400351// The |hash_nid| argument identifies the hash function used to calculate
352// |digest| and is embedded in the resulting signature in order to prevent hash
David Benjamin4512b792017-08-18 19:21:50 -0400353// confusion attacks. For example, it might be |NID_sha256|.
354//
355// It returns one if the signature is valid and zero otherwise.
356//
357// WARNING: this differs from the original, OpenSSL function which additionally
358// returned -1 on error.
David Benjamin940475d2021-05-13 18:45:52 -0400359//
360// WARNING: |digest| must be the result of hashing the data to be verified with
361// |hash_nid|. Passing unhashed input will not result in a secure signature
362// scheme.
363OPENSSL_EXPORT int RSA_verify(int hash_nid, const uint8_t *digest,
364 size_t digest_len, const uint8_t *sig,
365 size_t sig_len, RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700366
David Benjamin4512b792017-08-18 19:21:50 -0400367// RSA_verify_pss_mgf1 verifies that |sig_len| bytes from |sig| are a valid,
David Benjamin940475d2021-05-13 18:45:52 -0400368// RSASSA-PSS signature of |digest_len| bytes at |digest| by |rsa|. It returns
369// one if the signature is valid and zero otherwise. MGF1 is used as the mask
David Benjamin4512b792017-08-18 19:21:50 -0400370// generation function.
371//
David Benjamin940475d2021-05-13 18:45:52 -0400372// The |md| and |mgf1_md| arguments identify the hash used to calculate |digest|
David Benjamin4512b792017-08-18 19:21:50 -0400373// and the MGF1 hash, respectively. If |mgf1_md| is NULL, |md| is
374// used. |salt_len| specifies the expected salt length in bytes.
375//
376// If |salt_len| is -1, then the salt length is the same as the hash length. If
377// -2, then the salt length is recovered and all values accepted. If unsure, use
378// -1.
David Benjamin940475d2021-05-13 18:45:52 -0400379//
380// WARNING: |digest| must be the result of hashing the data to be verified with
381// |md|. Passing unhashed input will not result in a secure signature scheme.
382OPENSSL_EXPORT int RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *digest,
383 size_t digest_len, const EVP_MD *md,
David Benjamin79d18bc2017-05-02 14:34:09 -0400384 const EVP_MD *mgf1_md, int salt_len,
385 const uint8_t *sig, size_t sig_len);
386
David Benjamin940475d2021-05-13 18:45:52 -0400387// RSA_verify_raw performs the public key portion of verifying |in_len| bytes of
388// signature from |in| using the public key from |rsa|. On success, it returns
389// one and writes, at most, |max_out| bytes of output to |out|. The |max_out|
390// argument must be, at least, |RSA_size| in order to ensure the output fits. On
391// failure or invalid input, it returns zero.
David Benjamin4512b792017-08-18 19:21:50 -0400392//
David Benjamin940475d2021-05-13 18:45:52 -0400393// If |padding| is |RSA_PKCS1_PADDING|, this function checks the padding portion
394// of RSASSA-PKCS1-v1_5 and outputs the remainder of the encoded digest. The
395// caller is responsible for checking the output is a DigestInfo-wrapped digest
396// of the message.
David Benjamin4512b792017-08-18 19:21:50 -0400397//
David Benjamin940475d2021-05-13 18:45:52 -0400398// If |padding| is |RSA_NO_PADDING|, this function only performs the raw public
399// key operation. The caller is responsible for checking the output is a valid
400// result for the signature scheme being implemented.
401//
402// WARNING: This function is a building block for a signature scheme, not a
David Benjamin5fd91db2021-06-10 10:37:38 -0400403// complete one. Checking for arbitrary strings in |out| will not result in a
David Benjamin940475d2021-05-13 18:45:52 -0400404// secure signature scheme.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700405OPENSSL_EXPORT int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out,
406 size_t max_out, const uint8_t *in,
407 size_t in_len, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700408
David Benjamin940475d2021-05-13 18:45:52 -0400409// RSA_private_encrypt performs the private key portion of computing a signature
410// with |rsa|. It takes |flen| bytes from |from| as input and writes the result
411// to |to|. The |to| buffer must have at least |RSA_size| bytes of space. It
412// returns the number of bytes written, or -1 on error.
David Benjamin4512b792017-08-18 19:21:50 -0400413//
David Benjamin940475d2021-05-13 18:45:52 -0400414// For the interpretation of |padding| and the input, see |RSA_sign_raw|.
415//
416// WARNING: This function is a building block for a signature scheme, not a
417// complete one. See |RSA_sign_raw| for details.
418//
419// WARNING: This function is dangerous because it breaks the usual return value
David Benjamin4512b792017-08-18 19:21:50 -0400420// convention. Use |RSA_sign_raw| instead.
Matt Braithwaite978f16e2015-10-19 13:38:36 -0700421OPENSSL_EXPORT int RSA_private_encrypt(size_t flen, const uint8_t *from,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700422 uint8_t *to, RSA *rsa, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700423
David Benjamin940475d2021-05-13 18:45:52 -0400424// RSA_public_decrypt performs the public key portion of verifying |flen| bytes
425// of signature from |from| using the public key from |rsa|. It writes the
426// result to |to|, which must have at least |RSA_size| bytes of space. It
427// returns the number of bytes written, or -1 on error.
David Benjamin4512b792017-08-18 19:21:50 -0400428//
David Benjamin940475d2021-05-13 18:45:52 -0400429// For the interpretation of |padding| and the result, see |RSA_verify_raw|.
430//
431// WARNING: This function is a building block for a signature scheme, not a
432// complete one. See |RSA_verify_raw| for details.
433//
434// WARNING: This function is dangerous because it breaks the usual return value
David Benjamin4512b792017-08-18 19:21:50 -0400435// convention. Use |RSA_verify_raw| instead.
Matt Braithwaite978f16e2015-10-19 13:38:36 -0700436OPENSSL_EXPORT int RSA_public_decrypt(size_t flen, const uint8_t *from,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700437 uint8_t *to, RSA *rsa, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700438
439
David Benjamin4512b792017-08-18 19:21:50 -0400440// Utility functions.
Adam Langley95c29f32014-06-20 12:00:00 -0700441
David Benjamin4512b792017-08-18 19:21:50 -0400442// RSA_size returns the number of bytes in the modulus, which is also the size
443// of a signature or encrypted value using |rsa|.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700444OPENSSL_EXPORT unsigned RSA_size(const RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700445
David Benjamin4512b792017-08-18 19:21:50 -0400446// RSA_is_opaque returns one if |rsa| is opaque and doesn't expose its key
447// material. Otherwise it returns zero.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700448OPENSSL_EXPORT int RSA_is_opaque(const RSA *rsa);
David Benjaminecc0ce72014-07-18 18:39:42 -0400449
David Benjamin4512b792017-08-18 19:21:50 -0400450// RSAPublicKey_dup allocates a fresh |RSA| and copies the public key from
451// |rsa| into it. It returns the fresh |RSA| object, or NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700452OPENSSL_EXPORT RSA *RSAPublicKey_dup(const RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700453
David Benjamin4512b792017-08-18 19:21:50 -0400454// RSAPrivateKey_dup allocates a fresh |RSA| and copies the private key from
455// |rsa| into it. It returns the fresh |RSA| object, or NULL on error.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700456OPENSSL_EXPORT RSA *RSAPrivateKey_dup(const RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700457
David Benjamin4512b792017-08-18 19:21:50 -0400458// RSA_check_key performs basic validity tests on |rsa|. It returns one if
459// they pass and zero otherwise. Opaque keys and public keys always pass. If it
460// returns zero then a more detailed error is available on the error queue.
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700461OPENSSL_EXPORT int RSA_check_key(const RSA *rsa);
Adam Langley05b73772014-07-25 12:03:51 -0700462
David Benjamin2556f8b2018-08-24 14:58:18 -0500463// RSA_check_fips performs public key validity tests on |key|. It returns one if
464// they pass and zero otherwise. Opaque keys always fail. This function does not
465// mutate |rsa| for thread-safety purposes and may be used concurrently.
Steven Valdez400d0b72017-04-06 14:55:18 -0400466OPENSSL_EXPORT int RSA_check_fips(RSA *key);
Steven Valdezd0b98822017-04-11 12:46:03 -0400467
David Benjamin4512b792017-08-18 19:21:50 -0400468// RSA_verify_PKCS1_PSS_mgf1 verifies that |EM| is a correct PSS padding of
469// |mHash|, where |mHash| is a digest produced by |Hash|. |EM| must point to
470// exactly |RSA_size(rsa)| bytes of data. The |mgf1Hash| argument specifies the
471// hash function for generating the mask. If NULL, |Hash| is used. The |sLen|
472// argument specifies the expected salt length in bytes. If |sLen| is -1 then
473// the salt length is the same as the hash length. If -2, then the salt length
474// is recovered and all values accepted.
475//
476// If unsure, use -1.
477//
478// It returns one on success or zero on error.
479//
480// This function implements only the low-level padding logic. Use
481// |RSA_verify_pss_mgf1| instead.
David Benjamin2556f8b2018-08-24 14:58:18 -0500482OPENSSL_EXPORT int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa,
483 const uint8_t *mHash,
Adam Langley20b64fd2015-03-20 16:39:54 -0700484 const EVP_MD *Hash,
485 const EVP_MD *mgf1Hash,
486 const uint8_t *EM, int sLen);
487
David Benjamin4512b792017-08-18 19:21:50 -0400488// RSA_padding_add_PKCS1_PSS_mgf1 writes a PSS padding of |mHash| to |EM|,
489// where |mHash| is a digest produced by |Hash|. |RSA_size(rsa)| bytes of
490// output will be written to |EM|. The |mgf1Hash| argument specifies the hash
491// function for generating the mask. If NULL, |Hash| is used. The |sLen|
492// argument specifies the expected salt length in bytes. If |sLen| is -1 then
493// the salt length is the same as the hash length. If -2, then the salt length
494// is maximal given the space in |EM|.
495//
496// It returns one on success or zero on error.
497//
498// This function implements only the low-level padding logic. Use
499// |RSA_sign_pss_mgf1| instead.
David Benjamin2556f8b2018-08-24 14:58:18 -0500500OPENSSL_EXPORT int RSA_padding_add_PKCS1_PSS_mgf1(const RSA *rsa, uint8_t *EM,
Adam Langley20b64fd2015-03-20 16:39:54 -0700501 const uint8_t *mHash,
502 const EVP_MD *Hash,
503 const EVP_MD *mgf1Hash,
504 int sLen);
505
David Benjamin4512b792017-08-18 19:21:50 -0400506// RSA_padding_add_PKCS1_OAEP_mgf1 writes an OAEP padding of |from| to |to|
507// with the given parameters and hash functions. If |md| is NULL then SHA-1 is
508// used. If |mgf1md| is NULL then the value of |md| is used (which means SHA-1
509// if that, in turn, is NULL).
510//
511// It returns one on success or zero on error.
Adam Langleyaaccbfe2016-04-13 08:19:03 -0700512OPENSSL_EXPORT int RSA_padding_add_PKCS1_OAEP_mgf1(
David Benjaminf466cdb2017-03-14 15:35:27 -0400513 uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len,
514 const uint8_t *param, size_t param_len, const EVP_MD *md,
Adam Langleyaaccbfe2016-04-13 08:19:03 -0700515 const EVP_MD *mgf1md);
516
David Benjamin940475d2021-05-13 18:45:52 -0400517// RSA_add_pkcs1_prefix builds a version of |digest| prefixed with the
518// DigestInfo header for the given hash function and sets |out_msg| to point to
519// it. On successful return, if |*is_alloced| is one, the caller must release
David Benjamin54c259d2017-09-07 21:46:41 -0400520// |*out_msg| with |OPENSSL_free|.
David Benjaminb0acb772015-05-28 16:53:31 -0400521OPENSSL_EXPORT int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len,
522 int *is_alloced, int hash_nid,
David Benjamin940475d2021-05-13 18:45:52 -0400523 const uint8_t *digest,
524 size_t digest_len);
David Benjaminb0acb772015-05-28 16:53:31 -0400525
Adam Langley20b64fd2015-03-20 16:39:54 -0700526
David Benjamin4512b792017-08-18 19:21:50 -0400527// ASN.1 functions.
Adam Langley95c29f32014-06-20 12:00:00 -0700528
David Benjamincfafcd42021-10-14 17:22:23 -0400529// RSA_parse_public_key parses a DER-encoded RSAPublicKey structure (RFC 8017)
David Benjamin4512b792017-08-18 19:21:50 -0400530// from |cbs| and advances |cbs|. It returns a newly-allocated |RSA| or NULL on
531// error.
David Benjaminc0e245a2015-06-17 00:02:59 -0400532OPENSSL_EXPORT RSA *RSA_parse_public_key(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700533
David Benjamin4512b792017-08-18 19:21:50 -0400534// RSA_public_key_from_bytes parses |in| as a DER-encoded RSAPublicKey structure
David Benjamincfafcd42021-10-14 17:22:23 -0400535// (RFC 8017). It returns a newly-allocated |RSA| or NULL on error.
David Benjaminc0e245a2015-06-17 00:02:59 -0400536OPENSSL_EXPORT RSA *RSA_public_key_from_bytes(const uint8_t *in, size_t in_len);
537
David Benjamin4512b792017-08-18 19:21:50 -0400538// RSA_marshal_public_key marshals |rsa| as a DER-encoded RSAPublicKey structure
David Benjamincfafcd42021-10-14 17:22:23 -0400539// (RFC 8017) and appends the result to |cbb|. It returns one on success and
David Benjamin4512b792017-08-18 19:21:50 -0400540// zero on failure.
David Benjaminc0e245a2015-06-17 00:02:59 -0400541OPENSSL_EXPORT int RSA_marshal_public_key(CBB *cbb, const RSA *rsa);
542
David Benjamin4512b792017-08-18 19:21:50 -0400543// RSA_public_key_to_bytes marshals |rsa| as a DER-encoded RSAPublicKey
David Benjamincfafcd42021-10-14 17:22:23 -0400544// structure (RFC 8017) and, on success, sets |*out_bytes| to a newly allocated
David Benjamin4512b792017-08-18 19:21:50 -0400545// buffer containing the result and returns one. Otherwise, it returns zero. The
546// result should be freed with |OPENSSL_free|.
David Benjaminc0e245a2015-06-17 00:02:59 -0400547OPENSSL_EXPORT int RSA_public_key_to_bytes(uint8_t **out_bytes, size_t *out_len,
548 const RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700549
David Benjamincfafcd42021-10-14 17:22:23 -0400550// RSA_parse_private_key parses a DER-encoded RSAPrivateKey structure (RFC 8017)
David Benjamin4512b792017-08-18 19:21:50 -0400551// from |cbs| and advances |cbs|. It returns a newly-allocated |RSA| or NULL on
552// error.
David Benjamin74f71102015-06-27 14:56:25 -0400553OPENSSL_EXPORT RSA *RSA_parse_private_key(CBS *cbs);
Adam Langley95c29f32014-06-20 12:00:00 -0700554
David Benjamin4512b792017-08-18 19:21:50 -0400555// RSA_private_key_from_bytes parses |in| as a DER-encoded RSAPrivateKey
David Benjamincfafcd42021-10-14 17:22:23 -0400556// structure (RFC 8017). It returns a newly-allocated |RSA| or NULL on error.
David Benjamin74f71102015-06-27 14:56:25 -0400557OPENSSL_EXPORT RSA *RSA_private_key_from_bytes(const uint8_t *in,
558 size_t in_len);
559
David Benjamin4512b792017-08-18 19:21:50 -0400560// RSA_marshal_private_key marshals |rsa| as a DER-encoded RSAPrivateKey
David Benjamincfafcd42021-10-14 17:22:23 -0400561// structure (RFC 8017) and appends the result to |cbb|. It returns one on
David Benjamin4512b792017-08-18 19:21:50 -0400562// success and zero on failure.
David Benjamin74f71102015-06-27 14:56:25 -0400563OPENSSL_EXPORT int RSA_marshal_private_key(CBB *cbb, const RSA *rsa);
564
David Benjamin4512b792017-08-18 19:21:50 -0400565// RSA_private_key_to_bytes marshals |rsa| as a DER-encoded RSAPrivateKey
David Benjamincfafcd42021-10-14 17:22:23 -0400566// structure (RFC 8017) and, on success, sets |*out_bytes| to a newly allocated
David Benjamin4512b792017-08-18 19:21:50 -0400567// buffer containing the result and returns one. Otherwise, it returns zero. The
568// result should be freed with |OPENSSL_free|.
David Benjamin74f71102015-06-27 14:56:25 -0400569OPENSSL_EXPORT int RSA_private_key_to_bytes(uint8_t **out_bytes,
570 size_t *out_len, const RSA *rsa);
Adam Langley95c29f32014-06-20 12:00:00 -0700571
572
David Benjamin4512b792017-08-18 19:21:50 -0400573// ex_data functions.
574//
575// See |ex_data.h| for details.
Adam Langley95c29f32014-06-20 12:00:00 -0700576
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700577OPENSSL_EXPORT int RSA_get_ex_new_index(long argl, void *argp,
David Benjamin8a589332015-12-04 23:14:35 -0500578 CRYPTO_EX_unused *unused,
David Benjamind94682d2017-05-14 17:10:18 -0400579 CRYPTO_EX_dup *dup_unused,
Adam Langleyeb7d2ed2014-07-30 16:02:14 -0700580 CRYPTO_EX_free *free_func);
David Benjamin27e377e2017-07-31 19:09:42 -0400581OPENSSL_EXPORT int RSA_set_ex_data(RSA *rsa, int idx, void *arg);
582OPENSSL_EXPORT void *RSA_get_ex_data(const RSA *rsa, int idx);
Adam Langley95c29f32014-06-20 12:00:00 -0700583
David Benjamin6fad7bc2015-09-07 13:12:05 -0400584
David Benjamin4512b792017-08-18 19:21:50 -0400585// Flags.
David Benjamin6fad7bc2015-09-07 13:12:05 -0400586
David Benjamin4512b792017-08-18 19:21:50 -0400587// RSA_FLAG_OPAQUE specifies that this RSA_METHOD does not expose its key
588// material. This may be set if, for instance, it is wrapping some other crypto
589// API, like a platform key store.
David Benjaminecc0ce72014-07-18 18:39:42 -0400590#define RSA_FLAG_OPAQUE 1
Adam Langley95c29f32014-06-20 12:00:00 -0700591
David Benjamin4512b792017-08-18 19:21:50 -0400592// RSA_FLAG_NO_BLINDING disables blinding of private operations, which is a
593// dangerous thing to do. It is deprecated and should not be used. It will
594// be ignored whenever possible.
595//
596// This flag must be used if a key without the public exponent |e| is used for
597// private key operations; avoid using such keys whenever possible.
Adam Langley95c29f32014-06-20 12:00:00 -0700598#define RSA_FLAG_NO_BLINDING 8
599
David Benjamin4512b792017-08-18 19:21:50 -0400600// RSA_FLAG_EXT_PKEY is deprecated and ignored.
Adam Langley95c29f32014-06-20 12:00:00 -0700601#define RSA_FLAG_EXT_PKEY 0x20
602
Adam Langley95c29f32014-06-20 12:00:00 -0700603
David Benjamin4512b792017-08-18 19:21:50 -0400604// RSA public exponent values.
Adam Langley95c29f32014-06-20 12:00:00 -0700605
606#define RSA_3 0x3
607#define RSA_F4 0x10001
608
609
David Benjamin4512b792017-08-18 19:21:50 -0400610// Deprecated functions.
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700611
David Benjamina0c87ad2017-12-18 16:34:49 -0500612#define RSA_METHOD_FLAG_NO_CHECK RSA_FLAG_OPAQUE
613
614// RSA_flags returns the flags for |rsa|. These are a bitwise OR of |RSA_FLAG_*|
615// constants.
616OPENSSL_EXPORT int RSA_flags(const RSA *rsa);
617
David Benjamincd0b7672021-11-29 17:38:53 -0500618// RSA_test_flags returns the subset of flags in |flags| which are set in |rsa|.
619OPENSSL_EXPORT int RSA_test_flags(const RSA *rsa, int flags);
620
David Benjamin4512b792017-08-18 19:21:50 -0400621// RSA_blinding_on returns one.
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700622OPENSSL_EXPORT int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);
623
David Benjamin4512b792017-08-18 19:21:50 -0400624// RSA_generate_key behaves like |RSA_generate_key_ex|, which is what you
625// should use instead. It returns NULL on error, or a newly-allocated |RSA| on
626// success. This function is provided for compatibility only. The |callback|
627// and |cb_arg| parameters must be NULL.
Matt Braithwaite1cb49cd2015-06-17 17:16:02 -0700628OPENSSL_EXPORT RSA *RSA_generate_key(int bits, unsigned long e, void *callback,
629 void *cb_arg);
630
David Benjamincfafcd42021-10-14 17:22:23 -0400631// d2i_RSAPublicKey parses a DER-encoded RSAPublicKey structure (RFC 8017) from
632// |len| bytes at |*inp|, as described in |d2i_SAMPLE|.
633//
634// Use |RSA_parse_public_key| instead.
David Benjamin6fad7bc2015-09-07 13:12:05 -0400635OPENSSL_EXPORT RSA *d2i_RSAPublicKey(RSA **out, const uint8_t **inp, long len);
636
David Benjamincfafcd42021-10-14 17:22:23 -0400637// i2d_RSAPublicKey marshals |in| to a DER-encoded RSAPublicKey structure (RFC
638// 8017), as described in |i2d_SAMPLE|.
639//
640// Use |RSA_marshal_public_key| instead.
David Benjamin6fad7bc2015-09-07 13:12:05 -0400641OPENSSL_EXPORT int i2d_RSAPublicKey(const RSA *in, uint8_t **outp);
642
David Benjamincfafcd42021-10-14 17:22:23 -0400643// d2i_RSAPrivateKey parses a DER-encoded RSAPrivateKey structure (RFC 8017)
644// from |len| bytes at |*inp|, as described in |d2i_SAMPLE|.
645//
646// Use |RSA_parse_private_key| instead.
David Benjamin6fad7bc2015-09-07 13:12:05 -0400647OPENSSL_EXPORT RSA *d2i_RSAPrivateKey(RSA **out, const uint8_t **inp, long len);
648
David Benjamincfafcd42021-10-14 17:22:23 -0400649// i2d_RSAPrivateKey marshals |in| to a DER-encoded RSAPrivateKey structure (RFC
650// 8017), as described in |i2d_SAMPLE|.
651//
652// Use |RSA_marshal_private_key| instead.
David Benjamin6fad7bc2015-09-07 13:12:05 -0400653OPENSSL_EXPORT int i2d_RSAPrivateKey(const RSA *in, uint8_t **outp);
654
David Benjamin4512b792017-08-18 19:21:50 -0400655// RSA_padding_add_PKCS1_PSS acts like |RSA_padding_add_PKCS1_PSS_mgf1| but the
656// |mgf1Hash| parameter of the latter is implicitly set to |Hash|.
657//
658// This function implements only the low-level padding logic. Use
659// |RSA_sign_pss_mgf1| instead.
David Benjamin2556f8b2018-08-24 14:58:18 -0500660OPENSSL_EXPORT int RSA_padding_add_PKCS1_PSS(const RSA *rsa, uint8_t *EM,
Adam Langley8ba4b2d2016-03-07 16:35:18 -0800661 const uint8_t *mHash,
662 const EVP_MD *Hash, int sLen);
663
David Benjamin4512b792017-08-18 19:21:50 -0400664// RSA_verify_PKCS1_PSS acts like |RSA_verify_PKCS1_PSS_mgf1| but the
665// |mgf1Hash| parameter of the latter is implicitly set to |Hash|.
666//
667// This function implements only the low-level padding logic. Use
668// |RSA_verify_pss_mgf1| instead.
David Benjamin2556f8b2018-08-24 14:58:18 -0500669OPENSSL_EXPORT int RSA_verify_PKCS1_PSS(const RSA *rsa, const uint8_t *mHash,
Adam Langley8ba4b2d2016-03-07 16:35:18 -0800670 const EVP_MD *Hash, const uint8_t *EM,
671 int sLen);
672
David Benjamin4512b792017-08-18 19:21:50 -0400673// RSA_padding_add_PKCS1_OAEP acts like |RSA_padding_add_PKCS1_OAEP_mgf1| but
674// the |md| and |mgf1md| parameters of the latter are implicitly set to NULL,
675// which means SHA-1.
David Benjaminf466cdb2017-03-14 15:35:27 -0400676OPENSSL_EXPORT int RSA_padding_add_PKCS1_OAEP(uint8_t *to, size_t to_len,
Adam Langleyaaccbfe2016-04-13 08:19:03 -0700677 const uint8_t *from,
David Benjaminf466cdb2017-03-14 15:35:27 -0400678 size_t from_len,
Adam Langleyaaccbfe2016-04-13 08:19:03 -0700679 const uint8_t *param,
David Benjaminf466cdb2017-03-14 15:35:27 -0400680 size_t param_len);
Adam Langleyaaccbfe2016-04-13 08:19:03 -0700681
David Benjamin2f5100e2018-05-11 18:20:56 -0400682// RSA_print prints a textual representation of |rsa| to |bio|. It returns one
683// on success or zero otherwise.
684OPENSSL_EXPORT int RSA_print(BIO *bio, const RSA *rsa, int indent);
685
Shelley Vohr0446b592021-09-09 11:25:24 +0200686// RSA_get0_pss_params returns NULL. In OpenSSL, this function retries RSA-PSS
687// parameters associated with |RSA| objects, but BoringSSL does not support
688// the id-RSASSA-PSS key encoding.
689OPENSSL_EXPORT const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *rsa);
690
Adam Langleyc3ef76f2015-04-13 14:34:17 -0700691
Adam Langley95c29f32014-06-20 12:00:00 -0700692struct rsa_meth_st {
693 struct openssl_method_common_st common;
694
695 void *app_data;
696
697 int (*init)(RSA *rsa);
698 int (*finish)(RSA *rsa);
699
David Benjamin4512b792017-08-18 19:21:50 -0400700 // size returns the size of the RSA modulus in bytes.
David Benjamin925fee32014-07-11 14:14:08 -0400701 size_t (*size)(const RSA *rsa);
702
Adam Langley95c29f32014-06-20 12:00:00 -0700703 int (*sign)(int type, const uint8_t *m, unsigned int m_length,
704 uint8_t *sigret, unsigned int *siglen, const RSA *rsa);
705
David Benjamin4512b792017-08-18 19:21:50 -0400706 // These functions mirror the |RSA_*| functions of the same name.
Adam Langley95c29f32014-06-20 12:00:00 -0700707 int (*sign_raw)(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
708 const uint8_t *in, size_t in_len, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700709 int (*decrypt)(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
710 const uint8_t *in, size_t in_len, int padding);
Adam Langley95c29f32014-06-20 12:00:00 -0700711
David Benjamin4512b792017-08-18 19:21:50 -0400712 // private_transform takes a big-endian integer from |in|, calculates the
713 // d'th power of it, modulo the RSA modulus and writes the result as a
714 // big-endian integer to |out|. Both |in| and |out| are |len| bytes long and
715 // |len| is always equal to |RSA_size(rsa)|. If the result of the transform
716 // can be represented in fewer than |len| bytes, then |out| must be zero
717 // padded on the left.
718 //
719 // It returns one on success and zero otherwise.
720 //
721 // RSA decrypt and sign operations will call this, thus an ENGINE might wish
722 // to override it in order to avoid having to implement the padding
723 // functionality demanded by those, higher level, operations.
Adam Langley6bc658d2014-08-18 13:29:45 -0700724 int (*private_transform)(RSA *rsa, uint8_t *out, const uint8_t *in,
725 size_t len);
726
Adam Langley95c29f32014-06-20 12:00:00 -0700727 int flags;
Adam Langley95c29f32014-06-20 12:00:00 -0700728};
729
730
David Benjamin4512b792017-08-18 19:21:50 -0400731// Private functions.
Adam Langley95c29f32014-06-20 12:00:00 -0700732
733typedef struct bn_blinding_st BN_BLINDING;
734
735struct rsa_st {
Adam Langley95c29f32014-06-20 12:00:00 -0700736 RSA_METHOD *meth;
737
David Benjamin38c20fe2018-02-09 15:52:58 -0500738 // Access to the following fields was historically allowed, but
739 // deprecated. Use |RSA_get0_*| and |RSA_set0_*| instead. Access to all other
740 // fields is forbidden and will cause threading errors.
Adam Langley95c29f32014-06-20 12:00:00 -0700741 BIGNUM *n;
742 BIGNUM *e;
743 BIGNUM *d;
744 BIGNUM *p;
745 BIGNUM *q;
746 BIGNUM *dmp1;
747 BIGNUM *dmq1;
748 BIGNUM *iqmp;
Adam Langley839b8812015-05-26 11:36:46 -0700749
David Benjamin4512b792017-08-18 19:21:50 -0400750 // be careful using this if the RSA structure is shared
Adam Langley95c29f32014-06-20 12:00:00 -0700751 CRYPTO_EX_DATA ex_data;
Adam Langley0da323a2015-05-15 12:49:30 -0700752 CRYPTO_refcount_t references;
Adam Langley95c29f32014-06-20 12:00:00 -0700753 int flags;
754
Adam Langley683d7bd2015-04-13 11:04:14 -0700755 CRYPTO_MUTEX lock;
756
David Benjamin4512b792017-08-18 19:21:50 -0400757 // Used to cache montgomery values. The creation of these values is protected
758 // by |lock|.
David Benjamin8fb0f522015-11-03 18:24:07 -0500759 BN_MONT_CTX *mont_n;
760 BN_MONT_CTX *mont_p;
761 BN_MONT_CTX *mont_q;
Adam Langley95c29f32014-06-20 12:00:00 -0700762
David Benjamin38c20fe2018-02-09 15:52:58 -0500763 // The following fields are copies of |d|, |dmp1|, and |dmq1|, respectively,
764 // but with the correct widths to prevent side channels. These must use
765 // separate copies due to threading concerns caused by OpenSSL's API
766 // mistakes. See https://github.com/openssl/openssl/issues/5158 and
767 // the |freeze_private_key| implementation.
768 BIGNUM *d_fixed, *dmp1_fixed, *dmq1_fixed;
769
David Benjaminbe837402018-01-24 17:22:17 -0500770 // inv_small_mod_large_mont is q^-1 mod p in Montgomery form, using |mont_p|,
771 // if |p| >= |q|. Otherwise, it is p^-1 mod q in Montgomery form, using
772 // |mont_q|.
773 BIGNUM *inv_small_mod_large_mont;
774
David Benjamin4512b792017-08-18 19:21:50 -0400775 // num_blindings contains the size of the |blindings| and |blindings_inuse|
776 // arrays. This member and the |blindings_inuse| array are protected by
777 // |lock|.
Adam Langley95c29f32014-06-20 12:00:00 -0700778 unsigned num_blindings;
David Benjamin4512b792017-08-18 19:21:50 -0400779 // blindings is an array of BN_BLINDING structures that can be reserved by a
780 // thread by locking |lock| and changing the corresponding element in
781 // |blindings_inuse| from 0 to 1.
Adam Langley95c29f32014-06-20 12:00:00 -0700782 BN_BLINDING **blindings;
783 unsigned char *blindings_inuse;
David Benjaminb1086cd2019-02-01 00:45:23 +0000784 uint64_t blinding_fork_generation;
David Benjamin38c20fe2018-02-09 15:52:58 -0500785
786 // private_key_frozen is one if the key has been used for a private key
787 // operation and may no longer be mutated.
788 unsigned private_key_frozen:1;
Adam Langley95c29f32014-06-20 12:00:00 -0700789};
790
791
792#if defined(__cplusplus)
David Benjamin4512b792017-08-18 19:21:50 -0400793} // extern C
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700794
795extern "C++" {
796
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700797BSSL_NAMESPACE_BEGIN
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700798
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700799BORINGSSL_MAKE_DELETER(RSA, RSA_free)
David Benjamin5cf05ad2018-09-14 09:34:17 -0700800BORINGSSL_MAKE_UP_REF(RSA, RSA_up_ref)
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700801
Joshua Liebow-Feeser8c7c6352018-08-26 18:53:36 -0700802BSSL_NAMESPACE_END
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700803
David Benjamin4512b792017-08-18 19:21:50 -0400804} // extern C++
Matt Braithwaited17d74d2016-08-17 20:10:28 -0700805
Adam Langley95c29f32014-06-20 12:00:00 -0700806#endif
807
David Benjamina2f2bc32016-03-14 17:13:54 -0400808#define RSA_R_BAD_ENCODING 100
809#define RSA_R_BAD_E_VALUE 101
810#define RSA_R_BAD_FIXED_HEADER_DECRYPT 102
811#define RSA_R_BAD_PAD_BYTE_COUNT 103
812#define RSA_R_BAD_RSA_PARAMETERS 104
813#define RSA_R_BAD_SIGNATURE 105
814#define RSA_R_BAD_VERSION 106
815#define RSA_R_BLOCK_TYPE_IS_NOT_01 107
816#define RSA_R_BN_NOT_INITIALIZED 108
817#define RSA_R_CANNOT_RECOVER_MULTI_PRIME_KEY 109
818#define RSA_R_CRT_PARAMS_ALREADY_GIVEN 110
819#define RSA_R_CRT_VALUES_INCORRECT 111
820#define RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN 112
821#define RSA_R_DATA_TOO_LARGE 113
822#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 114
823#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 115
824#define RSA_R_DATA_TOO_SMALL 116
825#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 117
826#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 118
827#define RSA_R_D_E_NOT_CONGRUENT_TO_1 119
828#define RSA_R_EMPTY_PUBLIC_KEY 120
829#define RSA_R_ENCODE_ERROR 121
830#define RSA_R_FIRST_OCTET_INVALID 122
831#define RSA_R_INCONSISTENT_SET_OF_CRT_VALUES 123
832#define RSA_R_INTERNAL_ERROR 124
833#define RSA_R_INVALID_MESSAGE_LENGTH 125
834#define RSA_R_KEY_SIZE_TOO_SMALL 126
835#define RSA_R_LAST_OCTET_INVALID 127
836#define RSA_R_MODULUS_TOO_LARGE 128
837#define RSA_R_MUST_HAVE_AT_LEAST_TWO_PRIMES 129
838#define RSA_R_NO_PUBLIC_EXPONENT 130
839#define RSA_R_NULL_BEFORE_BLOCK_MISSING 131
840#define RSA_R_N_NOT_EQUAL_P_Q 132
841#define RSA_R_OAEP_DECODING_ERROR 133
842#define RSA_R_ONLY_ONE_OF_P_Q_GIVEN 134
843#define RSA_R_OUTPUT_BUFFER_TOO_SMALL 135
844#define RSA_R_PADDING_CHECK_FAILED 136
845#define RSA_R_PKCS_DECODING_ERROR 137
846#define RSA_R_SLEN_CHECK_FAILED 138
847#define RSA_R_SLEN_RECOVERY_FAILED 139
848#define RSA_R_TOO_LONG 140
849#define RSA_R_TOO_MANY_ITERATIONS 141
850#define RSA_R_UNKNOWN_ALGORITHM_TYPE 142
851#define RSA_R_UNKNOWN_PADDING_TYPE 143
852#define RSA_R_VALUE_MISSING 144
853#define RSA_R_WRONG_SIGNATURE_LENGTH 145
Steven Valdezd0b98822017-04-11 12:46:03 -0400854#define RSA_R_PUBLIC_KEY_VALIDATION_FAILED 146
David Benjaminc1c6eeb2018-03-04 02:42:44 -0500855#define RSA_R_D_OUT_OF_RANGE 147
David Benjamind12f2ba2018-05-14 18:10:14 -0400856#define RSA_R_BLOCK_TYPE_IS_NOT_02 148
Adam Langley95c29f32014-06-20 12:00:00 -0700857
David Benjamin4512b792017-08-18 19:21:50 -0400858#endif // OPENSSL_HEADER_RSA_H