Documentazione/documentazione.md

95 lines
4.1 KiB
Markdown
Raw Normal View History

2020-07-06 20:31:34 +00:00
# Protocollo TCN
## Descrizione del protocollo
2020-07-09 10:25:43 +00:00
Il protocollo TCN, Temporary Contact Number, è un protocollo di tracciamento dei contatti decentralizzato, ideato dalla TCN Coalition. Quest'ultima è una comunità di persone che durante l'emergenza COVID-19 hanno sviluppato questo supporto per lo sviluppo di applicazioni per notificare l'esposizione al contagio.
2020-07-08 17:28:02 +00:00
Il protocollo non richiede, informazioni personali ed è compatibile con autorità sanitarie.
2020-07-09 10:25:43 +00:00
I dispositivi degli utenti inviano un identificativo agli utenti vicini tramite Bluetooth e successivamente, se un utente è risultato positivo al contagio, può notificarlo ai suo contatti.
2020-07-08 17:28:02 +00:00
2020-07-09 10:25:43 +00:00
Per aumentare la scalabilità la TCN Coalition ha scelto di non generare randomicamente tcn, ma di generarli in modo deterministico da un seed.
In questo modo si riduce la dimensione del report da inviare, in quanto contiene solo le informazione necessarie per calcolare i tcn e non l'elenco intero di tcn.
2020-07-08 17:28:02 +00:00
L'utente può caricare diversi report di dimensioni minori in modo da non caricare l'intera cronologia dei contatti.
2020-07-06 20:31:34 +00:00
### Chiavi di autenticazione e verifica
2020-07-09 10:25:43 +00:00
L'user agent crea una chiave di autorizzazione *rak* (report authorization key) e una chiave di verifica *rvk* (report verification key).
A partire dalla rak è possibile ricavare la chiave di contatto iniziale tck_0.
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
```
tck_0 ← H_tck(rak)
```
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
dove `H_tck` è una funzione di hash con 256 bit di output.
### Chiave temporanea di contatto
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
Ogni report può contenere al massimo $2^{16}$ chiavi di contatto.
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
Partendo un tcn se ne può derivare il prossimo tcn come mostrato di seguito:
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
```
tck_i ← H_tck(rvk || tck_{i-1})
```
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
dove `||`indica una concatenazione.
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
### Numeri temporanei di contatto
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
Per ogni tck viene generato un numero di contatto temporaneo come mostrato di seguito:
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
```
tcn_i ← H_tcn(le_u16(i) || tck_i)
```
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
dove `H_tcn` è una funzione di Hash con 128 bit di output.
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
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.
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
```
┌───┐
┌──▶│rvk│─────────┬──────────┬──────────┬──────────┬──────────┐
│ └───┘ │ │ │ │ │
┌───┐ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ │ ┌─────┐ │
│rak│──────▶│tck_0│─┴─▶│tck_1│─┴─▶│tck_2│─┴─▶ ... ─┴─▶│tck_n│─┴─▶...
└───┘ └─────┘ └─────┘ └─────┘ └─────┘
│ │ │
▼ ▼ ▼
┌─────┐ ┌─────┐ ┌─────┐
│tcn_1│ │tcn_2│ ... │tcn_n│
└─────┘ └─────┘ └─────┘
```
2020-07-06 20:31:34 +00:00
2020-07-09 10:25:43 +00:00
### Report
2020-07-06 20:31:34 +00:00
2020-07-10 15:30:02 +00:00
Quando viene richiesto di caricare i dati dell'utente, è possibile eseguire l'upload di un report compatto. Infatti grazie alla derivazione deterministica, è possibile inviare tutti gli identificativi utilizzati nel periodo `j1` e `j2`, caricando unicamente la rvk, tck_{j-1}, e i due indici `j1` e `j2`. Di seguito è illustrato come costruire il report:
2020-07-09 15:21:20 +00:00
```
report ← rvk || tck_{j1-1} || le_u16(j1) || le_u16(j2) || memo
```
dove `memo` è una stringa di byte di lunghezza variabile che va da 2 a 257 byte.
2020-07-10 15:30:02 +00:00
Inoltre si utilizza il rak per produrre una firma `sig` per il report e verrà inviata al server la concatenazione di sig e report.
2020-07-09 15:21:20 +00:00
2020-07-10 15:30:02 +00:00
Poichè la rvk è contenuta all'interno del report, chiunque può verificare l'integrità del report e ricavare i vari.
2020-07-09 15:21:20 +00:00
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
## Implementazione del protocollo per la JMV
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
# Applicazione
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
## Bluetooth
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
### Trasmissione
2020-07-06 20:31:34 +00:00
2020-07-08 17:28:02 +00:00
### Scansione
2020-07-06 20:31:34 +00:00
### Stima della distanza
## UI
## Memorizzazione
## Rete