Changeset 644 in openpam


Ignore:
Timestamp:
Mar 5, 2013, 3:25:22 PM (8 years ago)
Author:
Dag-Erling Smørgrav
Message:

Add code to load a key and obtain and verify a response from the user.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/modules/pam_oath/pam_oath.c

    r623 r644  
    3434#endif
    3535
     36#include <limits.h>
    3637#include <pwd.h>
     38#include <stdint.h>
     39#include <stdio.h>
     40#include <stdlib.h>
     41#include <string.h>
    3742
    3843#define PAM_SM_AUTH
     
    4247#include <security/pam_appl.h>
    4348
     49#include "oath.h"
     50
    4451PAM_EXTERN int
    4552pam_sm_authenticate(pam_handle_t *pamh, int flags,
     
    4855        struct passwd *pwd;
    4956        const char *user;
    50         char *password;
    51         int pam_err;
     57        char *keyfile;
     58        struct oath_key *key;
     59        unsigned long code;
     60        char *password, *end;
     61        int pam_err, ret;
    5262
    5363        (void)flags;
     
    6171                return (PAM_USER_UNKNOWN);
    6272
     73        /* load key */
     74        keyfile = calloc(1, strlen(pwd->pw_dir) + sizeof "/.otpauth");
     75        if (keyfile == NULL)
     76                return (PAM_SYSTEM_ERR);
     77        sprintf(keyfile, "%s/.otpauth", pwd->pw_dir);
     78        free(keyfile);
     79        if ((key = oath_key_from_file(keyfile)) == NULL) {
     80                /* no key, fake it? */
     81                if (openpam_get_option(pamh, "fakeauth") == NULL)
     82                        return (PAM_AUTHINFO_UNAVAIL);
     83                key = oath_dummy_key(om_hotp, oh_sha1, 6);
     84        }
     85
    6386        /* get code */
    6487        pam_err = pam_get_authtok(pamh, PAM_AUTHTOK,
     
    6992                return (PAM_AUTH_ERR);
    7093
    71         pam_err = PAM_AUTH_ERR;
    72         return (pam_err);
     94        /* convert to number */
     95        code = strtoul(password, &end, 10);
     96        if (end == password || *end != '\0')
     97                code = ULONG_MAX;
     98
     99        /* verify response */
     100        if (key->mode == om_hotp)
     101                ret = oath_hotp_match(key, code, 1);
     102        else
     103                ret = oath_totp_match(key, code, 1);
     104        oath_key_free(key);
     105        if (ret != 0)
     106                return (PAM_AUTH_ERR);
     107
     108        /* XXX write back */
     109        return (PAM_SUCCESS);
    73110}
    74111
Note: See TracChangeset for help on using the changeset viewer.