source: MashMyData/trunk/pam_credential_translation/pam_cts.c @ 7744

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/MashMyData/trunk/pam_credential_translation/pam_cts.c@7744
Revision 7744, 2.5 KB checked in by pjkersha, 10 years ago (diff)

Incomplete - task 19: MashMyData?: Java MyProxy? logon and init/store

  • Working PAM module to work with MyProxyCA credential translation service.
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#include <security/pam_ext.h>
9#include <openssl/sha.h>
10
11
12static void sha256(const char *string, char outputBuffer[65])
13{
14    unsigned char hash[SHA256_DIGEST_LENGTH];
15    SHA256_CTX sha256;
16    SHA256_Init(&sha256);
17    SHA256_Update(&sha256, string, strlen(string));
18    SHA256_Final(hash, &sha256);
19    int i = 0;
20    for (i=0; i < SHA256_DIGEST_LENGTH; i++)
21    {
22        sprintf(outputBuffer + (i * 2), "%02x", hash[i]);
23    }
24    outputBuffer[64] = 0;
25}
26
27
28PAM_EXTERN int pam_sm_authenticate(pam_handle_t *pam_h, int flags, int argc, const char **argv)
29{
30    const char *user = (char *)NULL;
31    const char *passwd = (char *)NULL;
32    char *expected_passwd_hash = (char *)NULL;
33    char passwd_hash[65];
34    const char *service = (char *)NULL;
35    int status = PAM_SUCCESS;
36    int i=0;
37   
38    status = pam_get_item(pam_h, PAM_SERVICE, (const void **)&service);
39    if (status != PAM_SUCCESS)
40    {
41        syslog(LOG_AUTH|LOG_DEBUG, "Error getting service name: %s",
42               pam_strerror(pam_h, status));
43        return PAM_AUTH_ERR;
44    }   
45   
46    for (i=0; i < argc; i++)
47        if (strncmp(argv[i], "sha256passwd=", strlen("sha256passwd=")) == 0)
48        {
49            expected_passwd_hash = (char *)&argv[i][strlen("sha256passwd=")];
50            break;
51        }
52       
53    if (! expected_passwd_hash)
54    {
55        syslog(LOG_AUTH|LOG_DEBUG, 
56               "Expected \"sha256passwd=<sha256 hash of password>\" field in \"/etc/pam.d/%s\" file", 
57               service);
58        return PAM_AUTH_ERR;
59    }
60   
61    status = pam_get_user(pam_h, &user, NULL);
62    if (status != PAM_SUCCESS)
63    {
64        syslog(LOG_AUTH|LOG_DEBUG, "%s: error getting username: %s", service,
65               pam_strerror(pam_h, status));
66        return PAM_AUTH_ERR;
67    }
68   
69    if (! user) 
70    {
71        syslog(LOG_AUTH|LOG_DEBUG, "%s: no user set", service);
72        return PAM_USER_UNKNOWN;
73    }
74   
75    status = pam_get_authtok(pam_h, PAM_AUTHTOK, (const char **)&passwd, (const char *)NULL);
76    if (! passwd)   
77    {
78        syslog(LOG_AUTH|LOG_DEBUG, "%s: no password set", service);
79        return PAM_AUTH_ERR;
80    }
81    /*syslog(LOG_AUTH|LOG_DEBUG, "Password = %s", passwd);*/
82   
83    /*
84    * Take hash of password ready to compare it with the reference value
85    */
86    sha256(passwd, passwd_hash);
87    if (strcmp(expected_passwd_hash, passwd_hash))
88    {
89        syslog(LOG_AUTH|LOG_DEBUG, "%s: invalid password set", service);
90        return PAM_AUTH_ERR;
91    }
92       
93    syslog(LOG_AUTH|LOG_DEBUG, "%s: user \"%s\" authenticated", 
94           service, user);
95           
96    return PAM_SUCCESS;
97}
Note: See TracBrowser for help on using the repository browser.