Changeset 628 in openpam


Ignore:
Timestamp:
Feb 28, 2013, 12:12:53 PM (8 years ago)
Author:
Dag-Erling Smørgrav
Message:

Implement URI encoding.

File:
1 edited

Legend:

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

    r627 r628  
    4747#include <security/openpam.h>
    4848
     49#include "openpam_asprintf.h"
    4950#include "openpam_strlcmp.h"
    5051
     
    255256        return (key);
    256257}
     258
     259char *
     260oath_key_to_uri(const struct oath_key *key)
     261{
     262        const char *hash;
     263        char *tmp, *uri;
     264        size_t kslen, urilen;
     265
     266        switch (key->hash) {
     267        case oh_sha1:
     268                hash = "SHA1";
     269                break;
     270        case oh_sha256:
     271                hash = "SHA256";
     272                break;
     273        case oh_sha512:
     274                hash = "SHA512";
     275                break;
     276        case oh_md5:
     277                hash = "MD5";
     278                break;
     279        default:
     280                return (NULL);
     281        }
     282
     283        if (key->mode == om_hotp) {
     284                urilen = asprintf(&uri, "otpauth://"
     285                    "%s/%s?algorithm=%s&digits=%d&counter=%ju&secret=",
     286                    "hotp", key->label, hash, key->digits,
     287                    (uintmax_t)key->counter);
     288        } else if (key->mode == om_totp) {
     289                urilen = asprintf(&uri, "otpauth://"
     290                    "%s/%s?algorithm=%s&digits=%d&period=%u&secret=",
     291                    "totp", key->label, hash, key->digits, key->timestep);
     292        } else {
     293                /* unreachable */
     294                return (NULL);
     295        }
     296
     297        /* compute length of base32-encoded key and append it */
     298        kslen = base32_enclen(key->keylen);
     299        if ((tmp = realloc(uri, urilen + kslen + 1)) == NULL) {
     300                free(uri);
     301                return (NULL);
     302        }
     303        uri = tmp;
     304        if (base32_enc(key->key, key->keylen, uri + urilen, &kslen) != 0) {
     305                free(uri);
     306                return (NULL);
     307        }
     308
     309        return (uri);
     310}
Note: See TracChangeset for help on using the changeset viewer.