/proc/crypto
est juste une liste des algorithmes que le noyau a connaissance; cela n'a rien à voir avec PAM.
Il n'existe aucun moyen d'interroger directement PAM pour savoir quels hachages il peut supporter; il le sait en interne, bien sûr, mais il n'est exposé par aucune API publique. Une chose que vous pouvez faire est d'utiliser crypt
et tenter de hacher un passe avec les différents types d'id, en sondant essentiellement PAM (ou plus exactement, en explorant la crypt de libc, que PAM utilise pour les mots de passe ombrés). Exemple simple:
#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");
}