enum pem_type { PEM_TYPE_NONE = 0, PEM_TYPE_CERTIFICATE, PEM_TYPE_RSA_PRIVATE }; struct pem_map { enum pem_type type; const char *pem_string; }; #include <openssl/pem.h> enum pem_type identify_pem(const char *pem) { static const struct pem_map map[] = { { PEM_TYPE_CERTIFICATE, PEM_STRING_X509 "-----" }, { PEM_TYPE_RSA_PRIVATE, PEM_STRING_RSA "-----" }, }; const char *pem_begin; int idx; if (!pem) return PEM_TYPE_NONE; if (! (pem_begin = strstr(pem, "-----BEGIN "))) return PEM_TYPE_NONE; pem_begin += 11; for (idx = 0; idx < sizeof map / sizeof *map; idx++) { if (strncmp(pem_begin, map[idx].pem_string, strlen(map[idx].pem_string)) == 0) { return map[idx].type; } } return PEM_TYPE_NONE; } Untested. Extending to the remainder of the PEM types (see pem.h) is left as an exercise for the reader. -- Michael Wojcik Distinguished Engineer, Micro Focus -- openssl-users mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users