Oggi e' il domani di cui dovevi preoccuparti ieri!

Incontro sulla repressione, il controllo in rete, fuori dalla rete, e tecniche di salvaguardia di uno dei diritti civili basilari: la privacy.

Protocollo Tor

Panoramica

L'Onion Routing e' un sistama basato su una rete distribuita di nodi tra loro inteconnessi che permette di rendere anonime le comunicazioni tra applicazioni TCP che accedono alla rete Internet come ad esempio un browser o un client di posta.

Ogni nodo che compone la rete prende il nome di Onion Router (server) mentre ogni host che usufruisce di tale rete per veicolare anonimamente le proprie comunicazioni su Internet prende il nome di Onion Proxy (client).

Protocollo Tor

Panoramica

Quando un client desidera comunicare tramite questo sistema sceglie un percorso composto da diversi Onion Router (d'ora in poi OR), dove ogni OR conosce il nodo che lo precede e quello successivo ma non conosce gli altri nodi che compongono l'intero percorso.

In questo modo il client Onion Proxy (d'ora in poi OP) puo' inviare i propri dati cifrati lungo il percorso di OR, dove ogni OR e' in grado di decifrare e quandi legge la porzione di dati ad esso destinata mediante una chiave simmetrica.

Protocollo Tor

Panoramica

La stessa operazione viene eseguita per i restanti OR sul percorso fino a che i dati non arrivano a destinazione.

I dati vengono inviati in celle di lunghezza fissa al fine di impedire qualsiasi correlazione tra la lunghezza dei dati inviati e la loro natura.

Protocollo Tor

Algoritmi crittografici

Tor utilizza il protocollo TLS per criptare il canale di comunicazione. Le specifiche del protocollo tor descritte nella draft [1] richiedono che tutte le implementazioni supportino gli algoritmi della ciphersuite TLS ovvero "TLS_EDH_RSA_WITH_DES_192_CBC3_SHA" e possono supportare gli algoritmi "TLS_DHE_RSA_WITH_AES_128_CBC_SHA" se disponibili.

Viene specificato inoltre che possono essere utilizzati altri algoritmi crittografici con le seguenti limitazioni: gli algoritmi a chiave simmetrica devono utilizzare chiavi di almeno 128 bit, gli algoritmi hash devono avere digest di almeno 160 bit.

Protocollo Tor

Autenticazione

Prima di iniziare qualsiasi connessione il client OP si connette al directory server e scarica la lista dei nodi OR disponibili e delle chiavi di identificazione di quest'ultimi.

Quando un client OP si connette ad un nodo OR quest'ultimo si autentica al primo inviandogli una catena composta da due certificati: il primo certificato usando una chiave di connessione temporanea e il secondo certificato autofirmato contenente la chiave di identificazione del nodo OR.

Protocollo Tor

Autenticazione

Il campo CommonName (CN) del primo certificato e' il nickname del nodo OR, mentre il CN del secondo certificato e' il nickname del nodo OR seguito da uno spazio e dalla stringa "<identity>".

Il client OP puo' verificare la validita' della chiave di identificazione fornita dal nodo OR con quella scaricata dal directory server e rifiutare la connessione nel caso quest'ultima dovesse risultare non valida.

Due nodi OR invece eseguono una mutua autenticazione utilizzando una procedura simile a quella descritta in precedenza. Un nodo OR deve rifiutare una connessione a/da un OR la cui chiave di identificazione non dovesse risultare valida o il cui certificato sia malformato o mancante.

Protocollo Tor

Connessione

Una volta stabilita una connessione TLS tra le due entita' (OP-OR oppure OR-OR) esse incominciano a scambiarsi i dati in celle di lunghezza fissa pari a 512 byte che vengono inviate in maniera sequenziale, questo impedisce qualsiasi attacco di correlazione tra la lunghezza dei dati e la natura del traffico stesso.

La connessione TLS tra OP-OR oppure OR-OR non e' permanente, una delle due parti coinvolte nella comunicazione puo' interrompere la connessione se non transitano dati per un tempo pari al KeepalivePeriod che di default vale 5 minuti.

Protocollo Tor

Formato delle celle

I dati scambiati tra due entita' all'interno di un sistema di onion routing prendono il nome di celle, esse hanno una grandezza fissa di 512 byte.

Ogni cella e' composta da due campi che hanno funzioni di controllo e dal payload che contiene i dati trasmessi dall'applicazione.

Formato cella generica

CircID

Command

Payload

Serve ad indicare a quale circuito virtuale e' associata la

cella, infatti ogni nuova connessione effettuata da un'applicazione del

client OP puo' essere instradata tramite un percorso di nodi OR differente

Formato cella generica

CircID

Command

Payload

Contiene il valore relativo ad uno dei comandi supportati

dalle specifiche del protocollo e puo' assumere i seguenti valori:

0 -- PADDING (Padding)

1 -- CREATE (Crea un circuito)

2 -- CREATED (Conferma creazione)

3 -- RELAY (Invio dati)

4 -- DESTROY (Chiude un circuito)

5 -- CREATE_FAST (Crea un circuito)

6 -- CREATED_FAST (Conferma creazione)

Formato cella generica

CircID

Command

Payload

Contiene generalmente i dati che vogliamo trasmettere all'

altro nodo, ma il suo contenuto puo' variare a seconda del Command:

PADDING: Payload e' inutilizzato.

CREATE: Payload contiene il challenge.

CREATED: Payload contiene il response.

RELAY: Relay header e relay body.

DESTROY: Payload e' inutilizzato.

Lunghezza fissa di 509 byte, e' paddato con byte posti a 0.

Protocollo Tor

Tipologia celle

Le celle di PADDING vengono utilizzate per implementare il keepalive della connessione, se non c'e' traffico l'OP o l'OR invia una cella di padding ogni volta che trascorrono un certo numero di minuti.

Le celle CREATE, CREATED e DESTROY sono utilizzate per gestire la creazione e la chiusura dei circuiti virtuali.

Le celle RELAY sono utilizzate per inviare comandi o dati lungo il circuito virtuale.

Protocollo Tor

Cella CREATE

Il client OP crea il circuito in maniera incrementale, un nodo alla volta. Per creare un nuovo circuito il client OP sceglie un percorso casuale tra i nodi OR disponibili e invia una cella CREATE al primo nodo, il payload della cella conterra' la prima parte dell'handshake Diffie Hellman (ovvero g^x).

Protocollo Tor

Cella CREATE

I dati sono cifrati in questo modo: supponiamo che la chiave pubblica del nodo OR sia lunga L byte.

Se i dati da cifrare sono minori di L-42 allora i dati sono paddati con 42 byte OAEP e cifrati direttamente con la chiave pubblica, altrimenti viene generata una chiave simmetrica casuale di 16 byte che precede i dati, dopo la quale seguono i primi L-16-42 byte di dati il tutto viene cifrato con la chiave pubblica del nodo OR, il resto dei dati e' cifrato con la chiave simmetrica precedentemente generata.

Formato cella CREATE

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

1 = CREATE

Padding

Formato cella CREATE

CircID

Command

Cifrato

con RSA

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con chiave

simmetrica

Seconda

parte g^x

1 = CREATE

Padding

Protocollo Tor

Algoritmo ibrido

Tale scelta e' stata fatta per motivi di efficienza, un sistema ibrido infatti si avvale della crittografia asimmetrica per garantire uno scambio sicuro di una chiave simmetrica che verra' utilizzata per cifrare una mole di dati elevata con un'efficienza maggiore.

Protocollo Tor

Cella CREATED

Quando un nodo OR riceve una cella CREATE rispondera' con una cella CREATED il cui payload conterra' la seconda parte dell'handshake Diffie Hellman e i primi 20 byte della chiave derivata (KH).

Formato cella CREATED

CircID

Command

Valore g^y

KH

Padding

Serve a dimostrare la conoscenza della chiave condivisa

Protocollo Tor

Chiave derivata

Una volta che l'hanshake Diffie Hellman tra il client OP e il nodo OR e' completato entrambe le parti sono in grado di computare il valore di g^xy.

Tuttavia prima di computare tale valore entrambe le parti devono verificare che il valore di g^x o g^y ricevuto non sia degenerato, ovvero che sia rigorosamente maggiore di 1 e rigorosamente minore di p-1 dove p e' il modulo Diffie Hellman, e nel caso rifiutare la connessione.

Tale scelta viene fatta per motivi di sicurezza, se cosi' non fosse infatti un attaccante sarebbe in grado di sostituirsi al nodo OR semplicemente sostituendo il valore g^y della cella CREATED con un valore degenerato quale 0 o 1 il che renderebbe possibile il calcolo di g^xy.

Protocollo Tor

Chiave derivata

Nell'implementazione ufficiale di tor vengono considerati degenerati e quindi scartati tutti i valori di g^x e g^y minori di 2^24 e maggiori di p-2^24 o che hanno 1024-16 identici bit.

Tali valori costituiscono una porzione trascurabile rispetto all'intero spazio delle chiavi e quindi la possibilita' di indovinare una chiave casuale rimane astronomicamente basso.

Protocollo Tor

Chiave derivata

Il valore g^xy calcolato viene utilizzato per derivare il valore K di 100 byte secondo la formula seguente:
K = SHA1(g^xy | [00]) | SHA1(g^xy | [01]) | ... SHA1(g^xy | [04])

Dove l'operatore | esegue la concatenazione dei suoi operandi e [NN] e' un byte il cui valore e' NN.

Dal valore di K verrano a loro volta derivati ulteriori valori quali la chiave derivata (KH), il forward digest (Df), il backward digest (Db), la forward key (Kf) e la backward key (Kb) secondo il seguente schema: i primi 20 byte di K costituiscono KH, i byte 21-40 costituiscono Df, i byte 41-60 costituiscono Db, 61-76 costituiscono Kf e 77-92 costituiscono Kb.

Protocollo Tor

Chiave derivata

KH e' utilizzata durante il processo di handshake Diffie Hellman per dimostrare la conoscenza della chiave condivisa K derivata dal valore g^xy, Df e' utilizzato come seed per la funzione hash che controlla l'integrita' del flusso dati nella direzione che va dal client OP al nodo OR, Db e' utilizzato come Df ma per il flusso dati che va nella direzione opposta, Kf e' la chiave utilizzata per cifrare il flusso dati che va dal client OP al nodo OR, e Kb e' utilizzata come Kf ma per il flusso dati che va nella direzione opposta.

Protocollo Tor

Cella RELAY

A differenza delle celle CREATE e CREATED che sono scambiate tra nodi tra loro adiacenti, le celle RELAY sono utilizzate per veicolare flussi di dati e messaggi di controllo attraverso un circuito composto da piu' nodi.

Formato cella RELAY

3 = RELAY

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

Cifrato

con chiave

forward R_i

Formato cella RELAY

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

Puo' assumere i seguenti valori:

1 -- RELAY_BEGIN

2 -- RELAY_DATA

3 -- RELAY_END

4 -- RELAY_CONNECTED

5 -- RELAY_SENDME

6 -- RELAY_EXTEND

7 -- RELAY_EXTENDED

8 -- RELAY_TRUNCATE

9 -- RELAY_TRUNCATED

10 -- RELAY_DROP

11 -- RELAY_RESOLVE

12 -- RELAY_RESOLVED

Formato cella RELAY

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

Se tale campo risulta diverso da 0 la cella decifrata viene

instradata verso il prossimo nodo OR del circuito altrimenti il contenuto del

payload viene processato dal nodo stesso

Formato cella RELAY

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

Utilizzato per riconoscere le celle che appartengono

allo stesso flusso di dati

Formato cella RELAY

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

Indica la lunghezza in byte dei dati contenuti nel payload, il

resto del payload e' composto da byte di padding posti a 0

Protocollo Tor

Cella relay EXTEND

Per estendere il circuito di un ulteriore nodo il client OP invia una cella relay EXTEND che istruisce l'ultimo nodo OR ad inviare una cella CREATE per estendere il circuito verso il nodo OR desiderato.

Formato cella relay EXTEND

3 = RELAY

6 = RELAY_EXTEND

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Cifrato

con chiave di

forward R_i

Formato cella relay EXTEND

CircID

Command

Cifrato

con chiave di

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con RSA

Cifrato

con chiave

simmetrica

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Hash Pk

L'indirizzo e la porta rappresentano l'indirizzo IPv4 e la porta del prossimo

nodo OR verso il quale si desidera estendere il circuito

Formato cella relay EXTEND

CircID

Command

Cifrato

con chiave di

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con RSA

Cifrato

con chiave

simmetrica

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Hash Pk

L'onion skin cifrata con la chiave pubblica del nodo OR che deve estendere il circuito virtuale

Formato cella relay EXTEND

CircID

Command

Cifrato

con chiave di

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con RSA

Cifrato

con chiave

simmetrica

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Hash Pk

L'hash della chiave pubblica e' il digest SHA1 della codifica PKCS#1 ASN1 della chiave di identificazione di tale nodo OR

Protocollo Tor

Cella relay EXTENDED

Quando un nodo OR processa una cella relay EXTEND invia una cella CREATE al nuovo nodo OR per estendere il circuito, il nuovo OR risponde con una cella CREATED, il payload di tale cella viene restituito al client OP all'interno di una cella EXTENDED

Formato cella relay EXTENDED

CircID

Command

Cifrato

con chiave

backward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Protocollo Tor

Creazione circuito

Per creare un nuovo circuito virtuale il client OP procede secondo i passi illustrati nello schema seguente

Creazione circuito

OP

R_1

R_2

Il client OP sceglie il nodo di uscita

Creazione circuito

OP

R_1

R_2

Creazione circuito

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Invia a R_1 la cella CREATE

OP

R_1

R_2

Creazione circuito

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Decifra con la chiave privata

R_1

R_2

OP

Creazione circuito

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Decifra con la chiave simmetrica

R_1

R_2

OP

Creazione circuito

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Calcola il valore di g^xy e ne deriva K

R_1

R_2

OP

Creazione circuito

R_1

R_2

CircID

Command

Valore g^y

KH

Padding

Invia ad OP la cella CREATED

OP

Creazione circuito

R_1

R_2

CircID

Command

Valore g^y

KH

Padding

Calcola il valore di g^xy e ne deriva K

OP

Creazione circuito

R_1

R_2

CircID

Command

Valore g^y

KH

Padding

Confronta i primi 20 byte di K derivata con KH ricevuta

OP

Creazione circuito

R_1

R_2

Viene creato il circuito virtuale tra OP e R_1

OP

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Cifrato

con chiave di

forward R_1

Invio a R_1 la cella relay EXTEND

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Cifrato

con chiave di

forward R_1

Decifra con la chiave di forward

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Controlla il valore del campo Recognized = 0, e quindi processa il contenuto della cella

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Controlla il valore del campo Relay command = 6, che significa RELAY_EXTEND

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Controlla l'indirizzo IPv4 e la porta del nodo a cui estendere il circuito

Estensione circuito

R_1

R_2

OP

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Indirizzo

Porta

Cifrato

con RSA

Cifrato

con chiave

simmetrica

Hash Pk

Estrae l'onion skin dal payload della cella relay EXTEND

Estensione circuito

R_1

R_2

OP

Inserisce il payload estratto in una cella CREATE

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Estensione circuito

R_1

R_2

OP

Invia a R_2 la cella CREATE

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Estensione circuito

R_1

R_2

OP

Decifra con la propria chiave privata

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Cifrato

con RSA

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Estensione circuito

R_1

R_2

OP

Decifra con la chiave simmetrica

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Cifrato

con chiave

simmetrica

Padding

Estensione circuito

R_1

R_2

OP

Calcola il valore di g^xy e ne deriva il valore K

CircID

Command

OAEP

padding

Symmetric K

Prima

parte g^x

Seconda

parte g^x

Padding

Estensione circuito

R_1

R_2

OP

Invia a R_1 una cella CREATED

CircID

Command

Valore g^y

KH

Padding

Estensione circuito

R_1

R_2

OP

Estrae il payload dalla cella CREATED

CircID

Command

Valore g^y

KH

Padding

Estensione circuito

R_1

R_2

OP

Inserisce il payload estratto in una cella relay EXTENDED

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Estensione circuito

R_1

R_2

OP

Cifra header e payload della cella relay EXTENDED con la chiave di backward

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Cifrato

con chiave

backward R_1

Estensione circuito

R_1

R_2

OP

Invia a OP la cella relay EXTENDED

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Cifrato

con chiave

backward R_1

Estensione circuito

R_1

R_2

OP

Decifra con la chiave di backward

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Cifrato

con chiave

backward R_1

Estensione circuito

R_1

R_2

OP

Calcola il valore di g^xy e ne deriva la chiave K

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Estensione circuito

R_1

R_2

OP

Confronta i primi venti byte di K derivata con KH ricevuta

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

Valore g^y

KH

Estensione circuito

R_1

R_2

OP

Viene esteso il circuito virtuale verso R_2

Formato cella RELAY BEGIN

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

:

Port

[00]

Cifrato

con chiave

forward R_i

3 = RELAY

1 = RELAY_BEGIN

Formato cella RELAY BEGIN

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

:

Port

[00]

L'hostname o l'indirizzo IP nel formato IPv4 o IPv6 e la porta dell'host a cui ci si desidera connettere

Protocollo Tor

Creazione connessione

La cella RELAY_BEGIN viene instradata lungo il circuito e viene processata dal nodo OR di uscita che apre una nuova connessione TCP verso l'indirizzo e la porta specificati nel payload del pacchetto.

Se la connessione TCP va a buon fine il nodo OR di uscita invia una cella RELAY_CONNECTED al client OP che lo informa dell'avvenuta connessione.

Formato cella RELAY CONNECTED

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

TTL cache

Cifrato

con chiave

backward R_i

3 = RELAY

4 = RELAY_CONNECTED

Formato cella RELAY CONNECTED

CircID

Command

Cifrato

con chiave

backward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

TTL cache

Creazione connessione

OP

R_1

R_2

La cella RELAY BEGIN viene inviata sul circuito

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Cifrato

con chiave

forward R_1

Creazione connessione

OP

R_1

R_2

Decifra con la chiave di forward

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Cifrato

con chiave

forward R_1

Creazione connessione

OP

R_1

R_2

Verifica campo Recognized che risulta != 0 significa che la cella e' ancora cifrata

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Creazione connessione

OP

R_1

R_2

Invia la cella RELAY BEGIN al nodo R_2

CircID

Command

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Creazione connessione

OP

R_1

R_2

Decifra con la chiave di forward

CircID

Command

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Creazione connessione

OP

R_1

R_2

Controlla il campo Recognized che vale 0, quindi processa il payload

CircID

Command

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Creazione connessione

OP

R_1

R_2

Controlla il valore del campo Relay command = 1, cioe' RELAY_BEGIN

CircID

Command

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Creazione connessione

OP

R_1

R_2

Ricava l'IP address e la porta dell'host verso il quale deve aprire una connessione TCP

CircID

Command

Padding

IP Address

:

Port

[00]

Rel command

Recognized

StreamID

Digest

Length

Creazione connessione

OP

R_1

R_2

Apre una connessione TCP verso il sistema

SYN

SYN/ACK

ACK

Creazione connessione

OP

R_1

R_2

Invia una cella RELAY CONNECTED al nodo R_1

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Creazione connessione

OP

R_1

R_2

Aggiunge gli header della cella RELAY CONNECTED con Recoglized != da 0

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Creazione connessione

OP

R_1

R_2

Cifra con la chiave di backward

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Cifrato

con chiave

backward R_1

Creazione connessione

OP

R_1

R_2

Invia la cella RELAY CONNECTED al client OP

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Cifrato

con chiave

backward R_1

Creazione connessione

OP

R_1

R_2

Decifra con la chiave di backward di R_1

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Cifrato

con chiave

backward R_1

Creazione connessione

OP

R_1

R_2

Controlla il valore di Recognized != 0

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Creazione connessione

OP

R_1

R_2

Decifra con la chiave di backward di R_2

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

backward R_2

Creazione connessione

OP

R_1

R_2

Riceve conferma dell'avvenuta connessione TCP

CircID

Command

Padding

IP Address

TTL cache

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Protocollo Tor

Trasmissione dati

Una volta che la connessione TCP viene stabilita i dati vengono veicolati sul circuito virtuale attraverso celle RELAY_DATA, il contenuto del payload di tali celle viene inviato sulla connessione TCP associata allo StreamID della cella.

Formato cella RELAY DATA

CircID

Command

Cifrato

con chiave

forward R_i

Rel command

Recognized

StreamID

Digest

Length

Padding

Dati

2 = RELAY_DATA

Trasmissione dati (forward)

OP

R_1

R_2

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

GET index.htm

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Cifrato

con chiave

forward R_1

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

GET index.htm

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

CircID

Command

Rel command

Recognized

StreamID

Digest

Length

Padding

GET

index.htm

Rel command

Recognized

StreamID

Digest

Length

GET

index.htm

Trasmissione dati (backward)

OP

R_1

R_2

CircID

Command

Padding

<html>

pagina

</html>

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

<html>

pagina

</html>

CircID

Command

Padding

<html>

pagina

</html>

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Cifrato

con chiave

forward R_2

Cifrato

con chiave

forward R_1

CircID

Command

Padding

<html>

pagina

</html>

Rel command

Recognized

StreamID

Digest

Length

Rel command

Recognized

StreamID

Digest

Length

Protocollo Tor

Bibliografia

[1] Tor Protocol Specification
Roger Dingledine, Nick Mathewson

[2] Tor: An Anonymizing Overlay Network for TCP
Roger Dingledine

[3] http://tor.eff.org

2005-06-25T14:46:27