diff options
| author | David M. Syzdek <david@syzdek.net> | 2023-01-12 15:30:06 -0900 |
|---|---|---|
| committer | David M. Syzdek <david@syzdek.net> | 2023-01-12 15:30:06 -0900 |
| commit | 9c999e0d3108f6efee34297e260dcee5a6f1f0e0 (patch) | |
| tree | b5f9738d190d7d5541950c8753b1f8744cbb26dc /lib | |
| parent | 99a64f4d6d075e33be4b951d456996d5d6458380 (diff) | |
| download | otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.gz otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.bz2 otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.xz otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.zip | |
libotputil: refactoring otputil_skey_code()
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/libotputil/lcore.c | 90 | ||||
| -rw-r--r-- | lib/libotputil/lrfc1760-skey.c | 42 |
2 files changed, 95 insertions, 37 deletions
diff --git a/lib/libotputil/lcore.c b/lib/libotputil/lcore.c index 35c4e91..5ccc143 100644 --- a/lib/libotputil/lcore.c +++ b/lib/libotputil/lcore.c | |||
| @@ -90,6 +90,11 @@ const otputil_t otputil_const_defaults = | |||
| 90 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, | 90 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, |
| 91 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, | 91 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, |
| 92 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, | 92 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, |
| 93 | // S/KEY options | ||
| 94 | .skey_pass = OTPUTIL_DFLT_SKEY_PASS, | ||
| 95 | .skey_seq = OTPUTIL_DFLT_SKEY_SEQ, | ||
| 96 | .skey_hash = OTPUTIL_DFLT_SKEY_HASH, | ||
| 97 | .skey_encoding = OTPUTIL_DFLT_SKEY_ENCODE, | ||
| 93 | // TOTP options | 98 | // TOTP options |
| 94 | .totp_k = &otputil_const_defaults_k, | 99 | .totp_k = &otputil_const_defaults_k, |
| 95 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, | 100 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, |
| @@ -117,6 +122,11 @@ otputil_t otputil_defaults = | |||
| 117 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, | 122 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, |
| 118 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, | 123 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, |
| 119 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, | 124 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, |
| 125 | // S/KEY options | ||
| 126 | .skey_pass = OTPUTIL_DFLT_SKEY_PASS, | ||
| 127 | .skey_seq = OTPUTIL_DFLT_SKEY_SEQ, | ||
| 128 | .skey_hash = OTPUTIL_DFLT_SKEY_HASH, | ||
| 129 | .skey_encoding = OTPUTIL_DFLT_SKEY_ENCODE, | ||
| 120 | // TOTP options | 130 | // TOTP options |
| 121 | .totp_k = NULL, | 131 | .totp_k = NULL, |
| 122 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, | 132 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, |
| @@ -261,6 +271,29 @@ otputil_get_param( | |||
| 261 | *((int *)outvalue) = (int)tud->otp_seq; | 271 | *((int *)outvalue) = (int)tud->otp_seq; |
| 262 | return(OTPUTIL_SUCCESS); | 272 | return(OTPUTIL_SUCCESS); |
| 263 | 273 | ||
| 274 | ///////////////////////////// | ||
| 275 | // S/KEY options (RFC1760) // | ||
| 276 | ///////////////////////////// | ||
| 277 | |||
| 278 | case OTPUTIL_OPT_SKEY_ENCODE: | ||
| 279 | *((int *)outvalue) = (int)tud->skey_encoding; | ||
| 280 | return(OTPUTIL_SUCCESS); | ||
| 281 | |||
| 282 | case OTPUTIL_OPT_SKEY_HASH: | ||
| 283 | *((int *)outvalue) = (int)tud->skey_hash; | ||
| 284 | return(OTPUTIL_SUCCESS); | ||
| 285 | |||
| 286 | case OTPUTIL_OPT_SKEY_PASS: | ||
| 287 | *((char **)outvalue) = NULL; | ||
| 288 | if ((tud->skey_pass)) | ||
| 289 | if (( *((char **)outvalue) = bindle_strdup(tud->skey_pass)) == NULL) | ||
| 290 | return(OTPUTIL_ENOMEM); | ||
| 291 | return(OTPUTIL_SUCCESS); | ||
| 292 | |||
| 293 | case OTPUTIL_OPT_SKEY_SEQ: | ||
| 294 | *((int *)outvalue) = (int)tud->skey_seq; | ||
| 295 | return(OTPUTIL_SUCCESS); | ||
| 296 | |||
| 264 | //////////////////////////// | 297 | //////////////////////////// |
| 265 | // TOTP options (RFC6238) // | 298 | // TOTP options (RFC6238) // |
| 266 | //////////////////////////// | 299 | //////////////////////////// |
| @@ -383,6 +416,28 @@ otputil_initialize( | |||
| 383 | return(rc); | 416 | return(rc); |
| 384 | }; | 417 | }; |
| 385 | 418 | ||
| 419 | // defaults for S/KEY options | ||
| 420 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_SKEY_ENCODE, NULL)) != OTPUTIL_SUCCESS) | ||
| 421 | { | ||
| 422 | otputil_free(tud); | ||
| 423 | return(rc); | ||
| 424 | }; | ||
| 425 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_SKEY_HASH, NULL)) != OTPUTIL_SUCCESS) | ||
| 426 | { | ||
| 427 | otputil_free(tud); | ||
| 428 | return(rc); | ||
| 429 | }; | ||
| 430 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_SKEY_PASS, NULL)) != OTPUTIL_SUCCESS) | ||
| 431 | { | ||
| 432 | otputil_free(tud); | ||
| 433 | return(rc); | ||
| 434 | }; | ||
| 435 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_SKEY_SEQ, NULL)) != OTPUTIL_SUCCESS) | ||
| 436 | { | ||
| 437 | otputil_free(tud); | ||
| 438 | return(rc); | ||
| 439 | }; | ||
| 440 | |||
| 386 | // defaults for TOTP options | 441 | // defaults for TOTP options |
| 387 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_TOTP_K, NULL)) != OTPUTIL_SUCCESS) | 442 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_TOTP_K, NULL)) != OTPUTIL_SUCCESS) |
| 388 | { | 443 | { |
| @@ -551,6 +606,41 @@ otputil_set_param( | |||
| 551 | tud->otp_seq = _SET_INPUT_NUM(int, defaults->otp_seq); | 606 | tud->otp_seq = _SET_INPUT_NUM(int, defaults->otp_seq); |
| 552 | return(OTPUTIL_SUCCESS); | 607 | return(OTPUTIL_SUCCESS); |
| 553 | 608 | ||
| 609 | ///////////////////////////// | ||
| 610 | // S/KEY options (RFC1760) // | ||
| 611 | ///////////////////////////// | ||
| 612 | |||
| 613 | case OTPUTIL_OPT_SKEY_ENCODE: | ||
| 614 | switch (_SET_INPUT_NUM(int, defaults->skey_encoding)) | ||
| 615 | { case OTPUTIL_ENC_HEX: break; | ||
| 616 | case OTPUTIL_ENC_SIXWORD: break; | ||
| 617 | default: return(OTPUTIL_EOPTVAL); | ||
| 618 | }; | ||
| 619 | tud->skey_encoding = _SET_INPUT_NUM(int, defaults->skey_encoding); | ||
| 620 | return(OTPUTIL_SUCCESS); | ||
| 621 | |||
| 622 | case OTPUTIL_OPT_SKEY_HASH: | ||
| 623 | if (otputil_md2str(_SET_INPUT_NUM(int, defaults->skey_hash)) == NULL) | ||
| 624 | return(OTPUTIL_EOPTVAL); | ||
| 625 | tud->skey_hash = (int8_t)_SET_INPUT_NUM(int, defaults->skey_hash); | ||
| 626 | return(OTPUTIL_SUCCESS); | ||
| 627 | |||
| 628 | case OTPUTIL_OPT_SKEY_PASS: | ||
| 629 | ptr = NULL; | ||
| 630 | if ((invalue = ((invalue)) ? invalue : defaults->skey_pass) != NULL) | ||
| 631 | if ((ptr = bindle_strdup(((const char *)invalue))) == NULL) | ||
| 632 | return(OTPUTIL_ENOMEM); | ||
| 633 | if ((tud->skey_pass)) | ||
| 634 | free(tud->skey_pass); | ||
| 635 | tud->skey_pass = ptr; | ||
| 636 | return(OTPUTIL_SUCCESS); | ||
| 637 | |||
| 638 | case OTPUTIL_OPT_SKEY_SEQ: | ||
| 639 | if (_SET_INPUT_NUM(int, defaults->skey_seq) < 0) | ||
| 640 | return(OTPUTIL_EOPTVAL); | ||
| 641 | tud->skey_seq = _SET_INPUT_NUM(int, defaults->skey_seq); | ||
| 642 | return(OTPUTIL_SUCCESS); | ||
| 643 | |||
| 554 | //////////////////////////// | 644 | //////////////////////////// |
| 555 | // TOTP options (RFC6238) // | 645 | // TOTP options (RFC6238) // |
| 556 | //////////////////////////// | 646 | //////////////////////////// |
diff --git a/lib/libotputil/lrfc1760-skey.c b/lib/libotputil/lrfc1760-skey.c index 1853455..adb61a1 100644 --- a/lib/libotputil/lrfc1760-skey.c +++ b/lib/libotputil/lrfc1760-skey.c | |||
| @@ -147,45 +147,13 @@ int | |||
| 147 | otputil_skey_code( | 147 | otputil_skey_code( |
| 148 | const char * skey_pass, | 148 | const char * skey_pass, |
| 149 | int skey_seq, | 149 | int skey_seq, |
| 150 | int skey_hash, | ||
| 150 | uint64_t * skey_resultp ) | 151 | uint64_t * skey_resultp ) |
| 151 | { | 152 | { |
| 152 | unsigned char secret[OTPUTIL_SKEY_PASS_MAX_LEN+1]; | ||
| 153 | const EVP_MD * evp_md; | ||
| 154 | unsigned char md[EVP_MAX_MD_SIZE]; | ||
| 155 | unsigned md_len; | ||
| 156 | unsigned secret_len; | ||
| 157 | unsigned u; | ||
| 158 | int pos; | ||
| 159 | |||
| 160 | assert(skey_pass != NULL); | 153 | assert(skey_pass != NULL); |
| 161 | 154 | skey_seq = (skey_seq >= 0) ? skey_seq : otputil_defaults.skey_seq; | |
| 162 | // generate secret | 155 | skey_hash = ((skey_hash)) ? skey_hash : otputil_defaults.skey_hash; |
| 163 | secret_len = (int)strlen(skey_pass); | 156 | return(otputil_otp_code(skey_pass, NULL, skey_seq, skey_hash, skey_resultp)); |
| 164 | if (secret_len > OTPUTIL_SKEY_PASS_MAX_LEN) | ||
| 165 | return(-1); | ||
| 166 | bindle_strlcpy((char *)secret, skey_pass, sizeof(secret)); | ||
| 167 | |||
| 168 | // check otp_hash | ||
| 169 | evp_md = EVP_md4(); | ||
| 170 | |||
| 171 | // generate hashes | ||
| 172 | for(pos = 0; (pos <= skey_seq); pos++) | ||
| 173 | { | ||
| 174 | md_len = sizeof(md); | ||
| 175 | if (!(EVP_Digest(secret, secret_len, md, &md_len, evp_md, NULL))) | ||
| 176 | return(-1); | ||
| 177 | for(u = 0; (u < 8); u++) | ||
| 178 | md[u] ^= md[u+8]; | ||
| 179 | memcpy(secret, md, 8); | ||
| 180 | secret_len = 8; | ||
| 181 | }; | ||
| 182 | |||
| 183 | *skey_resultp = ((uint64_t)secret[0] << 56) | ((uint64_t)secret[1] << 48) | ||
| 184 | | ((uint64_t)secret[2] << 40) | ((uint64_t)secret[3] << 32) | ||
| 185 | | ((uint64_t)secret[4] << 24) | ((uint64_t)secret[5] << 16) | ||
| 186 | | ((uint64_t)secret[6] << 8) | ((uint64_t)secret[7] << 0); | ||
| 187 | |||
| 188 | return(0); | ||
| 189 | } | 157 | } |
| 190 | 158 | ||
| 191 | 159 | ||
| @@ -206,7 +174,7 @@ otputil_skey_str( | |||
| 206 | res.bv_val = bv_val; | 174 | res.bv_val = bv_val; |
| 207 | res.bv_len = sizeof(bv_val); | 175 | res.bv_len = sizeof(bv_val); |
| 208 | 176 | ||
| 209 | if (otputil_skey_code(skey_pass, skey_seq, &val) == -1) | 177 | if (otputil_skey_code(skey_pass, skey_seq, 0, &val) == -1) |
| 210 | return(NULL); | 178 | return(NULL); |
| 211 | 179 | ||
| 212 | bv_val[0] = (val >> 56) & 0xff; | 180 | bv_val[0] = (val >> 56) & 0xff; |
