| =pod |
| |
| =head1 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 |
| - key type and capabilities functions |
| |
| =head1 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); |
| |
| =head1 DESCRIPTION |
| |
| EVP_PKEY_is_a() checks if the key type of I<pkey> is I<name>. |
| |
| EVP_PKEY_can_sign() checks if the functionality for the key type of |
| I<pkey> supports signing. No other check is done, such as whether |
| I<pkey> contains a private key. |
| |
| EVP_PKEY_type_names_do_all() traverses all names for I<pkey>'s key type, and |
| calls I<fn> with each name and I<data>. For example, an RSA B<EVP_PKEY> may |
| be named both C<RSA> and C<rsaEncryption>. |
| The order of the names depends on the provider implementation that holds |
| the key. |
| |
| EVP_PKEY_get0_type_name() returns the first key type name that is found |
| for the given I<pkey>. Note that the I<pkey> may have multiple synonyms |
| associated with it. In this case it depends on the provider implementation |
| that holds the key which one will be returned. |
| Ownership of the returned string is retained by the I<pkey> object and should |
| not be freed by the caller. |
| |
| EVP_PKEY_get0_description() returns a description of the type of B<EVP_PKEY>, |
| meant for display and human consumption. The description is at the |
| discretion of the key type implementation. |
| |
| EVP_PKEY_get0_provider() returns the provider of the B<EVP_PKEY>'s |
| L<EVP_KEYMGMT(3)>. |
| |
| =head1 RETURN VALUES |
| |
| EVP_PKEY_is_a() returns 1 if I<pkey> has the key type I<name>, |
| otherwise 0. |
| |
| EVP_PKEY_can_sign() returns 1 if the I<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 that the callback was not called for any |
| names. |
| |
| =head1 EXAMPLES |
| |
| =head2 EVP_PKEY_is_a() |
| |
| The loaded providers and what key types they support will ultimately |
| determine what I<name> is possible to use with EVP_PKEY_is_a(). We do know |
| that the default provider supports RSA, DH, DSA and EC keys, so we can use |
| this as an 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); |
| } |
| |
| =head2 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... */ |
| |
| =head1 HISTORY |
| |
| The functions described here were added in OpenSSL 3.0. |
| |
| =head1 COPYRIGHT |
| |
| 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 |
| L<https://www.openssl.org/source/license.html>. |
| |
| =cut |