EVP_CIPHER_METH_NEW(3)

πŸ“¦ version 4.4.0, in alpine 3.24, arch rolling

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 new EVP_CIPHER structure. The cipher's NID (see EVP_CIPHER_nid(3)) is set to cipher_type, and the block size and key length are set to block_size and key_len, respectively. ✨
  • EVP_CIPHER_meth_dup() β€” creates a copy of cipher.
  • EVP_CIPHER_meth_free() β€” frees an EVP_CIPHER structure.
  • 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 in cipher with flags. 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, and EVP_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 function EVP_CIPHER_CTX_set_key_length(3) can be used with it.
  • EVP_CIPH_CUSTOM_IV β€” instruct EVP_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 its init function.
  • EVP_CIPH_ALWAYS_CALL_INIT β€” instruct EVP_CipherInit_ex(3) and similar initialization functions to call the implementation's init function even if the key argument is NULL.
  • EVP_CIPH_CTRL_INIT β€” instruct EVP_CipherInit_ex(3) and similar initialization functions to call the implementation's ctrl function with a command type of EVP_CTRL_INIT early during the setup.
  • EVP_CIPH_NO_PADDING β€” instruct EVP_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 β€” instruct EVP_CIPHER_CTX_rand_key(3) to not generate a random key using arc4random_buf(3) but instead leave that to the implementation by calling the ctrl function with a command type of EVP_CTRL_RAND_KEY and the pointer to the key memory storage in ptr.
  • EVP_CIPH_CUSTOM_COPY β€” instruct EVP_CIPHER_CTX_copy(3) to call the implementation's ctrl function with a command type of EVP_CTRL_COPY and the destination EVP_CIPHER_CTX *out in the ptr argument 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 with EVP_CIPHER_CTX_get_cipher_data(3).
  • EVP_CIPH_FLAG_DEFAULT_ASN1 β€” instruct EVP_CIPHER_param_to_asn1(3) to use ASN1_TYPE_set_octetstring(3) if no set_asn1_parameters function is installed, and instruct EVP_CIPHER_asn1_to_param(3) to use ASN1_TYPE_get_octetstring(3) if no get_asn1_parameters function 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 β€” instruct EVP_CipherUpdate(3), EVP_CipherFinal_ex(3), and similar encryption, decryption, and finalization functions that the implementation's do_cipher function 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 🫢:

🫢 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