summaryrefslogtreecommitdiff
path: root/crypto/evp/evp_utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/evp/evp_utils.c')
-rw-r--r--crypto/evp/evp_utils.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/crypto/evp/evp_utils.c b/crypto/evp/evp_utils.c
new file mode 100644
index 000000000000..3cc17921f8f4
--- /dev/null
+++ b/crypto/evp/evp_utils.c
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the Apache License 2.0 (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+/* Internal EVP utility functions */
+
+#include <openssl/core.h>
+#include <openssl/evp.h>
+#include <openssl/err.h>
+#include <openssl/asn1.h> /* evp_local.h needs it */
+#include <openssl/safestack.h> /* evp_local.h needs it */
+#include "crypto/evp.h" /* evp_local.h needs it */
+#include "evp_local.h"
+
+/*
+ * EVP_CTRL_RET_UNSUPPORTED = -1 is the returned value from any ctrl function
+ * where the control command isn't supported, and an alternative code path
+ * may be chosen.
+ * Since these functions are used to implement ctrl functionality, we
+ * use the same value, and other callers will have to compensate.
+ */
+#define PARAM_CHECK(obj, func, errfunc) \
+ if (obj == NULL) \
+ return 0; \
+ if (obj->prov == NULL) \
+ return EVP_CTRL_RET_UNSUPPORTED; \
+ if (obj->func == NULL) { \
+ errfunc(); \
+ return 0; \
+ }
+
+#define PARAM_FUNC(name, func, type, err) \
+int name (const type *obj, OSSL_PARAM params[]) \
+{ \
+ PARAM_CHECK(obj, func, err) \
+ return obj->func(params); \
+}
+
+#define PARAM_CTX_FUNC(name, func, type, err) \
+int name (const type *obj, void *algctx, OSSL_PARAM params[]) \
+{ \
+ PARAM_CHECK(obj, func, err) \
+ return obj->func(algctx, params); \
+}
+
+#define PARAM_FUNCTIONS(type, \
+ getname, getfunc, \
+ getctxname, getctxfunc, \
+ setctxname, setctxfunc) \
+ PARAM_FUNC(getname, getfunc, type, geterr) \
+ PARAM_CTX_FUNC(getctxname, getctxfunc, type, geterr) \
+ PARAM_CTX_FUNC(setctxname, setctxfunc, type, seterr)
+
+/*
+ * These error functions are a workaround for the error scripts, which
+ * currently require that XXXerr method appears inside a function (not a macro).
+ */
+static void geterr(void)
+{
+ ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_GET_PARAMETERS);
+}
+
+static void seterr(void)
+{
+ ERR_raise(ERR_LIB_EVP, EVP_R_CANNOT_SET_PARAMETERS);
+}
+
+PARAM_FUNCTIONS(EVP_CIPHER,
+ evp_do_ciph_getparams, get_params,
+ evp_do_ciph_ctx_getparams, get_ctx_params,
+ evp_do_ciph_ctx_setparams, set_ctx_params)
+
+PARAM_FUNCTIONS(EVP_MD,
+ evp_do_md_getparams, get_params,
+ evp_do_md_ctx_getparams, get_ctx_params,
+ evp_do_md_ctx_setparams, set_ctx_params)