static OSSL_core_get_params_fn *c_get_params = NULL;
/* Tell the core what params we provide and what type they are */
-static const OSSL_ITEM p_param_types[] = {
- { OSSL_PARAM_UTF8_STRING, "greeting" },
- { 0, NULL }
+static const OSSL_PARAM p_param_types[] = {
+ { "greeting", OSSL_PARAM_UTF8_STRING, NULL, 0, 0 },
+ { NULL, 0, NULL, 0, 0 }
};
-static const OSSL_ITEM *p_get_param_types(const OSSL_PROVIDER *_)
+/* This is a trick to ensure we define the provider functions correctly */
+static OSSL_provider_get_param_types_fn p_get_param_types;
+static OSSL_provider_get_params_fn p_get_params;
+
+static const OSSL_PARAM *p_get_param_types(void *_)
{
return p_param_types;
}
-static int p_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
+static int p_get_params(void *vprov, OSSL_PARAM params[])
{
- const OSSL_PARAM *p = params;
+ const OSSL_PROVIDER *prov = vprov;
+ OSSL_PARAM *p = params;
int ok = 1;
for (; ok && p->key != NULL; p++) {
if (strcmp(p->key, "greeting") == 0) {
- static char *opensslv = NULL;
- static char *provname = NULL;
+ static char *opensslv;
+ static char *provname;
+ static char *greeting;
static OSSL_PARAM counter_request[] = {
+ /* Known libcrypto provided parameters */
{ "openssl-version", OSSL_PARAM_UTF8_PTR,
- &opensslv, sizeof(&opensslv), NULL },
+ &opensslv, sizeof(&opensslv), 0 },
{ "provider-name", OSSL_PARAM_UTF8_PTR,
- &provname, sizeof(&provname), NULL},
- { NULL, 0, NULL, 0, NULL }
+ &provname, sizeof(&provname), 0},
+
+ /* This might be present, if there's such a configuration */
+ { "greeting", OSSL_PARAM_UTF8_PTR,
+ &greeting, sizeof(&greeting), 0 },
+
+ { NULL, 0, NULL, 0, 0 }
};
char buf[256];
size_t buf_l;
+ opensslv = provname = greeting = NULL;
+
if (c_get_params(prov, counter_request)) {
- const char *versionp = *(void **)counter_request[0].data;
- const char *namep = *(void **)counter_request[1].data;
- sprintf(buf, "Hello OpenSSL %.20s, greetings from %s!",
- versionp, namep);
+ if (greeting) {
+ strcpy(buf, greeting);
+ } else {
+ const char *versionp = *(void **)counter_request[0].data;
+ const char *namep = *(void **)counter_request[1].data;
+
+ sprintf(buf, "Hello OpenSSL %.20s, greetings from %s!",
+ versionp, namep);
+ }
} else {
sprintf(buf, "Howdy stranger...");
}
- *p->return_size = buf_l = strlen(buf) + 1;
+ p->return_size = buf_l = strlen(buf) + 1;
if (p->data_size >= buf_l)
- strncpy(p->data, buf, buf_l);
+ strcpy(p->data, buf);
else
ok = 0;
}
int OSSL_provider_init(const OSSL_PROVIDER *provider,
const OSSL_DISPATCH *in,
- const OSSL_DISPATCH **out)
+ const OSSL_DISPATCH **out,
+ void **provctx)
{
for (; in->function_id != 0; in++) {
switch (in->function_id) {
}
}
+ /* Because we use this in get_params, we need to pass it back */
+ *provctx = (void *)provider;
+
*out = p_test_table;
return 1;
}