Add a skeleton default provider
authorMatt Caswell <matt@openssl.org>
Wed, 13 Mar 2019 12:02:55 +0000 (12:02 +0000)
committerMatt Caswell <matt@openssl.org>
Thu, 21 Mar 2019 09:23:38 +0000 (09:23 +0000)
Reviewed-by: Paul Dale <paul.dale@oracle.com>
(Merged from https://github.com/openssl/openssl/pull/8513)

build.info
crypto/provider_predefined.c
include/openssl/core_names.h [new file with mode: 0644]
providers/build.info [new file with mode: 0644]
providers/default/build.info [new file with mode: 0644]
providers/default/defltprov.c [new file with mode: 0644]

index bea1441..a0ecb21 100644 (file)
@@ -1,6 +1,6 @@
 # Note that some of these directories are filtered in Configure.  Look for
 # %skipdir there for further explanations.
-SUBDIRS=crypto ssl apps test util tools fuzz engines
+SUBDIRS=crypto ssl apps test util tools fuzz engines providers
 
 LIBS=libcrypto libssl
 INCLUDE[libcrypto]=. crypto/include include
index be21565..d14cd5b 100644 (file)
 #include <openssl/core.h>
 #include "provider_local.h"
 
-#if 0                            /* Until it exists for real */
 OSSL_provider_init_fn ossl_default_provider_init;
-#endif
 
 const struct predefined_providers_st predefined_providers[] = {
-#if 0                            /* Until it exists for real */
     { "default", ossl_default_provider_init, 1 },
-#endif
     { NULL, NULL, 0 }
 };
diff --git a/include/openssl/core_names.h b/include/openssl/core_names.h
new file mode 100644 (file)
index 0000000..be4a647
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2019 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
+ */
+
+#ifndef OSSL_CORE_NAMES_H
+# define OSSL_CORE_NAMES_H
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+/*
+ * Well known parameter names that Providers can define
+ */
+
+/*
+ * A printable name for this provider
+ * Type: OSSL_PARAM_UTF8_STRING
+ */
+#define OSSL_PROV_PARAM_NAME        "name"
+/*
+ * A version string for this provider
+ * Type: OSSL_PARAM_UTF8_STRING
+ */
+#define OSSL_PROV_PARAM_VERSION     "version"
+/*
+ * A string providing provider specific build information
+ * Type: OSSL_PARAM_UTF8_STRING
+ */
+#define OSSL_PROV_PARAM_BUILDINFO   "buildinfo"
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif
diff --git a/providers/build.info b/providers/build.info
new file mode 100644 (file)
index 0000000..29cc184
--- /dev/null
@@ -0,0 +1 @@
+SUBDIRS=default
diff --git a/providers/default/build.info b/providers/default/build.info
new file mode 100644 (file)
index 0000000..eab90a3
--- /dev/null
@@ -0,0 +1,3 @@
+LIBS=../../libcrypto
+SOURCE[../../libcrypto]=\
+        defltprov.c
diff --git a/providers/default/defltprov.c b/providers/default/defltprov.c
new file mode 100644 (file)
index 0000000..2790309
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2019 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
+ */
+
+#include <string.h>
+#include <stdio.h>
+#include <openssl/core.h>
+#include <openssl/core_numbers.h>
+#include <openssl/core_names.h>
+#include <openssl/params.h>
+
+/* 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;
+
+/* Parameters we provide to the core */
+static const OSSL_ITEM deflt_param_types[] = {
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_NAME },
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_VERSION },
+    { OSSL_PARAM_UTF8_PTR, OSSL_PROV_PARAM_BUILDINFO },
+    { 0, NULL }
+};
+
+static const OSSL_ITEM *deflt_get_param_types(const OSSL_PROVIDER *prov)
+{
+    return deflt_param_types;
+}
+
+static int deflt_get_params(const OSSL_PROVIDER *prov,
+                            const OSSL_PARAM params[])
+{
+    const OSSL_PARAM *p;
+
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL Default Provider"))
+        return 0;
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_VERSION);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR))
+        return 0;
+    p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_BUILDINFO);
+    if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, OPENSSL_FULL_VERSION_STR))
+        return 0;
+
+    return 1;
+}
+
+/* Functions we provide to the core */
+static const OSSL_DISPATCH deflt_dispatch_table[] = {
+    { OSSL_FUNC_PROVIDER_GET_PARAM_TYPES, (void (*)(void))deflt_get_param_types },
+    { OSSL_FUNC_PROVIDER_GET_PARAMS, (void (*)(void))deflt_get_params },
+    { 0, NULL }
+};
+
+OSSL_provider_init_fn ossl_default_provider_init;
+
+int ossl_default_provider_init(const OSSL_PROVIDER *provider,
+                               const OSSL_DISPATCH *in,
+                               const OSSL_DISPATCH **out)
+{
+    for (; in->function_id != 0; in++) {
+        switch (in->function_id) {
+        case OSSL_FUNC_CORE_GET_PARAM_TYPES:
+            c_get_param_types = OSSL_get_core_get_param_types(in);
+            break;
+        case OSSL_FUNC_CORE_GET_PARAMS:
+            c_get_params = OSSL_get_core_get_params(in);
+            break;
+        default:
+            /* Just ignore anything we don't understand */
+            break;
+        }
+    }
+
+    *out = deflt_dispatch_table;
+    return 1;
+}