PROVIDER-ASYM_CIPHER(7ossl)
π NAME π
provider-asym_cipher β bestie, this is the asym_cipher library <-> provider functions page, straight out of the OpenSSL 7ossl manual set β¨
β¨ SYNOPSIS β¨
okay so first things first, you gotta pull in the headers, no cap:
#include <openssl/core_dispatch.h>
#include <openssl/core_names.h>
and now the big vibe check, the disclaimer that saves you from a whole crisis:
/*
* None of these are actual functions, but are displayed like this for
* the function signatures for functions that are offered as function
* pointers in OSSL_DISPATCH arrays.
*/
like, read that again bestie. π«Ά these are not real functions you can just call β they're signatures for the function pointers you'll find chilling inside OSSL_DISPATCH arrays. it's giving casting call, not actual actors. iykyk.
π Context management π
the whole "who am i, where am i" of it all β setup, cleanup, and the duplicate:
void *OSSL_FUNC_asym_cipher_newctx(void *provctx);
void OSSL_FUNC_asym_cipher_freectx(void *ctx);
void *OSSL_FUNC_asym_cipher_dupctx(void *ctx);
OSSL_FUNC_asym_cipher_newctxβ makes a fresh new context out ofprovctx, main character energy from the jump πOSSL_FUNC_asym_cipher_freectxβ yeets the context,ctxgets cleaned up, we love a tidy exitOSSL_FUNC_asym_cipher_dupctxβ copy ofctx, because sometimes you need two of her πΈ
π₯ Encryption π₯
locking it in β init first, then the actual encrypt:
int OSSL_FUNC_asym_cipher_encrypt_init(void *ctx, void *provkey,
const OSSL_PARAM params[]);
int OSSL_FUNC_asym_cipher_encrypt(void *ctx, unsigned char *out, size_t *outlen,
size_t outsize, const unsigned char *in,
size_t inlen);
OSSL_FUNC_asym_cipher_encrypt_initβ sets upctxwithprovkeyand theparamsarray, the pre-game ritual before anything spicy happens βOSSL_FUNC_asym_cipher_encryptβ the moment.ctx,out,outlen,outsize,in,inlen, all accounted for, encrypted, done, periodt π
π¦ Decryption π¦
same energy, opposite direction:
int OSSL_FUNC_asym_cipher_decrypt_init(void *ctx, void *provkey,
const OSSL_PARAM params[]);
int OSSL_FUNC_asym_cipher_decrypt(void *ctx, unsigned char *out, size_t *outlen,
size_t outsize, const unsigned char *in,
size_t inlen);
OSSL_FUNC_asym_cipher_decrypt_initβ handsctxitsprovkeyandparams, the reverse-direction warm-up π§OSSL_FUNC_asym_cipher_decryptβ takesin/inlen, drops the result intoout/outlenwithoutsizeas the ceiling, iconic behaviour honestly π
π Asymmetric Cipher parameters π
the settings girlies β gettable params, settable params, and the lists that tell you what's even on the menu:
int OSSL_FUNC_asym_cipher_get_ctx_params(void *ctx, OSSL_PARAM params[]);
const OSSL_PARAM *OSSL_FUNC_asym_cipher_gettable_ctx_params(void *ctx, void *provctx);
int OSSL_FUNC_asym_cipher_set_ctx_params(void *ctx, const OSSL_PARAM params[]);
const OSSL_PARAM *OSSL_FUNC_asym_cipher_settable_ctx_params(void *ctx, void *provctx);
OSSL_FUNC_asym_cipher_get_ctx_paramsβ reads the params offctxinto theparamsarray, respectfully snooping πOSSL_FUNC_asym_cipher_gettable_ctx_paramsβ returns theconst OSSL_PARAM *list of what you're allowed to get, takingctxandprovctx, so nobody's guessing β¨OSSL_FUNC_asym_cipher_set_ctx_paramsβ writes theparamsarray intoctx, the glow-up button πOSSL_FUNC_asym_cipher_settable_ctx_paramsβ returns theconst OSSL_PARAM *list of what you're allowed to set,ctxandprovctxin hand, no surprises π
π DESCRIPTION π
Okay bestie, listen up β this documentation is primarily aimed at provider authors. Like, if you're just out here using OpenSSL, that's a different vibe. Check out provider(7) for the full rundown, iykyk.
The asymmetric cipher operation β that's OSSL_OP_ASYM_CIPHER β is literally what lets providers implement asymmetric cipher algorithms and put them on the menu for applications, via the API functions EVP_PKEY_encrypt(3), EVP_PKEY_decrypt(3) and other related functions. π
So. All the "functions" we're talking about here get passed as function pointers between libcrypto and the provider, inside OSSL_DISPATCH(3) arrays, which come through OSSL_ALGORITHM(3) arrays that your provider's provider_query_operation() function hands back (peep "Provider Functions" in provider-base(7)).
Every single one of these "functions" has a matching function type definition named OSSL_FUNC_{name}_fn, plus a helper to scoop the function pointer out of an OSSL_DISPATCH(3) element, named OSSL_FUNC_{name}. Example time, because yes:
typedef void *(OSSL_FUNC_asym_cipher_newctx_fn)(void *provctx);
static ossl_inline OSSL_FUNC_asym_cipher_newctx_fn
OSSL_FUNC_asym_cipher_newctx(const OSSL_DISPATCH *opf);
OSSL_DISPATCH(3) arrays are indexed by numbers that are provided as macros in openssl-core_dispatch.h(7), and the whole mapping is giving:
OSSL_FUNC_asym_cipher_newctx OSSL_FUNC_ASYM_CIPHER_NEWCTX
OSSL_FUNC_asym_cipher_freectx OSSL_FUNC_ASYM_CIPHER_FREECTX
OSSL_FUNC_asym_cipher_dupctx OSSL_FUNC_ASYM_CIPHER_DUPCTX
OSSL_FUNC_asym_cipher_encrypt_init OSSL_FUNC_ASYM_CIPHER_ENCRYPT_INIT
OSSL_FUNC_asym_cipher_encrypt OSSL_FUNC_ASYM_CIPHER_ENCRYPT
OSSL_FUNC_asym_cipher_decrypt_init OSSL_FUNC_ASYM_CIPHER_DECRYPT_INIT
OSSL_FUNC_asym_cipher_decrypt OSSL_FUNC_ASYM_CIPHER_DECRYPT
OSSL_FUNC_asym_cipher_get_ctx_params OSSL_FUNC_ASYM_CIPHER_GET_CTX_PARAMS
OSSL_FUNC_asym_cipher_gettable_ctx_params OSSL_FUNC_ASYM_CIPHER_GETTABLE_CTX_PARAMS
OSSL_FUNC_asym_cipher_set_ctx_params OSSL_FUNC_ASYM_CIPHER_SET_CTX_PARAMS
OSSL_FUNC_asym_cipher_settable_ctx_params OSSL_FUNC_ASYM_CIPHER_SETTABLE_CTX_PARAMS
Now, real talk: an asymmetric cipher algorithm implementation may not implement all of these functions. No cap. But to be a consistent set of functions, a provider must implement OSSL_FUNC_asym_cipher_newctx and OSSL_FUNC_asym_cipher_freectx. It must also implement both of OSSL_FUNC_asym_cipher_encrypt_init and OSSL_FUNC_asym_cipher_encrypt, or both of OSSL_FUNC_asym_cipher_decrypt_init and OSSL_FUNC_asym_cipher_decrypt. OSSL_FUNC_asym_cipher_get_ctx_params is optional, but if it's there then OSSL_FUNC_asym_cipher_gettable_ctx_params has to be there too. Same energy for OSSL_FUNC_asym_cipher_set_ctx_params β optional, but if it's present then so must OSSL_FUNC_asym_cipher_settable_ctx_params. They're a package deal, periodt. π
Also, an asymmetric cipher algorithm must implement some mechanism for generating, loading or importing keys via the key management (OSSL_OP_KEYMGMT) operation. Seeprovider-keymgmt(7)for the details, bestie.
β¨ Context Management Functions β¨
OSSL_FUNC_asym_cipher_newctx()β should create and return a pointer to a provider side structure for holding context information during an asymmetric cipher operation. That pointer gets passed back in a bunch of the other asymmetric cipher operation function calls. The parameterprovctxis the provider context generated during provider initialisation (seeprovider(7)). π«ΆOSSL_FUNC_asym_cipher_freectx()β gets passed a pointer to the provider side asymmetric cipher context in thectxparameter. This function should free any resources associated with that context. Clean up your room, babe. π§ΉOSSL_FUNC_asym_cipher_dupctx()β should duplicate the provider side asymmetric cipher context in thectxparameter and return the duplicate copy. Twin energy. π―
π₯ Encryption Functions π₯
OSSL_FUNC_asym_cipher_encrypt_init() initialises a context for an asymmetric encryption, given a provider side asymmetric cipher context in the ctx parameter and a pointer to a provider key object in the provkey parameter. The params, if not NULL, should be set on the context in a manner similar to using OSSL_FUNC_asym_cipher_set_ctx_params(). And that key object? It should have been previously generated, loaded or imported into the provider using the key management (OSSL_OP_KEYMGMT) operation (see provider-keymgmt(7)). No shortcuts. β
OSSL_FUNC_asym_cipher_encrypt() performs the actual encryption itself. Fr fr, this is the main character. A previously initialised asymmetric cipher context is passed in the ctx parameter. The data to be encrypted is pointed to by the in parameter, which is inlen bytes long. Unless out is NULL, the encrypted data should be written to the location pointed to by the out parameter and it should not exceed outsize bytes in length. The length of the encrypted data should be written to *outlen. And if out is NULL? Then the maximum length of the encrypted data should be written to *outlen. π¦
πΈ Decryption Functions πΈ
OSSL_FUNC_asym_cipher_decrypt_init() initialises a context for an asymmetric decryption, given a provider side asymmetric cipher context in the ctx parameter and a pointer to a provider key object in the provkey parameter. The params, if not NULL, should be set on the context in a manner similar to using OSSL_FUNC_asym_cipher_set_ctx_params(). The key object should have been previously generated, loaded or imported into the provider using the key management (OSSL_OP_KEYMGMT) operation (see provider-keymgmt(7)). Yeah, same drill as encryption β the keys gotta come from somewhere legit. ποΈ
OSSL_FUNC_asym_cipher_decrypt() performs the actual decryption itself. A previously initialised asymmetric cipher context is passed in the ctx parameter. The data to be decrypted is pointed to by the in parameter, which is inlen bytes long. Unless out is NULL, the decrypted data should be written to the location pointed to by the out parameter and it should not exceed outsize bytes in length. The length of the decrypted data should be written to *outlen. If out is NULL then the maximum length of the decrypted data should be written to *outlen. π
π Asymmetric Cipher Parameters π
See OSSL_PARAM(3) for the full tea on the parameters structure that OSSL_FUNC_asym_cipher_get_ctx_params() and OSSL_FUNC_asym_cipher_set_ctx_params() use. π
OSSL_FUNC_asym_cipher_get_ctx_params()β gets asymmetric cipher parameters associated with the given provider side asymmetric cipher contextctxand stores them inparams. PassingNULLforparamsshould return true.OSSL_FUNC_asym_cipher_set_ctx_params()β sets the asymmetric cipher parameters associated with the given provider side asymmetric cipher contextctxtoparams. Any parameter settings are additional to any that were previously set β it stacks, it doesn't replace. PassingNULLforparamsshould return true.
Parameters currently recognised by built-in asymmetric cipher algorithms are as follows. Not all parameters are relevant to, or are understood by, all asymmetric cipher algorithms β so don't come for me if your algorithm ghosts one of them. π
"pad-mode"(OSSL_ASYM_CIPHER_PARAM_PAD_MODE)<UTF8 string>OR<integer>β the type of padding to be used. The interpretation of this value will depend on the algorithm in use. Choose wisely. ποΈ"digest"(OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST)<UTF8 string>β gets or sets the name of the OAEP digest algorithm used when OAEP padding is in use."digest"(OSSL_ASYM_CIPHER_PARAM_DIGEST)<UTF8 string>β gets or sets the name of the digest algorithm used by the algorithm (where applicable)."digest-props"(OSSL_ASYM_CIPHER_PARAM_OAEP_DIGEST_PROPS)<UTF8 string>β gets or sets the properties to use when fetching the OAEP digest algorithm."digest-props"(OSSL_ASYM_CIPHER_PARAM_DIGEST_PROPS)<UTF8 string>β gets or sets the properties to use when fetching the cipher digest algorithm."mgf1-digest"(OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST)<UTF8 string>β gets or sets the name of the MGF1 digest algorithm used when OAEP or PSS padding is in use."mgf1-digest-props"(OSSL_ASYM_CIPHER_PARAM_MGF1_DIGEST_PROPS)<UTF8 string>β gets or sets the properties to use when fetching the MGF1 digest algorithm."oaep-label"(OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL)<octet string ptr>β gets the OAEP label used when OAEP padding is in use."oaep-label"(OSSL_ASYM_CIPHER_PARAM_OAEP_LABEL)<octet string>β sets the OAEP label used when OAEP padding is in use."tls-client-version"(OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION)<unsigned integer>β the TLS protocol version first requested by the client."tls-negotiated-version"(OSSL_ASYM_CIPHER_PARAM_TLS_CLIENT_VERSION)<unsigned integer>β the negotiated TLS protocol version."implicit-rejection"(OSSL_ASYM_CIPHER_PARAM_IMPLICIT_REJECTION)<unsigned integer>β gets or sets the use of the implicit rejection mechanism for RSA PKCS#1 v1.5 decryption. When set (non zero value), the decryption API will return a deterministically random value if the PKCS#1 v1.5 padding check fails. This makes exploitation of the Bleichenbacher significantly harder, even if the code using the RSA decryption API is not implemented in side-channel free manner. Set by default in OpenSSL providers. Lowkey a big deal β this is the security glow-up. π₯
The OpenSSL FIPS provider also supports the following parameters:
"fips-indicator"(OSSL_ASYM_CIPHER_PARAM_FIPS_APPROVED_INDICATOR)<integer>β a getter that returns1if the operation is FIPS approved, or0otherwise. This may be used after calling eitherOSSL_FUNC_asym_cipher_encrypt()orOSSL_FUNC_asym_cipher_decrypt(). It may return0if"key-check"is set to0. β"key-check"(OSSL_ASYM_CIPHER_PARAM_FIPS_KEY_CHECK)<integer>β if required, this parameter should be set using eitherOSSL_FUNC_asym_cipher_encrypt_init()orOSSL_FUNC_asym_cipher_decrypt_init(). The default value of1causes an error during the init if the key is not FIPS approved (e.g. the key has a security strength of less than 112 bits). Setting this to0will ignore the error and set the approved"fips-indicator"to0.
π¨ Heads up bestie: this option breaks FIPS compliance if it causes the approved"fips-indicator"to return0. Like, that's the whole trade-off. You've been warned. π
And finally: OSSL_FUNC_asym_cipher_gettable_ctx_params() and OSSL_FUNC_asym_cipher_settable_ctx_params() get a constant OSSL_PARAM(3) array that describes the gettable and settable parameters β i.e. parameters that can be used with OSSL_FUNC_asym_cipherget_ctx_params() and OSSL_FUNC_asym_cipher_set_ctx_params() respectively. That's your menu of what's even on the table. π
π COPYRIGHT π
okay bestie, legal bit time β stay with me, it's short π
Copyright 2019-2026 The OpenSSL Project Authors. All Rights Reserved.
that's the whole squad holding it down, no cap π
and here's the licensing tea β β this file is Licensed under the Apache License 2.0 (the "License"), and likeβ¦ you literally may not use this file except in compliance with the License. that's not me being dramatic, that's just how it is π
if you want the full receipt (and honestly you should read it, it's giving responsible main character energy), you can grab a copy in the file LICENSE in the source distribution, or hit up:
<https://www.openssl.org/source/license.html>
that URL is the plug πβ¨
and that's a wrap on the whole page, bestie!! ππ¦ this little legend came from 3.5.9 and it's dated 2026-09-29 β screenshot it, bookmark it, tattoo it on your forearm, whatever works for you π π
go forth and configure your OSSL_ASYM_CIPHER providers like the icon you are πβ
π¦ where this page comes from
- alpine 3.23: openssl-doc 3.5.9-r0 Β· Apache-2.0
- alpine 3.24: openssl-doc 3.5.9-r0 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms