[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libmicrohttpd] 07/12: digestauth: increased timestamp to 48 bits
From: |
gnunet |
Subject: |
[libmicrohttpd] 07/12: digestauth: increased timestamp to 48 bits |
Date: |
Wed, 04 May 2022 14:59:41 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 5658583a8811537a5a42d5c7a93d6b4d9c685327
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Mon May 2 12:29:38 2022 +0300
digestauth: increased timestamp to 48 bits
---
src/microhttpd/digestauth.c | 45 ++++++++++++++++++++++++++++++---------------
1 file changed, 30 insertions(+), 15 deletions(-)
diff --git a/src/microhttpd/digestauth.c b/src/microhttpd/digestauth.c
index f009a6f2..250276d1 100644
--- a/src/microhttpd/digestauth.c
+++ b/src/microhttpd/digestauth.c
@@ -42,9 +42,17 @@
#endif /* MHD_W32_MUTEX_ */
/**
- * 32 bit value is 4 bytes
+ * 48 bit value in bytes
*/
-#define TIMESTAMP_BIN_SIZE 4
+#define TIMESTAMP_BIN_SIZE (48 / 8)
+
+
+/**
+ * Trim value to the TIMESTAMP_BIN_SIZE size
+ */
+#define TRIM_TO_TIMESTAMP(value) \
+ ((value) & ((UINT64_C(1) << (TIMESTAMP_BIN_SIZE * 8)) - 1))
+
/**
* Standard server nonce length, not including terminating null,
@@ -718,7 +726,7 @@ MHD_digest_auth_get_username (struct MHD_Connection
*connection)
* must provide NONCE_STD_LEN(da->digest_size)+1 bytes
*/
static void
-calculate_nonce (uint32_t nonce_time,
+calculate_nonce (uint64_t nonce_time,
const char *method,
const char *rnd,
size_t rnd_size,
@@ -727,7 +735,7 @@ calculate_nonce (uint32_t nonce_time,
struct DigestAlgorithm *da,
char *nonce)
{
- unsigned char timestamp[TIMESTAMP_BIN_SIZE];
+ uint8_t timestamp[TIMESTAMP_BIN_SIZE];
const unsigned int digest_size = da->digest_size;
char tmpnonce[VLA_ARRAY_LEN_DIGEST (digest_size)];
@@ -735,10 +743,17 @@ calculate_nonce (uint32_t nonce_time,
mhd_assert (0 != digest_size);
VLA_CHECK_LEN_DIGEST (digest_size);
da->init (da->ctx);
- timestamp[0] = (unsigned char) ((nonce_time & 0xff000000) >> 0x18);
- timestamp[1] = (unsigned char) ((nonce_time & 0x00ff0000) >> 0x10);
- timestamp[2] = (unsigned char) ((nonce_time & 0x0000ff00) >> 0x08);
- timestamp[3] = (unsigned char) ((nonce_time & 0x000000ff));
+ /* If the nonce_time is milliseconds, then the same 48 bit value will repeat
+ * every 8 925 years, which is more than enough to mitigate a replay attack
*/
+#if TIMESTAMP_BIN_SIZE != 6
+#error The code needs to be updated here
+#endif
+ timestamp[0] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 0)));
+ timestamp[1] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 1)));
+ timestamp[2] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 2)));
+ timestamp[3] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 3)));
+ timestamp[4] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 4)));
+ timestamp[5] = (uint8_t) (nonce_time >> (8 * (TIMESTAMP_BIN_SIZE - 1 - 5)));
da->update (da->ctx,
timestamp,
sizeof (timestamp));
@@ -923,8 +938,8 @@ digest_auth_check_all (struct MHD_Connection *connection,
char response[MAX_AUTH_RESPONSE_LENGTH];
const char *hentity = NULL; /* "auth-int" is not supported */
char noncehashexp[NONCE_STD_LEN (VLA_ARRAY_LEN_DIGEST (digest_size)) + 1];
- uint32_t nonce_time;
- uint32_t t;
+ uint64_t nonce_time;
+ uint64_t t;
size_t left; /* number of characters left in 'header' for 'uri' */
uint64_t nci;
char *qmark;
@@ -992,7 +1007,7 @@ digest_auth_check_all (struct MHD_Connection *connection,
return MHD_NO;
}
if (TIMESTAMP_BIN_SIZE * 2 !=
- MHD_strx_to_uint32_n_ (nonce + len - TIMESTAMP_BIN_SIZE * 2,
+ MHD_strx_to_uint64_n_ (nonce + len - TIMESTAMP_BIN_SIZE * 2,
TIMESTAMP_BIN_SIZE * 2,
&nonce_time))
{
@@ -1002,14 +1017,14 @@ digest_auth_check_all (struct MHD_Connection
*connection,
#endif
return MHD_NO;
}
- t = (uint32_t) MHD_monotonic_sec_counter ();
+
+ t = (uint64_t) MHD_monotonic_sec_counter ();
/*
* First level vetting for the nonce validity: if the timestamp
* attached to the nonce exceeds `nonce_timeout', then the nonce is
* invalid.
*/
- if ( (t > nonce_time + nonce_timeout) ||
- (nonce_time + nonce_timeout < nonce_time) )
+ if (TRIM_TO_TIMESTAMP (t - nonce_time) > nonce_timeout)
{
/* too old */
return MHD_INVALID_NONCE;
@@ -1432,7 +1447,7 @@ MHD_queue_auth_fail_response2 (struct MHD_Connection
*connection,
VLA_CHECK_LEN_DIGEST (da.digest_size);
/* Generating the server nonce */
- calculate_nonce ((uint32_t) MHD_monotonic_sec_counter (),
+ calculate_nonce ((uint64_t) MHD_monotonic_sec_counter (),
connection->method,
connection->daemon->digest_auth_random,
connection->daemon->digest_auth_rand_size,
--
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.
- [libmicrohttpd] branch master updated (76b68f65 -> d031ea8c), gnunet, 2022/05/04
- [libmicrohttpd] 04/12: digestauth: changed type of var, gnunet, 2022/05/04
- [libmicrohttpd] 01/12: internal.h: fixed doxy, gnunet, 2022/05/04
- [libmicrohttpd] 02/12: .gitignore: Updated, gnunet, 2022/05/04
- [libmicrohttpd] 05/12: digestauth: additional assert, gnunet, 2022/05/04
- [libmicrohttpd] 08/12: digestauth: use mseconds for timestamp, gnunet, 2022/05/04
- [libmicrohttpd] 09/12: digestauth: additional macros for readability, gnunet, 2022/05/04
- [libmicrohttpd] 07/12: digestauth: increased timestamp to 48 bits,
gnunet <=
- [libmicrohttpd] 06/12: digestauth: added run-time checks for algo value, gnunet, 2022/05/04
- [libmicrohttpd] 11/12: digestauth: added management of nonce-nc map array slots, gnunet, 2022/05/04
- [libmicrohttpd] 03/12: digestauth: use 7 bit shift for fast "hash", gnunet, 2022/05/04
- [libmicrohttpd] 10/12: digestauth: additional static function for code re-use, gnunet, 2022/05/04
- [libmicrohttpd] 12/12: digestauth: re-used static function, gnunet, 2022/05/04