source: trunk/MashMyData/pam_credential_translation/pam_credential_translation.c @ 8233

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg-security/trunk/MashMyData/pam_credential_translation/pam_credential_translation.c
Revision 8233, 3.3 KB checked in by pjkersha, 6 years ago (diff)
Line 
1#define PAM_SM_AUTH
2
3#include <stdio.h>
4#include <string.h>
5#include <syslog.h>
6
7#include <security/pam_modules.h>
8
9#ifdef __APPLE__
10#include <security/pam_appl.h>
11#else
12#include <security/pam_ext.h>
13#endif
14#include <openssl/sha.h>
15
16#include "pam_credential_translation.h"
17
18#define _SHA_BUF_LEN SHA256_DIGEST_LENGTH * 2 + 1
19
20static void sha256(const char *string, char outputBuffer[_SHA_BUF_LEN])
21{
22    unsigned char hash[SHA256_DIGEST_LENGTH];
23    SHA256_CTX sha256;
24    SHA256_Init(&sha256);
25    SHA256_Update(&sha256, string, strlen(string));
26    SHA256_Final(hash, &sha256);
27    int i = 0;
28    for (i=0; i < SHA256_DIGEST_LENGTH; i++)
29    {
30        sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
31    }
32    outputBuffer[_SHA_BUF_LEN - 1] = 0;
33}
34
35
36PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pam_h, 
37                                   int flags, 
38                                   int argc, 
39                                   const char **argv)
40{
41    const char *user = (char *)NULL;
42    const char *passwd = (char *)NULL;
43    char *expected_passwd_hash = (char *)NULL;
44    char passwd_hash[_SHA_BUF_LEN];
45    const char *service = (char *)NULL;
46    int status = PAM_SUCCESS;
47    int i=0;
48    int _log = ! (flags & PAM_SILENT);
49    FILE *fp = fopen("/tmp/pam_cred.log", "w");
50    _log = 1;
51   
52    fprintf(fp, "In pam_sm_authenticate()\n");
53    fclose(fp);
54    status = pam_get_item(pam_h, PAM_SERVICE, (const void **)&service);
55    if (status != PAM_SUCCESS)
56    {
57        if (_log)
58            syslog(LOG_AUTH|LOG_DEBUG, "Error getting service name: %s",
59                   pam_strerror(pam_h, status));
60        return PAM_AUTH_ERR;
61    }   
62   
63    for (i=0; i < argc; i++)
64        if (strncmp(argv[i], 
65                    CREDENTIAL_TRANSLATION_PAM_SHA256PASSWD_FIELD, CREDENTIAL_TRANSLATION_PAM_SHA256PASSWD_FIELD_LEN) == 0)
66        {
67            expected_passwd_hash = (char *)&argv[i]
68                [strlen(CREDENTIAL_TRANSLATION_PAM_SHA256PASSWD_FIELD)];
69            break;
70        }
71       
72    if (! expected_passwd_hash)
73    {
74        if (_log)
75            syslog(LOG_AUTH|LOG_DEBUG, 
76"Expected \"%s<sha256 hash of password>\" field in \"/etc/pam.d/%s\" file", 
77                   CREDENTIAL_TRANSLATION_PAM_SHA256PASSWD_FIELD,
78                   service);
79        return PAM_AUTH_ERR;
80    }
81   
82    status = pam_get_user(pam_h, &user, NULL);
83    if (status != PAM_SUCCESS)
84    {
85        if (_log)
86            syslog(LOG_AUTH|LOG_DEBUG, "%s: error getting username: %s",               service,
87                   pam_strerror(pam_h, status));
88        return PAM_AUTH_ERR;
89    }
90   
91    if (! user) 
92    {
93        if (_log)
94            syslog(LOG_AUTH|LOG_DEBUG, "%s: no user set", service);
95        return PAM_USER_UNKNOWN;
96    }
97   
98    status = pam_get_authtok(pam_h, 
99                             PAM_AUTHTOK, 
100                             (const char **)&passwd, 
101                             (const char *)NULL);
102    if (! passwd)   
103    {
104        if (_log)
105            syslog(LOG_AUTH|LOG_DEBUG, "%s: no password set", service);
106        return PAM_AUTH_ERR;
107    }
108   
109    /*
110    * Take hash of password ready to compare it with the reference value
111    */
112    sha256(passwd, passwd_hash);
113    if (strcmp(expected_passwd_hash, passwd_hash))
114    {
115        if (_log)
116            syslog(LOG_AUTH|LOG_DEBUG, "%s: invalid password set", service);
117        return PAM_AUTH_ERR;
118    }
119       
120    if (_log)
121        syslog(LOG_AUTH|LOG_DEBUG, "%s: user \"%s\" authenticated", 
122               service, user);
123           
124    return PAM_SUCCESS;
125}
126
127PAM_EXTERN int pam_sm_acct_mgmt(pam_handle_t *pam_h, 
128                                int flags, 
129                                int argc, 
130                                const char **argv)
131{
132    return PAM_SUCCESS;
133}
Note: See TracBrowser for help on using the repository browser.