// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef OPENSSL_HEADER_RSA_H
#define OPENSSL_HEADER_RSA_H

#include <openssl/base.h>   // IWYU pragma: export

#include <openssl/engine.h>
#include <openssl/ex_data.h>

#if defined(__cplusplus)
extern "C" {
#endif


// rsa.h contains functions for handling encryption and signature using RSA.


// Allocation and destruction.
//
// An `RSA` object represents a public or private RSA key. A given object may be
// used concurrently on multiple threads by non-mutating functions, provided no
// other thread is concurrently calling a mutating function. Unless otherwise
// documented, functions which take a `const` pointer are non-mutating and
// functions which take a non-`const` pointer are mutating.

// RSA_new_public_key returns a new `RSA` object containing a public key with
// the specified parameters, or NULL on error or invalid input.
OPENSSL_EXPORT RSA *RSA_new_public_key(const BIGNUM *n, const BIGNUM *e);

// RSA_new_private_key returns a new `RSA` object containing a private key with
// the specified parameters, or NULL on error or invalid input. All parameters
// are mandatory and may not be NULL.
//
// This function creates standard RSA private keys with CRT parameters.
OPENSSL_EXPORT RSA *RSA_new_private_key(const BIGNUM *n, const BIGNUM *e,
                                        const BIGNUM *d, const BIGNUM *p,
                                        const BIGNUM *q, const BIGNUM *dmp1,
                                        const BIGNUM *dmq1, const BIGNUM *iqmp);

// RSA_new returns a new, empty `RSA` object or NULL on error. Prefer using
// `RSA_new_public_key` or `RSA_new_private_key` to import an RSA key.
OPENSSL_EXPORT RSA *RSA_new(void);

// RSA_new_method acts the same as `RSA_new` but takes an explicit `ENGINE`.
OPENSSL_EXPORT RSA *RSA_new_method(const ENGINE *engine);

// RSA_free decrements the reference count of `rsa` and frees it if the
// reference count drops to zero.
OPENSSL_EXPORT void RSA_free(RSA *rsa);

// RSA_up_ref increments the reference count of `rsa` and returns one. It does
// not mutate `rsa` for thread-safety purposes and may be used concurrently.
OPENSSL_EXPORT int RSA_up_ref(RSA *rsa);


// Properties.

// OPENSSL_RSA_MAX_MODULUS_BITS is the maximum supported RSA modulus, in bits.
//
// WARNING: RSA-16384 is extremely slow and may be a DoS risk. This value is set
// based on the largest RSA keys any caller of BoringSSL may need to use, and
// may be too high for a general-purpose application. Applications should impose
// their own limits before importing an RSA key. RSA-16384 is of particular DoS
// risk for RSA private key operations, which scale cubicly.
//
// In the future, BoringSSL may limit overly large RSA key sizes to application
// opt-in, or impose a tighter limit on private key operations.
#define OPENSSL_RSA_MAX_MODULUS_BITS 16384

// RSA_bits returns the size of `rsa`, in bits.
OPENSSL_EXPORT unsigned RSA_bits(const RSA *rsa);

// RSA_get0_n returns `rsa`'s public modulus.
OPENSSL_EXPORT const BIGNUM *RSA_get0_n(const RSA *rsa);

// RSA_get0_e returns `rsa`'s public exponent.
OPENSSL_EXPORT const BIGNUM *RSA_get0_e(const RSA *rsa);

// RSA_get0_d returns `rsa`'s private exponent. If `rsa` is a public key, this
// value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_d(const RSA *rsa);

// RSA_get0_p returns `rsa`'s first private prime factor. If `rsa` is a public
// key or lacks its prime factors, this value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_p(const RSA *rsa);

// RSA_get0_q returns `rsa`'s second private prime factor. If `rsa` is a public
// key or lacks its prime factors, this value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_q(const RSA *rsa);

// RSA_get0_dmp1 returns d (mod p-1) for `rsa`. If `rsa` is a public key or
// lacks CRT parameters, this value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_dmp1(const RSA *rsa);

// RSA_get0_dmq1 returns d (mod q-1) for `rsa`. If `rsa` is a public key or
// lacks CRT parameters, this value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_dmq1(const RSA *rsa);

// RSA_get0_iqmp returns q^-1 (mod p). If `rsa` is a public key or lacks CRT
// parameters, this value will be NULL.
OPENSSL_EXPORT const BIGNUM *RSA_get0_iqmp(const RSA *rsa);

// RSA_get0_key sets `*out_n`, `*out_e`, and `*out_d`, if non-NULL, to `rsa`'s
// modulus, public exponent, and private exponent, respectively. If `rsa` is a
// public key, the private exponent will be set to NULL.
OPENSSL_EXPORT void RSA_get0_key(const RSA *rsa, const BIGNUM **out_n,
                                 const BIGNUM **out_e, const BIGNUM **out_d);

// RSA_get0_factors sets `*out_p` and `*out_q`, if non-NULL, to `rsa`'s prime
// factors. If `rsa` is a public key, they will be set to NULL.
OPENSSL_EXPORT void RSA_get0_factors(const RSA *rsa, const BIGNUM **out_p,
                                     const BIGNUM **out_q);

// RSA_get0_crt_params sets `*out_dmp1`, `*out_dmq1`, and `*out_iqmp`, if
// non-NULL, to `rsa`'s CRT parameters. These are d (mod p-1), d (mod q-1) and
// q^-1 (mod p), respectively. If `rsa` is a public key, each parameter will be
// set to NULL.
OPENSSL_EXPORT void RSA_get0_crt_params(const RSA *rsa, const BIGNUM **out_dmp1,
                                        const BIGNUM **out_dmq1,
                                        const BIGNUM **out_iqmp);


// Setting individual properties.
//
// These functions allow setting individual properties of an `RSA` object. This
// is typically used with `RSA_new` to construct an RSA key field by field.
// Prefer instead to use `RSA_new_public_key` and `RSA_new_private_key`. These
// functions defer some initialization to the first use of an `RSA` object. This
// means invalid inputs may be caught late.
//
// TODO(crbug.com/boringssl/316): This deferred initialization also causes
// performance problems in multi-threaded applications. The preferred APIs
// currently have the same issues, but they will initialize eagerly in the
// future.

// RSA_set0_key sets `rsa`'s modulus, public exponent, and private exponent to
// `n`, `e`, and `d` respectively, if non-NULL. On success, it takes ownership
// of each argument and returns one. Otherwise, it returns zero.
//
// `d` may be NULL, but `n` and `e` must either be non-NULL or already
// configured on `rsa`.
//
// It is an error to call this function after `rsa` has been used for a
// cryptographic operation. Construct a new `RSA` object instead.
OPENSSL_EXPORT int RSA_set0_key(RSA *rsa, BIGNUM *n, BIGNUM *e, BIGNUM *d);

// RSA_set0_factors sets `rsa`'s prime factors to `p` and `q`, if non-NULL, and
// takes ownership of them. On success, it takes ownership of each argument and
// returns one. Otherwise, it returns zero.
//
// Each argument must either be non-NULL or already configured on `rsa`.
//
// It is an error to call this function after `rsa` has been used for a
// cryptographic operation. Construct a new `RSA` object instead.
OPENSSL_EXPORT int RSA_set0_factors(RSA *rsa, BIGNUM *p, BIGNUM *q);

// RSA_set0_crt_params sets `rsa`'s CRT parameters to `dmp1`, `dmq1`, and
// `iqmp`, if non-NULL, and takes ownership of them. On success, it takes
// ownership of its parameters and returns one. Otherwise, it returns zero.
//
// Each argument must either be non-NULL or already configured on `rsa`.
//
// It is an error to call this function after `rsa` has been used for a
// cryptographic operation. Construct a new `RSA` object instead.
OPENSSL_EXPORT int RSA_set0_crt_params(RSA *rsa, BIGNUM *dmp1, BIGNUM *dmq1,
                                       BIGNUM *iqmp);


// Key generation.

// RSA_generate_key_ex generates a new RSA key where the modulus has size
// `bits` and the public exponent is `e`. If unsure, `RSA_F4` is a good value
// for `e`. If `cb` is not NULL then it is called during the key generation
// process. In addition to the calls documented for `BN_generate_prime_ex`, it
// is called with event=2 when the n'th prime is rejected as unsuitable and
// with event=3 when a suitable value for `p` is found.
//
// It returns one on success or zero on error.
OPENSSL_EXPORT int RSA_generate_key_ex(RSA *rsa, int bits, const BIGNUM *e,
                                       BN_GENCB *cb);

// RSA_generate_key_fips behaves like `RSA_generate_key_ex` but performs
// additional checks for FIPS compliance. The public exponent is always 65537
// and `bits` must be either 2048 or 3072.
OPENSSL_EXPORT int RSA_generate_key_fips(RSA *rsa, int bits, BN_GENCB *cb);


// Encryption / Decryption
//
// These functions are considered non-mutating for thread-safety purposes and
// may be used concurrently.

// RSA_PKCS1_PADDING denotes PKCS#1 v1.5 padding. When used with encryption,
// this is RSAES-PKCS1-v1_5. When used with signing, this is RSASSA-PKCS1-v1_5.
//
// WARNING: The RSAES-PKCS1-v1_5 encryption scheme is vulnerable to a
// chosen-ciphertext attack. Decrypting attacker-supplied ciphertext with
// RSAES-PKCS1-v1_5 may give the attacker control over your private key. This
// does not impact the RSASSA-PKCS1-v1_5 signature scheme. See "Chosen
// Ciphertext Attacks Against Protocols Based on the RSA Encryption Standard
// PKCS #1", Daniel Bleichenbacher, Advances in Cryptology (Crypto '98).
#define RSA_PKCS1_PADDING 1

// RSA_NO_PADDING denotes a raw RSA operation.
#define RSA_NO_PADDING 3

// RSA_PKCS1_OAEP_PADDING denotes the RSAES-OAEP encryption scheme.
#define RSA_PKCS1_OAEP_PADDING 4

// RSA_PKCS1_PSS_PADDING denotes the RSASSA-PSS signature scheme. This value may
// not be passed into `RSA_sign_raw`, only `EVP_PKEY_CTX_set_rsa_padding`. See
// also `RSA_sign_pss_mgf1` and `RSA_verify_pss_mgf1`.
#define RSA_PKCS1_PSS_PADDING 6

// RSA_encrypt encrypts `in_len` bytes from `in` to the public key from `rsa`
// and writes, at most, `max_out` bytes of encrypted data to `out`. The
// `max_out` argument must be, at least, `RSA_size` in order to ensure success.
//
// It returns 1 on success or zero on error.
//
// The `padding` argument must be one of the `RSA_*_PADDING` values. If in
// doubt, use `RSA_PKCS1_OAEP_PADDING` for new protocols. When `padding` is
// `RSA_PKCS1_OAEP_PADDING`, this function has no way to set the OAEP or MGF-1
// digest, so it is always SHA-1. For other OAEP parameters, wrap `rsa` in an
// `EVP_PKEY` and use `EVP_PKEY_encrypt` with `EVP_PKEY_CTX_set_rsa_padding` and
// related functions.
OPENSSL_EXPORT int RSA_encrypt(RSA *rsa, size_t *out_len, uint8_t *out,
                               size_t max_out, const uint8_t *in, size_t in_len,
                               int padding);

// RSA_decrypt decrypts `in_len` bytes from `in` with the private key from
// `rsa` and writes, at most, `max_out` bytes of plaintext to `out`. The
// `max_out` argument must be, at least, `RSA_size` in order to ensure success.
//
// It returns 1 on success or zero on error.
//
// The `padding` argument must be one of the `RSA_*_PADDING` values. If in
// doubt, use `RSA_PKCS1_OAEP_PADDING` for new protocols. When `padding` is
// `RSA_PKCS1_OAEP_PADDING`, this function has no way to set the OAEP or MGF-1
// digest, so it is always SHA-1. For other OAEP parameters, wrap `rsa` in an
// `EVP_PKEY` and use `EVP_PKEY_decrypt` with `EVP_PKEY_CTX_set_rsa_padding` and
// related functions.
//
// WARNING: Passing `RSA_PKCS1_PADDING` into this function is deprecated and
// insecure. RSAES-PKCS1-v1_5 is vulnerable to a chosen-ciphertext attack.
// Decrypting attacker-supplied ciphertext with RSAES-PKCS1-v1_5 may give the
// attacker control over your private key. See "Chosen Ciphertext Attacks
// Against Protocols Based on the RSA Encryption Standard PKCS #1", Daniel
// Bleichenbacher, Advances in Cryptology (Crypto '98).
//
// In some limited cases, such as TLS RSA key exchange, it is possible to
// mitigate this flaw with custom, protocol-specific padding logic. This
// should be implemented with `RSA_NO_PADDING`, not `RSA_PKCS1_PADDING`.
OPENSSL_EXPORT int RSA_decrypt(RSA *rsa, size_t *out_len, uint8_t *out,
                               size_t max_out, const uint8_t *in, size_t in_len,
                               int padding);

// RSA_public_encrypt encrypts `flen` bytes from `from` to the public key in
// `rsa` and writes the encrypted data to `to`. The `to` buffer must have at
// least `RSA_size` bytes of space. It returns the number of bytes written, or
// -1 on error. The `padding` argument must be one of the `RSA_*_PADDING`
// values. If in doubt, use `RSA_PKCS1_OAEP_PADDING` for new protocols.
//
// When `padding` is `RSA_PKCS1_OAEP_PADDING`, this function has no way to set
// the OAEP or MGF-1 digest, so it is always SHA-1. For other OAEP parameters,
// wrap `rsa` in an `EVP_PKEY` and use `EVP_PKEY_encrypt` with
// `EVP_PKEY_CTX_set_rsa_padding` and related functions.
//
// WARNING: this function is dangerous because it breaks the usual return value
// convention. Use `RSA_encrypt` instead.
OPENSSL_EXPORT int RSA_public_encrypt(size_t flen, const uint8_t *from,
                                      uint8_t *to, RSA *rsa, int padding);

// RSA_private_decrypt decrypts `flen` bytes from `from` with the public key in
// `rsa` and writes the plaintext to `to`. The `to` buffer must have at least
// `RSA_size` bytes of space. It returns the number of bytes written, or -1 on
// error. The `padding` argument must be one of the `RSA_*_PADDING` values. If
// in doubt, use `RSA_PKCS1_OAEP_PADDING` for new protocols. Passing
// `RSA_PKCS1_PADDING` into this function is deprecated and insecure. See
// `RSA_decrypt`.
//
// When `padding` is `RSA_PKCS1_OAEP_PADDING`, this function has no way to set
// the OAEP or MGF-1 digest, so it is always SHA-1. For other OAEP parameters,
// wrap `rsa` in an `EVP_PKEY` and use `EVP_PKEY_decrypt` with
// `EVP_PKEY_CTX_set_rsa_padding` and related functions.
//
// WARNING: this function is dangerous because it breaks the usual return value
// convention. Use `RSA_decrypt` instead.
OPENSSL_EXPORT int RSA_private_decrypt(size_t flen, const uint8_t *from,
                                       uint8_t *to, RSA *rsa, int padding);


// Signing / Verification
//
// These functions are considered non-mutating for thread-safety purposes and
// may be used concurrently.

// RSA_sign signs `digest_len` bytes of digest from `digest` with `rsa` using
// RSASSA-PKCS1-v1_5. It writes, at most, `RSA_size(rsa)` bytes to `out`. On
// successful return, the actual number of bytes written is written to
// `*out_len`.
//
// The `hash_nid` argument identifies the hash function used to calculate
// `digest` and is embedded in the resulting signature. For example, it might be
// `NID_sha256`.
//
// It returns 1 on success and zero on error.
//
// WARNING: `digest` must be the result of hashing the data to be signed with
// `hash_nid`. Passing unhashed inputs will not result in a secure signature
// scheme.
OPENSSL_EXPORT int RSA_sign(int hash_nid, const uint8_t *digest,
                            size_t digest_len, uint8_t *out, unsigned *out_len,
                            RSA *rsa);

// RSA_PSS_SALTLEN_DIGEST indicates a PSS salt length that matches the digest
// length. This is recommended.
#define RSA_PSS_SALTLEN_DIGEST (-1)
// RSA_PSS_SALTLEN_AUTO indicates a maximum possible PSS salt length when
// signing, and automatically detecting the salt length when verifying. This is
// not recommended. Neither the signing nor verifying behaviors are compliant
// with FIPS 186-5.
#define RSA_PSS_SALTLEN_AUTO (-2)

// RSA_sign_pss_mgf1 signs `digest_len` bytes from `digest` with the public key
// from `rsa` using RSASSA-PSS with MGF1 as the mask generation function. It
// writes, at most, `max_out` bytes of signature data to `out`. The `max_out`
// argument must be, at least, `RSA_size` in order to ensure success. It returns
// 1 on success or zero on error.
//
// The `md` and `mgf1_md` arguments identify the hash used to calculate `digest`
// and the MGF1 hash, respectively. If `mgf1_md` is NULL, `md` is
// used.
//
// `salt_len` specifies the expected salt length in bytes. If `salt_len` is
// `RSA_PSS_SALTLEN_DIGEST`, then the salt length is the same as the hash
// length. If `RSA_PSS_SALTLEN_AUTO`, then the salt length is maximal given the
// size of `rsa`. If unsure, use `RSA_PSS_SALTLEN_DIGEST`.
//
// WARNING: `digest` must be the result of hashing the data to be signed with
// `md`. Passing unhashed inputs will not result in a secure signature scheme.
OPENSSL_EXPORT int RSA_sign_pss_mgf1(RSA *rsa, size_t *out_len, uint8_t *out,
                                     size_t max_out, const uint8_t *digest,
                                     size_t digest_len, const EVP_MD *md,
                                     const EVP_MD *mgf1_md, int salt_len);

// RSA_sign_raw performs the private key portion of computing a signature with
// `rsa`. It writes, at most, `max_out` bytes of signature data to `out`. The
// `max_out` argument must be, at least, `RSA_size` in order to ensure the
// output fits. It returns 1 on success or zero on error.
//
// If `padding` is `RSA_PKCS1_PADDING`, this function wraps `in` with the
// padding portion of RSASSA-PKCS1-v1_5 and then performs the raw private key
// operation. The caller is responsible for hashing the input and wrapping it in
// a DigestInfo structure.
//
// If `padding` is `RSA_NO_PADDING`, this function only performs the raw private
// key operation, interpreting `in` as an integer modulo n. The caller is
// responsible for hashing the input and encoding it for the signature scheme
// being implemented.
//
// WARNING: This function is a building block for a signature scheme, not a
// complete one. `in` must be the result of hashing and encoding the data as
// needed for the scheme being implemented. Passing in arbitrary inputs will not
// result in a secure signature scheme.
OPENSSL_EXPORT int RSA_sign_raw(RSA *rsa, size_t *out_len, uint8_t *out,
                                size_t max_out, const uint8_t *in,
                                size_t in_len, int padding);

// RSA_verify verifies that `sig_len` bytes from `sig` are a valid,
// RSASSA-PKCS1-v1_5 signature of `digest_len` bytes at `digest` by `rsa`.
//
// The `hash_nid` argument identifies the hash function used to calculate
// `digest` and is embedded in the resulting signature in order to prevent hash
// confusion attacks. For example, it might be `NID_sha256`.
//
// It returns one if the signature is valid and zero otherwise.
//
// WARNING: this differs from the original, OpenSSL function which additionally
// returned -1 on error.
//
// WARNING: `digest` must be the result of hashing the data to be verified with
// `hash_nid`. Passing unhashed input will not result in a secure signature
// scheme.
OPENSSL_EXPORT int RSA_verify(int hash_nid, const uint8_t *digest,
                              size_t digest_len, const uint8_t *sig,
                              size_t sig_len, RSA *rsa);

// RSA_verify_pss_mgf1 verifies that `sig_len` bytes from `sig` are a valid,
// RSASSA-PSS signature of `digest_len` bytes at `digest` by `rsa`. It returns
// one if the signature is valid and zero otherwise. MGF1 is used as the mask
// generation function.
//
// The `md` and `mgf1_md` arguments identify the hash used to calculate `digest`
// and the MGF1 hash, respectively. If `mgf1_md` is NULL, `md` is
// used. `salt_len` specifies the expected salt length in bytes.
//
// If `salt_len` is `RSA_PSS_SALTLEN_DIGEST`, then the salt length is the same
// as the hash length. If `RSA_PSS_SALTLEN_AUTO`, then the salt length is
// recovered and all values accepted. If unsure, use `RSA_PSS_SALTLEN_DIGEST`.
//
// WARNING: `digest` must be the result of hashing the data to be verified with
// `md`. Passing unhashed input will not result in a secure signature scheme.
OPENSSL_EXPORT int RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *digest,
                                       size_t digest_len, const EVP_MD *md,
                                       const EVP_MD *mgf1_md, int salt_len,
                                       const uint8_t *sig, size_t sig_len);

// RSA_verify_raw performs the public key portion of verifying `in_len` bytes of
// signature from `in` using the public key from `rsa`. On success, it returns
// one and writes, at most, `max_out` bytes of output to `out`. The `max_out`
// argument must be, at least, `RSA_size` in order to ensure the output fits. On
// failure or invalid input, it returns zero.
//
// If `padding` is `RSA_PKCS1_PADDING`, this function checks the padding portion
// of RSASSA-PKCS1-v1_5 and outputs the remainder of the encoded digest. The
// caller is responsible for checking the output is a DigestInfo-wrapped digest
// of the message.
//
// If `padding` is `RSA_NO_PADDING`, this function only performs the raw public
// key operation. The caller is responsible for checking the output is a valid
// result for the signature scheme being implemented.
//
// WARNING: This function is a building block for a signature scheme, not a
// complete one. Checking for arbitrary strings in `out` will not result in a
// secure signature scheme.
OPENSSL_EXPORT int RSA_verify_raw(RSA *rsa, size_t *out_len, uint8_t *out,
                                  size_t max_out, const uint8_t *in,
                                  size_t in_len, int padding);

// RSA_private_encrypt performs the private key portion of computing a signature
// with `rsa`. It takes `flen` bytes from `from` as input and writes the result
// to `to`. The `to` buffer must have at least `RSA_size` bytes of space. It
// returns the number of bytes written, or -1 on error.
//
// For the interpretation of `padding` and the input, see `RSA_sign_raw`.
//
// WARNING: This function is a building block for a signature scheme, not a
// complete one. See `RSA_sign_raw` for details.
//
// WARNING: This function is dangerous because it breaks the usual return value
// convention. Use `RSA_sign_raw` instead.
OPENSSL_EXPORT int RSA_private_encrypt(size_t flen, const uint8_t *from,
                                       uint8_t *to, RSA *rsa, int padding);

// RSA_public_decrypt performs the public key portion of verifying `flen` bytes
// of signature from `from` using the public key from `rsa`. It writes the
// result to `to`, which must have at least `RSA_size` bytes of space. It
// returns the number of bytes written, or -1 on error.
//
// For the interpretation of `padding` and the result, see `RSA_verify_raw`.
//
// WARNING: This function is a building block for a signature scheme, not a
// complete one. See `RSA_verify_raw` for details.
//
// WARNING: This function is dangerous because it breaks the usual return value
// convention. Use `RSA_verify_raw` instead.
OPENSSL_EXPORT int RSA_public_decrypt(size_t flen, const uint8_t *from,
                                      uint8_t *to, RSA *rsa, int padding);


// Utility functions.

// RSA_size returns the number of bytes in the modulus, which is also the size
// of a signature or encrypted value using `rsa`.
OPENSSL_EXPORT unsigned RSA_size(const RSA *rsa);

// RSA_is_opaque returns one if `rsa` is opaque and doesn't expose its key
// material. Otherwise it returns zero.
OPENSSL_EXPORT int RSA_is_opaque(const RSA *rsa);

// RSAPublicKey_dup allocates a fresh `RSA` and copies the public key from
// `rsa` into it. It returns the fresh `RSA` object, or NULL on error.
OPENSSL_EXPORT RSA *RSAPublicKey_dup(const RSA *rsa);

// RSAPrivateKey_dup allocates a fresh `RSA` and copies the private key from
// `rsa` into it. It returns the fresh `RSA` object, or NULL on error.
OPENSSL_EXPORT RSA *RSAPrivateKey_dup(const RSA *rsa);

// RSA_check_key performs basic validity tests on `rsa`. It returns one if
// they pass and zero otherwise. Opaque keys and public keys always pass. If it
// returns zero then a more detailed error is available on the error queue.
OPENSSL_EXPORT int RSA_check_key(const RSA *rsa);

// RSA_check_fips performs public key validity tests on `key`. It returns one if
// they pass and zero otherwise. Opaque keys always fail. This function does not
// mutate `rsa` for thread-safety purposes and may be used concurrently.
OPENSSL_EXPORT int RSA_check_fips(RSA *key);

// RSA_verify_PKCS1_PSS_mgf1 verifies that `EM` is a correct PSS padding of
// `mHash`, where `mHash` is a digest produced by `Hash`. `EM` must point to
// exactly `RSA_size(rsa)` bytes of data. The `mgf1Hash` argument specifies the
// hash function for generating the mask. If NULL, `Hash` is used. The `sLen`
// argument specifies the expected salt length in bytes. If `sLen` is -1 then
// the salt length is the same as the hash length. If -2, then the salt length
// is recovered and all values accepted.
//
// If unsure, use -1.
//
// It returns one on success or zero on error.
//
// This function implements only the low-level padding logic. Use
// `RSA_verify_pss_mgf1` instead.
OPENSSL_EXPORT int RSA_verify_PKCS1_PSS_mgf1(const RSA *rsa,
                                             const uint8_t *mHash,
                                             const EVP_MD *Hash,
                                             const EVP_MD *mgf1Hash,
                                             const uint8_t *EM, int sLen);

// RSA_padding_add_PKCS1_PSS_mgf1 writes a PSS padding of `mHash` to `EM`,
// where `mHash` is a digest produced by `Hash`. `RSA_size(rsa)` bytes of
// output will be written to `EM`. The `mgf1Hash` argument specifies the hash
// function for generating the mask. If NULL, `Hash` is used. The `sLen`
// argument specifies the expected salt length in bytes. If `sLen` is -1 then
// the salt length is the same as the hash length. If -2, then the salt length
// is maximal given the space in `EM`.
//
// It returns one on success or zero on error.
//
// This function implements only the low-level padding logic. Use
// `RSA_sign_pss_mgf1` instead.
OPENSSL_EXPORT int RSA_padding_add_PKCS1_PSS_mgf1(const RSA *rsa, uint8_t *EM,
                                                  const uint8_t *mHash,
                                                  const EVP_MD *Hash,
                                                  const EVP_MD *mgf1Hash,
                                                  int sLen);

// RSA_padding_add_PKCS1_OAEP_mgf1 writes an OAEP padding of `from` to `to`
// with the given parameters and hash functions. If `md` is NULL then SHA-1 is
// used. If `mgf1md` is NULL then the value of `md` is used (which means SHA-1
// if that, in turn, is NULL).
//
// It returns one on success or zero on error.
OPENSSL_EXPORT int RSA_padding_add_PKCS1_OAEP_mgf1(
    uint8_t *to, size_t to_len, const uint8_t *from, size_t from_len,
    const uint8_t *param, size_t param_len, const EVP_MD *md,
    const EVP_MD *mgf1md);

// RSA_add_pkcs1_prefix builds a version of `digest` prefixed with the
// DigestInfo header for the given hash function and sets `out_msg` to point to
// it. On successful return, if `*is_alloced` is one, the caller must release
// `*out_msg` with `OPENSSL_free`.
OPENSSL_EXPORT int RSA_add_pkcs1_prefix(uint8_t **out_msg, size_t *out_msg_len,
                                        int *is_alloced, int hash_nid,
                                        const uint8_t *digest,
                                        size_t digest_len);


// ASN.1 functions.

// RSA_parse_public_key parses a DER-encoded RSAPublicKey structure (RFC 8017)
// from `cbs` and advances `cbs`. It returns a newly-allocated `RSA` or NULL on
// error.
OPENSSL_EXPORT RSA *RSA_parse_public_key(CBS *cbs);

// RSA_public_key_from_bytes parses `in` as a DER-encoded RSAPublicKey structure
// (RFC 8017). It returns a newly-allocated `RSA` or NULL on error.
OPENSSL_EXPORT RSA *RSA_public_key_from_bytes(const uint8_t *in, size_t in_len);

// RSA_marshal_public_key marshals `rsa` as a DER-encoded RSAPublicKey structure
// (RFC 8017) and appends the result to `cbb`. It returns one on success and
// zero on failure.
OPENSSL_EXPORT int RSA_marshal_public_key(CBB *cbb, const RSA *rsa);

// RSA_public_key_to_bytes marshals `rsa` as a DER-encoded RSAPublicKey
// structure (RFC 8017) and, on success, sets `*out_bytes` to a newly allocated
// buffer containing the result and returns one. Otherwise, it returns zero. The
// result should be freed with `OPENSSL_free`.
OPENSSL_EXPORT int RSA_public_key_to_bytes(uint8_t **out_bytes, size_t *out_len,
                                           const RSA *rsa);

// RSA_parse_private_key parses a DER-encoded RSAPrivateKey structure (RFC 8017)
// from `cbs` and advances `cbs`. It returns a newly-allocated `RSA` or NULL on
// error.
OPENSSL_EXPORT RSA *RSA_parse_private_key(CBS *cbs);

// RSA_private_key_from_bytes parses `in` as a DER-encoded RSAPrivateKey
// structure (RFC 8017). It returns a newly-allocated `RSA` or NULL on error.
OPENSSL_EXPORT RSA *RSA_private_key_from_bytes(const uint8_t *in,
                                               size_t in_len);

// RSA_marshal_private_key marshals `rsa` as a DER-encoded RSAPrivateKey
// structure (RFC 8017) and appends the result to `cbb`. It returns one on
// success and zero on failure.
OPENSSL_EXPORT int RSA_marshal_private_key(CBB *cbb, const RSA *rsa);

// RSA_private_key_to_bytes marshals `rsa` as a DER-encoded RSAPrivateKey
// structure (RFC 8017) and, on success, sets `*out_bytes` to a newly allocated
// buffer containing the result and returns one. Otherwise, it returns zero. The
// result should be freed with `OPENSSL_free`.
OPENSSL_EXPORT int RSA_private_key_to_bytes(uint8_t **out_bytes,
                                            size_t *out_len, const RSA *rsa);


// Obscure RSA variants.
//
// These functions allow creating RSA keys with obscure combinations of
// parameters.

// RSA_new_private_key_no_crt behaves like `RSA_new_private_key` but constructs
// an RSA key without CRT coefficients.
//
// Keys created by this function will be less performant and cannot be
// serialized.
OPENSSL_EXPORT RSA *RSA_new_private_key_no_crt(const BIGNUM *n, const BIGNUM *e,
                                               const BIGNUM *d);

// RSA_new_private_key_no_e behaves like `RSA_new_private_key` but constructs an
// RSA key without CRT parameters or public exponent.
//
// Keys created by this function will be less performant, cannot be serialized,
// and lack hardening measures that protect against side channels and fault
// attacks.
OPENSSL_EXPORT RSA *RSA_new_private_key_no_e(const BIGNUM *n, const BIGNUM *d);

// RSA_new_public_key_large_e behaves like `RSA_new_public_key` but allows any
// `e` up to `n`.
//
// BoringSSL typically bounds public exponents as a denial-of-service
// mitigation. Keys created by this function may perform worse than those
// created by `RSA_new_public_key`.
OPENSSL_EXPORT RSA *RSA_new_public_key_large_e(const BIGNUM *n,
                                               const BIGNUM *e);

// RSA_new_private_key_large_e behaves like `RSA_new_private_key` but allows any
// `e` up to `n`.
//
// BoringSSL typically bounds public exponents as a denial-of-service
// mitigation. Keys created by this function may perform worse than those
// created by `RSA_new_private_key`.
OPENSSL_EXPORT RSA *RSA_new_private_key_large_e(
    const BIGNUM *n, const BIGNUM *e, const BIGNUM *d, const BIGNUM *p,
    const BIGNUM *q, const BIGNUM *dmp1, const BIGNUM *dmq1,
    const BIGNUM *iqmp);


// ex_data functions.
//
// See `ex_data.h` for details.

OPENSSL_EXPORT int RSA_get_ex_new_index(long argl, void *argp,
                                        CRYPTO_EX_unused *unused,
                                        CRYPTO_EX_dup *dup_unused,
                                        CRYPTO_EX_free *free_func);
OPENSSL_EXPORT int RSA_set_ex_data(RSA *rsa, int idx, void *arg);
OPENSSL_EXPORT void *RSA_get_ex_data(const RSA *rsa, int idx);


// Flags.

// RSA_FLAG_OPAQUE specifies that this RSA_METHOD does not expose its key
// material. This may be set if, for instance, it is wrapping some other crypto
// API, like a platform key store.
#define RSA_FLAG_OPAQUE 1

// RSA_FLAG_NO_BLINDING does nothing.
#define RSA_FLAG_NO_BLINDING 8

// RSA_FLAG_EXT_PKEY is deprecated and ignored.
#define RSA_FLAG_EXT_PKEY 0x20

// RSA_FLAG_NO_PUBLIC_EXPONENT indicates that private keys without a public
// exponent are allowed. This is an internal constant. Use
// `RSA_new_private_key_no_e` to construct such keys.
#define RSA_FLAG_NO_PUBLIC_EXPONENT 0x40

// RSA_FLAG_LARGE_PUBLIC_EXPONENT indicates that keys with a large public
// exponent are allowed. This is an internal constant. Use
// `RSA_new_public_key_large_e` and `RSA_new_private_key_large_e` to construct
// such keys.
#define RSA_FLAG_LARGE_PUBLIC_EXPONENT 0x80


// RSA public exponent values.

#define RSA_3 0x3
#define RSA_F4 0x10001


// Deprecated functions.

#define RSA_METHOD_FLAG_NO_CHECK RSA_FLAG_OPAQUE

// RSA_flags returns the flags for `rsa`. These are a bitwise OR of `RSA_FLAG_*`
// constants.
OPENSSL_EXPORT int RSA_flags(const RSA *rsa);

// RSA_test_flags returns the subset of flags in `flags` which are set in `rsa`.
OPENSSL_EXPORT int RSA_test_flags(const RSA *rsa, int flags);

// RSA_blinding_on returns one.
OPENSSL_EXPORT int RSA_blinding_on(RSA *rsa, BN_CTX *ctx);

// RSA_blinding_off does nothing.
OPENSSL_EXPORT void RSA_blinding_off(RSA *rsa);

// RSA_generate_key behaves like `RSA_generate_key_ex`, which is what you
// should use instead. It returns NULL on error, or a newly-allocated `RSA` on
// success. This function is provided for compatibility only. The `callback`
// and `cb_arg` parameters must be NULL.
OPENSSL_EXPORT RSA *RSA_generate_key(int bits, uint64_t e, void *callback,
                                     void *cb_arg);

// d2i_RSAPublicKey parses a DER-encoded RSAPublicKey structure (RFC 8017) from
// `len` bytes at `*inp`, as described in `d2i_SAMPLE`.
//
// Use `RSA_parse_public_key` instead.
OPENSSL_EXPORT RSA *d2i_RSAPublicKey(RSA **out, const uint8_t **inp, long len);

// i2d_RSAPublicKey marshals `in` to a DER-encoded RSAPublicKey structure (RFC
// 8017), as described in `i2d_SAMPLE`.
//
// Use `RSA_marshal_public_key` instead.
OPENSSL_EXPORT int i2d_RSAPublicKey(const RSA *in, uint8_t **outp);

// d2i_RSAPrivateKey parses a DER-encoded RSAPrivateKey structure (RFC 8017)
// from `len` bytes at `*inp`, as described in `d2i_SAMPLE`.
//
// Use `RSA_parse_private_key` instead.
OPENSSL_EXPORT RSA *d2i_RSAPrivateKey(RSA **out, const uint8_t **inp, long len);

// i2d_RSAPrivateKey marshals `in` to a DER-encoded RSAPrivateKey structure (RFC
// 8017), as described in `i2d_SAMPLE`.
//
// Use `RSA_marshal_private_key` instead.
OPENSSL_EXPORT int i2d_RSAPrivateKey(const RSA *in, uint8_t **outp);

// RSA_padding_add_PKCS1_PSS acts like `RSA_padding_add_PKCS1_PSS_mgf1` but the
// `mgf1Hash` parameter of the latter is implicitly set to `Hash`.
//
// This function implements only the low-level padding logic. Use
// `RSA_sign_pss_mgf1` instead.
OPENSSL_EXPORT int RSA_padding_add_PKCS1_PSS(const RSA *rsa, uint8_t *EM,
                                             const uint8_t *mHash,
                                             const EVP_MD *Hash, int sLen);

// RSA_verify_PKCS1_PSS acts like `RSA_verify_PKCS1_PSS_mgf1` but the
// `mgf1Hash` parameter of the latter is implicitly set to `Hash`.
//
// This function implements only the low-level padding logic. Use
// `RSA_verify_pss_mgf1` instead.
OPENSSL_EXPORT int RSA_verify_PKCS1_PSS(const RSA *rsa, const uint8_t *mHash,
                                        const EVP_MD *Hash, const uint8_t *EM,
                                        int sLen);

// RSA_padding_add_PKCS1_OAEP acts like `RSA_padding_add_PKCS1_OAEP_mgf1` but
// the `md` and `mgf1md` parameters of the latter are implicitly set to NULL,
// which means SHA-1.
OPENSSL_EXPORT int RSA_padding_add_PKCS1_OAEP(uint8_t *to, size_t to_len,
                                              const uint8_t *from,
                                              size_t from_len,
                                              const uint8_t *param,
                                              size_t param_len);

// RSA_print prints a textual representation of `rsa` to `bio`. It returns one
// on success or zero otherwise.
OPENSSL_EXPORT int RSA_print(BIO *bio, const RSA *rsa, int indent);

// RSA_get0_pss_params returns NULL. In OpenSSL, this function retries RSA-PSS
// parameters associated with `RSA` objects, but BoringSSL does not enable the
// id-RSASSA-PSS key encoding by default.
//
// WARNING: BoringSSL does support id-RSASSA-PSS parameters when callers opt in
// (see `EVP_pkey_rsa_pss_sha256` and others). We currently assume such callers
// do not need this function. Callers that opt into id-RSASSA-PSS support and
// require this functionality should contact the BoringSSL team.
OPENSSL_EXPORT const RSA_PSS_PARAMS *RSA_get0_pss_params(const RSA *rsa);

// RSA_new_method_no_e returns a newly-allocated `RSA` object backed by
// `engine`, with a public modulus of `n` and no known public exponent.
//
// Do not use this function. It exists only to support Conscrypt, whose use
// should be replaced with a more sound mechanism. See
// https://crbug.com/boringssl/602.
OPENSSL_EXPORT RSA *RSA_new_method_no_e(const ENGINE *engine, const BIGNUM *n);


struct rsa_meth_st {
  struct openssl_method_common_st common;

  void *app_data;

  int (*init)(RSA *rsa);
  int (*finish)(RSA *rsa);

  int (*sign)(int type, const uint8_t *m, unsigned int m_length,
              uint8_t *sigret, unsigned int *siglen, const RSA *rsa);

  // These functions mirror the `RSA_*` functions of the same name.
  int (*sign_raw)(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                  const uint8_t *in, size_t in_len, int padding);
  int (*decrypt)(RSA *rsa, size_t *out_len, uint8_t *out, size_t max_out,
                 const uint8_t *in, size_t in_len, int padding);

  // private_transform takes a big-endian integer from `in`, calculates the
  // d'th power of it, modulo the RSA modulus and writes the result as a
  // big-endian integer to `out`. Both `in` and `out` are `len` bytes long and
  // `len` is always equal to `RSA_size(rsa)`. If the result of the transform
  // can be represented in fewer than `len` bytes, then `out` must be zero
  // padded on the left.
  //
  // It returns one on success and zero otherwise.
  //
  // RSA decrypt and sign operations will call this, thus an ENGINE might wish
  // to override it in order to avoid having to implement the padding
  // functionality demanded by those, higher level, operations.
  int (*private_transform)(RSA *rsa, uint8_t *out, const uint8_t *in,
                           size_t len);

  int flags;
};


#if defined(__cplusplus)
}  // extern C

extern "C++" {

BSSL_NAMESPACE_BEGIN

BORINGSSL_MAKE_DELETER(RSA, RSA_free)
BORINGSSL_MAKE_UP_REF(RSA, RSA_up_ref)

BSSL_NAMESPACE_END

}  // extern C++

#endif

#define RSA_R_BAD_ENCODING 100
#define RSA_R_BAD_E_VALUE 101
#define RSA_R_BAD_FIXED_HEADER_DECRYPT 102
#define RSA_R_BAD_PAD_BYTE_COUNT 103
#define RSA_R_BAD_RSA_PARAMETERS 104
#define RSA_R_BAD_SIGNATURE 105
#define RSA_R_BAD_VERSION 106
#define RSA_R_BLOCK_TYPE_IS_NOT_01 107
#define RSA_R_BN_NOT_INITIALIZED 108
#define RSA_R_CANNOT_RECOVER_MULTI_PRIME_KEY 109
#define RSA_R_CRT_PARAMS_ALREADY_GIVEN 110
#define RSA_R_CRT_VALUES_INCORRECT 111
#define RSA_R_DATA_LEN_NOT_EQUAL_TO_MOD_LEN 112
#define RSA_R_DATA_TOO_LARGE 113
#define RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZE 114
#define RSA_R_DATA_TOO_LARGE_FOR_MODULUS 115
#define RSA_R_DATA_TOO_SMALL 116
#define RSA_R_DATA_TOO_SMALL_FOR_KEY_SIZE 117
#define RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEY 118
#define RSA_R_D_E_NOT_CONGRUENT_TO_1 119
#define RSA_R_EMPTY_PUBLIC_KEY 120
#define RSA_R_ENCODE_ERROR 121
#define RSA_R_FIRST_OCTET_INVALID 122
#define RSA_R_INCONSISTENT_SET_OF_CRT_VALUES 123
#define RSA_R_INTERNAL_ERROR 124
#define RSA_R_INVALID_MESSAGE_LENGTH 125
#define RSA_R_KEY_SIZE_TOO_SMALL 126
#define RSA_R_LAST_OCTET_INVALID 127
#define RSA_R_MODULUS_TOO_LARGE 128
#define RSA_R_MUST_HAVE_AT_LEAST_TWO_PRIMES 129
#define RSA_R_NO_PUBLIC_EXPONENT 130
#define RSA_R_NULL_BEFORE_BLOCK_MISSING 131
#define RSA_R_N_NOT_EQUAL_P_Q 132
#define RSA_R_OAEP_DECODING_ERROR 133
#define RSA_R_ONLY_ONE_OF_P_Q_GIVEN 134
#define RSA_R_OUTPUT_BUFFER_TOO_SMALL 135
#define RSA_R_PADDING_CHECK_FAILED 136
#define RSA_R_PKCS_DECODING_ERROR 137
#define RSA_R_SLEN_CHECK_FAILED 138
#define RSA_R_SLEN_RECOVERY_FAILED 139
#define RSA_R_TOO_LONG 140
#define RSA_R_TOO_MANY_ITERATIONS 141
#define RSA_R_UNKNOWN_ALGORITHM_TYPE 142
#define RSA_R_UNKNOWN_PADDING_TYPE 143
#define RSA_R_VALUE_MISSING 144
#define RSA_R_WRONG_SIGNATURE_LENGTH 145
#define RSA_R_PUBLIC_KEY_VALIDATION_FAILED 146
#define RSA_R_D_OUT_OF_RANGE 147
#define RSA_R_BLOCK_TYPE_IS_NOT_02 148

#endif  // OPENSSL_HEADER_RSA_H
