+/*
+ * API provider, which handles the parameters using the API from params.h
+ */
+
+static int api_set_params(void *vobj, const OSSL_PARAM *params)
+{
+ struct object_st *obj = vobj;
+ const OSSL_PARAM *p = NULL;
+
+ if ((p = OSSL_PARAM_locate(params, "p1")) != NULL
+ && !TEST_true(OSSL_PARAM_get_int(p, &obj->p1)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p2")) != NULL
+ && !TEST_true(OSSL_PARAM_get_double(p, &obj->p2)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p3")) != NULL
+ && !TEST_true(OSSL_PARAM_get_BN(p, &obj->p3)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p4")) != NULL) {
+ OPENSSL_free(obj->p4);
+ obj->p4 = NULL;
+ /* If the value pointer is NULL, we get it automatically allocated */
+ if (!TEST_true(OSSL_PARAM_get_utf8_string(p, &obj->p4, 0)))
+ return 0;
+ }
+ if ((p = OSSL_PARAM_locate(params, "p5")) != NULL
+ && !TEST_true(OSSL_PARAM_get_utf8_ptr(p, &obj->p5)))
+ return 0;
+
+ return 1;
+}
+
+static int api_get_params(void *vobj, const OSSL_PARAM *params)
+{
+ struct object_st *obj = vobj;
+ const OSSL_PARAM *p = NULL;
+
+ if ((p = OSSL_PARAM_locate(params, "p1")) != NULL
+ && !TEST_true(OSSL_PARAM_set_int(p, obj->p1)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p2")) != NULL
+ && !TEST_true(OSSL_PARAM_set_double(p, obj->p2)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p3")) != NULL
+ && !TEST_true(OSSL_PARAM_set_BN(p, obj->p3)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p4")) != NULL
+ && !TEST_true(OSSL_PARAM_set_utf8_string(p, obj->p4)))
+ return 0;
+ if ((p = OSSL_PARAM_locate(params, "p5")) != NULL
+ && !TEST_true(OSSL_PARAM_set_utf8_ptr(p, obj->p5)))
+ return 0;
+
+ return 1;
+}
+