+int EVP_CIPHER_is_a(const EVP_CIPHER *cipher, const char *name)
+{
+#ifndef FIPS_MODE
+ if (cipher->prov == NULL) {
+ int nid = EVP_CIPHER_nid(cipher);
+
+ return nid == OBJ_sn2nid(name) || nid == OBJ_ln2nid(name);
+ }
+#endif
+ return evp_is_a(cipher->prov, cipher->name_id, name);
+}
+
+const char *EVP_CIPHER_name(const EVP_CIPHER *cipher)
+{
+ if (cipher->prov != NULL)
+ return evp_first_name(cipher->prov, cipher->name_id);
+#ifndef FIPS_MODE
+ return OBJ_nid2sn(EVP_CIPHER_nid(cipher));
+#else
+ return NULL;
+#endif
+}
+
+const OSSL_PROVIDER *EVP_CIPHER_provider(const EVP_CIPHER *cipher)
+{
+ return cipher->prov;
+}
+
+int EVP_CIPHER_mode(const EVP_CIPHER *cipher)
+{
+ int ok;
+ unsigned int v = EVP_CIPHER_flags(cipher) & EVP_CIPH_MODE;
+ OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
+
+ params[0] = OSSL_PARAM_construct_uint(OSSL_CIPHER_PARAM_MODE, &v);
+ ok = evp_do_ciph_getparams(cipher, params);
+
+ return ok != 0 ? (int)v : 0;
+}
+
+int EVP_MD_is_a(const EVP_MD *md, const char *name)
+{
+ return evp_is_a(md->prov, md->name_id, name);
+}
+
+const char *EVP_MD_name(const EVP_MD *md)
+{
+ if (md->prov != NULL)
+ return evp_first_name(md->prov, md->name_id);
+#ifndef FIPS_MODE
+ return OBJ_nid2sn(EVP_MD_nid(md));
+#else
+ return NULL;
+#endif
+}
+
+const OSSL_PROVIDER *EVP_MD_provider(const EVP_MD *md)
+{
+ return md->prov;
+}
+