From 99a64f4d6d075e33be4b951d456996d5d6458380 Mon Sep 17 00:00:00 2001 From: "David M. Syzdek" Date: Thu, 12 Jan 2023 15:16:58 -0900 Subject: libotputil: adding defaults to otputil_otp_code() --- include/otputil.h | 14 ++++++ lib/libotputil/lcore.c | 114 ++++++++++++++++++++++++++++++++++++++++++ lib/libotputil/libotputil.h | 12 ++++- lib/libotputil/lrfc2289-otp.c | 3 ++ 4 files changed, 142 insertions(+), 1 deletion(-) 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 @@ #define OTPUTIL_OPT_TOTP_TIME 0x0204 // (uint64_t *) current UNIX time #define OTPUTIL_OPT_TOTP_DIGITS 0x0205 // (int *) #define OTPUTIL_OPT_TOTP_HMAC 0x0206 // (int *) +// OTP options (RFC2289) +#define OTPUTIL_OPT_OTP_PASS 0x0400 // (char *) +#define OTPUTIL_OPT_OTP_SEED 0x0401 // (char *) +#define OTPUTIL_OPT_OTP_SEQ 0x0402 // (int *) +#define OTPUTIL_OPT_OTP_HASH 0x0403 // (int *) +#define OTPUTIL_OPT_OTP_ENCODE 0x0404 // (int *) #define OTPUTIL_MD_NONE 0 @@ -146,7 +152,9 @@ #define OTPUTIL_METH_RFC4226 0x0001 #define OTPUTIL_METH_RFC6238 0x0002 +#define OTPUTIL_METH_RFC2289 0x0004 #define OTPUTIL_METH_HOTP OTPUTIL_METH_RFC4226 +#define OTPUTIL_METH_OTP OTPUTIL_METH_RFC2289 #define OTPUTIL_METH_TOTP OTPUTIL_METH_RFC6238 @@ -155,6 +163,12 @@ #define OTPUTIL_DFLT_HOTP_C 1ULL #define OTPUTIL_DFLT_HOTP_DIGITS 6 #define OTPUTIL_DFLT_HOTP_HMAC OTPUTIL_MD_SHA1 +// OTP defaults +#define OTPUTIL_DFLT_OTP_PASS NULL +#define OTPUTIL_DFLT_OTP_SEED NULL +#define OTPUTIL_DFLT_OTP_SEQ 1 +#define OTPUTIL_DFLT_OTP_HASH OTPUTIL_MD_SHA1 +#define OTPUTIL_DFLT_OTP_ENCODE OTPUTIL_ENC_SIXWORD // TOTP defaults #define OTPUTIL_DFLT_TOTP_T0 0ULL #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 = .hotp_c = OTPUTIL_DFLT_HOTP_C, .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, + // OTP options + .otp_pass = OTPUTIL_DFLT_OTP_PASS, + .otp_seed = OTPUTIL_DFLT_OTP_SEED, + .otp_seq = OTPUTIL_DFLT_OTP_SEQ, + .otp_hash = OTPUTIL_DFLT_OTP_HASH, + .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, // TOTP options .totp_k = &otputil_const_defaults_k, .totp_time = OTPUTIL_DFLT_TOTP_TIME, @@ -105,6 +111,12 @@ otputil_t otputil_defaults = .hotp_c = OTPUTIL_DFLT_HOTP_C, .hotp_digits = OTPUTIL_DFLT_HOTP_DIGITS, .hotp_hmac = OTPUTIL_DFLT_HOTP_HMAC, + // OTP options + .otp_pass = OTPUTIL_DFLT_OTP_PASS, + .otp_seed = OTPUTIL_DFLT_OTP_SEED, + .otp_seq = OTPUTIL_DFLT_OTP_SEQ, + .otp_hash = OTPUTIL_DFLT_OTP_HASH, + .otp_encoding = OTPUTIL_DFLT_OTP_ENCODE, // TOTP options .totp_k = NULL, .totp_time = OTPUTIL_DFLT_TOTP_TIME, @@ -219,6 +231,36 @@ otputil_get_param( return(OTPUTIL_ENOMEM); return(OTPUTIL_SUCCESS); + /////////////////////////// + // OTP options (RFC2289) // + /////////////////////////// + + case OTPUTIL_OPT_OTP_ENCODE: + *((int *)outvalue) = (int)tud->otp_encoding; + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_HASH: + *((int *)outvalue) = (int)tud->otp_hash; + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_PASS: + *((char **)outvalue) = NULL; + if ((tud->otp_pass)) + if (( *((char **)outvalue) = bindle_strdup(tud->otp_pass)) == NULL) + return(OTPUTIL_ENOMEM); + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_SEED: + *((char **)outvalue) = NULL; + if ((tud->otp_seed)) + if (( *((char **)outvalue) = bindle_strdup(tud->otp_seed)) == NULL) + return(OTPUTIL_ENOMEM); + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_SEQ: + *((int *)outvalue) = (int)tud->otp_seq; + return(OTPUTIL_SUCCESS); + //////////////////////////// // TOTP options (RFC6238) // //////////////////////////// @@ -314,6 +356,33 @@ otputil_initialize( return(rc); }; + // defaults for OTP options + if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_ENCODE, NULL)) != OTPUTIL_SUCCESS) + { + otputil_free(tud); + return(rc); + }; + if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_HASH, NULL)) != OTPUTIL_SUCCESS) + { + otputil_free(tud); + return(rc); + }; + if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_PASS, NULL)) != OTPUTIL_SUCCESS) + { + otputil_free(tud); + return(rc); + }; + if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_SEED, NULL)) != OTPUTIL_SUCCESS) + { + otputil_free(tud); + return(rc); + }; + if ((rc = otputil_set_param(tud, OTPUTIL_OPT_OTP_SEQ, NULL)) != OTPUTIL_SUCCESS) + { + otputil_free(tud); + return(rc); + }; + // defaults for TOTP options if ((rc = otputil_set_param(tud, OTPUTIL_OPT_TOTP_K, NULL)) != OTPUTIL_SUCCESS) { @@ -437,6 +506,51 @@ otputil_set_param( tud->hotp_k = bv; return(OTPUTIL_SUCCESS); + /////////////////////////// + // OTP options (RFC2289) // + /////////////////////////// + + case OTPUTIL_OPT_OTP_ENCODE: + switch (_SET_INPUT_NUM(int, defaults->otp_encoding)) + { case OTPUTIL_ENC_HEX: break; + case OTPUTIL_ENC_SIXWORD: break; + default: return(OTPUTIL_EOPTVAL); + }; + tud->otp_encoding = _SET_INPUT_NUM(int, defaults->otp_encoding); + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_HASH: + if (otputil_md2str(_SET_INPUT_NUM(int, defaults->otp_hash)) == NULL) + return(OTPUTIL_EOPTVAL); + tud->otp_hash = (int8_t)_SET_INPUT_NUM(int, defaults->otp_hash); + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_PASS: + ptr = NULL; + if ((invalue = ((invalue)) ? invalue : defaults->otp_pass) != NULL) + if ((ptr = bindle_strdup(((const char *)invalue))) == NULL) + return(OTPUTIL_ENOMEM); + if ((tud->otp_pass)) + free(tud->otp_pass); + tud->otp_pass = ptr; + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_SEED: + ptr = NULL; + if ((invalue = ((invalue)) ? invalue : defaults->otp_seed) != NULL) + if ((ptr = bindle_strdup(((const char *)invalue))) == NULL) + return(OTPUTIL_ENOMEM); + if ((tud->otp_seed)) + free(tud->otp_seed); + tud->otp_seed = ptr; + return(OTPUTIL_SUCCESS); + + case OTPUTIL_OPT_OTP_SEQ: + if (_SET_INPUT_NUM(int, defaults->otp_seq) < 0) + return(OTPUTIL_EOPTVAL); + tud->otp_seq = _SET_INPUT_NUM(int, defaults->otp_seq); + return(OTPUTIL_SUCCESS); + //////////////////////////// // TOTP options (RFC6238) // //////////////////////////// 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 @@ // k:c:0:hmac:desc struct _otputil_secret { - int32_t util_method; + int util_method; + int otp_seq; + int skey_seq; + int padint; int8_t hotp_digits; int8_t hotp_hmac; int8_t totp_digits; int8_t totp_hmac; + int8_t otp_hash; + int8_t otp_encoding; + int8_t skey_hash; + int8_t skey_encoding; + char * skey_pass; + char * otp_pass; + char * otp_seed; char * util_desc; // description of secret otputil_bv_t * totp_k; 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( assert(otp_pass != NULL); + otp_seq = (otp_seq >= 0) ? otp_seq : otputil_defaults.otp_seq; + otp_hash = ((otp_hash)) ? otp_hash : otputil_defaults.otp_hash; + // check otp_seed secret[0] = '\0'; if ((otp_seed)) -- cgit v1.2.3