Currently available routines:
-
ERR helpers
OpenSSL's ERR functions do not lend themselves very well to provider's own error tables, because they can't pass the provider's handle to the error record building routines. This is due to certain limitations with the base C standard requirements for OpenSSL itself (C90).
These helpers are replacements of OpenSSL's ERR_raise() and
ERR_raise_data()
that take better advantage of more modern C standards. C99 required.See the comments in
include/prov/err.h
for more information. -
NUM helper
Converting
OSSL_PARAM
numbers to native numbers present a bit of a challenge, as they are variable length, and may need some adaption to fit into native numbers.provnum_get()
andprovnum_set()
claim to be universally applicable functions for converting an OSSL_PARAM number to a native integer or bignum implementations. -
OSSL_PARAM
parsing helperParsing
OSSL_PARAM
keys can be done in many ways, with various performance problems. A simple (even naïve) way was to loop over the params andstrcasecmp()
them with known names. Depending on thestrcasecmp()
implementation, that can be rather slow.perl/gen_param_LL.pl
takes a specification in form of a perl ARRAY, which contains a C function name (for example,"parse_params"
) as first item, followed by a series of tuples of this form:NAME => "key"
Each such
NAME
becomes a couple of C macros:S_NAME
, with the"key"
string as its value.V_NAME
, with a unique generated integer as its value.
The function name that's given at the start of the function becomes a C function that is called with a single argument, the key to parse. As a test, the following should always be true:
parse_params(S_NAME) == V_NAME
When looking through an
OSSL_PARAM
array, the easy way is to do something like this:const OSSL_PARAM *p; for (p = params; p->key != NULL; p++) { switch (parse_params(p->key)) { case V_NAME: /* Do whatever's needed */ break; ... } }