56 lines
1.5 KiB
Plaintext
56 lines
1.5 KiB
Plaintext
/*
|
|
* This function is a front-end for the message digest algorithms used
|
|
* to compute the user's encrypted passwords. No reversible encryption
|
|
* is used here and I intend to keep it that way.
|
|
*
|
|
* While there are many sources of encryption outside the United
|
|
* States, it *may* be illegal to re-export reversible encryption
|
|
* computer code. Until such time as it is legal to export encryption
|
|
* software freely from the US, please do not send me any. (AGM)
|
|
*/
|
|
|
|
/* this should have been defined in a header file.. Why wasn't it? AGM */
|
|
extern char *crypt(const char *key, const char *salt);
|
|
|
|
#include "md5.h"
|
|
#include "bigcrypt.-c"
|
|
|
|
struct cfns {
|
|
const char *salt;
|
|
int len;
|
|
char * (* mdfn)(const char *key, const char *salt);
|
|
};
|
|
|
|
/* array of non-standard digest algorithms available */
|
|
|
|
#define N_MDS 1
|
|
const static struct cfns cfn_list[N_MDS] = {
|
|
{ "$1$", 3, crypt_md5 },
|
|
};
|
|
|
|
static char *_pam_md(const char *key, const char *salt)
|
|
{
|
|
char *x,*e=NULL;
|
|
int i;
|
|
|
|
D(("called with key='%s', salt='%s'", key, salt));
|
|
|
|
/* check for non-standard salts */
|
|
|
|
for (i=0; i<N_MDS; ++i) {
|
|
if ( !strncmp(cfn_list[i].salt, salt, cfn_list[i].len) ) {
|
|
e = cfn_list[i].mdfn(key, salt);
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( i >= N_MDS ) {
|
|
e = bigcrypt(key, salt); /* (defaults to standard algorithm) */
|
|
}
|
|
|
|
x = x_strdup(e); /* put e in malloc()ed memory */
|
|
_pam_overwrite(e); /* clean up */
|
|
return x; /* this must be deleted elsewhere */
|
|
}
|
|
|