EVP_PKEY_IS_A(3SSL)

✨ EVP_PKEY_IS_A ✨

okay bestie, buckle up πŸ’– this is the OpenSSL man page for the 3SSL section β€” the key type + capabilities girlies. if you've ever been like "wait, what even IS this key and can it sign stuff?"… yeah. this page is for you. 🫢


🌸 NAME 🌸

EVP_PKEY_is_a, EVP_PKEY_can_sign, EVP_PKEY_type_names_do_all, EVP_PKEY_get0_type_name, EVP_PKEY_get0_description, EVP_PKEY_get0_provider β€” literally the key type and capabilities functions. they tell you what a key is, what it's called, and what it can do. that's the whole vibe. ✨


πŸŽ€ SYNOPSIS πŸŽ€

#include <openssl/evp.h>

int EVP_PKEY_is_a(const EVP_PKEY *pkey, const char *name);
int EVP_PKEY_can_sign(const EVP_PKEY *pkey);
int EVP_PKEY_type_names_do_all(const EVP_PKEY *pkey,
                               void (*fn)(const char *name, void *data),
                               void *data);
const char *EVP_PKEY_get0_type_name(const EVP_PKEY *key);
const char *EVP_PKEY_get0_description(const EVP_PKEY *key);
const OSSL_PROVIDER *EVP_PKEY_get0_provider(const EVP_PKEY *key);

πŸ’… DESCRIPTION πŸ’…

  • EVP_PKEY_is_a() β€” does a lil vibe check: is the key type of pkey actually name? yes or no, no elaboration. πŸ’…
  • EVP_PKEY_can_sign() β€” checks if the functionality for the key type of pkey supports signing. and that's it. no other check is done β€” like, it does NOT check whether pkey actually contains a private key. so don't get cocky. 😭
  • EVP_PKEY_type_names_do_all() β€” traverses every single name for pkey's key type and calls fn with each name and data. fr fr, an RSA EVP_PKEY may be named both "RSA" and "rsaEncryption" β€” it's giving multitudes. the order of the names depends on the provider implementation that holds the key, so don't come for me about ordering. πŸ™ˆ
  • EVP_PKEY_get0_type_name() β€” returns the first key type name that's found for the given pkey. heads up bestie: pkey may have multiple synonyms associated with it, and in that case it depends on the provider implementation that holds the key which one gets returned. also, ownership of the returned string is retained by the pkey object β€” do NOT free it yourself, that's not your business, that's not your string. 🚫
  • EVP_PKEY_get0_description() β€” returns a description of the type of EVP_PKEY, meant for display and human consumption. the description is at the discretion of the key type implementation, so it's whatever the provider decided to say. πŸ’¬
  • EVP_PKEY_get0_provider() β€” returns the provider of the EVP_PKEY's EVP_KEYMGMT(3). that's the whole job. ✨

🌈 RETURN VALUES 🌈

  • EVP_PKEY_is_a() β€” returns 1 if pkey has the key type name, otherwise 0.
  • EVP_PKEY_can_sign() β€” returns 1 if the pkey key type functionality supports signing, otherwise 0.
  • EVP_PKEY_get0_type_name() β€” returns the name that is found, or NULL on error.
  • EVP_PKEY_get0_description() β€” returns the description if found, or NULL if not.
  • EVP_PKEY_get0_provider() β€” returns the provider if found, or NULL if not.
  • EVP_PKEY_type_names_do_all() β€” returns 1 if the callback was called for all names. a return value of 0 means the callback was not called for any names. 😭

πŸ¦‹ EXAMPLES πŸ¦‹

⭐ EVP_PKEY_is_a() ⭐

the loaded providers and what key types they support will ultimately determine what name is possible to use with EVP_PKEY_is_a(). what we DO know: the default provider supports RSA, DH, DSA and EC keys, so we can use this as a crude example:

#include <openssl/evp.h>

...
    /* |pkey| is an EVP_PKEY* */
    if (EVP_PKEY_is_a(pkey, "RSA")) {
        BIGNUM *modulus = NULL;
        if (EVP_PKEY_get_bn_param(pkey, "n", &modulus))
            /* do whatever with the modulus */
        BN_free(modulus);
    }

⭐ EVP_PKEY_can_sign() ⭐

#include <openssl/evp.h>

...
    /* |pkey| is an EVP_PKEY* */
    if (!EVP_PKEY_can_sign(pkey)) {
        fprintf(stderr, "Not a signing key!");
        exit(1);
    }
    /* Sign something... */

like… if it can't sign, we're out. bye. πŸ‘‹


πŸ‘‘ HISTORY πŸ‘‘

the functions described here were added in OpenSSL 3.0. so yeah, they're not ancient, they're just iconic. πŸ’œ


Copyright 2020-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>.


πŸ’– okay that's the whole page bestie!! go forth and check those key types, you absolute main character. no cap, you ate. πŸ’…βœ¨

mwah πŸ’‹ β€” this was OpenSSL 4.0.3, dated 2026-09-29, from the EVP_PKEY_IS_A(3SSL) manual page. periodt. πŸŽ€

πŸ“¦ where this page comes from