5 evp_generic_fetch - generic algorithm fetcher and method creator for EVP
9 /* Only for EVP source */
12 void *evp_generic_fetch(OPENSSL_CTX *libctx, int operation_id,
13 const char *name, const char *properties,
14 void *(*new_method)(int nid, const OSSL_DISPATCH *fns,
16 int (*upref_method)(void *),
17 void (*free_method)(void *),
18 int (*nid_method)(void *));
22 evp_generic_fetch() calls ossl_method_construct() with the given
23 C<libctx>, C<operation_id>, C<name>, and C<properties> and uses
24 it to create an EVP method with the help of the functions
25 C<new_method>, C<upref_method>, and C<free_method>.
27 The three functions are supposed to:
33 creates an internal method from function pointers found in the
34 dispatch table C<fns>.
38 increments the reference counter for the given method, if there is
43 frees the given method.
47 returns the nid associated with the given method.
53 evp_generic_fetch() returns a method on success, or B<NULL> on error.
57 This is a short example of the fictitious EVP API and operation called
60 To begin with, let's assume something like this in
61 C<include/openssl/core_numbers.h>:
63 #define OSSL_OP_FOO 100
65 #define OSSL_OP_FOO_NEWCTX_FUNC 2001
66 #define OSSL_OP_FOO_INIT 2002
67 #define OSSL_OP_FOO_OPERATE 2003
68 #define OSSL_OP_FOO_CLEANCTX_FUNC 2004
69 #define OSSL_OP_FOO_FREECTX_FUNC 2005
70 OSSL_CORE_MAKE_FUNC(void *,OP_foo_newctx,(void))
71 OSSL_CORE_MAKE_FUNC(int,OP_foo_init,(void *vctx))
72 OSSL_CORE_MAKE_FUNC(int,OP_foo_operate,(void *vctx,
73 unsigned char *out, size_t *out_l,
74 unsigned char *in, size_t in_l))
75 OSSL_CORE_MAKE_FUNC(void,OP_foo_cleanctx,(void *vctx))
76 OSSL_CORE_MAKE_FUNC(void,OP_foo_freectx,(void *vctx))
78 And here's the implementation of the FOO method fetcher:
80 /* typedef struct evp_foo_st EVP_FOO */
84 CRYPTO_REF_COUNT refcnt;
85 OSSL_OP_foo_newctx_fn *newctx;
86 OSSL_OP_foo_init_fn *init;
87 OSSL_OP_foo_operate_fn *operate;
88 OSSL_OP_foo_cleanctx_fn *cleanctx;
89 OSSL_OP_foo_freectx_fn *freectx;
93 * In this example, we have a public method creator and destructor.
94 * It's not absolutely necessary, but is in the spirit of OpenSSL.
96 EVP_FOO *EVP_FOO_meth_from_dispatch(int foo_type, const OSSL_DISPATCH *fns,
101 if ((foo = OPENSSL_zalloc(sizeof(*foo))) == NULL)
104 for (; fns->function_id != 0; fns++) {
105 switch (fns->function_id) {
106 case OSSL_OP_FOO_NEWCTX_FUNC:
107 foo->newctx = OSSL_get_OP_foo_newctx(fns);
109 case OSSL_OP_FOO_INIT:
110 foo->init = OSSL_get_OP_foo_init(fns);
112 case OSSL_OP_FOO_OPERATE:
113 foo->operate = OSSL_get_OP_foo_operate(fns);
115 case OSSL_OP_FOO_CLEANCTX_FUNC:
116 foo->cleanctx = OSSL_get_OP_foo_cleanctx(fns);
118 case OSSL_OP_FOO_FREECTX_FUNC:
119 foo->freectx = OSSL_get_OP_foo_freectx(fns);
126 ossl_provider_upref(prov);
131 EVP_FOO_meth_free(EVP_FOO *foo)
134 OSSL_PROVIDER *prov = foo->prov;
137 ossl_provider_free(prov);
141 static void *foo_from_dispatch(int nid, const OSSL_DISPATCH *fns,
144 return EVP_FOO_meth_from_dispatch(nid, fns, prov);
147 static int foo_upref(void *vfoo)
152 CRYPTO_UP_REF(&foo->refcnt, &ref, foo_lock);
156 static void foo_free(void *vfoo)
158 EVP_FOO_meth_free(vfoo);
161 EVP_FOO *EVP_FOO_fetch(OPENSSL_CTX *ctx,
163 const char *properties)
165 return evp_generic_fetch(ctx, OSSL_OP_FOO, name, properties,
166 foo_from_dispatch, foo_upref, foo_free);
169 And finally, the library functions:
171 /* typedef struct evp_foo_st EVP_FOO_CTX */
172 struct evp_foo_ctx_st {
174 void *provctx; /* corresponding provider context */
177 int EVP_FOO_CTX_reset(EVP_FOO_CTX *c)
181 if (c->foo != NULL && c->foo->cleanctx != NULL)
182 c->foo->cleanctx(c->provctx);
186 EVP_FOO_CTX *EVP_FOO_CTX_new(void)
188 return OPENSSL_zalloc(sizeof(EVP_FOO_CTX));
191 void EVP_FOO_CTX_free(EVP_FOO_CTX *c)
193 EVP_FOO_CTX_reset(c);
194 c->foo->freectx(c->provctx);
198 int EVP_FooInit(EVP_FOO_CTX *c, const EVP_FOO *foo)
203 if (c->provctx == NULL)
204 c->provctx = c->foo->newctx();
206 ok = c->foo->init(c->provctx);
211 int EVP_FooOperate(EVP_FOO_CTX *c, unsigned char *out, size_t *outl,
212 const unsigned char *in, size_t inl)
216 ok = c->foo->update(c->provctx, out, inl, &outl, in, inl);
222 L<ossl_method_construct>
226 The functions described here were all added in OpenSSL 3.0.
230 Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
232 Licensed under the Apache License 2.0 (the "License"). You may not use
233 this file except in compliance with the License. You can obtain a copy
234 in the file LICENSE in the source distribution or at
235 L<https://www.openssl.org/source/license.html>.