EVP_CIPHER_METH_NEW(3)
EVP_CIPHER_METH_NEW(3) β from the Library Functions Manual β okay bestie π this page is the build-your-own-EVP_CIPHER-method kit, and it is highkey backend glamour. Every function name, flag, signature, and return value below is exactly what the manual says, no cap, so you can read it and still pass the vibe check π«Ά
β¨ NAME β¨
EVP_CIPHER_meth_new, EVP_CIPHER_meth_dup, EVP_CIPHER_meth_free, EVP_CIPHER_meth_set_iv_length, EVP_CIPHER_meth_set_flags, EVP_CIPHER_meth_set_impl_ctx_size, EVP_CIPHER_meth_set_init, EVP_CIPHER_meth_set_do_cipher, EVP_CIPHER_meth_set_cleanup, EVP_CIPHER_meth_set_set_asn1_params, EVP_CIPHER_meth_set_get_asn1_params, EVP_CIPHER_meth_set_ctrl β routines to build up EVP_CIPHER methods. Periodt. π
πΈ SYNOPSIS πΈ
library βlibcryptoβ #include <openssl/evp.h>
EVP_CIPHER *
EVP_CIPHER_meth_new(int cipher_type, int block_size, int key_len);
EVP_CIPHER *
EVP_CIPHER_meth_dup(const EVP_CIPHER *cipher);
void
EVP_CIPHER_meth_free(EVP_CIPHER *cipher);
int
EVP_CIPHER_meth_set_iv_length(EVP_CIPHER *cipher, int iv_len);
int
EVP_CIPHER_meth_set_flags(EVP_CIPHER *cipher, unsigned long flags);
int
EVP_CIPHER_meth_set_impl_ctx_size(EVP_CIPHER *cipher, int ctx_size);
int
EVP_CIPHER_meth_set_init(EVP_CIPHER *cipher,
int (*init)(EVP_CIPHER_CTX *ctx, const unsigned char *key, const unsigned char *iv, int enc));
int
EVP_CIPHER_meth_set_do_cipher(EVP_CIPHER *cipher,
int (*do_cipher)(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, size_t inl));
int
EVP_CIPHER_meth_set_cleanup(EVP_CIPHER *cipher,
int (*cleanup)(EVP_CIPHER_CTX *));
int
EVP_CIPHER_meth_set_set_asn1_params(EVP_CIPHER *cipher,
int (*set_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *));
int
EVP_CIPHER_meth_set_get_asn1_params(EVP_CIPHER *cipher,
int (*get_asn1_parameters)(EVP_CIPHER_CTX *, ASN1_TYPE *));
int
EVP_CIPHER_meth_set_ctrl(EVP_CIPHER *cipher,
int (*ctrl)(EVP_CIPHER_CTX *, int type, int arg, void *ptr));
π DESCRIPTION π
The EVP_CIPHER type is a structure holding function pointers for a symmetric cipher implementation. Think of it as the group chat your cipher implementation uses to tell EVP which functions to call β very main character energy, honestly π
EVP_CIPHER_meth_new()β allocates a newEVP_CIPHERstructure. The cipher's NID (seeEVP_CIPHER_nid(3)) is set tocipher_type, and the block size and key length are set toblock_sizeandkey_len, respectively. β¨EVP_CIPHER_meth_dup()β creates a copy ofcipher.EVP_CIPHER_meth_free()β frees anEVP_CIPHERstructure.EVP_CIPHER_meth_set_iv_length()β sets the length of the initialization vector. This is only needed when the implemented cipher mode requires it.EVP_CIPHER_meth_set_flags()β overwrites the flags that describe optional behaviours incipherwithflags. At most one of the following cipher modes can be set:EVP_CIPH_STREAM_CIPHER,EVP_CIPH_ECB_MODE,EVP_CIPH_CBC_MODE,EVP_CIPH_CFB_MODE,EVP_CIPH_OFB_MODE,EVP_CIPH_CTR_MODE,EVP_CIPH_GCM_MODE,EVP_CIPH_CCM_MODE,EVP_CIPH_XTS_MODE, andEVP_CIPH_WRAP_MODE.
Zero or more of the following flags can be OR'ed into the flags argument:
π flag squad for EVP_CIPHER_meth_set_flags() π
EVP_CIPH_VARIABLE_LENGTHβ this cipher has a variable key length, and the functionEVP_CIPHER_CTX_set_key_length(3)can be used with it.EVP_CIPH_CUSTOM_IVβ instructEVP_CipherInit_ex(3)and similar initialization functions to leave storing and initialising the IV entirely to the implementation. If this flag is set, the implementation is typically expected to do that in itsinitfunction.EVP_CIPH_ALWAYS_CALL_INITβ instructEVP_CipherInit_ex(3)and similar initialization functions to call the implementation'sinitfunction even if thekeyargument isNULL.EVP_CIPH_CTRL_INITβ instructEVP_CipherInit_ex(3)and similar initialization functions to call the implementation'sctrlfunction with a command type ofEVP_CTRL_INITearly during the setup.EVP_CIPH_NO_PADDINGβ instructEVP_CipherFinal_ex(3)and similar finalization functions to not use standard block padding but instead report an error if the total amount of data to be encrypted or decrypted is not a multiple of the block size.EVP_CIPH_RAND_KEYβ instructEVP_CIPHER_CTX_rand_key(3)to not generate a random key usingarc4random_buf(3)but instead leave that to the implementation by calling thectrlfunction with a command type ofEVP_CTRL_RAND_KEYand the pointer to the key memory storage inptr.EVP_CIPH_CUSTOM_COPYβ instructEVP_CIPHER_CTX_copy(3)to call the implementation'sctrlfunction with a command type ofEVP_CTRL_COPYand the destinationEVP_CIPHER_CTX *outin theptrargument immediately before returning successfully. The intended use is for further things to deal with after the implementation specific data block has been copied. The implementation-specific data block is reached withEVP_CIPHER_CTX_get_cipher_data(3).EVP_CIPH_FLAG_DEFAULT_ASN1β instructEVP_CIPHER_param_to_asn1(3)to useASN1_TYPE_set_octetstring(3)if noset_asn1_parametersfunction is installed, and instructEVP_CIPHER_asn1_to_param(3)to useASN1_TYPE_get_octetstring(3)if noget_asn1_parametersfunction is installed.EVP_CIPH_FLAG_LENGTH_BITSβ signals that the length of the input buffer for encryption / decryption is to be understood as the number of bits instead of bytes for this implementation. This is only useful for CFB1 ciphers.EVP_CIPH_FLAG_CUSTOM_CIPHERβ instructEVP_CipherUpdate(3),EVP_CipherFinal_ex(3), and similar encryption, decryption, and finalization functions that the implementation'sdo_cipherfunction takes care of everything, including padding, buffering and finalization.EVP_CIPH_FLAG_AEAD_CIPHERβ this indicates that this is an AEAD cipher implementation.
Back to the other setters, bestie π«Ά:
EVP_CIPHER_meth_set_impl_ctx_size()β sets the size of theEVP_CIPHER's implementation context so that it can be automatically allocated.EVP_CIPHER_meth_set_init()β sets theinitfunction forcipher. The cipher init function is called byEVP_CipherInit(3),EVP_CipherInit_ex(3),EVP_EncryptInit(3),EVP_EncryptInit_ex(3),EVP_DecryptInit(3), andEVP_DecryptInit_ex(3).EVP_CIPHER_meth_set_do_cipher()β sets the cipher function forcipher. The cipher function is called byEVP_CipherUpdate(3),EVP_EncryptUpdate(3),EVP_DecryptUpdate(3),EVP_CipherFinal(3),EVP_EncryptFinal(3),EVP_EncryptFinal_ex(3),EVP_DecryptFinal(3)andEVP_DecryptFinal_ex(3).EVP_CIPHER_meth_set_cleanup()β sets the function forcipherto do extra cleanup before the method's private data structure is cleaned out and freed. Note that the cleanup function is passed anEVP_CIPHER_CTX *, and the private data structure is then available withEVP_CIPHER_CTX_get_cipher_data(3). This cleanup function is called byEVP_CIPHER_CTX_reset(3)andEVP_CIPHER_CTX_free(3).EVP_CIPHER_meth_set_set_asn1_params()β sets the function forcipherto set theAlgorithmIdentifier "parameter"based on the passed cipher. This function is called byEVP_CIPHER_param_to_asn1(3).EVP_CIPHER_meth_set_get_asn1_params()β sets the function forcipherthat sets the cipher parameters based on an ASN.1AlgorithmIdentifier "parameter". Both these functions are needed when there is a need for custom data (more or other than the cipher IV). They are called byEVP_CIPHER_param_to_asn1(3)andEVP_CIPHER_asn1_to_param(3)respectively if defined.EVP_CIPHER_meth_set_ctrl()β sets the control function forcipher.
π«Ά RETURN VALUES π«Ά
EVP_CIPHER_meth_new() and EVP_CIPHER_meth_dup() return a pointer to a newly created EVP_CIPHER, or NULL on failure.
All EVP_CIPHER_meth_set_*() functions return 1. Yes, all of them: 1. Slay. π
π¦ SEE ALSO π¦
π HISTORY π
These functions first appeared in OpenSSL 1.1.0 and have been available since OpenBSD 7.3. Look at the lore go β¨
This page is from the Debian manual, dated June 8, 2025, and the page name is EVP_CIPHER_METH_NEW(3) β mwah πβ¨
π¦ 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) 2023 Ingo Schwarze <schwarze@openbsd.org>
- Copyright (c) 2015 The OpenSSL Project
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms