otp-parse.c revision a10ed8c47534b4c6b6bf2711ccfe577e720a47b4
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * OTP extended response parser.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * Copyright (c) 2006 Andrey Panin <pazke@donpac.ru>
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering * This software is released under the MIT license.
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#define IS_LWS(c) ((c) == ' ' || (c) == '\t')
a0166609f782da91710dea9183d1bf138538db37Tom Gundersenstatic inline const char *otp_skip_lws(const char *data)
7e8e0422aeb16f2a09a40546c61df753d10029b6Lennart Poetteringstatic inline int otp_check_tail(const char *data)
71d35b6b5563817dfbe757ab9e3b9f018b2db491Thomas Hindoe Paaboel Andersenint otp_read_hex(const char *data, const char **endptr, unsigned char *hash)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering unsigned int i = 0;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering buffer_create_data(&buf, hash, OTP_HASH_SIZE);
c73ce96b569e2f10dff64b7dc0bd271972674c2aLennart Poettering } else if (!IS_LWS(c)) {
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering#define add_word() do { \
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering buffer_append(&buf, &tmp, sizeof(tmp)); \
faa133f3aa7a18f26563dc5d6b95898cb315c37aLennart Poetteringint otp_read_words(const char *data, const char **endptr, unsigned char *hash)
d75acfb059ece4512278b8820a9103664996f1e5Lennart Poettering unsigned int parity = 0, bits[OTP_WORDS_NUMBER], tmp;
a8812dd7f161a3e459c1730ac92ff2bbc9986ff1Lennart Poettering for (; *data && (count < OTP_WORDS_NUMBER); data++) {
ad867662936a4c7ab2c7116d804c272338801231Lennart Poettering } else if (IS_LWS(c)) {
f3abbe25403444688e1a1a23b9dbcc9aeefc0507Lennart Poettering if ((str_len(word) > 0) && (count == OTP_WORDS_NUMBER - 1))
8b757a38611006a751c90933d1810cccaa47e1afDaniel Mack hash[1] = ((bits[0] & 7) << 5) | (bits[1] >> 6);
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering hash[2] = ((bits[1] & 0x3f) << 2) | (bits[2] >> 9);
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering hash[4] = ((bits[2] & 3) << 7) | (bits[3] >> 4);
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering hash[5] = ((bits[3] & 15) << 4) | (bits[4] >> 7);
3cb10d3a0b1b6a7c44f307f2abb5215104e16941Lennart Poettering hash[6] = ((bits[4] & 0x7f) << 1) | (bits[5] >> 10);
f0258e473667f44f4656dde49597b2badb9f598aLennart Poetteringint otp_read_new_params(const char *data, const char **endptr,
f0258e473667f44f4656dde49597b2badb9f598aLennart Poettering const char *p, *s;
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering unsigned int i = 0;
322345fdb9865ef2477fba8e4bdde0e1183ef505Lennart Poettering while ((*p != 0) && !IS_LWS(*p)) p++;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering algo = digest_find(t_strdup_until(s, p++));
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering state->seq = strtol(s, &end, 10); p = end;
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering if ((p == s) || !IS_LWS(*p))
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering while (i_isalnum(*p) && (i < OTP_MAX_SEED_LEN))
2001c80560e3dae69e14fd994d3978c187af48b8Lennart Poetteringint otp_parse_response(const char *data, unsigned char *hash, bool hex)
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poettering int ret = hex ? otp_read_hex(data, &end, hash) :
623a4c97b9175f95c4b1c6fc34e36c56f1e4ddbfLennart Poetteringint otp_parse_init_response(const char *data, struct otp_state *new_state,
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering unsigned char *hash, bool hex, const char **error)
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering int ret = hex ? otp_read_hex(data, &end, hash) :
d830ebbdf67d8cb32d33d8fdd47cf467fd6d3815Lennart Poettering ret = otp_read_new_params(end, &end, new_state);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering ret = hex ? otp_read_hex(end, &end, new_state->hash) :
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poettering otp_read_words(end, &end, new_state->hash);
74b2466e14a1961bf3ac0e8a60cfaceec705bd59Lennart Poetteringint otp_parse_dbentry(const char *text, struct otp_state *state)
1716f6dcf54d4c181c2e2558e3d5414f54c8d9caLennart Poettering ret = otp_read_new_params(text, &end, state);
931851e8e492a4d2715e22dcde50a5e7ccef4b49Lennart Poetteringconst char *otp_print_dbentry(const struct otp_state *state)
51323288fc628a5cac50914df915545d685b793eLennart Poettering return t_strdup_printf("%s %d %s %s", digest_name(state->algo),