Changeset 643 in openpam for trunk/modules/pam_oath/oath_key.c


Ignore:
Timestamp:
Mar 5, 2013, 3:24:00 PM (8 years ago)
Author:
Dag-Erling Smørgrav
Message:
  • Add a provisional API for computing the current HOTP or TOTP code.
  • Add a provisional API for matching a user response.
  • Add a provisional API for generating a dummy key. When one of the matching functions recognizes a dummy key, it will go through the motions but never report a match.
File:
1 edited

Legend:

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

    r628 r643  
    113113                goto invalid;
    114114        if (strlcmp("hotp", p, q - p) == 0) {
    115                 openpam_log(PAM_LOG_DEBUG, "OATH mode: HOTP");
    116115                key->mode = om_hotp;
    117116        } else if (strlcmp("totp", p, q - p) == 0) {
    118                 openpam_log(PAM_LOG_DEBUG, "OATH mode: TOTP");
    119117                key->mode = om_totp;
    120118        } else {
     
    133131
    134132        /* extract parameters */
    135         key->counter = UINTMAX_MAX;
     133        key->counter = UINT64_MAX;
    136134        while (*p != '\0') {
    137135                if ((q = strchr(p, '=')) == NULL)
     
    153151                                goto invalid;
    154152                        key->key = key->data + key->labellen;
     153                        key->keylen = key->datalen - key->labellen;
    155154                        if (base32_dec(q, r - q, key->key, &key->keylen) != 0)
    156155                                goto invalid;
     
    180179                        key->digits = *q - '0';
    181180                } else if (strlcmp("counter=", p, q - p) == 0) {
    182                         if (key->counter != UINTMAX_MAX)
     181                        if (key->counter != UINT64_MAX)
    183182                                /* dupe */
    184183                                goto invalid;
    185184                        n = strtoumax(q, &e, 10);
    186                         if (e != r || n >= UINTMAX_MAX)
     185                        if (e != r || n >= UINT64_MAX)
    187186                                goto invalid;
    188187                        key->counter = (uint64_t)n;
     
    227226        if (key->keylen == 0)
    228227                goto invalid;
     228        return (key);
    229229
    230230invalid:
     
    296296
    297297        /* compute length of base32-encoded key and append it */
    298         kslen = base32_enclen(key->keylen);
    299         if ((tmp = realloc(uri, urilen + kslen + 1)) == NULL) {
     298        kslen = base32_enclen(key->keylen) + 1;
     299        if ((tmp = realloc(uri, urilen + kslen)) == NULL) {
    300300                free(uri);
    301301                return (NULL);
     
    309309        return (uri);
    310310}
     311
     312struct oath_key *
     313oath_dummy_key(enum oath_mode mode, enum oath_hash hash, unsigned int digits)
     314{
     315        struct oath_key *key;
     316
     317        if ((key = oath_key_alloc(DUMMY_LABELLEN + DUMMY_KEYLEN)) == NULL)
     318                return (NULL);
     319        key->mode = mode;
     320        key->digits = digits;
     321        key->counter = 0;
     322        key->timestep = 30;
     323        key->hash = hash;
     324        key->label = (char *)key->data;
     325        memcpy(key->label, DUMMY_LABEL, DUMMY_LABELLEN);
     326        key->key = key->data + DUMMY_LABELLEN;
     327        key->keylen = DUMMY_KEYLEN;
     328        return (key);
     329}
Note: See TracChangeset for help on using the changeset viewer.