// 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 a 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
