Changeset 730 in openpam for trunk/lib


Ignore:
Timestamp:
Aug 21, 2013, 3:32:54 PM (7 years ago)
Author:
Dag-Erling Smørgrav
Message:

Support storing the non-standard lastused parameter in a key URI.
Also fix some default values.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/lib/liboath/oath_key.c

    r694 r730  
    8585
    8686        /* extract label */
     87        /* XXX actually URI-encoded */
    8788        if ((q = strchr(p, '?')) == NULL)
    8889                goto invalid;
     
    9596        /* extract parameters */
    9697        key->counter = UINT64_MAX;
     98        key->lastused = UINT64_MAX;
    9799        while (*p != '\0') {
    98100                if ((q = strchr(p, '=')) == NULL)
     
    144146                                goto invalid;
    145147                        key->counter = (uint64_t)n;
     148                } else if (strlcmp("lastused=", p, q - p) == 0) {
     149                        if (key->lastused != UINT64_MAX)
     150                                /* dupe */
     151                                goto invalid;
     152                        n = strtoumax(q, &e, 10);
     153                        if (e != r || n >= UINT64_MAX)
     154                                goto invalid;
     155                        key->lastused = (uint64_t)n;
    146156                } else if (strlcmp("period=", p, q - p) == 0) {
    147157                        if (key->timestep != 0)
     
    164174        /* sanity checks and default values */
    165175        if (key->mode == om_hotp) {
     176                if (key->counter == UINT64_MAX)
     177                        key->counter = 0;
    166178                if (key->timestep != 0)
    167179                        goto invalid;
    168                 if (key->counter == UINTMAX_MAX)
    169                         key->counter = 0;
     180                if (key->lastused != UINT64_MAX)
     181                        goto invalid;
    170182        } else if (key->mode == om_totp) {
    171                 if (key->counter != UINTMAX_MAX)
     183                if (key->counter != UINT64_MAX)
    172184                        goto invalid;
    173185                if (key->timestep == 0)
    174186                        key->timestep = OATH_DEF_TIMESTEP;
     187                if (key->lastused == UINT64_MAX)
     188                        key->lastused = 0;
    175189        } else {
    176190                /* unreachable */
     
    239253        }
    240254
     255        /* XXX the label should be URI-encoded */
    241256        if (key->mode == om_hotp) {
    242                 urilen = asprintf(&uri, "otpauth://"
    243                     "%s/%s?algorithm=%s&digits=%d&counter=%ju&secret=",
     257                urilen = asprintf(&uri, "otpauth://%s/%s?"
     258                    "algorithm=%s&digits=%d&counter=%ju&secret=",
    244259                    "hotp", key->label, hash, key->digits,
    245260                    (uintmax_t)key->counter);
    246261        } else if (key->mode == om_totp) {
    247                 urilen = asprintf(&uri, "otpauth://"
    248                     "%s/%s?algorithm=%s&digits=%d&period=%u&secret=",
    249                     "totp", key->label, hash, key->digits, key->timestep);
     262                urilen = asprintf(&uri, "otpauth://%s/%s?"
     263                    "algorithm=%s&digits=%d&period=%u&lastused=%ju&secret=",
     264                    "totp", key->label, hash, key->digits, key->timestep,
     265                    (uintmax_t)key->lastused);
    250266        } else {
    251267                /* unreachable */
Note: See TracChangeset for help on using the changeset viewer.