// 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);

// RSA_dup_ref increments the reference count of `rsa` and returns the same
// handle. It does not mutate `rsa` for thread-safety purposes and may be used
// concurrently.
OPENSSL_EXPORT RSA *RSA_dup_ref(const 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_dup_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
