RSA_METH_NEW(3ossl)
πΈ NAME πΈ
Welcome to RSA_METH_NEW(3ossl), bestie β this is the manual page for the whole RSA_meth_* squad, and TL;DR they are literally the routines to build up RSA methods. The full cast is RSA_meth_get0_app_data, RSA_meth_set0_app_data, RSA_meth_new, RSA_meth_free, RSA_meth_dup, RSA_meth_get0_name, RSA_meth_set1_name, RSA_meth_get_flags, RSA_meth_set_flags, RSA_meth_get_pub_enc, RSA_meth_set_pub_enc, RSA_meth_get_pub_dec, RSA_meth_set_pub_dec, RSA_meth_get_priv_enc, RSA_meth_set_priv_enc, RSA_meth_get_priv_dec, RSA_meth_set_priv_dec, RSA_meth_get_mod_exp, RSA_meth_set_mod_exp, RSA_meth_get_bn_mod_exp, RSA_meth_set_bn_mod_exp, RSA_meth_get_init, RSA_meth_set_init, RSA_meth_get_finish, RSA_meth_set_finish, RSA_meth_get_sign, RSA_meth_set_sign, RSA_meth_get_verify, RSA_meth_set_verify, RSA_meth_get_keygen, RSA_meth_set_keygen, RSA_meth_get_multi_prime_keygen, and RSA_meth_set_multi_prime_keygen. No cap, that is the whole group chat π
.
β¨ SYNOPSIS β¨
First things first, you gotta include this:
#include <openssl/rsa.h>
Heads up bestie: the following functions have been deprecated since OpenSSL 3.0, and can be hidden entirely by defining OPENSSL_API_COMPAT with a suitable version value, see openssl_user_macros(7):
RSA_METHOD *RSA_meth_new(const char *name, int flags);
void RSA_meth_free(RSA_METHOD *meth);
RSA_METHOD *RSA_meth_dup(const RSA_METHOD *meth);
const char *RSA_meth_get0_name(const RSA_METHOD *meth);
int RSA_meth_set1_name(RSA_METHOD *meth, const char *name);
int RSA_meth_get_flags(const RSA_METHOD *meth);
int RSA_meth_set_flags(RSA_METHOD *meth, int flags);
void *RSA_meth_get0_app_data(const RSA_METHOD *meth);
int RSA_meth_set0_app_data(RSA_METHOD *meth, void *app_data);
int (*RSA_meth_get_pub_enc(const RSA_METHOD *meth))(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_pub_enc(RSA_METHOD *rsa,
int (*pub_enc)(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding));
int (*RSA_meth_get_pub_dec(const RSA_METHOD *meth))
(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_meth_set_pub_dec(RSA_METHOD *rsa,
int (*pub_dec)(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding));
int (*RSA_meth_get_priv_enc(const RSA_METHOD *meth))(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding);
int RSA_meth_set_priv_enc(RSA_METHOD *rsa,
int (*priv_enc)(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding));
int (*RSA_meth_get_priv_dec(const RSA_METHOD *meth))(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa,
int padding);
int RSA_meth_set_priv_dec(RSA_METHOD *rsa,
int (*priv_dec)(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding));
/* Can be null */
int (*RSA_meth_get_mod_exp(const RSA_METHOD *meth))(BIGNUM *r0, const BIGNUM *i,
RSA *rsa, BN_CTX *ctx);
int RSA_meth_set_mod_exp(RSA_METHOD *rsa,
int (*mod_exp)(BIGNUM *r0, const BIGNUM *i, RSA *rsa,
BN_CTX *ctx));
/* Can be null */
int (*RSA_meth_get_bn_mod_exp(const RSA_METHOD *meth))(BIGNUM *r, const BIGNUM *a,
const BIGNUM *p, const BIGNUM *m,
BN_CTX *ctx, BN_MONT_CTX *m_ctx);
int RSA_meth_set_bn_mod_exp(RSA_METHOD *rsa,
int (*bn_mod_exp)(BIGNUM *r, const BIGNUM *a,
const BIGNUM *p, const BIGNUM *m,
BN_CTX *ctx, BN_MONT_CTX *m_ctx));
/* called at new */
int (*RSA_meth_get_init(const RSA_METHOD *meth) (RSA *rsa);
int RSA_meth_set_init(RSA_METHOD *rsa, int (*init (RSA *rsa));
/* called at free */
int (*RSA_meth_get_finish(const RSA_METHOD *meth))(RSA *rsa);
int RSA_meth_set_finish(RSA_METHOD *rsa, int (*finish)(RSA *rsa));
int (*RSA_meth_get_sign(const RSA_METHOD *meth))(int type, const unsigned char *m,
unsigned int m_length,
unsigned char *sigret,
unsigned int *siglen, const RSA *rsa);
int RSA_meth_set_sign(RSA_METHOD *rsa,
int (*sign)(int type, const unsigned char *m,
unsigned int m_length, unsigned char *sigret,
unsigned int *siglen, const RSA *rsa));
int (*RSA_meth_get_verify(const RSA_METHOD *meth))(int dtype, const unsigned char *m,
unsigned int m_length,
const unsigned char *sigbuf,
unsigned int siglen, const RSA *rsa);
int RSA_meth_set_verify(RSA_METHOD *rsa,
int (*verify)(int dtype, const unsigned char *m,
unsigned int m_length,
const unsigned char *sigbuf,
unsigned int siglen, const RSA *rsa));
int (*RSA_meth_get_keygen(const RSA_METHOD *meth))(RSA *rsa, int bits, BIGNUM *e,
BN_GENCB *cb);
int RSA_meth_set_keygen(RSA_METHOD *rsa,
int (*keygen)(RSA *rsa, int bits, BIGNUM *e,
BN_GENCB *cb));
int (*RSA_meth_get_multi_prime_keygen(const RSA_METHOD *meth))(RSA *rsa, int bits,
int primes, BIGNUM *e,
BN_GENCB *cb);
int RSA_meth_set_multi_prime_keygen(RSA_METHOD *meth,
int (*keygen) (RSA *rsa, int bits,
int primes, BIGNUM *e,
BN_GENCB *cb));
That is the synopsis locked in, and yes it is giving function-pointer buffet π. Part 2 has the rest of the deets, and it is lowkey a lot, iykyk π.
β¨ DESCRIPTION β¨
Okay bestie, buckle up because I have to tell you the sad part first π
EVERY. SINGLE. ONE. of the functions on this page is deprecated. Not one, not a few β all of them. The actual move is to use the OSSL_PROVIDER APIs instead. So like... read this for the vibes and the lore, but don't build your new thing on it, okay? π«Ά
So RSA_METHOD β literally the blueprint structure for plugging your own custom RSA implementation into OpenSSL π It hands OpenSSL a whole little squad of functions, and OpenSSL calls them to actually make all the different RSA capabilities happen. Think of it as your main character's entourage.
πΈ The constructors & destructors πΈ
RSA_meth_new()β makes a brand newRSA_METHODstructure β¨ Give it a unique name and a set of flags. The name has to be aNULLterminated string, and here's the tea: it gets duplicated and stored inside theRSA_METHODobject, so you, the caller, are still responsible for freeing your original string. Not it. π The flags get used later when a new RSA object is constructed from thisRSA_METHODβ and every new RSA object will have those flags set by default. Free real estate.RSA_meth_dup()β makes a duplicate copy of theRSA_METHODobject you pass in. Super useful when you want a newRSA_METHODbased on an existing one but with like... a few little differences π iconic behavior honestly.RSA_meth_free()β destroys anRSA_METHODstructure and frees up all the memory attached to it. If the argument isNULL, literally nothing happens. No drama, no crash, we love a chill function π
π Names & flags π
RSA_meth_get0_name()returns a pointer to the name of thisRSA_METHOD. Heads up though β it's a pointer to the internal name string, so do not free it, bestie, I'm begging π«ΆRSA_meth_set1_name()sets the name of theRSA_METHODto name. The string is duplicated and the copy is stored in theRSA_METHODstructure, so you're still on the hook for freeing the memory associated with the name you passed in.RSA_meth_get_flags()returns the current value of the flags associated with thisRSA_METHOD.RSA_meth_set_flags()lets you set those flags. Slay.
π¦ App data π¦
The functions RSA_meth_get0_app_data() and RSA_meth_set0_app_data() let you associate implementation-specific data with the RSA_METHOD. And guess what β it's the application's responsibility to free that data before the RSA_METHOD gets freed via RSA_meth_free(). Don't forget or it's a leak, and leaks are not cute π
π Sign & verify π
RSA_meth_get_sign()andRSA_meth_set_sign()get and set the function used for creating an RSA signature (respectively, obviously π ). This function gets called when the application callsRSA_sign(). Its parameters mean the same thing as the ones forRSA_sign().RSA_meth_get_verify()andRSA_meth_set_verify()get and set the function used for verifying an RSA signature. This one fires when the application callsRSA_verify(). Its parameters mean the same thing as the ones forRSA_verify().
π Modular exponentiation π
RSA_meth_get_mod_exp()andRSA_meth_set_mod_exp()get and set the function used for CRT computations.RSA_meth_get_bn_mod_exp()andRSA_meth_set_bn_mod_exp()get and set the function used for CRT computations too β specifically this value right here:
r = a ^ p mod m
Both the mod_exp() function and the bn_mod_exp() function get called by the default OpenSSL method during encryption, decryption, signing and verification. They're booked and busy fr fr π₯
π§ Init & finish π§
RSA_meth_get_init()andRSA_meth_set_init()get and set the function used for creating a new RSA instance. It gets called when the application callsRSA_new()(but only if the current defaultRSA_METHODis this one) orRSA_new_method(). Here's how it goes:RSA_new()andRSA_new_method()allocate the memory for the new RSA object, and a pointer to that freshly allocated structure gets passed as a parameter to your function. This function may beNULL. β¨RSA_meth_get_finish()andRSA_meth_set_finish()get and set the function used for destroying an instance of an RSA object. It gets called when the application callsRSA_free(), and a pointer to the RSA being destroyed is passed as a parameter. Use this destroy function for RSA-implementation-specific cleanup β but do not free the memory for the RSA itself in here, that's not your job bestie π This function may beNULL.
π Key generation π
RSA_meth_get_keygen()andRSA_meth_set_keygen()get and set the function used for generating a new RSA key pair. It gets called when the application callsRSA_generate_key_ex(), and its parameter means the same thing as the one forRSA_generate_key_ex().RSA_meth_get_multi_prime_keygen()andRSA_meth_set_multi_prime_keygen()get and set the function used for generating a new multi-prime RSA key pair. It gets called when the application callsRSA_generate_multi_prime_key(), and its parameter means the same thing as the one forRSA_generate_multi_prime_key().
π Encrypt & decrypt π
RSA_meth_get_pub_enc(), RSA_meth_set_pub_enc(), RSA_meth_get_pub_dec(), RSA_meth_set_pub_dec(), RSA_meth_get_priv_enc(), RSA_meth_set_priv_enc(), RSA_meth_get_priv_dec() and RSA_meth_set_priv_dec() get and set the functions used for public and private key encryption and decryption β¨
These get called when the application calls RSA_public_encrypt(), RSA_private_decrypt(), RSA_private_encrypt() and RSA_public_decrypt() respectively, and they take the same parameters as those. Full circle, we love consistency π«Ά
β RETURN VALUES β
RSA_meth_new()andRSA_meth_dup()return the newly allocatedRSA_METHODobject β orNULLon failure πRSA_meth_get0_name()andRSA_meth_get_flags()return the name and flags associated with theRSA_METHOD, respectively.- All the other
RSA_meth_get_*()functions return the appropriate function pointer that's been set in theRSA_METHODβ orNULLif no such pointer has been set yet. RSA_meth_set1_nameand all theRSA_meth_set_*()functions return1on success or0on failure. Simple as that π
π¦ SEE ALSO π¦
Go read these next, bestie, they're all in the same universe:
RSA_new(3)RSA_generate_key_ex(3)RSA_sign(3)RSA_set_method(3)RSA_size(3)RSA_get0_key(3)RSA_generate_multi_prime_key(3)
πΈ HISTORY πΈ
A little timeline moment for you π
- All of these functions were deprecated in
OpenSSL 3.0. RSA_meth_get_multi_prime_keygen()andRSA_meth_set_multi_prime_keygen()were added inOpenSSL 1.1.1.- The other functions described here were added in
OpenSSL 1.1.0.
π COPYRIGHT π
Copyright 2016-2024 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 π«Ά This was RSA_METH_NEW(3ossl) from OpenSSL 3.5.0, dated 2026-09-25 β go forth and maybe use OSSL_PROVIDER instead, mwah πβ¨
π¦ where this page comes from
- opensuse-leap 16.0: openssl-3-doc 3.5.0-160000.11.1 Β· Apache-2.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms