aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDavid M. Syzdek <david@syzdek.net>2023-01-12 15:30:06 -0900
committerDavid M. Syzdek <david@syzdek.net>2023-01-12 15:30:06 -0900
commit9c999e0d3108f6efee34297e260dcee5a6f1f0e0 (patch)
treeb5f9738d190d7d5541950c8753b1f8744cbb26dc
parent99a64f4d6d075e33be4b951d456996d5d6458380 (diff)
downloadotputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.gz
otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.bz2
otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.tar.xz
otputils-9c999e0d3108f6efee34297e260dcee5a6f1f0e0.zip
libotputil: refactoring otputil_skey_code()
-rw-r--r--include/otputil.h13
-rw-r--r--lib/libotputil/lcore.c90
-rw-r--r--lib/libotputil/lrfc1760-skey.c42
3 files changed, 108 insertions, 37 deletions
diff --git a/include/otputil.h b/include/otputil.h
index effb553..9e2f261 100644
--- a/include/otputil.h
+++ b/include/otputil.h
@@ -127,6 +127,11 @@
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// S/KEY options (RFC1760)
131#define OTPUTIL_OPT_SKEY_PASS 0x0300 // (char *)
132#define OTPUTIL_OPT_SKEY_SEQ 0x0301 // (int *)
133#define OTPUTIL_OPT_SKEY_HASH 0x0302 // (int *)
134#define OTPUTIL_OPT_SKEY_ENCODE 0x0303 // (int *)
130// OTP options (RFC2289) 135// OTP options (RFC2289)
131#define OTPUTIL_OPT_OTP_PASS 0x0400 // (char *) 136#define OTPUTIL_OPT_OTP_PASS 0x0400 // (char *)
132#define OTPUTIL_OPT_OTP_SEED 0x0401 // (char *) 137#define OTPUTIL_OPT_OTP_SEED 0x0401 // (char *)
@@ -152,9 +157,11 @@
152 157
153#define OTPUTIL_METH_RFC4226 0x0001 158#define OTPUTIL_METH_RFC4226 0x0001
154#define OTPUTIL_METH_RFC6238 0x0002 159#define OTPUTIL_METH_RFC6238 0x0002
160#define OTPUTIL_METH_RFC1760 0x0003
155#define OTPUTIL_METH_RFC2289 0x0004 161#define OTPUTIL_METH_RFC2289 0x0004
156#define OTPUTIL_METH_HOTP OTPUTIL_METH_RFC4226 162#define OTPUTIL_METH_HOTP OTPUTIL_METH_RFC4226
157#define OTPUTIL_METH_OTP OTPUTIL_METH_RFC2289 163#define OTPUTIL_METH_OTP OTPUTIL_METH_RFC2289
164#define OTPUTIL_METH_SKEY OTPUTIL_METH_RFC1760
158#define OTPUTIL_METH_TOTP OTPUTIL_METH_RFC6238 165#define OTPUTIL_METH_TOTP OTPUTIL_METH_RFC6238
159 166
160 167
@@ -169,6 +176,11 @@
169#define OTPUTIL_DFLT_OTP_SEQ 1 176#define OTPUTIL_DFLT_OTP_SEQ 1
170#define OTPUTIL_DFLT_OTP_HASH OTPUTIL_MD_SHA1 177#define OTPUTIL_DFLT_OTP_HASH OTPUTIL_MD_SHA1
171#define OTPUTIL_DFLT_OTP_ENCODE OTPUTIL_ENC_SIXWORD 178#define OTPUTIL_DFLT_OTP_ENCODE OTPUTIL_ENC_SIXWORD
179// S/KEY defaults
180#define OTPUTIL_DFLT_SKEY_PASS NULL
181#define OTPUTIL_DFLT_SKEY_SEQ 1
182#define OTPUTIL_DFLT_SKEY_HASH OTPUTIL_MD_MD4
183#define OTPUTIL_DFLT_SKEY_ENCODE OTPUTIL_ENC_SIXWORD
172// TOTP defaults 184// TOTP defaults
173#define OTPUTIL_DFLT_TOTP_T0 0ULL 185#define OTPUTIL_DFLT_TOTP_T0 0ULL
174#define OTPUTIL_DFLT_TOTP_X 30ULL 186#define OTPUTIL_DFLT_TOTP_X 30ULL
@@ -417,6 +429,7 @@ _OTPUTIL_F int
417otputil_skey_code( 429otputil_skey_code(
418 const char * skey_pass, 430 const char * skey_pass,
419 int skey_seq, 431 int skey_seq,
432 int skey_hash,
420 uint64_t * skey_resultp ); 433 uint64_t * skey_resultp );
421 434
422 435
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
147otputil_skey_code( 147otputil_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;