diff options
| -rw-r--r-- | include/otputil.h | 14 | ||||
| -rw-r--r-- | lib/libotputil/lcore.c | 114 | ||||
| -rw-r--r-- | lib/libotputil/libotputil.h | 12 | ||||
| -rw-r--r-- | lib/libotputil/lrfc2289-otp.c | 3 |
4 files changed, 142 insertions, 1 deletions
diff --git a/include/otputil.h b/include/otputil.h index 8258013..effb553 100644 --- a/include/otputil.h +++ b/include/otputil.h | |||
| @@ -127,6 +127,12 @@ | |||
| 127 | #define OTPUTIL_OPT_TOTP_TIME 0x0204 // (uint64_t *) current UNIX time | 127 | #define OTPUTIL_OPT_TOTP_TIME 0x0204 // (uint64_t *) current UNIX time |
| 128 | #define OTPUTIL_OPT_TOTP_DIGITS 0x0205 // (int *) | 128 | #define OTPUTIL_OPT_TOTP_DIGITS 0x0205 // (int *) |
| 129 | #define OTPUTIL_OPT_TOTP_HMAC 0x0206 // (int *) | 129 | #define OTPUTIL_OPT_TOTP_HMAC 0x0206 // (int *) |
| 130 | // OTP options (RFC2289) | ||
| 131 | #define OTPUTIL_OPT_OTP_PASS 0x0400 // (char *) | ||
| 132 | #define OTPUTIL_OPT_OTP_SEED 0x0401 // (char *) | ||
| 133 | #define OTPUTIL_OPT_OTP_SEQ 0x0402 // (int *) | ||
| 134 | #define OTPUTIL_OPT_OTP_HASH 0x0403 // (int *) | ||
| 135 | #define OTPUTIL_OPT_OTP_ENCODE 0x0404 // (int *) | ||
| 130 | 136 | ||
| 131 | 137 | ||
| 132 | #define OTPUTIL_MD_NONE 0 | 138 | #define OTPUTIL_MD_NONE 0 |
| @@ -146,7 +152,9 @@ | |||
| 146 | 152 | ||
| 147 | #define OTPUTIL_METH_RFC4226 0x0001 | 153 | #define OTPUTIL_METH_RFC4226 0x0001 |
| 148 | #define OTPUTIL_METH_RFC6238 0x0002 | 154 | #define OTPUTIL_METH_RFC6238 0x0002 |
| 155 | #define OTPUTIL_METH_RFC2289 0x0004 | ||
| 149 | #define OTPUTIL_METH_HOTP OTPUTIL_METH_RFC4226 | 156 | #define OTPUTIL_METH_HOTP OTPUTIL_METH_RFC4226 |
| 157 | #define OTPUTIL_METH_OTP OTPUTIL_METH_RFC2289 | ||
| 150 | #define OTPUTIL_METH_TOTP OTPUTIL_METH_RFC6238 | 158 | #define OTPUTIL_METH_TOTP OTPUTIL_METH_RFC6238 |
| 151 | 159 | ||
| 152 | 160 | ||
| @@ -155,6 +163,12 @@ | |||
| 155 | #define OTPUTIL_DFLT_HOTP_C 1ULL | 163 | #define OTPUTIL_DFLT_HOTP_C 1ULL |
| 156 | #define OTPUTIL_DFLT_HOTP_DIGITS 6 | 164 | #define OTPUTIL_DFLT_HOTP_DIGITS 6 |
| 157 | #define OTPUTIL_DFLT_HOTP_HMAC OTPUTIL_MD_SHA1 | 165 | #define OTPUTIL_DFLT_HOTP_HMAC OTPUTIL_MD_SHA1 |
| 166 | // OTP defaults | ||
| 167 | #define OTPUTIL_DFLT_OTP_PASS NULL | ||
| 168 | #define OTPUTIL_DFLT_OTP_SEED NULL | ||
| 169 | #define OTPUTIL_DFLT_OTP_SEQ 1 | ||
| 170 | #define OTPUTIL_DFLT_OTP_HASH OTPUTIL_MD_SHA1 | ||
| 171 | #define OTPUTIL_DFLT_OTP_ENCODE OTPUTIL_ENC_SIXWORD | ||
| 158 | // TOTP defaults | 172 | // TOTP defaults |
| 159 | #define OTPUTIL_DFLT_TOTP_T0 0ULL | 173 | #define OTPUTIL_DFLT_TOTP_T0 0ULL |
| 160 | #define OTPUTIL_DFLT_TOTP_X 30ULL | 174 | #define OTPUTIL_DFLT_TOTP_X 30ULL |
diff --git a/lib/libotputil/lcore.c b/lib/libotputil/lcore.c index 8b79e26..35c4e91 100644 --- a/lib/libotputil/lcore.c +++ b/lib/libotputil/lcore.c | |||
| @@ -84,6 +84,12 @@ const otputil_t otputil_const_defaults = | |||
| 84 | .hotp_c = OTPUTIL_DFLT_HOTP_C, | 84 | .hotp_c = OTPUTIL_DFLT_HOTP_C, |
| 85 | .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, | 85 | .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, |
| 86 | .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, | 86 | .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, |
| 87 | // OTP options | ||
| 88 | .otp_pass = OTPUTIL_DFLT_OTP_PASS, | ||
| 89 | .otp_seed = OTPUTIL_DFLT_OTP_SEED, | ||
| 90 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, | ||
| 91 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, | ||
| 92 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, | ||
| 87 | // TOTP options | 93 | // TOTP options |
| 88 | .totp_k = &otputil_const_defaults_k, | 94 | .totp_k = &otputil_const_defaults_k, |
| 89 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, | 95 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, |
| @@ -105,6 +111,12 @@ otputil_t otputil_defaults = | |||
| 105 | .hotp_c = OTPUTIL_DFLT_HOTP_C, | 111 | .hotp_c = OTPUTIL_DFLT_HOTP_C, |
| 106 | .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, | 112 | .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, |
| 107 | .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, | 113 | .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, |
| 114 | // OTP options | ||
| 115 | .otp_pass = OTPUTIL_DFLT_OTP_PASS, | ||
| 116 | .otp_seed = OTPUTIL_DFLT_OTP_SEED, | ||
| 117 | .otp_seq = OTPUTIL_DFLT_OTP_SEQ, | ||
| 118 | .otp_hash = OTPUTIL_DFLT_OTP_HASH, | ||
| 119 | .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, | ||
| 108 | // TOTP options | 120 | // TOTP options |
| 109 | .totp_k = NULL, | 121 | .totp_k = NULL, |
| 110 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, | 122 | .totp_time = OTPUTIL_DFLT_TOTP_TIME, |
| @@ -219,6 +231,36 @@ otputil_get_param( | |||
| 219 | return(OTPUTIL_ENOMEM); | 231 | return(OTPUTIL_ENOMEM); |
| 220 | return(OTPUTIL_SUCCESS); | 232 | return(OTPUTIL_SUCCESS); |
| 221 | 233 | ||
| 234 | /////////////////////////// | ||
| 235 | // OTP options (RFC2289) // | ||
| 236 | /////////////////////////// | ||
| 237 | |||
| 238 | case OTPUTIL_OPT_OTP_ENCODE: | ||
| 239 | *((int *)outvalue) = (int)tud->otp_encoding; | ||
| 240 | return(OTPUTIL_SUCCESS); | ||
| 241 | |||
| 242 | case OTPUTIL_OPT_OTP_HASH: | ||
| 243 | *((int *)outvalue) = (int)tud->otp_hash; | ||
| 244 | return(OTPUTIL_SUCCESS); | ||
| 245 | |||
| 246 | case OTPUTIL_OPT_OTP_PASS: | ||
| 247 | *((char **)outvalue) = NULL; | ||
| 248 | if ((tud->otp_pass)) | ||
| 249 | if (( *((char **)outvalue) = bindle_strdup(tud->otp_pass)) == NULL) | ||
| 250 | return(OTPUTIL_ENOMEM); | ||
| 251 | return(OTPUTIL_SUCCESS); | ||
| 252 | |||
| 253 | case OTPUTIL_OPT_OTP_SEED: | ||
| 254 | *((char **)outvalue) = NULL; | ||
| 255 | if ((tud->otp_seed)) | ||
| 256 | if (( *((char **)outvalue) = bindle_strdup(tud->otp_seed)) == NULL) | ||
| 257 | return(OTPUTIL_ENOMEM); | ||
| 258 | return(OTPUTIL_SUCCESS); | ||
| 259 | |||
| 260 | case OTPUTIL_OPT_OTP_SEQ: | ||
| 261 | *((int *)outvalue) = (int)tud->otp_seq; | ||
| 262 | return(OTPUTIL_SUCCESS); | ||
| 263 | |||
| 222 | //////////////////////////// | 264 | //////////////////////////// |
| 223 | // TOTP options (RFC6238) // | 265 | // TOTP options (RFC6238) // |
| 224 | //////////////////////////// | 266 | //////////////////////////// |
| @@ -314,6 +356,33 @@ otputil_initialize( | |||
| 314 | return(rc); | 356 | return(rc); |
| 315 | }; | 357 | }; |
| 316 | 358 | ||
| 359 | // defaults for OTP options | ||
| 360 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_ENCODE, NULL)) != OTPUTIL_SUCCESS) | ||
| 361 | { | ||
| 362 | otputil_free(tud); | ||
| 363 | return(rc); | ||
| 364 | }; | ||
| 365 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_HASH, NULL)) != OTPUTIL_SUCCESS) | ||
| 366 | { | ||
| 367 | otputil_free(tud); | ||
| 368 | return(rc); | ||
| 369 | }; | ||
| 370 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_PASS, NULL)) != OTPUTIL_SUCCESS) | ||
| 371 | { | ||
| 372 | otputil_free(tud); | ||
| 373 | return(rc); | ||
| 374 | }; | ||
| 375 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_SEED, NULL)) != OTPUTIL_SUCCESS) | ||
| 376 | { | ||
| 377 | otputil_free(tud); | ||
| 378 | return(rc); | ||
| 379 | }; | ||
| 380 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_SEQ, NULL)) != OTPUTIL_SUCCESS) | ||
| 381 | { | ||
| 382 | otputil_free(tud); | ||
| 383 | return(rc); | ||
| 384 | }; | ||
| 385 | |||
| 317 | // defaults for TOTP options | 386 | // defaults for TOTP options |
| 318 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_TOTP_K, NULL)) != OTPUTIL_SUCCESS) | 387 | if ((rc = otputil_set_param(tud, OTPUTIL_OPT_TOTP_K, NULL)) != OTPUTIL_SUCCESS) |
| 319 | { | 388 | { |
| @@ -437,6 +506,51 @@ otputil_set_param( | |||
| 437 | tud->hotp_k = bv; | 506 | tud->hotp_k = bv; |
| 438 | return(OTPUTIL_SUCCESS); | 507 | return(OTPUTIL_SUCCESS); |
| 439 | 508 | ||
| 509 | /////////////////////////// | ||
| 510 | // OTP options (RFC2289) // | ||
| 511 | /////////////////////////// | ||
| 512 | |||
| 513 | case OTPUTIL_OPT_OTP_ENCODE: | ||
| 514 | switch (_SET_INPUT_NUM(int, defaults->otp_encoding)) | ||
| 515 | { case OTPUTIL_ENC_HEX: break; | ||
| 516 | case OTPUTIL_ENC_SIXWORD: break; | ||
| 517 | default: return(OTPUTIL_EOPTVAL); | ||
| 518 | }; | ||
| 519 | tud->otp_encoding = _SET_INPUT_NUM(int, defaults->otp_encoding); | ||
| 520 | return(OTPUTIL_SUCCESS); | ||
| 521 | |||
| 522 | case OTPUTIL_OPT_OTP_HASH: | ||
| 523 | if (otputil_md2str(_SET_INPUT_NUM(int, defaults->otp_hash)) == NULL) | ||
| 524 | return(OTPUTIL_EOPTVAL); | ||
| 525 | tud->otp_hash = (int8_t)_SET_INPUT_NUM(int, defaults->otp_hash); | ||
| 526 | return(OTPUTIL_SUCCESS); | ||
| 527 | |||
| 528 | case OTPUTIL_OPT_OTP_PASS: | ||
| 529 | ptr = NULL; | ||
| 530 | if ((invalue = ((invalue)) ? invalue : defaults->otp_pass) != NULL) | ||
| 531 | if ((ptr = bindle_strdup(((const char *)invalue))) == NULL) | ||
| 532 | return(OTPUTIL_ENOMEM); | ||
| 533 | if ((tud->otp_pass)) | ||
| 534 | free(tud->otp_pass); | ||
| 535 | tud->otp_pass = ptr; | ||
| 536 | return(OTPUTIL_SUCCESS); | ||
| 537 | |||
| 538 | case OTPUTIL_OPT_OTP_SEED: | ||
| 539 | ptr = NULL; | ||
| 540 | if ((invalue = ((invalue)) ? invalue : defaults->otp_seed) != NULL) | ||
| 541 | if ((ptr = bindle_strdup(((const char *)invalue))) == NULL) | ||
| 542 | return(OTPUTIL_ENOMEM); | ||
| 543 | if ((tud->otp_seed)) | ||
| 544 | free(tud->otp_seed); | ||
| 545 | tud->otp_seed = ptr; | ||
| 546 | return(OTPUTIL_SUCCESS); | ||
| 547 | |||
| 548 | case OTPUTIL_OPT_OTP_SEQ: | ||
| 549 | if (_SET_INPUT_NUM(int, defaults->otp_seq) < 0) | ||
| 550 | return(OTPUTIL_EOPTVAL); | ||
| 551 | tud->otp_seq = _SET_INPUT_NUM(int, defaults->otp_seq); | ||
| 552 | return(OTPUTIL_SUCCESS); | ||
| 553 | |||
| 440 | //////////////////////////// | 554 | //////////////////////////// |
| 441 | // TOTP options (RFC6238) // | 555 | // TOTP options (RFC6238) // |
| 442 | //////////////////////////// | 556 | //////////////////////////// |
diff --git a/lib/libotputil/libotputil.h b/lib/libotputil/libotputil.h index 78a7d32..49c2465 100644 --- a/lib/libotputil/libotputil.h +++ b/lib/libotputil/libotputil.h | |||
| @@ -73,11 +73,21 @@ | |||
| 73 | // k:c:0:hmac:desc | 73 | // k:c:0:hmac:desc |
| 74 | struct _otputil_secret | 74 | struct _otputil_secret |
| 75 | { | 75 | { |
| 76 | int32_t util_method; | 76 | int util_method; |
| 77 | int otp_seq; | ||
| 78 | int skey_seq; | ||
| 79 | int padint; | ||
| 77 | int8_t hotp_digits; | 80 | int8_t hotp_digits; |
| 78 | int8_t hotp_hmac; | 81 | int8_t hotp_hmac; |
| 79 | int8_t totp_digits; | 82 | int8_t totp_digits; |
| 80 | int8_t totp_hmac; | 83 | int8_t totp_hmac; |
| 84 | int8_t otp_hash; | ||
| 85 | int8_t otp_encoding; | ||
| 86 | int8_t skey_hash; | ||
| 87 | int8_t skey_encoding; | ||
| 88 | char * skey_pass; | ||
| 89 | char * otp_pass; | ||
| 90 | char * otp_seed; | ||
| 81 | char * util_desc; // description of secret | 91 | char * util_desc; // description of secret |
| 82 | otputil_bv_t * totp_k; | 92 | otputil_bv_t * totp_k; |
| 83 | otputil_bv_t * hotp_k; | 93 | otputil_bv_t * hotp_k; |
diff --git a/lib/libotputil/lrfc2289-otp.c b/lib/libotputil/lrfc2289-otp.c index 1ba7828..6a47463 100644 --- a/lib/libotputil/lrfc2289-otp.c +++ b/lib/libotputil/lrfc2289-otp.c | |||
| @@ -86,6 +86,9 @@ otputil_otp_code( | |||
| 86 | 86 | ||
| 87 | assert(otp_pass != NULL); | 87 | assert(otp_pass != NULL); |
| 88 | 88 | ||
| 89 | otp_seq = (otp_seq >= 0) ? otp_seq : otputil_defaults.otp_seq; | ||
| 90 | otp_hash = ((otp_hash)) ? otp_hash : otputil_defaults.otp_hash; | ||
| 91 | |||
| 89 | // check otp_seed | 92 | // check otp_seed |
| 90 | secret[0] = '\0'; | 93 | secret[0] = '\0'; |
| 91 | if ((otp_seed)) | 94 | if ((otp_seed)) |
