mirror of
https://git.gnunet.org/libmicrohttpd.git
synced 2026-09-25 04:09:31 +03:00
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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user