digestauth: when checking 'nc' reuse always check nonce match first

While the validity of nonce itself was already checked, it could be stale
nonce, so let's make sure that re-use of 'nc' is limited to the same
nonce only.
This commit is contained in:
Evgeny Grin (Karlson2k)
2022-05-01 15:04:45 +03:00
parent f84c4d60a4
commit d6db60e373
+14 -8
View File
@@ -559,7 +559,8 @@ add_nonce (struct MHD_Connection *connection,
MHD_mutex_lock_chk_ (&daemon->nnc_lock);
memcpy (nn->nonce,
nonce,
noncelen + 1);
noncelen);
nn->nonce[noncelen] = 0;
nn->nc = 0;
nn->nmask = 0;
MHD_mutex_unlock_chk_ (&daemon->nnc_lock);
@@ -612,20 +613,25 @@ check_nonce_nc (struct MHD_Connection *connection,
MHD_mutex_lock_chk_ (&daemon->nnc_lock);
if ( (0 != memcmp (nn->nonce, nonce, noncelen)) ||
(0 != nn->nonce[noncelen]) )
{
/* Nonce does not match, fail */
stale = true;
ret = MHD_NO;
}
/* Note that we use 64 here, as we do not store the
bit for 'nn->nc' itself in 'nn->nmask' */
if ( (nc < nn->nc) &&
(nc + 64 > nc /* checking for overflow */) &&
(nc + 64 >= nn->nc) &&
(0 == ((1LLU << (nn->nc - nc - 1)) & nn->nmask)) )
else if ( (nc < nn->nc) &&
(nc + 64 > nc /* checking for overflow */) &&
(nc + 64 >= nn->nc) &&
(0 == ((1LLU << (nn->nc - nc - 1)) & nn->nmask)) )
{
/* Out-of-order nonce, but within 64-bit bitmask, set bit */
nn->nmask |= (1LLU << (nn->nc - nc - 1));
ret = MHD_YES;
}
else if ( (nc <= nn->nc) ||
(0 != strcmp (nn->nonce,
nonce)) )
else if (nc <= nn->nc)
{
/* Nonce does not match, fail */
stale = true;