diff options
Diffstat (limited to 'cmake/Modules/findopensslfeatures.c')
-rw-r--r-- | cmake/Modules/findopensslfeatures.c | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/cmake/Modules/findopensslfeatures.c b/cmake/Modules/findopensslfeatures.c new file mode 100644 index 0000000..390f1d2 --- /dev/null +++ b/cmake/Modules/findopensslfeatures.c @@ -0,0 +1,101 @@ +#include <stdio.h> +#include <string.h> +#include <ctype.h> +#include <openssl/ec.h> +#include <openssl/objects.h> +#include <openssl/evp.h> + +int +list_curves() +{ + size_t len = EC_get_builtin_curves(NULL, 0); + EC_builtin_curve *curves = OPENSSL_malloc(sizeof(EC_builtin_curve) * len); + if (!curves) { + fprintf(stderr, "Allocation failed.\n"); + return 1; + } + if (!EC_get_builtin_curves(curves, len)) { + OPENSSL_free(curves); + fprintf(stderr, "Failed to get curves.\n"); + return 1; + } + for (size_t i = 0; i < len; i++) { + const char *sname = OBJ_nid2sn(curves[i].nid); + if (!sname) { + continue; + } + printf("%s\n", sname); + } + OPENSSL_free(curves); + return 0; +} + +static void +print_hash(const EVP_MD *md, const char *from, const char *to, void *arg) +{ + if (!md) { + return; + } + if (strstr(from, "rsa") || strstr(from, "RSA")) { + return; + } + printf("%s\n", from); +} + +int +list_hashes() +{ + EVP_MD_do_all_sorted(print_hash, NULL); + return 0; +} + +static void +print_cipher(const EVP_CIPHER *cipher, const char *from, const char *to, void *x) +{ + if (!cipher) { + return; + } + printf("%s\n", from); +} + +int +list_ciphers() +{ + EVP_CIPHER_do_all_sorted(print_cipher, NULL); + return 0; +} + +int +list_publickey() +{ + for (size_t i = 0; i < EVP_PKEY_meth_get_count(); i++) { + const EVP_PKEY_METHOD *pmeth = EVP_PKEY_meth_get0(i); + int id = 0; + EVP_PKEY_meth_get0_info(&id, NULL, pmeth); + printf("%s\n", OBJ_nid2ln(id)); + } + return 0; +} + +int +main(int argc, char *argv[]) +{ + if (argc != 2) { + fprintf(stderr, "Usage: opensslfeatures [curves|hashes|ciphers|publickey]\n"); + return 1; + } + if (!strcmp(argv[1], "hashes")) { + return list_hashes(); + } + if (!strcmp(argv[1], "ciphers")) { + return list_ciphers(); + } + if (!strcmp(argv[1], "curves")) { + return list_curves(); + } + if (!strcmp(argv[1], "publickey")) { + return list_publickey(); + } + fprintf(stderr, "Unknown command: %s\n", argv[1]); + return 1; +} |