RSA_METH_NEW(3ossl)

πŸ“¦ version 3.5.0, in opensuse-leap 16.0

🌸 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 new RSA_METHOD structure ✨ Give it a unique name and a set of flags. The name has to be a NULL terminated string, and here's the tea: it gets duplicated and stored inside the RSA_METHOD object, 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 this RSA_METHOD β€” and every new RSA object will have those flags set by default. Free real estate.
  • RSA_meth_dup() β€” makes a duplicate copy of the RSA_METHOD object you pass in. Super useful when you want a new RSA_METHOD based on an existing one but with like... a few little differences πŸ‘‘ iconic behavior honestly.
  • RSA_meth_free() β€” destroys an RSA_METHOD structure and frees up all the memory attached to it. If the argument is NULL, 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 this RSA_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 the RSA_METHOD to name. The string is duplicated and the copy is stored in the RSA_METHOD structure, 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 this RSA_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() and RSA_meth_set_sign() get and set the function used for creating an RSA signature (respectively, obviously πŸ’…). This function gets called when the application calls RSA_sign(). Its parameters mean the same thing as the ones for RSA_sign().
  • RSA_meth_get_verify() and RSA_meth_set_verify() get and set the function used for verifying an RSA signature. This one fires when the application calls RSA_verify(). Its parameters mean the same thing as the ones for RSA_verify().

🌈 Modular exponentiation 🌈

  • RSA_meth_get_mod_exp() and RSA_meth_set_mod_exp() get and set the function used for CRT computations.
  • RSA_meth_get_bn_mod_exp() and RSA_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() and RSA_meth_set_init() get and set the function used for creating a new RSA instance. It gets called when the application calls RSA_new() (but only if the current default RSA_METHOD is this one) or RSA_new_method(). Here's how it goes: RSA_new() and RSA_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 be NULL. ✨
  • RSA_meth_get_finish() and RSA_meth_set_finish() get and set the function used for destroying an instance of an RSA object. It gets called when the application calls RSA_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 be NULL.

πŸ‘‘ Key generation πŸ‘‘

  • RSA_meth_get_keygen() and RSA_meth_set_keygen() get and set the function used for generating a new RSA key pair. It gets called when the application calls RSA_generate_key_ex(), and its parameter means the same thing as the one for RSA_generate_key_ex().
  • RSA_meth_get_multi_prime_keygen() and RSA_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 calls RSA_generate_multi_prime_key(), and its parameter means the same thing as the one for RSA_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() and RSA_meth_dup() return the newly allocated RSA_METHOD object β€” or NULL on failure 😭
  • RSA_meth_get0_name() and RSA_meth_get_flags() return the name and flags associated with the RSA_METHOD, respectively.
  • All the other RSA_meth_get_*() functions return the appropriate function pointer that's been set in the RSA_METHOD β€” or NULL if no such pointer has been set yet.
  • RSA_meth_set1_name and all the RSA_meth_set_*() functions return 1 on success or 0 on failure. Simple as that πŸ’…

πŸ¦‹ SEE ALSO πŸ¦‹

Go read these next, bestie, they're all in the same universe:


🌸 HISTORY 🌸

A little timeline moment for you πŸŽ€

  • All of these functions were deprecated in OpenSSL 3.0.
  • RSA_meth_get_multi_prime_keygen() and RSA_meth_set_multi_prime_keygen() were added in OpenSSL 1.1.1.
  • The other functions described here were added in OpenSSL 1.1.0.

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