---
name: "libressl-RSA_public_encrypt"
section: "3"
platform: "linux"
package: "libressl"
version: "4.4.0-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/libressl-RSA_public_encrypt"
---

# libressl-RSA\_public\_encrypt(3)

RSA public key cryptography

## NAME

**RSA\_public\_encrypt**, **RSA\_private\_decrypt**, **EVP\_PKEY\_encrypt\_old**, **EVP\_PKEY\_decrypt\_old** – RSA public key cryptography

## SYNOPSIS

Crypto Library (libcrypto, -lcrypto)

**#include \<openssl/rsa.h\>**

*int*\

**RSA\_public\_encrypt**(*int flen*, *const unsigned char \*from*, *unsigned char \*to*, *RSA \*rsa*, *int padding*);

*int*\

**RSA\_private\_decrypt**(*int flen*, *const unsigned char \*from*, *unsigned char \*to*, *RSA \*rsa*, *int padding*);

**#include \<openssl/evp.h\>**

*int*\

**EVP\_PKEY\_encrypt\_old**(*unsigned char \*to*, *const unsigned char \*from*, *int flen*, *EVP\_PKEY \*pkey*);

*int*\

**EVP\_PKEY\_decrypt\_old**(*unsigned char \*to*, *const unsigned char \*from*, *int flen*, *EVP\_PKEY \*pkey*);

## DESCRIPTION

**RSA\_public\_encrypt**() encrypts the *flen* bytes at *from* (usually a session key) using the public key *rsa* and stores the ciphertext in *to*. *to* must point to **RSA\_size**(*rsa*) bytes of memory.

*padding* denotes one of the following modes:

- RSA\_PKCS1\_PADDING

  PKCS #1 v1.5 padding. This currently is the most widely used mode.

- RSA\_PKCS1\_OAEP\_PADDING

  EME-OAEP as defined in PKCS #1 v2.0 with SHA-1, MGF1 and an empty encoding parameter. This mode is recommended for all new applications.

- RSA\_NO\_PADDING

  Raw RSA encryption. This mode should only be used to implement cryptographically sound padding modes in the application code. Encrypting user data directly with RSA is insecure.

*flen* must be less than **RSA\_size**(*rsa*) - 11 for the PKCS #1 v1.5 based padding modes, less than **RSA\_size**(*rsa*) - 41 for RSA\_PKCS1\_OAEP\_PADDING and exactly **RSA\_size**(*rsa*) for RSA\_NO\_PADDING.

**RSA\_private\_decrypt**() decrypts the *flen* bytes at *from* using the private key *rsa* and stores the plaintext in *to*. *to* must point to a memory section large enough to hold the decrypted data (which is smaller than **RSA\_size**(*rsa*)). *padding* is the padding mode that was used to encrypt the data.

**EVP\_PKEY\_encrypt\_old**() is a deprecated wrapper around **RSA\_public\_encrypt**() that uses the *RSA* public key stored in *pkey* and RSA\_PKCS1\_PADDING.

**EVP\_PKEY\_decrypt\_old**() is a deprecated wrapper around **RSA\_private\_decrypt**() that uses the *RSA* private key stored in *pkey* and RSA\_PKCS1\_PADDING.

## RETURN VALUES

**RSA\_public\_encrypt**() and **EVP\_PKEY\_encrypt\_old**() return the size of the encrypted data (i.e. **RSA\_size**(*rsa*)). **RSA\_private\_decrypt**() and **EVP\_PKEY\_decrypt\_old**() returns the size of the recovered plaintext. On error, -1 is returned; the error codes can be obtained by ERR\_get\_error(3).

In addition to the return values documented above, **EVP\_PKEY\_encrypt\_old**() may return 0 if the EVP\_PKEY\_id(3) of *pkey* is not EVP\_PKEY\_RSA.

## SEE ALSO

EVP\_PKEY\_decrypt(3), EVP\_PKEY\_encrypt(3), RSA\_meth\_set\_priv\_dec(3), RSA\_new(3), RSA\_size(3)

## STANDARDS

SSL, PKCS #1 v2.0

## HISTORY

**RSA\_public\_encrypt**() and **RSA\_private\_decrypt**() appeared in SSLeay 0.4 or earlier and have been available since OpenBSD 2.4.

**EVP\_PKEY\_encrypt**() and **EVP\_PKEY\_decrypt**() first appeared in SSLeay 0.9.0 and have been available since OpenBSD 2.4. There were renamed to **EVP\_PKEY\_encrypt\_old**() and **EVP\_PKEY\_decrypt\_old**() in OpenSSL 1.0.0 and OpenBSD 4.9.

RSA\_NO\_PADDING is available since SSLeay 0.9.0. OAEP was added in OpenSSL 0.9.2b.

## BUGS

Decryption failures in the RSA\_PKCS1\_PADDING mode leak information which can potentially be used to mount a Bleichenbacher padding oracle attack. This is an inherent weakness in the PKCS #1 v1.5 padding design. Prefer RSA\_PKCS1\_OAEP\_PADDING.
