diff --git a/documentazione.md b/documentazione.md index 0d3f74c..28f0ab2 100644 --- a/documentazione.md +++ b/documentazione.md @@ -1,57 +1,87 @@ # 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: -### Chiave temporanea di contatto +``` +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 -