RSA_CHECK_KEY(3ossl)

πŸ“¦
version 15.1 Β· 3 versions
, in freebsd 15.1

πŸ’… RSA_CHECK_KEY(3ossl) β€” the OpenSSL manual, but make it make sense

okay so bestie, gather round, because we're talking about RSA_check_key_ex and RSA_check_key β€” the little functions that validate private RSA keys. This is the OpenSSL page, and honestly? It's giving "vintage". Let's get into it πŸŽ€


✨ NAME ✨

RSA_check_key_ex, RSA_check_key β€” validate private RSA keys. That's it, that's the whole job. πŸ‘‘


🌸 SYNOPSIS 🌸

First things first, you gotta pull in the header, obviously:

#include <openssl/rsa.h>
🚨 okay so the vibe check here is important: both of these functions have been deprecated since OpenSSL 3.0. You can hide them entirely by defining OPENSSL_API_COMPAT with a suitable version value β€” and yes, openssl_user_macros(7) has the tea on that.

Here's the signatures, bestie:

int RSA_check_key_ex(const RSA *rsa, BN_GENCB *cb);

int RSA_check_key(const RSA *rsa);

πŸ’– DESCRIPTION πŸ’–

So. Both functions on this page are deprecated, periodt. Applications should instead use EVP_PKEY_public_check(3), EVP_PKEY_private_check(3) and EVP_PKEY_pairwise_check(3). That's the glow-up, go use those. πŸ’…

RSA_check_key_ex() validates RSA keys. It checks that p and q are in fact prime, and that n = p*q. Like, actually prime, not just "looks prime in the group chat". πŸ”₯

It does not work on RSA public keys that have only the modulus and public exponent elements populated. Nope. Not happening. 🚫

It also checks that d*e = 1 mod (p-1*q-1), and that dmp1, dmq1 and iqmp are set correctly or are NULL.

It performs integrity checks on all the RSA key material, so the RSA key structure must contain all the private key data too. Therefore, it cannot be used with any arbitrary RSA key object, even if it is otherwise fit for regular RSA operation. Like, it's not being picky on purpose, it genuinely needs the whole set. 😭

The cb parameter is a callback that will be invoked in the same manner as BN_is_prime_ex(3).

RSA_check_key() is equivalent to RSA_check_key_ex() with a NULL cb. Same energy, fewer arguments. 🫢


⭐ RETURN VALUES ⭐

RSA_check_key_ex() and RSA_check_key() return 1 if rsa is a valid RSA key, and 0 otherwise. They return -1 if an error occurs while checking the key.

If the key is invalid or an error occurred, the reason code can be obtained using ERR_get_error(3). Go get the receipts, bestie. 🧾


πŸ¦‹ NOTES πŸ¦‹

Unlike most other RSA functions, this function does not work transparently with any underlying ENGINE implementation, because it uses the key data in the RSA structure directly. Rude? A little. Necessary? Also yes.

An ENGINE implementation can override the way key data is stored and handled, and can even provide support for HSM keys β€” in which case the RSA structure may contain no key data at all! πŸ’€ Like, nothing. Empty. Ghosted.

If the ENGINE in question is only being used for acceleration or analysis purposes, then in all likelihood the RSA key data is complete and untouched β€” but this can't be assumed in the general case. No cap. πŸ™ˆ


🌈 BUGS 🌈

A method of verifying the RSA key using opaque RSA API functions might need to be considered. Right now RSA_check_key() simply uses the RSA structure elements directly, bypassing the RSA_METHOD table altogether β€” and completely violating encapsulation and object-orientation in the process. Not me calling out the code in its own manpage 😭😭

The best fix will probably be to introduce a "check_key()" handler to the RSA_METHOD function table so that alternative implementations can also provide their own verifiers. Manifesting this for the next release ✨


πŸ”₯ SEE ALSO πŸ”₯

iykyk πŸ‘‘


πŸ“ HISTORY πŸ“

All of these functions were deprecated in OpenSSL 3.0.

RSA_check_key_ex() appeared after OpenSSL 1.0.2. She's newer, but still vintage at this point πŸ’œ


Copyright 2000-2020 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 3.5.6, dated 2026-04-07, filed under RSA_CHECK_KEY(3ossl) β€” mwah, go validate those keys responsibly πŸ’–βœ¨

πŸ“¦ where this page comes from