EVP_DIGESTINIT(3SSL)
๐
EVP_DIGESTINIT(3SSL) โ OpenSSL ๐
Okay bestie, this is the OpenSSL manual page for the whole EVP digest routine friend group โ message digests, XOFs, contexts, params, all of it. Buckle up, it's giving โcryptographic group chatโ and we're getting into every detail. ๐
โจ NAME โจ
This page covers the full squad โ literally all of these are EVP digest routines:
EVP_MD_fetch, EVP_MD_up_ref, EVP_MD_free, EVP_MD_get_params,
EVP_MD_gettable_params, EVP_MD_CTX_new, EVP_MD_CTX_reset,
EVP_MD_CTX_free, EVP_MD_CTX_dup, EVP_MD_CTX_copy, EVP_MD_CTX_copy_ex,
EVP_MD_CTX_ctrl, EVP_MD_CTX_set_params, EVP_MD_CTX_get_params,
EVP_MD_CTX_settable_params, EVP_MD_CTX_gettable_params,
EVP_MD_CTX_set_flags, EVP_MD_CTX_clear_flags, EVP_MD_CTX_test_flags,
EVP_Q_digest, EVP_Digest, EVP_DigestInit_ex2, EVP_DigestInit_ex,
EVP_DigestInit, EVP_DigestUpdate, EVP_DigestFinal_ex,
EVP_DigestFinalXOF, EVP_DigestFinal, EVP_DigestSqueeze, EVP_MD_is_a,
EVP_MD_get0_name, EVP_MD_get0_description, EVP_MD_names_do_all,
EVP_MD_get0_provider, EVP_MD_get_type, EVP_MD_get_pkey_type,
EVP_MD_get_size, EVP_MD_get_block_size, EVP_MD_get_flags,
EVP_MD_CTX_get0_name, EVP_MD_CTX_md, EVP_MD_CTX_get0_md,
EVP_MD_CTX_get1_md, EVP_MD_CTX_get_type, EVP_MD_CTX_get_size_ex,
EVP_MD_CTX_get_block_size, EVP_MD_CTX_get0_md_data,
EVP_MD_CTX_update_fn, EVP_MD_CTX_set_update_fn, EVP_md_null,
EVP_get_digestbyname, EVP_get_digestbynid, EVP_get_digestbyobj,
EVP_MD_CTX_get_pkey_ctx, EVP_MD_CTX_set_pkey_ctx,
EVP_MD_do_all_provided, EVP_MD_type, EVP_MD_nid, EVP_MD_name,
EVP_MD_pkey_type, EVP_MD_size, EVP_MD_block_size, EVP_MD_flags,
EVP_MD_xof, EVP_MD_CTX_size, EVP_MD_CTX_get_size, EVP_MD_CTX_block_size,
EVP_MD_CTX_type, EVP_MD_CTX_pkey_ctx, EVP_MD_CTX_md_data - EVP digest
routines
๐ฆ SYNOPSIS ๐ฆ
This is the exact lineup, no cap:
#include <openssl/evp.h>
EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm,
const char *properties);
int EVP_MD_up_ref(EVP_MD *md);
void EVP_MD_free(EVP_MD *md);
int EVP_MD_get_params(const EVP_MD *digest, OSSL_PARAM params[]);
const OSSL_PARAM *EVP_MD_gettable_params(const EVP_MD *digest);
EVP_MD_CTX *EVP_MD_CTX_new(void);
int EVP_MD_CTX_reset(EVP_MD_CTX *ctx);
void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
void EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void* p2);
int EVP_MD_CTX_get_params(EVP_MD_CTX *ctx, OSSL_PARAM params[]);
int EVP_MD_CTX_set_params(EVP_MD_CTX *ctx, const OSSL_PARAM params[]);
const OSSL_PARAM *EVP_MD_settable_ctx_params(const EVP_MD *md);
const OSSL_PARAM *EVP_MD_gettable_ctx_params(const EVP_MD *md);
const OSSL_PARAM *EVP_MD_CTX_settable_params(EVP_MD_CTX *ctx);
const OSSL_PARAM *EVP_MD_CTX_gettable_params(EVP_MD_CTX *ctx);
void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags);
void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags);
int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags);
int EVP_Q_digest(OSSL_LIB_CTX *libctx, const char *name, const char *propq,
const void *data, size_t datalen,
unsigned char *md, size_t *mdlen);
int EVP_Digest(const void *data, size_t count, unsigned char *md,
unsigned int *size, const EVP_MD *type, ENGINE *impl);
int EVP_DigestInit_ex2(EVP_MD_CTX *ctx, const EVP_MD *type,
const OSSL_PARAM params[]);
int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt);
int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);
int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *out, size_t outlen);
int EVP_DigestSqueeze(EVP_MD_CTX *ctx, unsigned char *out, size_t outlen);
EVP_MD_CTX *EVP_MD_CTX_dup(const EVP_MD_CTX *in);
int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in);
int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s);
int EVP_MD_CTX_copy(EVP_MD_CTX *out, EVP_MD_CTX *in);
const char *EVP_MD_get0_name(const EVP_MD *md);
const char *EVP_MD_get0_description(const EVP_MD *md);
int EVP_MD_is_a(const EVP_MD *md, const char *name);
int EVP_MD_names_do_all(const EVP_MD *md,
void (*fn)(const char *name, void *data),
void *data);
const OSSL_PROVIDER *EVP_MD_get0_provider(const EVP_MD *md);
int EVP_MD_get_type(const EVP_MD *md);
int EVP_MD_get_pkey_type(const EVP_MD *md);
int EVP_MD_get_size(const EVP_MD *md);
int EVP_MD_get_block_size(const EVP_MD *md);
unsigned long EVP_MD_get_flags(const EVP_MD *md);
int EVP_MD_xof(const EVP_MD *md);
const EVP_MD *EVP_MD_CTX_get0_md(const EVP_MD_CTX *ctx);
EVP_MD *EVP_MD_CTX_get1_md(EVP_MD_CTX *ctx);
const char *EVP_MD_CTX_get0_name(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_size_ex(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_block_size(const EVP_MD_CTX *ctx);
int EVP_MD_CTX_get_type(const EVP_MD_CTX *ctx);
void *EVP_MD_CTX_get0_md_data(const EVP_MD_CTX *ctx);
const EVP_MD *EVP_md_null(void);
const EVP_MD *EVP_get_digestbyname(const char *name);
const EVP_MD *EVP_get_digestbynid(int type);
const EVP_MD *EVP_get_digestbyobj(const ASN1_OBJECT *o);
EVP_PKEY_CTX *EVP_MD_CTX_get_pkey_ctx(const EVP_MD_CTX *ctx);
void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx);
void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx,
void (*fn)(EVP_MD *mac, void *arg),
void *arg);
#define EVP_MD_type EVP_MD_get_type
#define EVP_MD_nid EVP_MD_get_type
#define EVP_MD_name EVP_MD_get0_name
#define EVP_MD_pkey_type EVP_MD_get_pkey_type
#define EVP_MD_size EVP_MD_get_size
#define EVP_MD_block_size EVP_MD_get_block_size
#define EVP_MD_flags EVP_MD_get_flags
#define EVP_MD_CTX_get_size EVP_MD_CTX_get_size_ex
#define EVP_MD_CTX_size EVP_MD_CTX_get_size_ex
#define EVP_MD_CTX_block_size EVP_MD_CTX_get_block_size
#define EVP_MD_CTX_type EVP_MD_CTX_get_type
#define EVP_MD_CTX_pkey_ctx EVP_MD_CTX_get_pkey_ctx
#define EVP_MD_CTX_md_data EVP_MD_CTX_get0_md_data
And heads up, these ones have been deprecated since OpenSSL 3.0, and can be hidden entirely by defining OPENSSL_API_COMPAT with a suitable version value โ see openssl_user_macros(7):
const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx);
int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx,
const void *data, size_t count);
void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx,
int (*update)(EVP_MD_CTX *ctx,
const void *data, size_t count));
๐ DESCRIPTION ๐
The EVP digest routines are your high-level interface to message digests and Extendable Output Functions (XOF). Think of them as the VIP entrance to hashing, but make it OpenSSL.
The EVP_MD type is a structure for digest method implementation. It's the blueprint, not the finished smoothie. ๐
Each Message digest algorithm (such as SHA256) produces a fixed size output length, which is returned when EVP_DigestFinal_ex() is called. Extendable Output Functions (XOF) such as SHAKE256 are the iconique ones with a variable sized output length outlen, and you can use either EVP_DigestFinalXOF() or EVP_DigestSqueeze() with them. You can also use EVP_DigestFinal_ex() for an XOF, but bestie, the "xoflen" must be set beforehand (see PARAMETERS below). And note: EVP_MD_get_size() and EVP_MD_CTX_get_size_ex() behave differently for an XOF. Different vibes, literally.
๐ EVP_MD_fetch()
Fetches the digest implementation for the given algorithm from any provider offering it, within the criteria given by the properties. See ALGORITHM FETCHING in crypto(7) for further information.
The returned value must eventually be freed with EVP_MD_free().
Fetched EVP_MD structures are reference counted. Slay.
๐ EVP_MD_up_ref()
Increments the reference count for an EVP_MD structure. That's it. That's the whole job. ๐
๐ EVP_MD_free()
Decrements the reference count for the fetched EVP_MD structure. If the reference count drops to 0, then the structure is freed. If the argument is NULL, nothing is done โ no drama, no crash.
๐ EVP_MD_CTX_new()
Allocates and returns a digest context. Fresh context, main character energy. โจ
๐ EVP_MD_CTX_reset()
Resets the digest context ctx. You can use this to reuse an already existing context instead of making a whole new one. Reuse era.
๐ EVP_MD_CTX_free()
Cleans up digest context ctx and frees up the space allocated to it. If the argument is NULL, nothing is done.
๐ EVP_MD_CTX_ctrl()
This is a legacy method, okay? EVP_MD_CTX_set_params() and EVP_MD_CTX_get_params() are the mechanism that should be used to set and get parameters that are used by providers.
That said: it performs digest-specific control actions on context ctx. The control command is indicated in cmd, and any additional arguments are in p1 and p2. EVP_MD_CTX_ctrl() must be called after EVP_DigestInit_ex2(). Other restrictions may apply depending on the control type and digest implementation.
If this function happens to be used with a fetched EVP_MD, it will translate the controls that are known to OpenSSL into OSSL_PARAM(3) parameters with keys defined by OpenSSL and call EVP_MD_CTX_get_params() or EVP_MD_CTX_set_params() as is appropriate for each control command.
See CONTROLS below for more information, including what translations are being done.
๐ EVP_MD_get_params()
Retrieves the requested list of params from an MD md. See PARAMETERS below for more info.
๐ EVP_MD_CTX_get_params()
Retrieves the requested list of params from an MD context ctx. See PARAMETERS below.
๐ EVP_MD_CTX_set_params()
Sets the list of params into an MD context ctx. See PARAMETERS below.
๐ EVP_MD_gettable_params()
Get a constant OSSL_PARAM(3) array that describes the retrievable parameters that can be used with EVP_MD_get_params(). It's the โwhat can I ask for?โ list.
๐ EVP_MD_gettable_ctx_params(), EVP_MD_CTX_gettable_params()
Get a constant OSSL_PARAM(3) array that describes the retrievable parameters that can be used with EVP_MD_CTX_get_params().
EVP_MD_gettable_ctx_params() returns the parameters that can be retrieved from the algorithm, whereas EVP_MD_CTX_gettable_params() returns the parameters that can be retrieved in the context's current state. Two different vibes, same param tea. ๐ซถ
๐ EVP_MD_settable_ctx_params(), EVP_MD_CTX_settable_params()
Get a constant OSSL_PARAM(3) array that describes the settable parameters that can be used with EVP_MD_CTX_set_params().
EVP_MD_settable_ctx_params() returns the parameters that can be set from the algorithm, whereas EVP_MD_CTX_settable_params() returns the parameters that can be set in the context's current state. Algorithm-level vs current-state-level, iykyk.
๐ EVP_MD_CTX_set_flags(), EVP_MD_CTX_clear_flags(), EVP_MD_CTX_test_flags()
Sets, clears and tests ctx flags. See FLAGS below for more information. The flags section is right there waiting, bestie. ๐
EVP_Q_digest()โ the quick lil one-shot digest bestie โจ. It hashesdatalenbytes ofdataatdatausing the digest algorithmname, which gets fetched using the optionallibctxandpropqparameters. Digest value goes inmd, and its length is written atmdlenif that pointer isn'tNULL. At mostEVP_MAX_MD_SIZEbytes get written, no cap.EVP_Digest()โ basically a wrapper around theDigest Init_ex,UpdateandFinal_exfunctions ๐ซถ. Hashescountbytes ofdataatdatausing a digest type from theENGINEimpl. Digest value lands inmdand its length is written atsizeif that pointer isn'tNULL. At mostEVP_MAX_MD_SIZEbytes will be written. IfimplisNULL, the default implementation of the digest type is used โ iconic default behaviour ๐ .EVP_DigestInit_ex2()โ sets up digest contextctxto use a digest type ๐.typeis typically supplied by something likeEVP_sha1(), or a value explicitly fetched withEVP_MD_fetch().ctxMUST NOT beNULLโ like, do not do that, fr fr.
The parameters params are set on the context after initialisation, cute.
type can be NULL if ctx has already been initialized with another EVP_DigestInit_ex() call and has not been reset with EVP_MD_CTX_reset().
EVP_DigestInit_ex()โ same vibe, sets up digest contextctxto use a digest type.typeis typically supplied by a function such asEVP_sha1(), or a value explicitly fetched withEVP_MD_fetch().
If impl is non-NULL, its implementation of the digest type is used if there is one, and if there isn't, the default implementation steps in ๐.
Again: type can be NULL if ctx has already been initialized with another EVP_DigestInit_ex() call and has not been reset with EVP_MD_CTX_reset().
EVP_DigestUpdate()โ hashescntbytes ofdataatdinto the digest contextctx๐ฅ. You can call this several times on the samectxto hash additional data โ stack that data, bestie.EVP_DigestFinal_ex()โ retrieves the digest value fromctxand places it inmd๐ธ. If thesparameter isn'tNULL, the number of bytes of data written (i.e. the length of the digest) gets written to the integer ats. At mostEVP_MAX_MD_SIZEbytes will be written โ unless the digest implementation allows changing the digest size and it's been set to a larger value by the application ๐.
After callingEVP_DigestFinal_ex()you cannot make any moreEVP_DigestUpdate()calls on that context. You can callEVP_DigestInit_ex2()to initialize a new digest operation though. AndctxMUST NOT beNULLโ periodt.
EVP_DigestFinalXOF()โ the interface to extendable-output functions, XOFs, likeSHAKE128andSHAKE256๐ฆ. It retrieves the digest value fromctxand places it in theoutlen-sizedout.
After calling this, no moreEVP_DigestUpdate()calls โ butEVP_DigestInit_ex2()can spin up a new operation. AlsoEVP_DigestFinalXOF()may only be called once, so make it count ๐ .
EVP_DigestSqueeze()โ similar toEVP_DigestFinalXOF()but it lets you make multiple calls to squeeze out variable length output data ๐. And heads up:EVP_DigestFinalXOF()should not be called after this.EVP_MD_CTX_dup()โ duplicates the message digest state frominโจ. So useful for avoiding multipleEVP_MD_fetch()calls, or when you've got large amounts of data to hash that only differ in the last few bytes. Work smarter, not harder.EVP_MD_CTX_copy_ex()โ copies the message digest state fromintoout๐. Same reasoning: it's a lifesaver if large amounts of data are to be hashed which only differ in the last few bytes.EVP_DigestInit()โ behaves in the same way asEVP_DigestInit_ex2()except it doesn't set any parameters and it callsEVP_MD_CTX_reset(), so it literally cannot be used with atypeofNULL๐ญ.EVP_DigestFinal()โ similar toEVP_DigestFinal_ex()except after computing the digest, the digest contextctxis automatically cleaned up withEVP_MD_CTX_reset()๐ง. Self-cleaning, we love her.EVP_MD_CTX_copy()โ similar toEVP_MD_CTX_copy_ex()except the destinationoutdoes not have to be initialized ๐.EVP_MD_is_a()โ returns1ifmdis an implementation of an algorithm that's identifiable withname, otherwise0โ .
If md is a legacy digest (like, it's the return value from the likes of EVP_sha256() rather than the result of an EVP_MD_fetch()), only cipher names registered with the default library context (see OSSL_LIB_CTX(3)) will be considered ๐
EVP_MD_xof()โ returns1ifmdis an Extendable-output Function (XOF), otherwise0๐.SHAKE128andSHAKE256are XOF functions. It returns0for BLAKE2B algorithms, just so you know.EVP_MD_get0_name(),EVP_MD_CTX_get0_name()โ return the name of the given message digest ๐ท๏ธ. For fetched message digests with multiple names, only one of them gets returned; it's recommended to useEVP_MD_names_do_all()instead, iykyk.EVP_MD_names_do_all()โ traverses all names for themd, and callsfnwith each name anddata๐. This is only useful with fetchedEVP_MDs.EVP_MD_get0_description()โ returns a description of the digest, meant for display and human consumption ๐. The description is at the discretion of the digest implementation, so it's giving "each algorithm writes its own bio".EVP_MD_get0_provider()โ returns anOSSL_PROVIDERpointer to the provider that implements the givenEVP_MD๐.EVP_MD_get_size()โ returns the size of the message digest when passed anEVP_MD, i.e. the size of the hash ๐. A negative value or0can occur for invalid size. For an XOF with no default size, this returns0.EVP_MD_CTX_get_size_ex(),EVP_MD_CTX_get_size()โ for a normal digest this is the same asEVP_MD_get_size()๐ซถ. For an XOF it returns the"xoflen"if it's been set, otherwise it returns0.EVP_MD_get_block_size(),EVP_MD_CTX_get_block_size()โ return the block size of the message digest when passed anEVP_MDor anEVP_MD_CTXstructure ๐งฑ.EVP_MD_get_type(),EVP_MD_CTX_get_type()โ return the NID of the OBJECT IDENTIFIER representing the given message digest when passed anEVP_MDstructure ๐ธ. Like, for example:
EVP_MD_get_type(EVP_sha1())
returns NID_sha1. This function is normally used when setting ASN1 OIDs, bestie ๐
.
EVP_MD_CTX_get0_md_data()โ returns the digest method private data for the passedEVP_MD_CTX๐. The space is allocated by OpenSSL and has the size originally set withEVP_MD_meth_set_app_datasize().EVP_MD_CTX_get0_md(),EVP_MD_CTX_get1_md()โEVP_MD_CTX_get0_md()returns theEVP_MDstructure corresponding to the passedEVP_MD_CTX๐. This will be the sameEVP_MDobject originally passed toEVP_DigestInit_ex2()(or other similar function) when theEVP_MD_CTXwas first initialised.
Careful though: where explicit fetch is in use (seeEVP_MD_fetch(3)), the value returned from this function will not have its reference count incremented, so it should not be used after theEVP_MD_CTXis freed ๐.
EVP_MD_CTX_get1_md() is the same except the ownership is passed to the caller and is from the passed EVP_MD_CTX.
EVP_MD_CTX_set_update_fn()โ sets the update function forctxtoupdate๐ง. This is the function that's called byEVP_DigestUpdate(). If it's not set, the update function from theEVP_MDtype specified at initialization is used.EVP_MD_CTX_update_fn()โ returns the update function forctx๐ฏ.EVP_MD_get_flags()โ returns themdflags ๐ฉ. Note that these are different from theEVP_MD_CTXones. SeeEVP_MD_meth_set_flags(3)for more information.EVP_MD_get_pkey_type()โ returns the NID of the public key signing algorithm associated with this digest ๐. For exampleEVP_sha1()is associated with RSA so this will returnNID_sha1WithRSAEncryption. Since digests and signature algorithms are no longer linked, this function is only retained for compatibility reasons โ it's legacy energy, but we respect it.EVP_md_null()โ a "null" message digest that does literally nothing: i.e. the hash it returns is of zero length ๐ (the original main-character-of-nothing).EVP_get_digestbyname(),EVP_get_digestbynid(),EVP_get_digestbyobj()โ return anEVP_MDstructure when passed a digest name, a digest NID or anASN1_OBJECTstructure respectively ๐.
The EVP_get_digestbyname() function is present for backwards compatibility with OpenSSL prior to version 3 and is different to the EVP_MD_fetch() function since it does not attempt to "fetch" an implementation of the cipher. Additionally, it only knows about digests that are built-in to OpenSSL and have an associated NID. Similarly EVP_get_digestbynid() and EVP_get_digestbyobj() also return objects without an associated implementation ๐.
When the digest objects returned by these functions are used (such as in a call to EVP_DigestInit_ex()), an implementation of the digest will be implicitly fetched from the loaded providers. This fetch could fail if no suitable implementation is available ๐ญ. Use EVP_MD_fetch() instead to explicitly fetch the algorithm and an associated implementation from a provider.
See "ALGORITHM FETCHING" in crypto(7) for more information about fetching.
The digest objects returned from these functions do not need to be freed with EVP_MD_free() โ good news honestly.
EVP_MD_CTX_get_pkey_ctx()โ returns theEVP_PKEY_CTXassigned toctx๐. The returned pointer should not be freed by the caller.EVP_MD_CTX_set_pkey_ctx()โ assigns anEVP_PKEY_CTXtoEVP_MD_CTX๐ . This is usually used to provide a customizedEVP_PKEY_CTXtoEVP_DigestSignInit(3)orEVP_DigestVerifyInit(3). Thepctxpassed to this function should be freed by the caller. ANULLpctxpointer is also allowed, to clear theEVP_PKEY_CTXassigned toctx. In that case, whether the clearedEVP_PKEY_CTXgets freed or not depends on how theEVP_PKEY_CTXis created ๐.EVP_MD_do_all_provided()โ traverses all message digests implemented by all activated providers in the given library contextlibctx, and for each of the implementations, calls the given functionfnwith the implementation method and the givenargas argument ๐๐.
๐๏ธ PARAMETERS
Okay bestie, before we get into the actual keys โ peep OSSL_PARAM(3) for the whole tea on passing parameters, that's your homework. ๐
So EVP_MD_CTX_set_params() and EVP_MD_CTX_get_params() both play nice with these OSSL_PARAM keys:
"xoflen"(OSSL_DIGEST_PARAM_XOFLEN) <unsigned integer> โ sets or gets the digest length for extendable output functions. The value should not exceed what can be given using asize_t(don't be messy about it ๐ ). SHAKE-128 and SHAKE-256 may use it to set the output length thatEVP_DigestFinal_ex()andEVP_DigestFinal()use."size"(OSSL_DIGEST_PARAM_SIZE) <unsigned integer> โ sets or gets a fixed digest length. Again: the value should not exceed what can be given using asize_t. BLAKE2B-512 may use it to set the output length used byEVP_DigestFinal_ex()andEVP_DigestFinal().
EVP_MD_CTX_set_params() gets its own exclusive little list โ these keys are set-only:
"pad-type"(OSSL_DIGEST_PARAM_PAD_TYPE) <unsigned integer> โ sets the padding type. The MDC2 algorithm is the one using this. ๐งฉ
And EVP_MD_CTX_get_params() has its own get-only key too:
"micalg"(OSSL_DIGEST_PARAM_MICALG) <UTF8 string> โ gets the digest Message Integrity Check algorithm string. This is the one used when you're creating S/MIMEmultipart/signedmessages, exactly as specified in RFC 3851. External engines or providers may use it. โจ
๐ฎ CONTROLS
EVP_MD_CTX_ctrl() is your remote control โ it can send these standard controls:
EVP_MD_CTRL_MICALGโ gets the digest Message Integrity Check algorithm string. Yep, same S/MIMEmultipart/signedsituation, as specified in RFC 3851. The string value gets written to p2. When you use this with a fetchedEVP_MD,EVP_MD_CTX_get_params()gets called with anOSSL_PARAM(3)item with the key"micalg"(OSSL_DIGEST_PARAM_MICALG).EVP_MD_CTRL_XOF_LENโ this control sets the digest length for extendable output functions to p1. Sending this control directly should not be necessary, bestie โ usingEVP_DigestFinalXOF()is the preferred glow-up route. Currently used by SHAKE algorithms. When you use this with a fetchedEVP_MD,EVP_MD_CTX_get_params()gets called with anOSSL_PARAM(3)item with the key"xoflen"(OSSL_DIGEST_PARAM_XOFLEN).
๐ฉ FLAGS
EVP_MD_CTX_set_flags(), EVP_MD_CTX_clear_flags() and EVP_MD_CTX_test_flags() are the trio you use to manipulate and test these EVP_MD_CTX flags:
EVP_MD_CTX_FLAG_ONESHOTโ tells the digest to optimize for one update only, if possible. Main-character efficiency. โกEVP_MD_CTX_FLAG_CLEANEDโ internal use only. Must not be used in user code. Hands off. ๐EVP_MD_CTX_FLAG_REUSEโ also internal use only, also must not be used in user code. Same energy. ๐EVP_MD_CTX_FLAG_NO_INITโ instructsEVP_DigestInit()and similar functions not to initialise the implementation specific data.EVP_MD_CTX_FLAG_FINALISEโ some functions likeEVP_DigestSignonly finalise copies of internal contexts, so that additional data can be included after the finalisation call. That's inefficient if you don't actually need the functionality, and this flag disables it. ๐ช
๐ RETURN VALUES
Okay, here's the receipts โ what every single one of these gives you back:
EVP_MD_fetch()โ returns a pointer to aEVP_MDfor success, orNULLfor failure.EVP_MD_up_ref()โ returns1for success or0for failure.EVP_Q_digest(),EVP_Digest(),EVP_DigestInit_ex2(),EVP_DigestInit_ex(),EVP_DigestInit(),EVP_DigestUpdate(),EVP_DigestFinal_ex(),EVP_DigestFinalXOF(), andEVP_DigestFinal()โ return1for success and0for failure.EVP_MD_CTX_ctrl()โ returns1if successful or0for failure.EVP_MD_CTX_set_params(),EVP_MD_CTX_get_params()โ returns1if successful or0for failure.EVP_MD_CTX_settable_params(),EVP_MD_CTX_gettable_params()โ return an array of constantOSSL_PARAM(3)s, orNULLif there is none to get.EVP_MD_CTX_dup()โ returns a newEVP_MD_CTXif successful orNULLon failure.EVP_MD_CTX_copy_ex()โ returns1if successful or0for failure.EVP_MD_get_type(),EVP_MD_get_pkey_type()โ returns the NID of the corresponding OBJECT IDENTIFIER, orNID_undefif none exists.EVP_MD_get_size(),EVP_MD_get_block_size(),EVP_MD_CTX_get_size(),EVP_MD_CTX_get_block_size()โ returns the digest or block size in bytes, or-1for failure.EVP_md_null()โ returns a pointer to theEVP_MDstructure of the"null"message digest.EVP_get_digestbyname(),EVP_get_digestbynid(),EVP_get_digestbyobj()โ returns either anEVP_MDstructure orNULLif an error occurs.EVP_MD_CTX_set_pkey_ctx()โ this function has no return value. Nothing. Nada. ๐EVP_MD_names_do_all()โ returns1if the callback was called for all names. A return value of0means that the callback was not called for any names.
๐ NOTES
The EVP interface to message digests should almost always be used in preference to the low-level interfaces. Why? Because then your code becomes transparent to the digest being used and so much more flexible. It's giving adaptable. ๐ฆ
New applications should use the SHA-2 (such as EVP_sha256(3)) or the SHA-3 digest algorithms (such as EVP_sha3_512(3)). The other digest algorithms are still in common use, so no shade to them, but yeah. ๐
For most applications the impl parameter to EVP_DigestInit_ex() will be set to NULL to use the default digest implementation.
โ ๏ธ Lowkey important, bestie: ignoring failure returns ofEVP_DigestInit_ex(),EVP_DigestInit_ex2(), orEVP_DigestInit()can lead to undefined behavior on subsequent calls updating or finalizing theEVP_MD_CTX, such as theEVP_DigestUpdate()orEVP_DigestFinal()functions. The only valid calls on theEVP_MD_CTXwhen initialization fails are calls that attempt another initialization of the context or release the context. That's it. Periodt. ๐
The functions EVP_DigestInit(), EVP_DigestFinal() and EVP_MD_CTX_copy() are obsolete but are retained to maintain compatibility with existing code. New applications should use EVP_DigestInit_ex(), EVP_DigestFinal_ex() and EVP_MD_CTX_copy_ex() instead โ because they can efficiently reuse a digest context instead of initializing and cleaning it up on each call, and they allow non default implementations of digests to be specified. Reuse era. โป๏ธ
If digest contexts are not cleaned up after use, memory leaks will occur. ๐ญ Not the vibe. Clean up your contexts.
EVP_MD_CTX_get0_name(), EVP_MD_CTX_get_size(), EVP_MD_CTX_get_block_size(), EVP_MD_CTX_get_type(), EVP_get_digestbynid() and EVP_get_digestbyobj() are defined as macros. iykyk.
EVP_MD_CTX_ctrl() sends commands to message digests for additional configuration or control.
๐ป EXAMPLES
This example digests the data "Test Message\n" and "Hello World\n", using the digest name passed on the command line. She's simple, she's iconic:
#include <stdio.h>
#include <string.h>
#include <openssl/evp.h>
int main(int argc, char *argv[])
{
EVP_MD_CTX *mdctx;
const EVP_MD *md;
char mess1[] = "Test Message\n";
char mess2[] = "Hello World\n";
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
if (argv[1] == NULL) {
printf("Usage: mdtest digestname\n");
exit(1);
}
md = EVP_get_digestbyname(argv[1]);
if (md == NULL) {
printf("Unknown message digest %s\n", argv[1]);
exit(1);
}
mdctx = EVP_MD_CTX_new();
if (mdctx == NULL) {
printf("Message digest create failed.\n");
exit(1);
}
if (!EVP_DigestInit_ex2(mdctx, md, NULL)) {
printf("Message digest initialization failed.\n");
EVP_MD_CTX_free(mdctx);
exit(1);
}
if (!EVP_DigestUpdate(mdctx, mess1, strlen(mess1))) {
printf("Message digest update failed.\n");
EVP_MD_CTX_free(mdctx);
exit(1);
}
if (!EVP_DigestUpdate(mdctx, mess2, strlen(mess2))) {
printf("Message digest update failed.\n");
EVP_MD_CTX_free(mdctx);
exit(1);
}
if (!EVP_DigestFinal_ex(mdctx, md_value, &md_len)) {
printf("Message digest finalization failed.\n");
EVP_MD_CTX_free(mdctx);
exit(1);
}
EVP_MD_CTX_free(mdctx);
printf("Digest is: ");
for (i = 0; i < md_len; i++)
printf("%02x", md_value[i]);
printf("\n");
exit(0);
}
๐ SEE ALSO
The whole friend group: EVP_MD_meth_new(3), openssl-dgst(1), evp(7), OSSL_PROVIDER(3), OSSL_PARAM(3), property(7), "ALGORITHM FETCHING" in crypto(7), provider-digest(7), life_cycle-digest(7) ๐ซถ
The full list of digest algorithms are provided below, bestie โ go wild:
EVP_blake2b512(3), EVP_md2(3), EVP_md4(3), EVP_md5(3), EVP_mdc2(3), EVP_ripemd160(3), EVP_sha1(3), EVP_sha224(3), EVP_sha3_224(3), EVP_sm3(3), EVP_whirlpool(3)
๐ฐ๏ธ HISTORY
Let's take a lil stroll down memory lane, shall we? ๐ธ
The EVP_MD_CTX_create() and EVP_MD_CTX_destroy() functions were renamed to EVP_MD_CTX_new() and EVP_MD_CTX_free() in OpenSSL 1.1.0, respectively.
The link between digests and signing algorithms was fixed in OpenSSL 1.0 and later, so now EVP_sha1() can be used with RSA and DSA. Slay. ๐
The EVP_dss1() function was removed in OpenSSL 1.1.0. Gone but not forgotten. ๐๏ธ
The EVP_MD_CTX_set_pkey_ctx() function was added in OpenSSL 1.1.1.
The EVP_Q_digest(), EVP_DigestInit_ex2(), EVP_MD_fetch(), EVP_MD_free(), EVP_MD_up_ref(), EVP_MD_get_params(), EVP_MD_CTX_set_params(), EVP_MD_CTX_get_params(), EVP_MD_gettable_params(), EVP_MD_gettable_ctx_params(), EVP_MD_settable_ctx_params(), EVP_MD_CTX_settable_params() and EVP_MD_CTX_gettable_params() functions were added in OpenSSL 3.0.
The EVP_MD_type(), EVP_MD_nid(), EVP_MD_name(), EVP_MD_pkey_type(), EVP_MD_size(), EVP_MD_block_size(), EVP_MD_flags(), EVP_MD_CTX_size(), EVP_MD_CTX_block_size(), EVP_MD_CTX_type(), and EVP_MD_CTX_md_data() functions were renamed to include "get" or "get0" in their names in OpenSSL 3.0, respectively. The old names are kept as non-deprecated alias macros, so nobody's code gets left behind. ๐ซถ
The EVP_MD_CTX_md() function was deprecated in OpenSSL 3.0; use EVP_MD_CTX_get0_md() instead. EVP_MD_CTX_update_fn() and EVP_MD_CTX_set_update_fn() were deprecated in OpenSSL 3.0.
The EVP_MD_CTX_dup() function was added in OpenSSL 3.1.
The EVP_DigestSqueeze() function was added in OpenSSL 3.3.
The EVP_MD_CTX_get_size_ex() and EVP_xof() functions were added in OpenSSL 3.4. The macros EVP_MD_CTX_get_size() and EVP_MD_CTX_size were changed in OpenSSL 3.4 to be aliases for EVP_MD_CTX_get_size_ex(), previously they were aliases for EVP_MD_get_size which returned a constant value. This is required for XOF digests since they do not have a fixed size. ๐
๐ COPYRIGHT ๐
okay bestie, legal era incoming, but it's actually short so stay with me ๐ซถ
Copyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved. like, every last one of them, no cap ๐
This file is licensed under the Apache License 2.0 (the "License"). The way that's phrased: you may not use this file except in compliance with the License โ so like, read it first, it's giving "terms and conditions but make it actually matter" ๐ญ
You can grab a copy of the License in the file LICENSE in the source distribution, or at:
https://www.openssl.org/source/license.html
that's the whole thing. licensing lore, delivered ๐
and that's a wrap on EVP_DIGESTINIT(3SSL), bestie!! ๐ this iconic little page is from OpenSSL sources, version 3.5.7, dated 2026-06-09 โจ go forth and digest responsibly, mwah ๐๐ฆ๐ธ
๐ฆ where this page comes from
- debian trixie: libssl-doc 3.5.7-1~deb13u2 ยท Apache-2.0
- debian trixie: libssl-doc 3.5.7-1~deb13u3 ยท Apache-2.0
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms