+/* MACs */
+
+# define OSSL_FUNC_MAC_NEWCTX 1
+# define OSSL_FUNC_MAC_DUPCTX 2
+# define OSSL_FUNC_MAC_FREECTX 3
+# define OSSL_FUNC_MAC_INIT 4
+# define OSSL_FUNC_MAC_UPDATE 5
+# define OSSL_FUNC_MAC_FINAL 6
+# define OSSL_FUNC_MAC_GET_PARAMS 7
+# define OSSL_FUNC_MAC_GET_CTX_PARAMS 8
+# define OSSL_FUNC_MAC_SET_CTX_PARAMS 9
+# define OSSL_FUNC_MAC_GETTABLE_PARAMS 10
+# define OSSL_FUNC_MAC_GETTABLE_CTX_PARAMS 11
+# define OSSL_FUNC_MAC_SETTABLE_CTX_PARAMS 12
+
+OSSL_CORE_MAKE_FUNC(void *, OP_mac_newctx, (void *provctx))
+OSSL_CORE_MAKE_FUNC(void *, OP_mac_dupctx, (void *src))
+OSSL_CORE_MAKE_FUNC(void, OP_mac_freectx, (void *mctx))
+OSSL_CORE_MAKE_FUNC(size_t, OP_mac_size, (void *mctx))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_init, (void *mctx))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_update,
+ (void *mctx, const unsigned char *in, size_t inl))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_final,
+ (void *mctx,
+ unsigned char *out, size_t *outl, size_t outsize))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_mac_gettable_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_mac_gettable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_mac_settable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_get_params, (OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_get_ctx_params,
+ (void *mctx, OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_mac_set_ctx_params,
+ (void *mctx, const OSSL_PARAM params[]))
+
+/* KDFs and PRFs */
+
+# define OSSL_FUNC_KDF_NEWCTX 1
+# define OSSL_FUNC_KDF_DUPCTX 2
+# define OSSL_FUNC_KDF_FREECTX 3
+# define OSSL_FUNC_KDF_RESET 4
+# define OSSL_FUNC_KDF_DERIVE 5
+# define OSSL_FUNC_KDF_GETTABLE_PARAMS 6
+# define OSSL_FUNC_KDF_GETTABLE_CTX_PARAMS 7
+# define OSSL_FUNC_KDF_SETTABLE_CTX_PARAMS 8
+# define OSSL_FUNC_KDF_GET_PARAMS 9
+# define OSSL_FUNC_KDF_GET_CTX_PARAMS 10
+# define OSSL_FUNC_KDF_SET_CTX_PARAMS 11
+
+OSSL_CORE_MAKE_FUNC(void *, OP_kdf_newctx, (void *provctx))
+OSSL_CORE_MAKE_FUNC(void *, OP_kdf_dupctx, (void *src))
+OSSL_CORE_MAKE_FUNC(void, OP_kdf_freectx, (void *kctx))
+OSSL_CORE_MAKE_FUNC(void, OP_kdf_reset, (void *kctx))
+OSSL_CORE_MAKE_FUNC(int, OP_kdf_derive, (void *kctx, unsigned char *key,
+ size_t keylen))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_kdf_gettable_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_kdf_gettable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_kdf_settable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(int, OP_kdf_get_params, (OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_kdf_get_ctx_params,
+ (void *kctx, OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_kdf_set_ctx_params,
+ (void *kctx, const OSSL_PARAM params[]))
+
+/* RAND */
+
+# define OSSL_FUNC_RAND_NEWCTX 1
+# define OSSL_FUNC_RAND_FREECTX 2
+# define OSSL_FUNC_RAND_INSTANTIATE 3
+# define OSSL_FUNC_RAND_UNINSTANTIATE 4
+# define OSSL_FUNC_RAND_GENERATE 5
+# define OSSL_FUNC_RAND_RESEED 6
+# define OSSL_FUNC_RAND_NONCE 7
+# define OSSL_FUNC_RAND_ENABLE_LOCKING 8
+# define OSSL_FUNC_RAND_LOCK 9
+# define OSSL_FUNC_RAND_UNLOCK 10
+# define OSSL_FUNC_RAND_GETTABLE_PARAMS 11
+# define OSSL_FUNC_RAND_GETTABLE_CTX_PARAMS 12
+# define OSSL_FUNC_RAND_SETTABLE_CTX_PARAMS 13
+# define OSSL_FUNC_RAND_GET_PARAMS 14
+# define OSSL_FUNC_RAND_GET_CTX_PARAMS 15
+# define OSSL_FUNC_RAND_SET_CTX_PARAMS 16
+# define OSSL_FUNC_RAND_SET_CALLBACKS 17
+# define OSSL_FUNC_RAND_VERIFY_ZEROIZATION 18
+
+OSSL_CORE_MAKE_FUNC(void *, OP_rand_newctx,
+ (void *provctx, int secure, void *parent,
+ const OSSL_DISPATCH *parent_calls))
+OSSL_CORE_MAKE_FUNC(void, OP_rand_freectx, (void *vctx))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_instantiate,
+ (void *vdrbg, unsigned int strength,
+ int prediction_resistance,
+ const unsigned char *pstr, size_t pstr_len))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_uninstantiate, (void *vdrbg))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_generate,
+ (void *vctx, unsigned char *out, size_t outlen,
+ unsigned int strength, int prediction_resistance,
+ const unsigned char *addin, size_t addin_len))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_reseed,
+ (void *vctx, int prediction_resistance,
+ const unsigned char *ent, size_t ent_len,
+ const unsigned char *addin, size_t addin_len))
+OSSL_CORE_MAKE_FUNC(size_t, OP_rand_nonce,
+ (void *vctx, unsigned char *out, int strength,
+ size_t min_noncelen, size_t max_noncelen))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_set_callbacks,
+ (void *vctx,
+ OSSL_CALLBACK *get_entropy, OSSL_CALLBACK *cleanup_entropy,
+ OSSL_CALLBACK *get_nonce, OSSL_CALLBACK *cleanup_nonce))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_enable_locking, (void *vctx))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_lock, (void *vctx))
+OSSL_CORE_MAKE_FUNC(void, OP_rand_unlock, (void *vctx))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_rand_gettable_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_rand_gettable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_rand_settable_ctx_params, (void))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_get_params, (OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_get_ctx_params,
+ (void *vctx, OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_set_ctx_params,
+ (void *vctx, const OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(int, OP_rand_verify_zeroization,
+ (void *vctx))
+
+/*-
+ * Key management
+ *
+ * The Key Management takes care of provider side key objects, and includes
+ * all current functionality to create them, destroy them, set parameters
+ * and key material, etc, essentially everything that manipulates the keys
+ * themselves and their parameters.
+ *
+ * The key objects are commonly refered to as |keydata|, and it MUST be able
+ * to contain parameters if the key has any, the public key and the private
+ * key. All parts are optional, but their presence determines what can be
+ * done with the key object in terms of encryption, signature, and so on.
+ * The assumption from libcrypto is that the key object contains any of the
+ * following data combinations:
+ *
+ * - parameters only
+ * - public key only
+ * - public key + private key
+ * - parameters + public key
+ * - parameters + public key + private key
+ *
+ * What "parameters", "public key" and "private key" means in detail is left
+ * to the implementation. In the case of DH and DSA, they would typically
+ * include domain parameters, while for certain variants of RSA, they would
+ * typically include PSS or OAEP parameters.
+ *
+ * Key objects are created with OP_keymgmt_new() and destroyed with
+ * Op_keymgmt_free(). Key objects can have data filled in with
+ * OP_keymgmt_import().
+ *
+ * Three functions are made available to check what selection of data is
+ * present in a key object: OP_keymgmt_has_parameters(),
+ * OP_keymgmt_has_public_key(), and OP_keymgmt_has_private_key(),
+ */
+
+/* Key data subset selection - individual bits */
+# define OSSL_KEYMGMT_SELECT_PRIVATE_KEY 0x01
+# define OSSL_KEYMGMT_SELECT_PUBLIC_KEY 0x02
+# define OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS 0x04
+# define OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS 0x80
+
+/* Key data subset selection - combinations */
+# define OSSL_KEYMGMT_SELECT_ALL_PARAMETERS \
+ ( OSSL_KEYMGMT_SELECT_DOMAIN_PARAMETERS \
+ | OSSL_KEYMGMT_SELECT_OTHER_PARAMETERS)
+# define OSSL_KEYMGMT_SELECT_KEYPAIR \
+ ( OSSL_KEYMGMT_SELECT_PRIVATE_KEY | OSSL_KEYMGMT_SELECT_PUBLIC_KEY )
+# define OSSL_KEYMGMT_SELECT_ALL \
+ ( OSSL_KEYMGMT_SELECT_KEYPAIR | OSSL_KEYMGMT_SELECT_ALL_PARAMETERS )
+
+/* Basic key object creation */
+# define OSSL_FUNC_KEYMGMT_NEW 1
+OSSL_CORE_MAKE_FUNC(void *, OP_keymgmt_new, (void *provctx))
+
+/* Generation, a more complex constructor */
+# define OSSL_FUNC_KEYMGMT_GEN_INIT 2
+# define OSSL_FUNC_KEYMGMT_GEN_SET_TEMPLATE 3
+# define OSSL_FUNC_KEYMGMT_GEN_SET_PARAMS 4
+# define OSSL_FUNC_KEYMGMT_GEN_SETTABLE_PARAMS 5
+# define OSSL_FUNC_KEYMGMT_GEN 6
+# define OSSL_FUNC_KEYMGMT_GEN_CLEANUP 7
+OSSL_CORE_MAKE_FUNC(void *, OP_keymgmt_gen_init,
+ (void *provctx, int selection))
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_gen_set_template,
+ (void *genctx, void *templ))
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_gen_set_params,
+ (void *genctx, const OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *,
+ OP_keymgmt_gen_settable_params, (void *provctx))
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_gen_get_params,
+ (void *genctx, OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *,
+ OP_keymgmt_gen_gettable_params, (void *provctx))
+OSSL_CORE_MAKE_FUNC(void *, OP_keymgmt_gen,
+ (void *genctx, OSSL_CALLBACK *cb, void *cbarg))
+OSSL_CORE_MAKE_FUNC(void, OP_keymgmt_gen_cleanup, (void *genctx))
+
+/* Basic key object destruction */
+# define OSSL_FUNC_KEYMGMT_FREE 10
+OSSL_CORE_MAKE_FUNC(void, OP_keymgmt_free, (void *keydata))
+
+/* Key object information, with discovery */
+#define OSSL_FUNC_KEYMGMT_GET_PARAMS 11
+#define OSSL_FUNC_KEYMGMT_GETTABLE_PARAMS 12
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_get_params,
+ (void *keydata, OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_keymgmt_gettable_params, (void))
+
+#define OSSL_FUNC_KEYMGMT_SET_PARAMS 13
+#define OSSL_FUNC_KEYMGMT_SETTABLE_PARAMS 14
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_set_params,
+ (void *keydata, const OSSL_PARAM params[]))
+OSSL_CORE_MAKE_FUNC(const OSSL_PARAM *, OP_keymgmt_settable_params, (void))
+
+/* Key checks - discovery of supported operations */
+# define OSSL_FUNC_KEYMGMT_QUERY_OPERATION_NAME 20
+OSSL_CORE_MAKE_FUNC(const char *, OP_keymgmt_query_operation_name,
+ (int operation_id))
+
+/* Key checks - key data content checks */
+# define OSSL_FUNC_KEYMGMT_HAS 21
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_has, (void *keydata, int selection))
+
+/* Key checks - validation */
+# define OSSL_FUNC_KEYMGMT_VALIDATE 22
+OSSL_CORE_MAKE_FUNC(int, OP_keymgmt_validate, (void *keydata, int selection))