EVP_PKEY_DECRYPT(3)
Okay so bestie, welcome to EVP_PKEY_DECRYPT(3) from the Library Functions Manual π
β¨ β this is the whole page, but make it make sense. It's giving public-key decryption setup, buffer-length moments, and one extremely important -2. No cap.
πΈ NAME πΈ
EVP_PKEY_decrypt_init, EVP_PKEY_decrypt β decrypt using a public key algorithm.
β¨ SYNOPSIS β¨
First things first: it wants the library βlibcryptoβ and this exact include, okay?
library βlibcryptoβ #include <openssl/evp.h>
int
EVP_PKEY_decrypt_init(EVP_PKEY_CTX *ctx);
int
EVP_PKEY_decrypt(EVP_PKEY_CTX *ctx, unsigned char *out, size_t *outlen,
const unsigned char *in, size_t inlen);
π¦ DESCRIPTION π¦
Here's the tea, bestie:
EVP_PKEY_decrypt_init()β initializes a public key algorithm context using keyctx->pkeyfor a decryption operation. Setup era, fr fr.EVP_PKEY_decrypt()β performs a public key decryption operation usingctx. The data to be decrypted is specified using theinandinlenparameters. IfoutisNULLthen the maximum size of the output buffer is written to theoutlenparameter. Ifoutis notNULLthen before the call theoutlenparameter should contain the length of theoutbuffer. If the call is successful, the decrypted data is written tooutand the amount of data written tooutlen. Buffer math, but make it fashion π .
After the call to EVP_PKEY_decrypt_init(), algorithm specific control operations can be performed to set any appropriate parameters for the operation. That's your little customisation window, iykyk.
The function EVP_PKEY_decrypt() can be called more than once on the same context if several operations are performed using the same parameters. Reuse is iconic, periodt.
π«Ά RETURN VALUES π«Ά
EVP_PKEY_decrypt_init() and EVP_PKEY_decrypt() return 1 for success and 0 or a negative value for failure. In particular, a return value of -2 indicates the operation is not supported by the public key algorithm.
So 1 is slay, 0 or negative is not the vibe, and -2 is literally the algorithm saying βnot supportedβ π.
π₯ EXAMPLES π₯
Decrypt data using OAEP (for RSA keys):
Obsessed with a full example? Same. Here it is, exactly:
#include <openssl/evp.h>
#include <openssl/rsa.h>
EVP_PKEY_CTX *ctx;
unsigned char *out, *in;
size_t outlen, inlen;
EVP_PKEY *key;
/*
* Assumes that key, in, and inlen are already set up
* and that key is an RSA private key.
*/
ctx = EVP_PKEY_CTX_new(key, NULL);
if (!ctx)
/* Error occurred */
if (EVP_PKEY_decrypt_init(ctx) <= 0)
/* Error */
if (EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING) <= 0)
/* Error */
/* Determine buffer length */
if (EVP_PKEY_decrypt(ctx, NULL, &outlen, in, inlen) <= 0)
/* Error */
out = malloc(outlen);
if (!out)
/* malloc failure */
if (EVP_PKEY_decrypt(ctx, out, &outlen, in, inlen) <= 0)
/* Error */
/* Decrypted data is outlen bytes written to buffer out */
π SEE ALSO π
Go see also: EVP_PKEY_CTX_new(3), EVP_PKEY_derive(3), EVP_PKEY_encrypt(3), EVP_PKEY_sign(3), EVP_PKEY_verify(3), EVP_PKEY_verify_recover(3).
π HISTORY π
History lesson, bestie: EVP_PKEY_decrypt_init() and EVP_PKEY_decrypt() first appeared in OpenSSL 1.0.0 and have been available since OpenBSD 4.9.
xoxo, Debian π β June 8, 2025 β EVP_PKEY_DECRYPT(3) signing off! π
π¦ where this page comes from
- alpine 3.24: libressl-doc 4.3.1-r0 Β· custom
- arch rolling: libressl 4.4.0-1 Β· ISC AND custom:OpenSSL
- Copyright (c) 2006, 2009, 2013, 2018 The OpenSSL Project
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms