OSSL_PARAM_A...ATE_FROM_TEXT(3ossl)
π OSSL_PARAM_A...ATE_FROM_TEXT(3ossl) π
okay bestie, so this is the OpenSSL manpage for OSSL_PARAM_allocate_from_text, and it lives in the 3ossl manual section. it's a construction-utilities situation and honestly it's giving "glow-up era for parameter passing". let's get into it π«Ά
β¨ NAME β¨
OSSL_PARAM_allocate_from_text β OSSL_PARAM construction utilities
πΈ SYNOPSIS πΈ
#include <openssl/params.h>
int OSSL_PARAM_allocate_from_text(OSSL_PARAM *to,
const OSSL_PARAM *paramdefs,
const char *key, const char *value,
size_t value_n,
int *found);
π¦ DESCRIPTION π¦
so, back in the day β like, OpenSSL before version 3.0 β parameters got passed down to algorithm implementations (and pulled back out of them) through control functions. some of those control functions had variants that just took string parameters, for example EVP_PKEY_CTX_ctrl_str(3).
then OpenSSL 3.0 showed up and said "new mechanism, new me" π
β now you do the same thing with an array of parameters that hold a name, a value, a value type and a value size (peep OSSL_PARAM(3) if you want the full lore).
OSSL_PARAM_allocate_from_text() uses key to look up an item in paramdefs. if it finds one, it converts value into something suitable for that item's data_type, and stores the result in to->data along with its size in to->data_size. then to->key and to->data_type get assigned the corresponding values from the item that was found, and to->return_size is set to zero. iconic behaviour honestly.
heads up bestie:to->datais always allocated usingOPENSSL_zalloc(3), and you β the caller β have to free it when it's not useful any more, usingOPENSSL_free(3). no cap, don't forget, that's a leak otherwise π
and if found isn't NULL, then *found gets set to 1 if key could be located in paramdefs, and to 0 otherwise.
π The use of key and value in detail π
OSSL_PARAM_allocate_from_text() pays attention to whether key starts with "hex", and if it does, it'll only use the rest of key to look up an item in paramdefs. for example, if key is "hexid", then "id" is what gets looked up in paramdefs. sneaky but cute.
once an item in paramdefs has been found, value gets converted depending on that item's data_type, like this:
OSSL_PARAM_INTEGERandOSSL_PARAM_UNSIGNED_INTEGERβ ifkeydidn't start with"hex", thenvalueis assumed to containvalue_ndecimal characters, which get decoded, and the resulting bytes become the number stored in theto->datastorage.- but wait: if
valuestarts with"0x", it's assumed to containvalue_nhexadecimal characters instead. - and if
keystarted with"hex", thenvalueis assumed to containvalue_nhexadecimal characters without the"0x"prefix. - if
valuecontains characters that couldn't be decoded as hexadecimal or decimal characters,OSSL_PARAM_allocate_from_text()considers that an error. π
- but wait: if
OSSL_PARAM_UTF8_STRINGβ ifkeystarted with"hex",OSSL_PARAM_allocate_from_text()considers that an error. nope, not today.- otherwise,
valueis considered a C string and is copied to theto->datastorage. and on systems where the native character encoding is EBCDIC, the bytes into->dataare converted to ASCII. β¨
- otherwise,
OSSL_PARAM_OCTET_STRINGβ ifkeystarted with"hex",valueis assumed to containvalue_nhexadecimal characters, which get decoded, and the resulting bytes are stored in theto->datastorage. ifvaluecontains characters that couldn't be decoded as hexadecimal or decimal characters,OSSL_PARAM_allocate_from_text()considers that an error.- if
keydidn't start with"hex", thenvalue_nbytes fromvalueare copied to theto->datastorage.
- if
π RETURN VALUES π
OSSL_PARAM_allocate_from_text() returns 1 if key was found in paramdefs and there was no other failure. otherwise it returns 0. that's it, that's the tea. π
π NOTES π
the parameter descriptor array comes from functions that are dedicated to returning them. the following OSSL_PARAM(3) attributes get used:
keydata_typedata_size
all other attributes are ignored. periodt.
the data_size attribute can be zero, which means the parameter it describes expects arbitrary length data. flexible queen π§
β EXAMPLES β
code that looked like this:
int mac_ctrl_string(EVP_PKEY_CTX *ctx, const char *value)
{
int rv;
char *stmp, *vtmp = NULL;
stmp = OPENSSL_strdup(value);
if (stmp == NULL)
return -1;
vtmp = strchr(stmp, ':');
if (vtmp != NULL)
*vtmp++ = '\0';
rv = EVP_MAC_ctrl_str(ctx, stmp, vtmp);
OPENSSL_free(stmp);
return rv;
}
...
for (i = 0; i < sk_OPENSSL_STRING_num(macopts); i++) {
char *macopt = sk_OPENSSL_STRING_value(macopts, i);
if (pkey_ctrl_string(mac_ctx, macopt) <= 0) {
BIO_printf(bio_err,
"MAC parameter error \"%s\"\n", macopt);
ERR_print_errors(bio_err);
goto mac_end;
}
}
can be written like this instead:
OSSL_PARAM *params =
OPENSSL_zalloc(sizeof(*params)
* (sk_OPENSSL_STRING_num(opts) + 1));
const OSSL_PARAM *paramdefs = EVP_MAC_settable_ctx_params(mac);
size_t params_n;
char *opt = "<unknown>";
for (params_n = 0; params_n < (size_t)sk_OPENSSL_STRING_num(opts);
params_n++) {
char *stmp, *vtmp = NULL;
opt = sk_OPENSSL_STRING_value(opts, (int)params_n);
if ((stmp = OPENSSL_strdup(opt)) == NULL
|| (vtmp = strchr(stmp, ':')) == NULL)
goto err;
*vtmp++ = '\0';
if (!OSSL_PARAM_allocate_from_text(¶ms[params_n],
paramdefs, stmp,
vtmp, strlen(vtmp), NULL))
goto err;
}
params[params_n] = OSSL_PARAM_construct_end();
if (!EVP_MAC_CTX_set_params(ctx, params))
goto err;
while (params_n-- > 0)
OPENSSL_free(params[params_n].data);
OPENSSL_free(params);
/* ... */
return;
err:
BIO_printf(bio_err, "MAC parameter error '%s'\n", opt);
ERR_print_errors(bio_err);
the glow-up is real. π₯
π SEE ALSO π
OSSL_PARAM(3), OSSL_PARAM_int(3)
π COPYRIGHT π
Copyright 2019-2021 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>.
and that's the whole page bestie, you ate it π
β¨ this was OpenSSL 3.5.9, dated 2026-09-2, from the OSSL_PARAM_A...ATE_FROM_TEXT(3ossl) manual β go forth and allocate responsibly, and please free your to->data π«Άπ
π¦ where this page comes from
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 43: openssl-devel 1:3.5.9-1.fc43 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- fedora 44: openssl-devel 1:3.5.9-1.fc44 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms