Merge branch 'tcn' into develop
All checks were successful
continuous-integration/drone/push Build is passing
All checks were successful
continuous-integration/drone/push Build is passing
This commit is contained in:
commit
c161830f6f
10
bib.bib
10
bib.bib
@ -79,4 +79,14 @@
|
|||||||
langid = {english}
|
langid = {english}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@software{TCNCoalitionTCN2020,
|
||||||
|
title = {{{TCNCoalition}}/{{TCN}}},
|
||||||
|
date = {2020-06-30T08:50:32Z},
|
||||||
|
origdate = {2020-03-31T18:18:05Z},
|
||||||
|
url = {https://github.com/TCNCoalition/TCN},
|
||||||
|
urldate = {2020-07-10},
|
||||||
|
abstract = {Specification and reference implementation of the TCN Protocol for decentralized, privacy-preserving contact tracing.},
|
||||||
|
organization = {{TCN Coalition}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,25 +1,63 @@
|
|||||||
# Protocollo TCN {#sec:tcn-protocol}
|
# Protocollo TCN {#sec:tcn-protocol}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Descrizione del protocollo
|
## Descrizione del protocollo
|
||||||
|
|
||||||
|
Il protocollo TCN [@TCNCoalitionTCN2020], 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 identificativo agli utenti vicini tramite Bluetooth e successivamente, se un utente è risultato positivo al contagio, può notificarlo ai suo contatti.
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
### Chiavi di autenticazione e verifica
|
### 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) attraverso la curva ellittica *Ed25519*.
|
||||||
|
|
||||||
|
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 che utilizza come separatore di dominio la rappresentazione in byte della stringa *H_TCK*.
|
||||||
|
|
||||||
### Chiave temporanea di contatto {#sec:tck}
|
### Chiave temporanea di contatto {#sec:tck}
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
### Numeri temporanei di contatto
|
### Numeri temporanei di contatto
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
### Report
|
### Report
|
||||||
|
|
||||||
|
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 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.
|
||||||
|
|
||||||
## Implementazione del protocollo per la JMV
|
## Implementazione del protocollo per la JMV
|
||||||
|
|
||||||
@ -313,4 +351,5 @@ interface TCNDataDao {
|
|||||||
## Rete
|
## Rete
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Riferimenti
|
# Riferimenti
|
||||||
|
Loading…
Reference in New Issue
Block a user