aboutsummaryrefslogtreecommitdiff
path: root/providers
diff options
context:
space:
mode:
Diffstat (limited to 'providers')
-rw-r--r--providers/fips/fipsprov.c176
1 files changed, 153 insertions, 23 deletions
diff --git a/providers/fips/fipsprov.c b/providers/fips/fipsprov.c
index 0f0a962..8978d1b 100644
--- a/providers/fips/fipsprov.c
+++ b/providers/fips/fipsprov.c
@@ -27,19 +27,35 @@
#include "internal/provider_ctx.h"
#include "internal/providercommon.h"
+extern OSSL_core_thread_start_fn *c_thread_start;
+
/*
* TODO(3.0): Should these be stored in the provider side provctx? Could they
* ever be different from one init to the next? Unfortunately we can't do this
- * at the moment because c_put_error/c_add_error_vdata do not provide us with
- * the OPENSSL_CTX as a parameter.
+ * at the moment because c_put_error/c_add_error_vdata do not provide
+ * us with the OPENSSL_CTX as a parameter.
*/
/* Functions provided by the core */
-static OSSL_core_get_param_types_fn *c_get_param_types = NULL;
-static OSSL_core_get_params_fn *c_get_params = NULL;
-extern OSSL_core_thread_start_fn *c_thread_start;
-OSSL_core_thread_start_fn *c_thread_start = NULL;
-static OSSL_core_put_error_fn *c_put_error = NULL;
-static OSSL_core_add_error_vdata_fn *c_add_error_vdata = NULL;
+static OSSL_core_get_param_types_fn *c_get_param_types;
+static OSSL_core_get_params_fn *c_get_params;
+OSSL_core_thread_start_fn *c_thread_start;
+static OSSL_core_put_error_fn *c_put_error;
+static OSSL_core_add_error_vdata_fn *c_add_error_vdata;
+static OSSL_CRYPTO_malloc_fn *c_CRYPTO_malloc;
+static OSSL_CRYPTO_zalloc_fn *c_CRYPTO_zalloc;
+static OSSL_CRYPTO_memdup_fn *c_CRYPTO_memdup;
+static OSSL_CRYPTO_strdup_fn *c_CRYPTO_strdup;
+static OSSL_CRYPTO_strndup_fn *c_CRYPTO_strndup;
+static OSSL_CRYPTO_free_fn *c_CRYPTO_free;
+static OSSL_CRYPTO_clear_free_fn *c_CRYPTO_clear_free;
+static OSSL_CRYPTO_realloc_fn *c_CRYPTO_realloc;
+static OSSL_CRYPTO_clear_realloc_fn *c_CRYPTO_clear_realloc;
+static OSSL_CRYPTO_secure_malloc_fn *c_CRYPTO_secure_malloc;
+static OSSL_CRYPTO_secure_zalloc_fn *c_CRYPTO_secure_zalloc;
+static OSSL_CRYPTO_secure_free_fn *c_CRYPTO_secure_free;
+static OSSL_CRYPTO_secure_clear_free_fn *c_CRYPTO_secure_clear_free;
+static OSSL_CRYPTO_secure_allocated_fn *c_CRYPTO_secure_allocated;
+static OSSL_OPENSSL_hexstr2buf_fn *c_OPENSSL_hexstr2buf;
typedef struct fips_global_st {
const OSSL_PROVIDER *prov;
@@ -299,24 +315,66 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
case OSSL_FUNC_CORE_ADD_ERROR_VDATA:
c_add_error_vdata = OSSL_get_core_add_error_vdata(in);
break;
- /* Just ignore anything we don't understand */
+ case OSSL_FUNC_CRYPTO_MALLOC:
+ c_CRYPTO_malloc = OSSL_get_CRYPTO_malloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_ZALLOC:
+ c_CRYPTO_zalloc = OSSL_get_CRYPTO_zalloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_MEMDUP:
+ c_CRYPTO_memdup = OSSL_get_CRYPTO_memdup(in);
+ break;
+ case OSSL_FUNC_CRYPTO_STRDUP:
+ c_CRYPTO_strdup = OSSL_get_CRYPTO_strdup(in);
+ break;
+ case OSSL_FUNC_CRYPTO_STRNDUP:
+ c_CRYPTO_strndup = OSSL_get_CRYPTO_strndup(in);
+ break;
+ case OSSL_FUNC_CRYPTO_FREE:
+ c_CRYPTO_free = OSSL_get_CRYPTO_free(in);
+ break;
+ case OSSL_FUNC_CRYPTO_CLEAR_FREE:
+ c_CRYPTO_clear_free = OSSL_get_CRYPTO_clear_free(in);
+ break;
+ case OSSL_FUNC_CRYPTO_REALLOC:
+ c_CRYPTO_realloc = OSSL_get_CRYPTO_realloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_CLEAR_REALLOC:
+ c_CRYPTO_clear_realloc = OSSL_get_CRYPTO_clear_realloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_SECURE_MALLOC:
+ c_CRYPTO_secure_malloc = OSSL_get_CRYPTO_secure_malloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_SECURE_ZALLOC:
+ c_CRYPTO_secure_zalloc = OSSL_get_CRYPTO_secure_zalloc(in);
+ break;
+ case OSSL_FUNC_CRYPTO_SECURE_FREE:
+ c_CRYPTO_secure_free = OSSL_get_CRYPTO_secure_free(in);
+ break;
+ case OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE:
+ c_CRYPTO_secure_clear_free = OSSL_get_CRYPTO_secure_clear_free(in);
+ break;
+ case OSSL_FUNC_CRYPTO_SECURE_ALLOCATED:
+ c_CRYPTO_secure_allocated = OSSL_get_CRYPTO_secure_allocated(in);
+ break;
+ case OSSL_FUNC_OPENSSL_HEXSTR2BUF:
+ c_OPENSSL_hexstr2buf = OSSL_get_OPENSSL_hexstr2buf(in);
+ break;
default:
+ /* Just ignore anything we don't understand */
break;
}
}
- ctx = OPENSSL_CTX_new();
- if (ctx == NULL)
+ /* Create a context. */
+ if ((ctx = OPENSSL_CTX_new()) == NULL)
return 0;
-
- fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
- &fips_prov_ossl_ctx_method);
-
- if (fgbl == NULL)
- goto err;
-
+ if ((fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
+ &fips_prov_ossl_ctx_method)) == NULL) {
+ OPENSSL_CTX_free(ctx);
+ return 0;
+ }
fgbl->prov = provider;
-
*out = fips_dispatch_table;
*provctx = ctx;
@@ -331,10 +389,6 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
}
return 1;
-
- err:
- OPENSSL_CTX_free(ctx);
- return 0;
}
/*
@@ -413,3 +467,79 @@ const OSSL_PROVIDER *FIPS_get_provider(OPENSSL_CTX *ctx)
return fgbl->prov;
}
+
+void *CRYPTO_malloc(size_t num, const char *file, int line)
+{
+ return c_CRYPTO_malloc(num, file, line);
+}
+
+void *CRYPTO_zalloc(size_t num, const char *file, int line)
+{
+ return c_CRYPTO_zalloc(num, file, line);
+}
+
+void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line)
+{
+ return c_CRYPTO_memdup(str, siz, file, line);
+}
+
+char *CRYPTO_strdup(const char *str, const char *file, int line)
+{
+ return c_CRYPTO_strdup(str, file, line);
+}
+
+char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line)
+{
+ return c_CRYPTO_strndup(str, s, file, line);
+}
+
+void CRYPTO_free(void *ptr, const char *file, int line)
+{
+ c_CRYPTO_free(ptr, file, line);
+}
+
+void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line)
+{
+ c_CRYPTO_clear_free(ptr, num, file, line);
+}
+
+void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line)
+{
+ return c_CRYPTO_realloc(addr, num, file, line);
+}
+
+void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num,
+ const char *file, int line)
+{
+ return c_CRYPTO_clear_realloc(addr, old_num, num, file, line);
+}
+
+void *CRYPTO_secure_malloc(size_t num, const char *file, int line)
+{
+ return c_CRYPTO_secure_malloc(num, file, line);
+}
+
+void *CRYPTO_secure_zalloc(size_t num, const char *file, int line)
+{
+ return c_CRYPTO_secure_zalloc(num, file, line);
+}
+
+void CRYPTO_secure_free(void *ptr, const char *file, int line)
+{
+ c_CRYPTO_secure_free(ptr, file, line);
+}
+
+void CRYPTO_secure_clear_free(void *ptr, size_t num, const char *file, int line)
+{
+ c_CRYPTO_secure_clear_free(ptr, num, file, line);
+}
+
+unsigned char *OPENSSL_hexstr2buf(const char *str, long *len)
+{
+ return c_OPENSSL_hexstr2buf(str, len);
+}
+
+int CRYPTO_secure_allocated(const void *ptr)
+{
+ return c_CRYPTO_secure_allocated(ptr);
+}