aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2023-01-12 15:16:58 -0900
committerDavid M. Syzdek <david@syzdek.net>2023-01-12 15:28:31 -0900
commit99a64f4d6d075e33be4b951d456996d5d6458380 (patch)
treedb925aad9ea21434f81dd8503ac6cce6f7c61777
parent6a6d1f9911a5b48cb2ba4863c04f7239fa1d1f10 (diff)
downloadotputils-99a64f4d6d075e33be4b951d456996d5d6458380.tar.gz
otputils-99a64f4d6d075e33be4b951d456996d5d6458380.tar.bz2
otputils-99a64f4d6d075e33be4b951d456996d5d6458380.tar.xz
otputils-99a64f4d6d075e33be4b951d456996d5d6458380.zip
libotputil: adding defaults to otputil_otp_code()
-rw-r--r--include/otputil.h14
-rw-r--r--lib/libotputil/lcore.c114
-rw-r--r--lib/libotputil/libotputil.h12
-rw-r--r--lib/libotputil/lrfc2289-otp.c3
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
74struct _otputil_secret 74struct _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))