Documentazione/documentazione.md

3.4 KiB

Protocollo TCN

Descrizione del protocollo

Il protocollo TCN, Temporary Contact Number, è un protocollo di tracciamento dei contatti decentralizzato, sviluppato dalla TCN Coalition. Quest'ultima è una comunità di persone che durante l'emergenza COVID-19 hanno sviluppato questo supporto per lo sviluppo di app per notificare l'esposizione al contagio. Il protocollo non richiede, informazioni personali ed è compatibile con autorità sanitarie. I dispositivi degli utenti inviano un id(?) agli utenti vicini tramite Bluetooth e successivamente se un utente è risultato positivo al contagio può notificarlo ai suo contatti.

Per aumentare la scalabilità si è scelto di non generare automaticamente di TCN ma di generarli in modo deterministico da alcuni dati seed. In questo modo si riduce la dimensione del report da inviare, in quanto contiene solo dati seed compatti e non l'elenco intero di TCN. L'utente può caricare diversi report di dimensioni minori in modo da non caricare l'intera cronologia dei contatti. Inoltre è necessaria una chiave segreta che possiede l'utente per derivare i TCN.

Chiavi di autenticazione e verifica

L'user agent crea una chiave di autorizzazione rak (report authorization key) e una chiave di verifica rvk (report verification key), che ruotano periodicamente. Si genera una chiave di contatto iniziale tck_1 in questo modo:

tck_0 ← H_tck(rak)
tck_1 ← H_tck(rvk || tck_0)

dove H_tck è una funzione di hash con 256 bit di output.

Ogni report può contenere al massimo 2^(16) chiavi di contatto

Partendo una TCN se ne può derivare unìaltra tramite un'operazione di Ratchet:

tck_i ← H_tck(rvk || tck_{i-1})

dove || indica una concatenazione.

Chiave temporanea di contatto

Il numero di contatto temporaneo viene generato da una chiave di contatto temporanea, nel seguente modo:

tcn_i ← H_tcn(le_u16(i) || tck_i)

dove H_tcn è una funzione di Hash con 128bit di output.

Dalla chiave rak è possibile generare la chiave rvk e la chiave tck_0, dalle quali è possibile generare le successive tck e quindi tutti i successivi tcn.

      ┌───┐
  ┌──▶│rvk│─────────┬──────────┬──────────┬──────────┬──────────┐
  │   └───┘         │          │          │          │          │
┌───┐       ┌─────┐ │  ┌─────┐ │  ┌─────┐ │          │  ┌─────┐ │
│rak│──────▶│tck_0│─┴─▶│tck_1│─┴─▶│tck_2│─┴─▶  ...  ─┴─▶│tck_n│─┴─▶...
└───┘       └─────┘    └─────┘    └─────┘               └─────┘
                          │          │                     │
                          ▼          ▼                     ▼
                       ┌─────┐    ┌─────┐               ┌─────┐
                       │tcn_1│    │tcn_2│      ...      │tcn_n│
                       └─────┘    └─────┘               └─────┘

Numeri temporanei di contatto

Report

Implementazione del protocollo per la JMV

Applicazione

Bluetooth

Trasmissione

Scansione

Stima della distanza

UI

Memorizzazione

Rete