}
#endif
+static int evp_md_cache_constants(EVP_MD *md)
+{
+ int ok;
+ size_t blksz = 0;
+ size_t mdsize = 0;
+ unsigned long flags = 0;
+ OSSL_PARAM params[4];
+
+ params[0] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_BLOCK_SIZE, &blksz);
+ params[1] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_SIZE, &mdsize);
+ params[2] = OSSL_PARAM_construct_ulong(OSSL_DIGEST_PARAM_FLAGS, &flags);
+ params[3] = OSSL_PARAM_construct_end();
+ ok = evp_do_md_getparams(md, params);
+ if (mdsize > INT_MAX || blksz > INT_MAX)
+ ok = 0;
+ if (ok) {
+ md->block_size = (int)blksz;
+ md->md_size = (int)mdsize;
+ md->flags = flags;
+ }
+ return ok;
+}
+
static void *evp_md_from_dispatch(int name_id,
const OSSL_DISPATCH *fns,
OSSL_PROVIDER *prov)
if (prov != NULL)
ossl_provider_up_ref(prov);
+ if (!evp_md_cache_constants(md)) {
+ EVP_MD_free(md);
+ ERR_raise(ERR_LIB_EVP, EVP_R_CACHE_CONSTANTS_FAILED);
+ md = NULL;
+ }
+
return md;
}
int EVP_MD_block_size(const EVP_MD *md)
{
- int ok;
- size_t v;
- OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
-
- if (md == NULL) {
- ERR_raise(ERR_LIB_EVP, EVP_R_MESSAGE_DIGEST_IS_NULL);
- return -1;
- }
- v = md->block_size;
- params[0] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_BLOCK_SIZE, &v);
- ok = evp_do_md_getparams(md, params);
-
- return ok != 0 ? (int)v : -1;
+ return md->block_size;
}
int EVP_MD_type(const EVP_MD *md)
int EVP_MD_size(const EVP_MD *md)
{
- int ok;
- size_t v;
- OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
-
if (md == NULL) {
ERR_raise(ERR_LIB_EVP, EVP_R_MESSAGE_DIGEST_IS_NULL);
return -1;
}
- v = md->md_size;
- params[0] = OSSL_PARAM_construct_size_t(OSSL_DIGEST_PARAM_SIZE, &v);
- ok = evp_do_md_getparams(md, params);
-
- return ok != 0 ? (int)v : -1;
+ return md->md_size;
}
unsigned long EVP_MD_flags(const EVP_MD *md)
{
- int ok;
- unsigned long v = md->flags;
- OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
-
- params[0] = OSSL_PARAM_construct_ulong(OSSL_CIPHER_PARAM_FLAGS, &v);
- ok = evp_do_md_getparams(md, params);
-
- return ok != 0 ? v : 0;
+ return md->flags;
}
EVP_MD *EVP_MD_meth_new(int md_type, int pkey_type)