1e71b7053SJung-uk Kim=pod 2e71b7053SJung-uk Kim 3e71b7053SJung-uk Kim=head1 NAME 4e71b7053SJung-uk Kim 5b077aed3SPierre ProncheryEVP_MD_fetch, EVP_MD_up_ref, EVP_MD_free, 6b077aed3SPierre ProncheryEVP_MD_get_params, EVP_MD_gettable_params, 717f01e99SJung-uk KimEVP_MD_CTX_new, EVP_MD_CTX_reset, EVP_MD_CTX_free, EVP_MD_CTX_copy, 8b077aed3SPierre ProncheryEVP_MD_CTX_copy_ex, EVP_MD_CTX_ctrl, 9b077aed3SPierre ProncheryEVP_MD_CTX_set_params, EVP_MD_CTX_get_params, 10b077aed3SPierre ProncheryEVP_MD_settable_ctx_params, EVP_MD_gettable_ctx_params, 11b077aed3SPierre ProncheryEVP_MD_CTX_settable_params, EVP_MD_CTX_gettable_params, 12b077aed3SPierre ProncheryEVP_MD_CTX_set_flags, EVP_MD_CTX_clear_flags, EVP_MD_CTX_test_flags, 13b077aed3SPierre ProncheryEVP_Q_digest, EVP_Digest, EVP_DigestInit_ex2, EVP_DigestInit_ex, EVP_DigestInit, 14b077aed3SPierre ProncheryEVP_DigestUpdate, EVP_DigestFinal_ex, EVP_DigestFinalXOF, EVP_DigestFinal, 15b077aed3SPierre ProncheryEVP_MD_is_a, EVP_MD_get0_name, EVP_MD_get0_description, 16b077aed3SPierre ProncheryEVP_MD_names_do_all, EVP_MD_get0_provider, EVP_MD_get_type, 17b077aed3SPierre ProncheryEVP_MD_get_pkey_type, EVP_MD_get_size, EVP_MD_get_block_size, EVP_MD_get_flags, 18b077aed3SPierre ProncheryEVP_MD_CTX_get0_name, EVP_MD_CTX_md, EVP_MD_CTX_get0_md, EVP_MD_CTX_get1_md, 19b077aed3SPierre ProncheryEVP_MD_CTX_get_type, EVP_MD_CTX_get_size, EVP_MD_CTX_get_block_size, 20b077aed3SPierre ProncheryEVP_MD_CTX_get0_md_data, EVP_MD_CTX_update_fn, EVP_MD_CTX_set_update_fn, 21e71b7053SJung-uk KimEVP_md_null, 2217f01e99SJung-uk KimEVP_get_digestbyname, EVP_get_digestbynid, EVP_get_digestbyobj, 23b077aed3SPierre ProncheryEVP_MD_CTX_get_pkey_ctx, EVP_MD_CTX_set_pkey_ctx, 24b077aed3SPierre ProncheryEVP_MD_do_all_provided, 25b077aed3SPierre ProncheryEVP_MD_type, EVP_MD_nid, EVP_MD_name, EVP_MD_pkey_type, EVP_MD_size, 26b077aed3SPierre ProncheryEVP_MD_block_size, EVP_MD_flags, EVP_MD_CTX_size, EVP_MD_CTX_block_size, 27b077aed3SPierre ProncheryEVP_MD_CTX_type, EVP_MD_CTX_pkey_ctx, EVP_MD_CTX_md_data 28b077aed3SPierre Pronchery- EVP digest routines 29e71b7053SJung-uk Kim 30e71b7053SJung-uk Kim=head1 SYNOPSIS 31e71b7053SJung-uk Kim 32e71b7053SJung-uk Kim #include <openssl/evp.h> 33e71b7053SJung-uk Kim 34b077aed3SPierre Pronchery EVP_MD *EVP_MD_fetch(OSSL_LIB_CTX *ctx, const char *algorithm, 35b077aed3SPierre Pronchery const char *properties); 36b077aed3SPierre Pronchery int EVP_MD_up_ref(EVP_MD *md); 37b077aed3SPierre Pronchery void EVP_MD_free(EVP_MD *md); 38b077aed3SPierre Pronchery int EVP_MD_get_params(const EVP_MD *digest, OSSL_PARAM params[]); 39b077aed3SPierre Pronchery const OSSL_PARAM *EVP_MD_gettable_params(const EVP_MD *digest); 40e71b7053SJung-uk Kim EVP_MD_CTX *EVP_MD_CTX_new(void); 41e71b7053SJung-uk Kim int EVP_MD_CTX_reset(EVP_MD_CTX *ctx); 42e71b7053SJung-uk Kim void EVP_MD_CTX_free(EVP_MD_CTX *ctx); 43e71b7053SJung-uk Kim void EVP_MD_CTX_ctrl(EVP_MD_CTX *ctx, int cmd, int p1, void* p2); 44b077aed3SPierre Pronchery int EVP_MD_CTX_get_params(EVP_MD_CTX *ctx, OSSL_PARAM params[]); 45b077aed3SPierre Pronchery int EVP_MD_CTX_set_params(EVP_MD_CTX *ctx, const OSSL_PARAM params[]); 46b077aed3SPierre Pronchery const OSSL_PARAM *EVP_MD_settable_ctx_params(const EVP_MD *md); 47b077aed3SPierre Pronchery const OSSL_PARAM *EVP_MD_gettable_ctx_params(const EVP_MD *md); 48b077aed3SPierre Pronchery const OSSL_PARAM *EVP_MD_CTX_settable_params(EVP_MD_CTX *ctx); 49b077aed3SPierre Pronchery const OSSL_PARAM *EVP_MD_CTX_gettable_params(EVP_MD_CTX *ctx); 50e71b7053SJung-uk Kim void EVP_MD_CTX_set_flags(EVP_MD_CTX *ctx, int flags); 51e71b7053SJung-uk Kim void EVP_MD_CTX_clear_flags(EVP_MD_CTX *ctx, int flags); 52e71b7053SJung-uk Kim int EVP_MD_CTX_test_flags(const EVP_MD_CTX *ctx, int flags); 53e71b7053SJung-uk Kim 54b077aed3SPierre Pronchery int EVP_Q_digest(OSSL_LIB_CTX *libctx, const char *name, const char *propq, 55b077aed3SPierre Pronchery const void *data, size_t datalen, 56b077aed3SPierre Pronchery unsigned char *md, size_t *mdlen); 5717f01e99SJung-uk Kim int EVP_Digest(const void *data, size_t count, unsigned char *md, 5817f01e99SJung-uk Kim unsigned int *size, const EVP_MD *type, ENGINE *impl); 59b077aed3SPierre Pronchery int EVP_DigestInit_ex2(EVP_MD_CTX *ctx, const EVP_MD *type, 60b077aed3SPierre Pronchery const OSSL_PARAM params[]); 61e71b7053SJung-uk Kim int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); 62e71b7053SJung-uk Kim int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *d, size_t cnt); 63e71b7053SJung-uk Kim int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); 64e71b7053SJung-uk Kim int EVP_DigestFinalXOF(EVP_MD_CTX *ctx, unsigned char *md, size_t len); 65e71b7053SJung-uk Kim 66e71b7053SJung-uk Kim int EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in); 67e71b7053SJung-uk Kim 68e71b7053SJung-uk Kim int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type); 69e71b7053SJung-uk Kim int EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); 70e71b7053SJung-uk Kim 71e71b7053SJung-uk Kim int EVP_MD_CTX_copy(EVP_MD_CTX *out, EVP_MD_CTX *in); 72e71b7053SJung-uk Kim 73b077aed3SPierre Pronchery const char *EVP_MD_get0_name(const EVP_MD *md); 74b077aed3SPierre Pronchery const char *EVP_MD_get0_description(const EVP_MD *md); 75b077aed3SPierre Pronchery int EVP_MD_is_a(const EVP_MD *md, const char *name); 76b077aed3SPierre Pronchery int EVP_MD_names_do_all(const EVP_MD *md, 77b077aed3SPierre Pronchery void (*fn)(const char *name, void *data), 78b077aed3SPierre Pronchery void *data); 79b077aed3SPierre Pronchery const OSSL_PROVIDER *EVP_MD_get0_provider(const EVP_MD *md); 80b077aed3SPierre Pronchery int EVP_MD_get_type(const EVP_MD *md); 81b077aed3SPierre Pronchery int EVP_MD_get_pkey_type(const EVP_MD *md); 82b077aed3SPierre Pronchery int EVP_MD_get_size(const EVP_MD *md); 83b077aed3SPierre Pronchery int EVP_MD_get_block_size(const EVP_MD *md); 84b077aed3SPierre Pronchery unsigned long EVP_MD_get_flags(const EVP_MD *md); 85e71b7053SJung-uk Kim 86b077aed3SPierre Pronchery const EVP_MD *EVP_MD_CTX_get0_md(const EVP_MD_CTX *ctx); 87b077aed3SPierre Pronchery EVP_MD *EVP_MD_CTX_get1_md(EVP_MD_CTX *ctx); 88b077aed3SPierre Pronchery const char *EVP_MD_CTX_get0_name(const EVP_MD_CTX *ctx); 89b077aed3SPierre Pronchery int EVP_MD_CTX_get_size(const EVP_MD_CTX *ctx); 90b077aed3SPierre Pronchery int EVP_MD_CTX_get_block_size(const EVP_MD_CTX *ctx); 91b077aed3SPierre Pronchery int EVP_MD_CTX_get_type(const EVP_MD_CTX *ctx); 92b077aed3SPierre Pronchery void *EVP_MD_CTX_get0_md_data(const EVP_MD_CTX *ctx); 93e71b7053SJung-uk Kim 94e71b7053SJung-uk Kim const EVP_MD *EVP_md_null(void); 95e71b7053SJung-uk Kim 96e71b7053SJung-uk Kim const EVP_MD *EVP_get_digestbyname(const char *name); 97e71b7053SJung-uk Kim const EVP_MD *EVP_get_digestbynid(int type); 98e71b7053SJung-uk Kim const EVP_MD *EVP_get_digestbyobj(const ASN1_OBJECT *o); 99e71b7053SJung-uk Kim 100b077aed3SPierre Pronchery EVP_PKEY_CTX *EVP_MD_CTX_get_pkey_ctx(const EVP_MD_CTX *ctx); 101e71b7053SJung-uk Kim void EVP_MD_CTX_set_pkey_ctx(EVP_MD_CTX *ctx, EVP_PKEY_CTX *pctx); 102e71b7053SJung-uk Kim 103b077aed3SPierre Pronchery void EVP_MD_do_all_provided(OSSL_LIB_CTX *libctx, 104b077aed3SPierre Pronchery void (*fn)(EVP_MD *mac, void *arg), 105b077aed3SPierre Pronchery void *arg); 106b077aed3SPierre Pronchery 107b077aed3SPierre Pronchery #define EVP_MD_type EVP_MD_get_type 108b077aed3SPierre Pronchery #define EVP_MD_nid EVP_MD_get_type 109b077aed3SPierre Pronchery #define EVP_MD_name EVP_MD_get0_name 110b077aed3SPierre Pronchery #define EVP_MD_pkey_type EVP_MD_get_pkey_type 111b077aed3SPierre Pronchery #define EVP_MD_size EVP_MD_get_size 112b077aed3SPierre Pronchery #define EVP_MD_block_size EVP_MD_get_block_size 113b077aed3SPierre Pronchery #define EVP_MD_flags EVP_MD_get_flags 114b077aed3SPierre Pronchery #define EVP_MD_CTX_size EVP_MD_CTX_get_size 115b077aed3SPierre Pronchery #define EVP_MD_CTX_block_size EVP_MD_CTX_get_block_size 116b077aed3SPierre Pronchery #define EVP_MD_CTX_type EVP_MD_CTX_get_type 117b077aed3SPierre Pronchery #define EVP_MD_CTX_pkey_ctx EVP_MD_CTX_get_pkey_ctx 118b077aed3SPierre Pronchery #define EVP_MD_CTX_md_data EVP_MD_CTX_get0_md_data 119b077aed3SPierre Pronchery 120b077aed3SPierre ProncheryThe following functions have been deprecated since OpenSSL 3.0, and can be 121b077aed3SPierre Proncheryhidden entirely by defining B<OPENSSL_API_COMPAT> with a suitable version value, 122b077aed3SPierre Proncherysee L<openssl_user_macros(7)>: 123b077aed3SPierre Pronchery 124b077aed3SPierre Pronchery const EVP_MD *EVP_MD_CTX_md(const EVP_MD_CTX *ctx); 125b077aed3SPierre Pronchery 126b077aed3SPierre Pronchery int (*EVP_MD_CTX_update_fn(EVP_MD_CTX *ctx))(EVP_MD_CTX *ctx, 127b077aed3SPierre Pronchery const void *data, size_t count); 128b077aed3SPierre Pronchery 129b077aed3SPierre Pronchery void EVP_MD_CTX_set_update_fn(EVP_MD_CTX *ctx, 130b077aed3SPierre Pronchery int (*update)(EVP_MD_CTX *ctx, 131b077aed3SPierre Pronchery const void *data, size_t count)); 132b077aed3SPierre Pronchery 133e71b7053SJung-uk Kim=head1 DESCRIPTION 134e71b7053SJung-uk Kim 13558f35182SJung-uk KimThe EVP digest routines are a high-level interface to message digests, 136b077aed3SPierre Proncheryand should be used instead of the digest-specific functions. 137b077aed3SPierre Pronchery 138b077aed3SPierre ProncheryThe B<EVP_MD> type is a structure for digest method implementation. 139e71b7053SJung-uk Kim 140e71b7053SJung-uk Kim=over 4 141e71b7053SJung-uk Kim 142b077aed3SPierre Pronchery=item EVP_MD_fetch() 143b077aed3SPierre Pronchery 144b077aed3SPierre ProncheryFetches the digest implementation for the given I<algorithm> from any 145b077aed3SPierre Proncheryprovider offering it, within the criteria given by the I<properties>. 146b077aed3SPierre ProncherySee L<crypto(7)/ALGORITHM FETCHING> for further information. 147b077aed3SPierre Pronchery 148b077aed3SPierre ProncheryThe returned value must eventually be freed with EVP_MD_free(). 149b077aed3SPierre Pronchery 150b077aed3SPierre ProncheryFetched B<EVP_MD> structures are reference counted. 151b077aed3SPierre Pronchery 152b077aed3SPierre Pronchery=item EVP_MD_up_ref() 153b077aed3SPierre Pronchery 154b077aed3SPierre ProncheryIncrements the reference count for an B<EVP_MD> structure. 155b077aed3SPierre Pronchery 156b077aed3SPierre Pronchery=item EVP_MD_free() 157b077aed3SPierre Pronchery 158b077aed3SPierre ProncheryDecrements the reference count for the fetched B<EVP_MD> structure. 159b077aed3SPierre ProncheryIf the reference count drops to 0 then the structure is freed. 160b077aed3SPierre Pronchery 161e71b7053SJung-uk Kim=item EVP_MD_CTX_new() 162e71b7053SJung-uk Kim 163e71b7053SJung-uk KimAllocates and returns a digest context. 164e71b7053SJung-uk Kim 165e71b7053SJung-uk Kim=item EVP_MD_CTX_reset() 166e71b7053SJung-uk Kim 167b077aed3SPierre ProncheryResets the digest context I<ctx>. This can be used to reuse an already 168e71b7053SJung-uk Kimexisting context. 169e71b7053SJung-uk Kim 170e71b7053SJung-uk Kim=item EVP_MD_CTX_free() 171e71b7053SJung-uk Kim 172b077aed3SPierre ProncheryCleans up digest context I<ctx> and frees up the space allocated to it. 173e71b7053SJung-uk Kim 174e71b7053SJung-uk Kim=item EVP_MD_CTX_ctrl() 175e71b7053SJung-uk Kim 176b077aed3SPierre ProncheryI<This is a legacy method. EVP_MD_CTX_set_params() and EVP_MD_CTX_get_params() 177b077aed3SPierre Proncheryis the mechanism that should be used to set and get parameters that are used by 178b077aed3SPierre Proncheryproviders.> 179b077aed3SPierre Pronchery 180b077aed3SPierre ProncheryPerforms digest-specific control actions on context I<ctx>. The control command 181b077aed3SPierre Proncheryis indicated in I<cmd> and any additional arguments in I<p1> and I<p2>. 182b077aed3SPierre ProncheryEVP_MD_CTX_ctrl() must be called after EVP_DigestInit_ex2(). Other restrictions 18317f01e99SJung-uk Kimmay apply depending on the control type and digest implementation. 184b077aed3SPierre Pronchery 185b077aed3SPierre ProncheryIf this function happens to be used with a fetched B<EVP_MD>, it will 186b077aed3SPierre Proncherytranslate the controls that are known to OpenSSL into L<OSSL_PARAM(3)> 187b077aed3SPierre Proncheryparameters with keys defined by OpenSSL and call EVP_MD_CTX_get_params() or 188b077aed3SPierre ProncheryEVP_MD_CTX_set_params() as is appropriate for each control command. 189b077aed3SPierre Pronchery 190b077aed3SPierre ProncherySee L</CONTROLS> below for more information, including what translations are 191b077aed3SPierre Proncherybeing done. 192b077aed3SPierre Pronchery 193b077aed3SPierre Pronchery=item EVP_MD_get_params() 194b077aed3SPierre Pronchery 195b077aed3SPierre ProncheryRetrieves the requested list of I<params> from a MD I<md>. 196b077aed3SPierre ProncherySee L</PARAMETERS> below for more information. 197b077aed3SPierre Pronchery 198b077aed3SPierre Pronchery=item EVP_MD_CTX_get_params() 199b077aed3SPierre Pronchery 200b077aed3SPierre ProncheryRetrieves the requested list of I<params> from a MD context I<ctx>. 201b077aed3SPierre ProncherySee L</PARAMETERS> below for more information. 202b077aed3SPierre Pronchery 203b077aed3SPierre Pronchery=item EVP_MD_CTX_set_params() 204b077aed3SPierre Pronchery 205b077aed3SPierre ProncherySets the list of I<params> into a MD context I<ctx>. 206b077aed3SPierre ProncherySee L</PARAMETERS> below for more information. 207b077aed3SPierre Pronchery 208b077aed3SPierre Pronchery=item EVP_MD_gettable_params() 209b077aed3SPierre Pronchery 210b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the retrievable parameters 211b077aed3SPierre Proncherythat can be used with EVP_MD_get_params(). 212b077aed3SPierre Pronchery 213b077aed3SPierre Pronchery=item EVP_MD_gettable_ctx_params(), EVP_MD_CTX_gettable_params() 214b077aed3SPierre Pronchery 215b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the retrievable parameters 216b077aed3SPierre Proncherythat can be used with EVP_MD_CTX_get_params(). EVP_MD_gettable_ctx_params() 217b077aed3SPierre Proncheryreturns the parameters that can be retrieved from the algorithm, whereas 218b077aed3SPierre ProncheryEVP_MD_CTX_gettable_params() returns the parameters that can be retrieved 219b077aed3SPierre Proncheryin the context's current state. 220b077aed3SPierre Pronchery 221b077aed3SPierre Pronchery=item EVP_MD_settable_ctx_params(), EVP_MD_CTX_settable_params() 222b077aed3SPierre Pronchery 223b077aed3SPierre ProncheryGet a constant L<OSSL_PARAM(3)> array that describes the settable parameters 224b077aed3SPierre Proncherythat can be used with EVP_MD_CTX_set_params(). EVP_MD_settable_ctx_params() 225b077aed3SPierre Proncheryreturns the parameters that can be set from the algorithm, whereas 226b077aed3SPierre ProncheryEVP_MD_CTX_settable_params() returns the parameters that can be set in the 227b077aed3SPierre Proncherycontext's current state. 228e71b7053SJung-uk Kim 229e71b7053SJung-uk Kim=item EVP_MD_CTX_set_flags(), EVP_MD_CTX_clear_flags(), EVP_MD_CTX_test_flags() 230e71b7053SJung-uk Kim 231b077aed3SPierre ProncherySets, clears and tests I<ctx> flags. See L</FLAGS> below for more information. 232b077aed3SPierre Pronchery 233b077aed3SPierre Pronchery=item EVP_Q_digest() is a quick one-shot digest function. 234b077aed3SPierre Pronchery 235b077aed3SPierre ProncheryIt hashes I<datalen> bytes of data at I<data> using the digest algorithm 236b077aed3SPierre ProncheryI<name>, which is fetched using the optional I<libctx> and I<propq> parameters. 237b077aed3SPierre ProncheryThe digest value is placed in I<md> and its length is written at I<mdlen> 238b077aed3SPierre Proncheryif the pointer is not NULL. At most B<EVP_MAX_MD_SIZE> bytes will be written. 239e71b7053SJung-uk Kim 24017f01e99SJung-uk Kim=item EVP_Digest() 24117f01e99SJung-uk Kim 24217f01e99SJung-uk KimA wrapper around the Digest Init_ex, Update and Final_ex functions. 243b077aed3SPierre ProncheryHashes I<count> bytes of data at I<data> using a digest I<type> from ENGINE 244b077aed3SPierre ProncheryI<impl>. The digest value is placed in I<md> and its length is written at I<size> 24517f01e99SJung-uk Kimif the pointer is not NULL. At most B<EVP_MAX_MD_SIZE> bytes will be written. 246b077aed3SPierre ProncheryIf I<impl> is NULL the default implementation of digest I<type> is used. 247b077aed3SPierre Pronchery 248b077aed3SPierre Pronchery=item EVP_DigestInit_ex2() 249b077aed3SPierre Pronchery 250b077aed3SPierre ProncherySets up digest context I<ctx> to use a digest I<type>. 251b077aed3SPierre ProncheryI<type> is typically supplied by a function such as EVP_sha1(), or a 252b077aed3SPierre Proncheryvalue explicitly fetched with EVP_MD_fetch(). 253b077aed3SPierre Pronchery 254b077aed3SPierre ProncheryThe parameters B<params> are set on the context after initialisation. 255b077aed3SPierre Pronchery 256b077aed3SPierre ProncheryThe I<type> parameter can be NULL if I<ctx> has been already initialized 257b077aed3SPierre Proncherywith another EVP_DigestInit_ex() call and has not been reset with 258b077aed3SPierre ProncheryEVP_MD_CTX_reset(). 25917f01e99SJung-uk Kim 260e71b7053SJung-uk Kim=item EVP_DigestInit_ex() 261e71b7053SJung-uk Kim 262b077aed3SPierre ProncherySets up digest context I<ctx> to use a digest I<type>. 263b077aed3SPierre ProncheryI<type> is typically supplied by a function such as EVP_sha1(), or a 264b077aed3SPierre Proncheryvalue explicitly fetched with EVP_MD_fetch(). 265b077aed3SPierre Pronchery 266b077aed3SPierre ProncheryIf I<impl> is non-NULL, its implementation of the digest I<type> is used if 267b077aed3SPierre Proncherythere is one, and if not, the default implementation is used. 268b077aed3SPierre Pronchery 269b077aed3SPierre ProncheryThe I<type> parameter can be NULL if I<ctx> has been already initialized 270b077aed3SPierre Proncherywith another EVP_DigestInit_ex() call and has not been reset with 271b077aed3SPierre ProncheryEVP_MD_CTX_reset(). 272e71b7053SJung-uk Kim 273e71b7053SJung-uk Kim=item EVP_DigestUpdate() 274e71b7053SJung-uk Kim 275b077aed3SPierre ProncheryHashes I<cnt> bytes of data at I<d> into the digest context I<ctx>. This 276b077aed3SPierre Proncheryfunction can be called several times on the same I<ctx> to hash additional 277e71b7053SJung-uk Kimdata. 278e71b7053SJung-uk Kim 279e71b7053SJung-uk Kim=item EVP_DigestFinal_ex() 280e71b7053SJung-uk Kim 281b077aed3SPierre ProncheryRetrieves the digest value from I<ctx> and places it in I<md>. If the I<s> 282e71b7053SJung-uk Kimparameter is not NULL then the number of bytes of data written (i.e. the 283b077aed3SPierre Proncherylength of the digest) will be written to the integer at I<s>, at most 284e71b7053SJung-uk KimB<EVP_MAX_MD_SIZE> bytes will be written. After calling EVP_DigestFinal_ex() 285e71b7053SJung-uk Kimno additional calls to EVP_DigestUpdate() can be made, but 286b077aed3SPierre ProncheryEVP_DigestInit_ex2() can be called to initialize a new digest operation. 287e71b7053SJung-uk Kim 288e71b7053SJung-uk Kim=item EVP_DigestFinalXOF() 289e71b7053SJung-uk Kim 290e71b7053SJung-uk KimInterfaces to extendable-output functions, XOFs, such as SHAKE128 and SHAKE256. 291b077aed3SPierre ProncheryIt retrieves the digest value from I<ctx> and places it in I<len>-sized I<md>. 292e71b7053SJung-uk KimAfter calling this function no additional calls to EVP_DigestUpdate() can be 293b077aed3SPierre Proncherymade, but EVP_DigestInit_ex2() can be called to initialize a new operation. 294e71b7053SJung-uk Kim 295e71b7053SJung-uk Kim=item EVP_MD_CTX_copy_ex() 296e71b7053SJung-uk Kim 297b077aed3SPierre ProncheryCan be used to copy the message digest state from I<in> to I<out>. This is 298e71b7053SJung-uk Kimuseful if large amounts of data are to be hashed which only differ in the last 299e71b7053SJung-uk Kimfew bytes. 300e71b7053SJung-uk Kim 301e71b7053SJung-uk Kim=item EVP_DigestInit() 302e71b7053SJung-uk Kim 303b077aed3SPierre ProncheryBehaves in the same way as EVP_DigestInit_ex2() except it doesn't set any 304b077aed3SPierre Proncheryparameters and calls EVP_MD_CTX_reset() so it cannot be used with an I<type> 305b077aed3SPierre Proncheryof NULL. 306e71b7053SJung-uk Kim 307e71b7053SJung-uk Kim=item EVP_DigestFinal() 308e71b7053SJung-uk Kim 309b077aed3SPierre ProncherySimilar to EVP_DigestFinal_ex() except after computing the digest 310b077aed3SPierre Proncherythe digest context I<ctx> is automatically cleaned up with EVP_MD_CTX_reset(). 311e71b7053SJung-uk Kim 312e71b7053SJung-uk Kim=item EVP_MD_CTX_copy() 313e71b7053SJung-uk Kim 314b077aed3SPierre ProncherySimilar to EVP_MD_CTX_copy_ex() except the destination I<out> does not have to 315e71b7053SJung-uk Kimbe initialized. 316e71b7053SJung-uk Kim 317b077aed3SPierre Pronchery=item EVP_MD_is_a() 318b077aed3SPierre Pronchery 319b077aed3SPierre ProncheryReturns 1 if I<md> is an implementation of an algorithm that's 320b077aed3SPierre Proncheryidentifiable with I<name>, otherwise 0. 321b077aed3SPierre Pronchery 322b077aed3SPierre ProncheryIf I<md> is a legacy digest (it's the return value from the likes of 323b077aed3SPierre ProncheryEVP_sha256() rather than the result of an EVP_MD_fetch()), only cipher 324b077aed3SPierre Proncherynames registered with the default library context (see 325b077aed3SPierre ProncheryL<OSSL_LIB_CTX(3)>) will be considered. 326b077aed3SPierre Pronchery 327b077aed3SPierre Pronchery=item EVP_MD_get0_name(), 328b077aed3SPierre ProncheryEVP_MD_CTX_get0_name() 329b077aed3SPierre Pronchery 330b077aed3SPierre ProncheryReturn the name of the given message digest. For fetched message 331b077aed3SPierre Proncherydigests with multiple names, only one of them is returned; it's 332b077aed3SPierre Proncheryrecommended to use EVP_MD_names_do_all() instead. 333b077aed3SPierre Pronchery 334b077aed3SPierre Pronchery=item EVP_MD_names_do_all() 335b077aed3SPierre Pronchery 336b077aed3SPierre ProncheryTraverses all names for the I<md>, and calls I<fn> with each name and 337b077aed3SPierre ProncheryI<data>. This is only useful with fetched B<EVP_MD>s. 338b077aed3SPierre Pronchery 339b077aed3SPierre Pronchery=item EVP_MD_get0_description() 340b077aed3SPierre Pronchery 341b077aed3SPierre ProncheryReturns a description of the digest, meant for display and human consumption. 342b077aed3SPierre ProncheryThe description is at the discretion of the digest implementation. 343b077aed3SPierre Pronchery 344b077aed3SPierre Pronchery=item EVP_MD_get0_provider() 345b077aed3SPierre Pronchery 346b077aed3SPierre ProncheryReturns an B<OSSL_PROVIDER> pointer to the provider that implements the given 347b077aed3SPierre ProncheryB<EVP_MD>. 348b077aed3SPierre Pronchery 349b077aed3SPierre Pronchery=item EVP_MD_get_size(), 350b077aed3SPierre ProncheryEVP_MD_CTX_get_size() 351e71b7053SJung-uk Kim 352e71b7053SJung-uk KimReturn the size of the message digest when passed an B<EVP_MD> or an 353e71b7053SJung-uk KimB<EVP_MD_CTX> structure, i.e. the size of the hash. 354e71b7053SJung-uk Kim 355b077aed3SPierre Pronchery=item EVP_MD_get_block_size(), 356b077aed3SPierre ProncheryEVP_MD_CTX_get_block_size() 357e71b7053SJung-uk Kim 358e71b7053SJung-uk KimReturn the block size of the message digest when passed an B<EVP_MD> or an 359e71b7053SJung-uk KimB<EVP_MD_CTX> structure. 360e71b7053SJung-uk Kim 361b077aed3SPierre Pronchery=item EVP_MD_get_type(), 362b077aed3SPierre ProncheryEVP_MD_CTX_get_type() 363e71b7053SJung-uk Kim 364e71b7053SJung-uk KimReturn the NID of the OBJECT IDENTIFIER representing the given message digest 365b077aed3SPierre Proncherywhen passed an B<EVP_MD> structure. For example, C<EVP_MD_get_type(EVP_sha1())> 366e71b7053SJung-uk Kimreturns B<NID_sha1>. This function is normally used when setting ASN1 OIDs. 367e71b7053SJung-uk Kim 368b077aed3SPierre Pronchery=item EVP_MD_CTX_get0_md_data() 369e71b7053SJung-uk Kim 370e71b7053SJung-uk KimReturn the digest method private data for the passed B<EVP_MD_CTX>. 371e71b7053SJung-uk KimThe space is allocated by OpenSSL and has the size originally set with 372e71b7053SJung-uk KimEVP_MD_meth_set_app_datasize(). 373e71b7053SJung-uk Kim 374b077aed3SPierre Pronchery=item EVP_MD_CTX_get0_md(), EVP_MD_CTX_get1_md() 375e71b7053SJung-uk Kim 376b077aed3SPierre ProncheryEVP_MD_CTX_get0_md() returns 377b077aed3SPierre Proncherythe B<EVP_MD> structure corresponding to the passed B<EVP_MD_CTX>. This 378b077aed3SPierre Proncherywill be the same B<EVP_MD> object originally passed to EVP_DigestInit_ex2() (or 379b077aed3SPierre Proncheryother similar function) when the EVP_MD_CTX was first initialised. Note that 380b077aed3SPierre Proncherywhere explicit fetch is in use (see L<EVP_MD_fetch(3)>) the value returned from 381b077aed3SPierre Proncherythis function will not have its reference count incremented and therefore it 382b077aed3SPierre Proncheryshould not be used after the EVP_MD_CTX is freed. 383b077aed3SPierre ProncheryEVP_MD_CTX_get1_md() is the same except the ownership is passed to the 384b077aed3SPierre Proncherycaller and is from the passed B<EVP_MD_CTX>. 385e71b7053SJung-uk Kim 38617f01e99SJung-uk Kim=item EVP_MD_CTX_set_update_fn() 38717f01e99SJung-uk Kim 388b077aed3SPierre ProncherySets the update function for I<ctx> to I<update>. 389b077aed3SPierre ProncheryThis is the function that is called by EVP_DigestUpdate(). If not set, the 39017f01e99SJung-uk Kimupdate function from the B<EVP_MD> type specified at initialization is used. 39117f01e99SJung-uk Kim 39217f01e99SJung-uk Kim=item EVP_MD_CTX_update_fn() 39317f01e99SJung-uk Kim 394b077aed3SPierre ProncheryReturns the update function for I<ctx>. 39517f01e99SJung-uk Kim 396b077aed3SPierre Pronchery=item EVP_MD_get_flags() 39717f01e99SJung-uk Kim 398b077aed3SPierre ProncheryReturns the I<md> flags. Note that these are different from the B<EVP_MD_CTX> 39917f01e99SJung-uk Kimones. See L<EVP_MD_meth_set_flags(3)> for more information. 40017f01e99SJung-uk Kim 401b077aed3SPierre Pronchery=item EVP_MD_get_pkey_type() 402e71b7053SJung-uk Kim 403e71b7053SJung-uk KimReturns the NID of the public key signing algorithm associated with this 404e71b7053SJung-uk Kimdigest. For example EVP_sha1() is associated with RSA so this will return 405e71b7053SJung-uk KimB<NID_sha1WithRSAEncryption>. Since digests and signature algorithms are no 406e71b7053SJung-uk Kimlonger linked this function is only retained for compatibility reasons. 407e71b7053SJung-uk Kim 408e71b7053SJung-uk Kim=item EVP_md_null() 409e71b7053SJung-uk Kim 410e71b7053SJung-uk KimA "null" message digest that does nothing: i.e. the hash it returns is of zero 411e71b7053SJung-uk Kimlength. 412e71b7053SJung-uk Kim 413e71b7053SJung-uk Kim=item EVP_get_digestbyname(), 414e71b7053SJung-uk KimEVP_get_digestbynid(), 415e71b7053SJung-uk KimEVP_get_digestbyobj() 416e71b7053SJung-uk Kim 417e71b7053SJung-uk KimReturns an B<EVP_MD> structure when passed a digest name, a digest B<NID> or an 418e71b7053SJung-uk KimB<ASN1_OBJECT> structure respectively. 419e71b7053SJung-uk Kim 420b077aed3SPierre ProncheryThe EVP_get_digestbyname() function is present for backwards compatibility with 421b077aed3SPierre ProncheryOpenSSL prior to version 3 and is different to the EVP_MD_fetch() function 422b077aed3SPierre Proncherysince it does not attempt to "fetch" an implementation of the cipher. 423b077aed3SPierre ProncheryAdditionally, it only knows about digests that are built-in to OpenSSL and have 424b077aed3SPierre Proncheryan associated NID. Similarly EVP_get_digestbynid() and EVP_get_digestbyobj() 425b077aed3SPierre Proncheryalso return objects without an associated implementation. 42617f01e99SJung-uk Kim 427b077aed3SPierre ProncheryWhen the digest objects returned by these functions are used (such as in a call 428b077aed3SPierre Proncheryto EVP_DigestInit_ex()) an implementation of the digest will be implicitly 429b077aed3SPierre Proncheryfetched from the loaded providers. This fetch could fail if no suitable 430b077aed3SPierre Proncheryimplementation is available. Use EVP_MD_fetch() instead to explicitly fetch 431b077aed3SPierre Proncherythe algorithm and an associated implementation from a provider. 432b077aed3SPierre Pronchery 433b077aed3SPierre ProncherySee L<crypto(7)/ALGORITHM FETCHING> for more information about fetching. 434b077aed3SPierre Pronchery 435b077aed3SPierre ProncheryThe digest objects returned from these functions do not need to be freed with 436b077aed3SPierre ProncheryEVP_MD_free(). 437b077aed3SPierre Pronchery 438b077aed3SPierre Pronchery=item EVP_MD_CTX_get_pkey_ctx() 439b077aed3SPierre Pronchery 440b077aed3SPierre ProncheryReturns the B<EVP_PKEY_CTX> assigned to I<ctx>. The returned pointer should not 44117f01e99SJung-uk Kimbe freed by the caller. 44217f01e99SJung-uk Kim 443e71b7053SJung-uk Kim=item EVP_MD_CTX_set_pkey_ctx() 444e71b7053SJung-uk Kim 445e71b7053SJung-uk KimAssigns an B<EVP_PKEY_CTX> to B<EVP_MD_CTX>. This is usually used to provide 44617f01e99SJung-uk Kima customized B<EVP_PKEY_CTX> to L<EVP_DigestSignInit(3)> or 447b077aed3SPierre ProncheryL<EVP_DigestVerifyInit(3)>. The I<pctx> passed to this function should be freed 448b077aed3SPierre Proncheryby the caller. A NULL I<pctx> pointer is also allowed to clear the B<EVP_PKEY_CTX> 449b077aed3SPierre Proncheryassigned to I<ctx>. In such case, freeing the cleared B<EVP_PKEY_CTX> or not 450e71b7053SJung-uk Kimdepends on how the B<EVP_PKEY_CTX> is created. 451e71b7053SJung-uk Kim 452b077aed3SPierre Pronchery=item EVP_MD_do_all_provided() 453b077aed3SPierre Pronchery 454b077aed3SPierre ProncheryTraverses all messages digests implemented by all activated providers 455b077aed3SPierre Proncheryin the given library context I<libctx>, and for each of the implementations, 456b077aed3SPierre Proncherycalls the given function I<fn> with the implementation method and the given 457b077aed3SPierre ProncheryI<arg> as argument. 458b077aed3SPierre Pronchery 459b077aed3SPierre Pronchery=back 460b077aed3SPierre Pronchery 461b077aed3SPierre Pronchery=head1 PARAMETERS 462b077aed3SPierre Pronchery 463b077aed3SPierre ProncherySee L<OSSL_PARAM(3)> for information about passing parameters. 464b077aed3SPierre Pronchery 465b077aed3SPierre ProncheryEVP_MD_CTX_set_params() can be used with the following OSSL_PARAM keys: 466b077aed3SPierre Pronchery 467b077aed3SPierre Pronchery=over 4 468b077aed3SPierre Pronchery 469b077aed3SPierre Pronchery=item "xoflen" (B<OSSL_DIGEST_PARAM_XOFLEN>) <unsigned integer> 470b077aed3SPierre Pronchery 471b077aed3SPierre ProncherySets the digest length for extendable output functions. 472b077aed3SPierre ProncheryIt is used by the SHAKE algorithm and should not exceed what can be given 473b077aed3SPierre Proncheryusing a B<size_t>. 474b077aed3SPierre Pronchery 475b077aed3SPierre Pronchery=item "pad-type" (B<OSSL_DIGEST_PARAM_PAD_TYPE>) <unsigned integer> 476b077aed3SPierre Pronchery 477b077aed3SPierre ProncherySets the padding type. 478b077aed3SPierre ProncheryIt is used by the MDC2 algorithm. 479b077aed3SPierre Pronchery 480b077aed3SPierre Pronchery=back 481b077aed3SPierre Pronchery 482b077aed3SPierre ProncheryEVP_MD_CTX_get_params() can be used with the following OSSL_PARAM keys: 483b077aed3SPierre Pronchery 484b077aed3SPierre Pronchery=over 4 485b077aed3SPierre Pronchery 486*44096ebdSEnji Cooper=item "micalg" (B<OSSL_DIGEST_PARAM_MICALG>) <UTF8 string>. 487b077aed3SPierre Pronchery 488b077aed3SPierre ProncheryGets the digest Message Integrity Check algorithm string. This is used when 489b077aed3SPierre Proncherycreating S/MIME multipart/signed messages, as specified in RFC 3851. 490b077aed3SPierre ProncheryIt may be used by external engines or providers. 491b077aed3SPierre Pronchery 492e71b7053SJung-uk Kim=back 493e71b7053SJung-uk Kim 49417f01e99SJung-uk Kim=head1 CONTROLS 49517f01e99SJung-uk Kim 49617f01e99SJung-uk KimEVP_MD_CTX_ctrl() can be used to send the following standard controls: 49717f01e99SJung-uk Kim 49817f01e99SJung-uk Kim=over 4 49917f01e99SJung-uk Kim 50017f01e99SJung-uk Kim=item EVP_MD_CTRL_MICALG 50117f01e99SJung-uk Kim 50217f01e99SJung-uk KimGets the digest Message Integrity Check algorithm string. This is used when 50317f01e99SJung-uk Kimcreating S/MIME multipart/signed messages, as specified in RFC 3851. 504b077aed3SPierre ProncheryThe string value is written to I<p2>. 505b077aed3SPierre Pronchery 506b077aed3SPierre ProncheryWhen used with a fetched B<EVP_MD>, EVP_MD_CTX_get_params() gets called with 507b077aed3SPierre Proncheryan L<OSSL_PARAM(3)> item with the key "micalg" (B<OSSL_DIGEST_PARAM_MICALG>). 50817f01e99SJung-uk Kim 50917f01e99SJung-uk Kim=item EVP_MD_CTRL_XOF_LEN 51017f01e99SJung-uk Kim 511b077aed3SPierre ProncheryThis control sets the digest length for extendable output functions to I<p1>. 51217f01e99SJung-uk KimSending this control directly should not be necessary, the use of 513b077aed3SPierre ProncheryEVP_DigestFinalXOF() is preferred. 51417f01e99SJung-uk KimCurrently used by SHAKE. 51517f01e99SJung-uk Kim 516b077aed3SPierre ProncheryWhen used with a fetched B<EVP_MD>, EVP_MD_CTX_get_params() gets called with 517b077aed3SPierre Proncheryan L<OSSL_PARAM(3)> item with the key "xoflen" (B<OSSL_DIGEST_PARAM_XOFLEN>). 518b077aed3SPierre Pronchery 51917f01e99SJung-uk Kim=back 52017f01e99SJung-uk Kim 521e71b7053SJung-uk Kim=head1 FLAGS 522e71b7053SJung-uk Kim 523e71b7053SJung-uk KimEVP_MD_CTX_set_flags(), EVP_MD_CTX_clear_flags() and EVP_MD_CTX_test_flags() 524e71b7053SJung-uk Kimcan be used the manipulate and test these B<EVP_MD_CTX> flags: 525e71b7053SJung-uk Kim 526e71b7053SJung-uk Kim=over 4 527e71b7053SJung-uk Kim 528e71b7053SJung-uk Kim=item EVP_MD_CTX_FLAG_ONESHOT 529e71b7053SJung-uk Kim 530e71b7053SJung-uk KimThis flag instructs the digest to optimize for one update only, if possible. 531e71b7053SJung-uk Kim 532e71b7053SJung-uk Kim=for comment EVP_MD_CTX_FLAG_CLEANED is internal, don't mention it 533e71b7053SJung-uk Kim 534e71b7053SJung-uk Kim=for comment EVP_MD_CTX_FLAG_REUSE is internal, don't mention it 535e71b7053SJung-uk Kim 536e71b7053SJung-uk Kim=for comment We currently avoid documenting flags that are only bit holder: 537e71b7053SJung-uk KimEVP_MD_CTX_FLAG_NON_FIPS_ALLOW, EVP_MD_CTX_FLAGS_PAD_* 538e71b7053SJung-uk Kim 539e71b7053SJung-uk Kim=item EVP_MD_CTX_FLAG_NO_INIT 540e71b7053SJung-uk Kim 541e71b7053SJung-uk KimThis flag instructs EVP_DigestInit() and similar not to initialise the 542e71b7053SJung-uk Kimimplementation specific data. 543e71b7053SJung-uk Kim 544e71b7053SJung-uk Kim=item EVP_MD_CTX_FLAG_FINALISE 545e71b7053SJung-uk Kim 546e71b7053SJung-uk KimSome functions such as EVP_DigestSign only finalise copies of internal 547e71b7053SJung-uk Kimcontexts so additional data can be included after the finalisation call. 548e71b7053SJung-uk KimThis is inefficient if this functionality is not required, and can be 549e71b7053SJung-uk Kimdisabled with this flag. 550e71b7053SJung-uk Kim 551e71b7053SJung-uk Kim=back 552e71b7053SJung-uk Kim 553e71b7053SJung-uk Kim=head1 RETURN VALUES 554e71b7053SJung-uk Kim 555e71b7053SJung-uk Kim=over 4 556e71b7053SJung-uk Kim 557b077aed3SPierre Pronchery=item EVP_MD_fetch() 558e71b7053SJung-uk Kim 559b077aed3SPierre ProncheryReturns a pointer to a B<EVP_MD> for success or NULL for failure. 560b077aed3SPierre Pronchery 561b077aed3SPierre Pronchery=item EVP_MD_up_ref() 562b077aed3SPierre Pronchery 563b077aed3SPierre ProncheryReturns 1 for success or 0 for failure. 564b077aed3SPierre Pronchery 565b077aed3SPierre Pronchery=item EVP_Q_digest(), 566b077aed3SPierre ProncheryEVP_Digest(), 567b077aed3SPierre ProncheryEVP_DigestInit_ex2(), 568b077aed3SPierre ProncheryEVP_DigestInit_ex(), 569b077aed3SPierre ProncheryEVP_DigestInit(), 570b077aed3SPierre ProncheryEVP_DigestUpdate(), 571b077aed3SPierre ProncheryEVP_DigestFinal_ex(), 572b077aed3SPierre ProncheryEVP_DigestFinalXOF(), and 573b077aed3SPierre ProncheryEVP_DigestFinal() 574b077aed3SPierre Pronchery 575b077aed3SPierre Proncheryreturn 1 for 576e71b7053SJung-uk Kimsuccess and 0 for failure. 577e71b7053SJung-uk Kim 578e71b7053SJung-uk Kim=item EVP_MD_CTX_ctrl() 579e71b7053SJung-uk Kim 580e71b7053SJung-uk KimReturns 1 if successful or 0 for failure. 581e71b7053SJung-uk Kim 582b077aed3SPierre Pronchery=item EVP_MD_CTX_set_params(), 583b077aed3SPierre ProncheryEVP_MD_CTX_get_params() 584b077aed3SPierre Pronchery 585b077aed3SPierre ProncheryReturns 1 if successful or 0 for failure. 586b077aed3SPierre Pronchery 587b077aed3SPierre Pronchery=item EVP_MD_CTX_settable_params(), 588b077aed3SPierre ProncheryEVP_MD_CTX_gettable_params() 589b077aed3SPierre Pronchery 590b077aed3SPierre ProncheryReturn an array of constant L<OSSL_PARAM(3)>s, or NULL if there is none 591b077aed3SPierre Proncheryto get. 592b077aed3SPierre Pronchery 593e71b7053SJung-uk Kim=item EVP_MD_CTX_copy_ex() 594e71b7053SJung-uk Kim 595e71b7053SJung-uk KimReturns 1 if successful or 0 for failure. 596e71b7053SJung-uk Kim 597b077aed3SPierre Pronchery=item EVP_MD_get_type(), 598b077aed3SPierre ProncheryEVP_MD_get_pkey_type() 599e71b7053SJung-uk Kim 600e71b7053SJung-uk KimReturns the NID of the corresponding OBJECT IDENTIFIER or NID_undef if none 601e71b7053SJung-uk Kimexists. 602e71b7053SJung-uk Kim 603b077aed3SPierre Pronchery=item EVP_MD_get_size(), 604b077aed3SPierre ProncheryEVP_MD_get_block_size(), 605b077aed3SPierre ProncheryEVP_MD_CTX_get_size(), 606b077aed3SPierre ProncheryEVP_MD_CTX_get_block_size() 607e71b7053SJung-uk Kim 608b077aed3SPierre ProncheryReturns the digest or block size in bytes or -1 for failure. 609e71b7053SJung-uk Kim 610e71b7053SJung-uk Kim=item EVP_md_null() 611e71b7053SJung-uk Kim 612e71b7053SJung-uk KimReturns a pointer to the B<EVP_MD> structure of the "null" message digest. 613e71b7053SJung-uk Kim 614e71b7053SJung-uk Kim=item EVP_get_digestbyname(), 615e71b7053SJung-uk KimEVP_get_digestbynid(), 616e71b7053SJung-uk KimEVP_get_digestbyobj() 617e71b7053SJung-uk Kim 618e71b7053SJung-uk KimReturns either an B<EVP_MD> structure or NULL if an error occurs. 619e71b7053SJung-uk Kim 620e71b7053SJung-uk Kim=item EVP_MD_CTX_set_pkey_ctx() 621e71b7053SJung-uk Kim 622e71b7053SJung-uk KimThis function has no return value. 623e71b7053SJung-uk Kim 624b077aed3SPierre Pronchery=item EVP_MD_names_do_all() 625b077aed3SPierre Pronchery 626b077aed3SPierre ProncheryReturns 1 if the callback was called for all names. A return value of 0 means 627b077aed3SPierre Proncherythat the callback was not called for any names. 628b077aed3SPierre Pronchery 629e71b7053SJung-uk Kim=back 630e71b7053SJung-uk Kim 631e71b7053SJung-uk Kim=head1 NOTES 632e71b7053SJung-uk Kim 633e71b7053SJung-uk KimThe B<EVP> interface to message digests should almost always be used in 63458f35182SJung-uk Kimpreference to the low-level interfaces. This is because the code then becomes 635e71b7053SJung-uk Kimtransparent to the digest used and much more flexible. 636e71b7053SJung-uk Kim 637e71b7053SJung-uk KimNew applications should use the SHA-2 (such as L<EVP_sha256(3)>) or the SHA-3 638e71b7053SJung-uk Kimdigest algorithms (such as L<EVP_sha3_512(3)>). The other digest algorithms 639e71b7053SJung-uk Kimare still in common use. 640e71b7053SJung-uk Kim 641b077aed3SPierre ProncheryFor most applications the I<impl> parameter to EVP_DigestInit_ex() will be 642e71b7053SJung-uk Kimset to NULL to use the default digest implementation. 643e71b7053SJung-uk Kim 644b077aed3SPierre ProncheryIgnoring failure returns of EVP_DigestInit_ex(), EVP_DigestInit_ex2(), or 645b077aed3SPierre ProncheryEVP_DigestInit() can lead to undefined behavior on subsequent calls 646b077aed3SPierre Proncheryupdating or finalizing the B<EVP_MD_CTX> such as the EVP_DigestUpdate() or 647b077aed3SPierre ProncheryEVP_DigestFinal() functions. The only valid calls on the B<EVP_MD_CTX> 648b077aed3SPierre Proncherywhen initialization fails are calls that attempt another initialization of 649b077aed3SPierre Proncherythe context or release the context. 650b077aed3SPierre Pronchery 651e71b7053SJung-uk KimThe functions EVP_DigestInit(), EVP_DigestFinal() and EVP_MD_CTX_copy() are 652e71b7053SJung-uk Kimobsolete but are retained to maintain compatibility with existing code. New 653e71b7053SJung-uk Kimapplications should use EVP_DigestInit_ex(), EVP_DigestFinal_ex() and 654e71b7053SJung-uk KimEVP_MD_CTX_copy_ex() because they can efficiently reuse a digest context 655e71b7053SJung-uk Kiminstead of initializing and cleaning it up on each call and allow non default 656e71b7053SJung-uk Kimimplementations of digests to be specified. 657e71b7053SJung-uk Kim 658e71b7053SJung-uk KimIf digest contexts are not cleaned up after use, 659e71b7053SJung-uk Kimmemory leaks will occur. 660e71b7053SJung-uk Kim 661b077aed3SPierre ProncheryEVP_MD_CTX_get0_name(), EVP_MD_CTX_get_size(), EVP_MD_CTX_get_block_size(), 662b077aed3SPierre ProncheryEVP_MD_CTX_get_type(), EVP_get_digestbynid() and EVP_get_digestbyobj() are 663b077aed3SPierre Proncherydefined as macros. 664e71b7053SJung-uk Kim 665e71b7053SJung-uk KimEVP_MD_CTX_ctrl() sends commands to message digests for additional configuration 666e71b7053SJung-uk Kimor control. 667e71b7053SJung-uk Kim 668da327cd2SJung-uk Kim=head1 EXAMPLES 669e71b7053SJung-uk Kim 670e71b7053SJung-uk KimThis example digests the data "Test Message\n" and "Hello World\n", using the 671e71b7053SJung-uk Kimdigest name passed on the command line. 672e71b7053SJung-uk Kim 673e71b7053SJung-uk Kim #include <stdio.h> 674c9cf7b5cSJung-uk Kim #include <string.h> 675e71b7053SJung-uk Kim #include <openssl/evp.h> 676e71b7053SJung-uk Kim 677c9cf7b5cSJung-uk Kim int main(int argc, char *argv[]) 678e71b7053SJung-uk Kim { 679e71b7053SJung-uk Kim EVP_MD_CTX *mdctx; 680e71b7053SJung-uk Kim const EVP_MD *md; 681e71b7053SJung-uk Kim char mess1[] = "Test Message\n"; 682e71b7053SJung-uk Kim char mess2[] = "Hello World\n"; 683e71b7053SJung-uk Kim unsigned char md_value[EVP_MAX_MD_SIZE]; 684c9cf7b5cSJung-uk Kim unsigned int md_len, i; 685e71b7053SJung-uk Kim 686e71b7053SJung-uk Kim if (argv[1] == NULL) { 687e71b7053SJung-uk Kim printf("Usage: mdtest digestname\n"); 688e71b7053SJung-uk Kim exit(1); 689e71b7053SJung-uk Kim } 690e71b7053SJung-uk Kim 691e71b7053SJung-uk Kim md = EVP_get_digestbyname(argv[1]); 692e71b7053SJung-uk Kim if (md == NULL) { 693e71b7053SJung-uk Kim printf("Unknown message digest %s\n", argv[1]); 694e71b7053SJung-uk Kim exit(1); 695e71b7053SJung-uk Kim } 696e71b7053SJung-uk Kim 697e71b7053SJung-uk Kim mdctx = EVP_MD_CTX_new(); 698b077aed3SPierre Pronchery if (!EVP_DigestInit_ex2(mdctx, md, NULL)) { 699b077aed3SPierre Pronchery printf("Message digest initialization failed.\n"); 700b077aed3SPierre Pronchery EVP_MD_CTX_free(mdctx); 701b077aed3SPierre Pronchery exit(1); 702b077aed3SPierre Pronchery } 703b077aed3SPierre Pronchery if (!EVP_DigestUpdate(mdctx, mess1, strlen(mess1))) { 704b077aed3SPierre Pronchery printf("Message digest update failed.\n"); 705b077aed3SPierre Pronchery EVP_MD_CTX_free(mdctx); 706b077aed3SPierre Pronchery exit(1); 707b077aed3SPierre Pronchery } 708b077aed3SPierre Pronchery if (!EVP_DigestUpdate(mdctx, mess2, strlen(mess2))) { 709b077aed3SPierre Pronchery printf("Message digest update failed.\n"); 710b077aed3SPierre Pronchery EVP_MD_CTX_free(mdctx); 711b077aed3SPierre Pronchery exit(1); 712b077aed3SPierre Pronchery } 713b077aed3SPierre Pronchery if (!EVP_DigestFinal_ex(mdctx, md_value, &md_len)) { 714b077aed3SPierre Pronchery printf("Message digest finalization failed.\n"); 715b077aed3SPierre Pronchery EVP_MD_CTX_free(mdctx); 716b077aed3SPierre Pronchery exit(1); 717b077aed3SPierre Pronchery } 718e71b7053SJung-uk Kim EVP_MD_CTX_free(mdctx); 719e71b7053SJung-uk Kim 720e71b7053SJung-uk Kim printf("Digest is: "); 721e71b7053SJung-uk Kim for (i = 0; i < md_len; i++) 722e71b7053SJung-uk Kim printf("%02x", md_value[i]); 723e71b7053SJung-uk Kim printf("\n"); 724e71b7053SJung-uk Kim 725e71b7053SJung-uk Kim exit(0); 726e71b7053SJung-uk Kim } 727e71b7053SJung-uk Kim 728e71b7053SJung-uk Kim=head1 SEE ALSO 729e71b7053SJung-uk Kim 73017f01e99SJung-uk KimL<EVP_MD_meth_new(3)>, 731b077aed3SPierre ProncheryL<openssl-dgst(1)>, 732b077aed3SPierre ProncheryL<evp(7)>, 733b077aed3SPierre ProncheryL<OSSL_PROVIDER(3)>, 734b077aed3SPierre ProncheryL<OSSL_PARAM(3)>, 735b077aed3SPierre ProncheryL<property(7)>, 736b077aed3SPierre ProncheryL<crypto(7)/ALGORITHM FETCHING>, 737b077aed3SPierre ProncheryL<provider-digest(7)>, 738b077aed3SPierre ProncheryL<life_cycle-digest(7)> 739e71b7053SJung-uk Kim 740e71b7053SJung-uk KimThe full list of digest algorithms are provided below. 741e71b7053SJung-uk Kim 742e71b7053SJung-uk KimL<EVP_blake2b512(3)>, 743e71b7053SJung-uk KimL<EVP_md2(3)>, 744e71b7053SJung-uk KimL<EVP_md4(3)>, 745e71b7053SJung-uk KimL<EVP_md5(3)>, 746e71b7053SJung-uk KimL<EVP_mdc2(3)>, 747e71b7053SJung-uk KimL<EVP_ripemd160(3)>, 748e71b7053SJung-uk KimL<EVP_sha1(3)>, 749e71b7053SJung-uk KimL<EVP_sha224(3)>, 750e71b7053SJung-uk KimL<EVP_sha3_224(3)>, 751e71b7053SJung-uk KimL<EVP_sm3(3)>, 752e71b7053SJung-uk KimL<EVP_whirlpool(3)> 753e71b7053SJung-uk Kim 754e71b7053SJung-uk Kim=head1 HISTORY 755e71b7053SJung-uk Kim 7566935a639SJung-uk KimThe EVP_MD_CTX_create() and EVP_MD_CTX_destroy() functions were renamed to 7576935a639SJung-uk KimEVP_MD_CTX_new() and EVP_MD_CTX_free() in OpenSSL 1.1.0, respectively. 758e71b7053SJung-uk Kim 759e71b7053SJung-uk KimThe link between digests and signing algorithms was fixed in OpenSSL 1.0 and 760e71b7053SJung-uk Kimlater, so now EVP_sha1() can be used with RSA and DSA. 761e71b7053SJung-uk Kim 7626935a639SJung-uk KimThe EVP_dss1() function was removed in OpenSSL 1.1.0. 763e71b7053SJung-uk Kim 764b077aed3SPierre ProncheryThe EVP_MD_CTX_set_pkey_ctx() function was added in OpenSSL 1.1.1. 765b077aed3SPierre Pronchery 766b077aed3SPierre ProncheryThe EVP_Q_digest(), EVP_DigestInit_ex2(), 767b077aed3SPierre ProncheryEVP_MD_fetch(), EVP_MD_free(), EVP_MD_up_ref(), 768b077aed3SPierre ProncheryEVP_MD_get_params(), EVP_MD_CTX_set_params(), EVP_MD_CTX_get_params(), 769b077aed3SPierre ProncheryEVP_MD_gettable_params(), EVP_MD_gettable_ctx_params(), 770b077aed3SPierre ProncheryEVP_MD_settable_ctx_params(), EVP_MD_CTX_settable_params() and 771b077aed3SPierre ProncheryEVP_MD_CTX_gettable_params() functions were added in OpenSSL 3.0. 772b077aed3SPierre Pronchery 773b077aed3SPierre ProncheryThe EVP_MD_type(), EVP_MD_nid(), EVP_MD_name(), EVP_MD_pkey_type(), 774b077aed3SPierre ProncheryEVP_MD_size(), EVP_MD_block_size(), EVP_MD_flags(), EVP_MD_CTX_size(), 775b077aed3SPierre ProncheryEVP_MD_CTX_block_size(), EVP_MD_CTX_type(), and EVP_MD_CTX_md_data() 776b077aed3SPierre Proncheryfunctions were renamed to include C<get> or C<get0> in their names in 777b077aed3SPierre ProncheryOpenSSL 3.0, respectively. The old names are kept as non-deprecated 778b077aed3SPierre Proncheryalias macros. 779b077aed3SPierre Pronchery 780b077aed3SPierre ProncheryThe EVP_MD_CTX_md() function was deprecated in OpenSSL 3.0; use 781b077aed3SPierre ProncheryEVP_MD_CTX_get0_md() instead. 782b077aed3SPierre ProncheryEVP_MD_CTX_update_fn() and EVP_MD_CTX_set_update_fn() were deprecated 783b077aed3SPierre Proncheryin OpenSSL 3.0. 784e71b7053SJung-uk Kim 785e71b7053SJung-uk Kim=head1 COPYRIGHT 786e71b7053SJung-uk Kim 787*44096ebdSEnji CooperCopyright 2000-2024 The OpenSSL Project Authors. All Rights Reserved. 788e71b7053SJung-uk Kim 789b077aed3SPierre ProncheryLicensed under the Apache License 2.0 (the "License"). You may not use 790e71b7053SJung-uk Kimthis file except in compliance with the License. You can obtain a copy 791e71b7053SJung-uk Kimin the file LICENSE in the source distribution or at 792e71b7053SJung-uk KimL<https://www.openssl.org/source/license.html>. 793e71b7053SJung-uk Kim 794e71b7053SJung-uk Kim=cut 795