From 98a13ea8a16683611079de58554f35eafe040c06 Mon Sep 17 00:00:00 2001 From: noemi3 Date: Wed, 8 Jul 2020 19:28:02 +0200 Subject: [PATCH 1/5] add tcn --- documentazione.md | 78 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 24 deletions(-) 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 - From d4fd16abeee24392e9cb476852e80c89f656e4df Mon Sep 17 00:00:00 2001 From: noemi3 Date: Thu, 9 Jul 2020 12:25:43 +0200 Subject: [PATCH 2/5] fixed tcn --- documentazione.md | 40 ++++++++++++++++++---------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/documentazione.md b/documentazione.md index 28f0ab2..85b37cb 100644 --- a/documentazione.md +++ b/documentazione.md @@ -2,49 +2,47 @@ ## 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 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. 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. +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. -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. +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. 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: +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. ``` tck_0 ← H_tck(rak) -tck_1 ← H_tck(rvk || tck_0) ``` -dove *H_tck* è una funzione di hash con 256 bit di output. +dove `H_tck` è una funzione di hash con 256 bit di output. -Ogni report può contenere al massimo 2^(16) chiavi di contatto +### Chiave temporanea di contatto -Partendo una TCN se ne può derivare unìaltra tramite un'operazione di Ratchet: +Ogni report può contenere al massimo $2^{16}$ chiavi di contatto. + +Partendo un tcn se ne può derivare il prossimo tcn come mostrato di seguito: ``` tck_i ← H_tck(rvk || tck_{i-1}) ``` -dove || indica una concatenazione. +dove `||`indica una concatenazione. +### Numeri temporanei di contatto - -### Chiave temporanea di contatto - -Il numero di contatto temporaneo viene generato da una chiave di contatto temporanea, nel seguente modo: +Per ogni tck viene generato un numero di contatto temporaneo come mostrato di seguito: ``` tcn_i ← H_tcn(le_u16(i) || tck_i) ``` -dove *H_tcn* è una funzione di Hash con 128bit di output. +dove `H_tcn` è una funzione di Hash con 128 bit 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. @@ -62,12 +60,10 @@ Dalla chiave rak è possibile generare la chiave rvk e la chiave tck_0, dalle qu └─────┘ └─────┘ └─────┘ ``` - - -### Numeri temporanei di contatto - ### Report + + ## Implementazione del protocollo per la JMV # Applicazione From 91097382399a31fc94d0ac30b0dc3c1cfbeb4779 Mon Sep 17 00:00:00 2001 From: noemi3 Date: Thu, 9 Jul 2020 17:21:20 +0200 Subject: [PATCH 3/5] add reporting --- documentazione.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/documentazione.md b/documentazione.md index 85b37cb..14906c5 100644 --- a/documentazione.md +++ b/documentazione.md @@ -62,6 +62,37 @@ Dalla chiave rak è possibile generare la chiave rvk e la chiave tck_0, dalle qu ### Report +Un utente che vuole caricare il proprio report del periodo compreso tra `j1` e `j2`, lo farà nel seguente modo: + +``` +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. +Inoltre si utilizza il rak per produrre una firma`sig` per il report `report` e verrà mandata la concatenazione di `sig` || `report` al server. + +Chiunque può verificare l'integrità della sorgente e ricavare il tcn tramite sig, report e rvk, per poi confrontare questo tcn ottenuto con le proprie osservazioni. + +``` +tck_j1 ← H_tck(rvk || tck_{j1-1}) # Ratchet +tcn_j1 ← H_tcn(le_u16(j1) || tck_{j1}) # Generate +tck_{j1+1} ← H_tck(rvk || tck_{j1}) # Ratchet +tcn_{j1+1} ← H_tcn(le_u16(j1+1) || tck_{j1+1}) # Generate +... +``` + +**non so se mettere o no questa parte di codice** + +Si noti che il tcn deriva dal `tck_1{j1-1}`che non è incluso nel report, perchè il destinatario non può verificare se è associato al rvk. +Se la verifica del client non è importante, il server, in modo arbitrario, può rmuover i 64 byte finali da ciascun report. + + + + + + + + ## Implementazione del protocollo per la JMV From f6bbded63a25e831578334020cda9a0197c8e39f Mon Sep 17 00:00:00 2001 From: noemi3 Date: Fri, 10 Jul 2020 17:30:02 +0200 Subject: [PATCH 4/5] fixed report --- documentazione.md | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/documentazione.md b/documentazione.md index 14906c5..51d7ed6 100644 --- a/documentazione.md +++ b/documentazione.md @@ -62,36 +62,16 @@ Dalla chiave rak è possibile generare la chiave rvk e la chiave tck_0, dalle qu ### Report -Un utente che vuole caricare il proprio report del periodo compreso tra `j1` e `j2`, lo farà nel seguente modo: +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: ``` 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. -Inoltre si utilizza il rak per produrre una firma`sig` per il report `report` e verrà mandata la concatenazione di `sig` || `report` al server. - -Chiunque può verificare l'integrità della sorgente e ricavare il tcn tramite sig, report e rvk, per poi confrontare questo tcn ottenuto con le proprie osservazioni. - -``` -tck_j1 ← H_tck(rvk || tck_{j1-1}) # Ratchet -tcn_j1 ← H_tcn(le_u16(j1) || tck_{j1}) # Generate -tck_{j1+1} ← H_tck(rvk || tck_{j1}) # Ratchet -tcn_{j1+1} ← H_tcn(le_u16(j1+1) || tck_{j1+1}) # Generate -... -``` - -**non so se mettere o no questa parte di codice** - -Si noti che il tcn deriva dal `tck_1{j1-1}`che non è incluso nel report, perchè il destinatario non può verificare se è associato al rvk. -Se la verifica del client non è importante, il server, in modo arbitrario, può rmuover i 64 byte finali da ciascun report. - - - - - - +Inoltre si utilizza il rak per produrre una firma `sig` per il report e verrà inviata al server la concatenazione di sig e report. +Poichè la rvk è contenuta all'interno del report, chiunque può verificare l'integrità del report e ricavare i vari. From 236da1e9022411582cd4a15db0a51d547546d8e0 Mon Sep 17 00:00:00 2001 From: noemi3 Date: Fri, 10 Jul 2020 17:34:16 +0200 Subject: [PATCH 5/5] fixed key --- documentazione.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/documentazione.md b/documentazione.md index 51d7ed6..5daeb62 100644 --- a/documentazione.md +++ b/documentazione.md @@ -12,7 +12,7 @@ L'utente può caricare diversi report di dimensioni minori in modo da non carica ### 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). +L'user agent crea una chiave di autorizzazione *rak* (report authorization key) e una chiave di verifica *rvk* (report verification key) attraverso la curva ellittica *Ed25519*. A partire dalla rak è possibile ricavare la chiave di contatto iniziale tck_0. @@ -20,7 +20,7 @@ A partire dalla rak è possibile ricavare la chiave di contatto iniziale tck_0. tck_0 ← H_tck(rak) ``` -dove `H_tck` è una funzione di hash con 256 bit di output. +dove `H_tck` è una funzione di hash con 256 bit di output che utilizza come separatore di dominio la rappresentazione in byte della stringa *H_TCK*. ### Chiave temporanea di contatto @@ -42,7 +42,7 @@ Per ogni tck viene generato un numero di contatto temporaneo come mostrato di se tcn_i ← H_tcn(le_u16(i) || tck_i) ``` -dove `H_tcn` è una funzione di Hash con 128 bit di output. +dove `H_tcn` è una funzione di Hash con 128 bit di output che utilizza come separatore di dominio la rappresentazione in byte della stringa *H_TCN* . 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. @@ -73,8 +73,6 @@ Inoltre si utilizza il rak per produrre una firma `sig` per il report e verrà i Poichè la rvk è contenuta all'interno del report, chiunque può verificare l'integrità del report e ricavare i vari. - - ## Implementazione del protocollo per la JMV # Applicazione