/proc/crypto
- это просто список алгоритмов, о которых знает ядро; это не имеет ничего общего с PAM.
Нет способа напрямую запросить PAM, чтобы выяснить, какие хеши он может поддерживать; конечно, он знает это внутренне, но не доступен ни одному общедоступному API.
Одна вещь, которую вы могли бы сделать, это использовать crypt
и попытаться хэшировать проход с различными типами идентификаторов, по существу, проверяя PAM (или, точнее, проверяя крипту libc, которую PAM использует для теневых паролей). Простой пример:
#include <unistd.h>
#include <stdio.h>
#include <string>
bool test_crypt_method(const char* id)
{
const std::string salt =
std::string("$") + id + "$" + "testsalt$";
std::string crypt_result = ::crypt("password", salt.c_str());
/*
* If the hash ID is not supported, glibc unfortunately
* then treats it as a old-style DES crypt rather than
* failing; find this situation.
*/
if(crypt_result.size() == 13 &&
crypt_result[0] == '$' &&
crypt_result.find('$', 1) == std::string::npos)
return false;
return true;
}
int main()
{
if(test_crypt_method("1"))
printf("md5 ");
if(test_crypt_method("2a"))
printf("blowfish ");
if(test_crypt_method("4")) // test for false positives
printf("undefined ");
if(test_crypt_method("5"))
printf("sha256 ");
if(test_crypt_method("6"))
printf("sha512 ");
printf("\n");
}