Bitcoin Core 28.99.0
P2P Digital Currency
Functions | Variables
torcontrol.cpp File Reference
#include <torcontrol.h>
#include <chainparams.h>
#include <chainparamsbase.h>
#include <common/args.h>
#include <compat/compat.h>
#include <crypto/hmac_sha256.h>
#include <logging.h>
#include <net.h>
#include <netaddress.h>
#include <netbase.h>
#include <random.h>
#include <tinyformat.h>
#include <util/check.h>
#include <util/fs.h>
#include <util/readwritefile.h>
#include <util/strencodings.h>
#include <util/string.h>
#include <util/thread.h>
#include <util/time.h>
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <deque>
#include <functional>
#include <map>
#include <optional>
#include <set>
#include <thread>
#include <utility>
#include <vector>
#include <event2/buffer.h>
#include <event2/bufferevent.h>
#include <event2/event.h>
#include <event2/thread.h>
#include <event2/util.h>
Include dependency graph for torcontrol.cpp:

Go to the source code of this file.

Functions

std::pair< std::string, std::string > SplitTorReplyLine (const std::string &s)
 
std::map< std::string, std::string > ParseTorReplyMapping (const std::string &s)
 Parse reply arguments in the form 'METHODS=COOKIE,SAFECOOKIE COOKIEFILE=".../control_auth_cookie"'. More...
 
static std::vector< uint8_t > ComputeResponse (const std::string &key, const std::vector< uint8_t > &cookie, const std::vector< uint8_t > &clientNonce, const std::vector< uint8_t > &serverNonce)
 Compute Tor SAFECOOKIE response. More...
 
static void TorControlThread (CService onion_service_target)
 
void StartTorControl (CService onion_service_target)
 
void InterruptTorControl ()
 
void StopTorControl ()
 
CService DefaultOnionServiceTarget (uint16_t port)
 

Variables

const std::string DEFAULT_TOR_CONTROL = "127.0.0.1:" + ToString(DEFAULT_TOR_CONTROL_PORT)
 Default control ip and port. More...
 
static const int TOR_COOKIE_SIZE = 32
 Tor cookie size (from control-spec.txt) More...
 
static const int TOR_NONCE_SIZE = 32
 Size of client/server nonce for SAFECOOKIE. More...
 
static const std::string TOR_SAFE_SERVERKEY = "Tor safe cookie authentication server-to-controller hash"
 For computing serverHash in SAFECOOKIE. More...
 
static const std::string TOR_SAFE_CLIENTKEY = "Tor safe cookie authentication controller-to-server hash"
 For computing clientHash in SAFECOOKIE. More...
 
static const float RECONNECT_TIMEOUT_START = 1.0
 Exponential backoff configuration - initial timeout in seconds. More...
 
static const float RECONNECT_TIMEOUT_EXP = 1.5
 Exponential backoff configuration - growth factor. More...
 
static const int MAX_LINE_LENGTH = 100000
 Maximum length for lines received on TorControlConnection. More...
 
static const uint16_t DEFAULT_TOR_SOCKS_PORT = 9050
 
static struct event_base * gBase
 
static std::thread torControlThread
 

Function Documentation

◆ ComputeResponse()

static std::vector< uint8_t > ComputeResponse ( const std::string &  key,
const std::vector< uint8_t > &  cookie,
const std::vector< uint8_t > &  clientNonce,
const std::vector< uint8_t > &  serverNonce 
)
static

Compute Tor SAFECOOKIE response.

ServerHash is computed as: HMAC-SHA256("Tor safe cookie authentication server-to-controller hash", CookieString | ClientNonce | ServerNonce) (with the HMAC key as its first argument)

After a controller sends a successful AUTHCHALLENGE command, the next command sent on the connection must be an AUTHENTICATE command, and the only authentication string which that AUTHENTICATE command will accept is:

HMAC-SHA256("Tor safe cookie authentication controller-to-server hash", CookieString | ClientNonce | ServerNonce)

Definition at line 495 of file torcontrol.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ DefaultOnionServiceTarget()

CService DefaultOnionServiceTarget ( uint16_t  port)

Definition at line 714 of file torcontrol.cpp.

Here is the caller graph for this function:

◆ InterruptTorControl()

void InterruptTorControl ( )

Definition at line 695 of file torcontrol.cpp.

Here is the caller graph for this function:

◆ ParseTorReplyMapping()

std::map< std::string, std::string > ParseTorReplyMapping ( const std::string &  s)

Parse reply arguments in the form 'METHODS=COOKIE,SAFECOOKIE COOKIEFILE=".../control_auth_cookie"'.

Returns a map of keys to values, or an empty map if there was an error. Grammar is implicitly defined in https://spec.torproject.org/control-spec by the server reply formats for PROTOCOLINFO (S3.21), AUTHCHALLENGE (S3.24), and ADD_ONION (S3.27). See also sections 2.1 and 2.3.

Unescape value. Per https://spec.torproject.org/control-spec section 2.1.1:

For future-proofing, controller implementers MAY use the following rules to be compatible with buggy Tor implementations and with future ones that implement the spec as intended:

Read
\t \r and \0 ... \377 as C escapes. Treat a backslash followed by any other character as that character.

Definition at line 228 of file torcontrol.cpp.

Here is the caller graph for this function:

◆ SplitTorReplyLine()

std::pair< std::string, std::string > SplitTorReplyLine ( const std::string &  s)

Definition at line 209 of file torcontrol.cpp.

Here is the caller graph for this function:

◆ StartTorControl()

void StartTorControl ( CService  onion_service_target)

Definition at line 676 of file torcontrol.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ StopTorControl()

void StopTorControl ( )

Definition at line 705 of file torcontrol.cpp.

Here is the caller graph for this function:

◆ TorControlThread()

static void TorControlThread ( CService  onion_service_target)
static

Definition at line 669 of file torcontrol.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

Variable Documentation

◆ DEFAULT_TOR_CONTROL

const std::string DEFAULT_TOR_CONTROL = "127.0.0.1:" + ToString(DEFAULT_TOR_CONTROL_PORT)

Default control ip and port.

Definition at line 50 of file torcontrol.cpp.

◆ DEFAULT_TOR_SOCKS_PORT

const uint16_t DEFAULT_TOR_SOCKS_PORT = 9050
static

Definition at line 68 of file torcontrol.cpp.

◆ gBase

struct event_base* gBase
static

Definition at line 666 of file torcontrol.cpp.

◆ MAX_LINE_LENGTH

const int MAX_LINE_LENGTH = 100000
static

Maximum length for lines received on TorControlConnection.

tor-control-spec.txt mentions that there is explicitly no limit defined to line length, this is belt-and-suspenders sanity limit to prevent memory exhaustion.

Definition at line 67 of file torcontrol.cpp.

◆ RECONNECT_TIMEOUT_EXP

const float RECONNECT_TIMEOUT_EXP = 1.5
static

Exponential backoff configuration - growth factor.

Definition at line 62 of file torcontrol.cpp.

◆ RECONNECT_TIMEOUT_START

const float RECONNECT_TIMEOUT_START = 1.0
static

Exponential backoff configuration - initial timeout in seconds.

Definition at line 60 of file torcontrol.cpp.

◆ TOR_COOKIE_SIZE

const int TOR_COOKIE_SIZE = 32
static

Tor cookie size (from control-spec.txt)

Definition at line 52 of file torcontrol.cpp.

◆ TOR_NONCE_SIZE

const int TOR_NONCE_SIZE = 32
static

Size of client/server nonce for SAFECOOKIE.

Definition at line 54 of file torcontrol.cpp.

◆ TOR_SAFE_CLIENTKEY

const std::string TOR_SAFE_CLIENTKEY = "Tor safe cookie authentication controller-to-server hash"
static

For computing clientHash in SAFECOOKIE.

Definition at line 58 of file torcontrol.cpp.

◆ TOR_SAFE_SERVERKEY

const std::string TOR_SAFE_SERVERKEY = "Tor safe cookie authentication server-to-controller hash"
static

For computing serverHash in SAFECOOKIE.

Definition at line 56 of file torcontrol.cpp.

◆ torControlThread

std::thread torControlThread
static

Definition at line 667 of file torcontrol.cpp.