Context. In my quest on figuring out if I must use NEWNYM
signal or stream isolation is enough for me I dig into the code and narrowed down the possible privacy improvements that NEWNYM
can bring over simple stream isolation, so I can ask more specific questions. One of it is clearing the state of rendezvous client.
Goal. My goal is to be able to talk with a server with two different identity, without the server, learning let's say Alice and Bob are the same user. Where the server is a hidden service.
What I know. This answer explains one thing that Tor does for NEWNYM
request:
src/or/rendclient.c:rend_client_purge_state
clears the state of the rendezvous client (hidden services) to avoid possible links between the old and new nym because of the new nym starting with the end state of the old nym.
Question. Is there a risk the server can learn the connection between Alice and Bob without clearing the state of the rendezvous client? If so, then how much of this risk is?
For reference I also drop the code here, its comments may be useful:
/** Purge all potentially remotely-detectable state held in the hidden
* service client code. Called on SIGNAL NEWNYM. */
void
rend_client_purge_state(void)
{
rend_cache_purge();
rend_cache_failure_purge();
rend_client_cancel_descriptor_fetches();
rend_client_purge_last_hid_serv_requests();
}
/** Remove ALL entries from the rendezvous service descriptor cache.
*/
void
rend_cache_purge(void)
{
...
}
/** Remove ALL entries from the failure cache. This is also called when a
* NEWNYM signal is received. */
void
rend_cache_failure_purge(void)
{
...
}
rend_client_cancel_descriptor_fetches
/** Cancel all rendezvous descriptor fetches currently in progress.
*/
void
rend_client_cancel_descriptor_fetches(void)
{
...
}
rend_client_purge_last_hid_serv_requests
/** Purge the history of request times to hidden service directories,
* so that future lookups of an HS descriptor will not fail because we
* accessed all of the HSDir relays responsible for the descriptor
* recently. */
void
rend_client_purge_last_hid_serv_requests(void)
{
...
}