Entriamo nel tecnico.
Tutto quello che dice la prima pagina, scritto come la cosa da cui è nato: il database vero, come si crea davvero un contatto, e chi altro tocca una chiamata.
Questa pagina non ti serve per usare Rilo, e niente qui contraddice la versione più semplice. È lo stesso prodotto, descritto con precisione.
Tutto il database
Tutto quello che il nostro server sa della tua famiglia.
Non è un riassunto. Queste sono le diciassette tabelle del server, con le colonne che hanno. Quattro sono la tua famiglia: chi sono, chi può agire per un bambino, i telefoni da cui parlano e dove farli squillare. Quattro tengono qualcosa da parte per un telefono che era spento, e tutte e quattro si cancellano da sole. Tre riguardano chi può agire per un bambino e quale telefono ha smesso di essere affidabile. Due sono registrazioni firmate di una fine: un contatto tagliato, o qualcuno che se n’è andato. Si conservano perché un telefono rimasto offline possa verificarle invece di credere a noi. Una contiene numeri usa e getta già spesi, spazzati via alla scadenza. Una è l’abbonamento, e non contiene niente che faccia il nome di nessuno. Una è una segnalazione che ci ha mandato un adulto, ed è l’unica tabella qui che esiste per far succedere qualcosa. L’ultima non riguarda affatto la tua famiglia.
- idun hash della chiave pubblica, non un nome
- public_keyla chiave del dispositivo, che è l’account
- typeadulto o bambino
- type_certla firma che lo dimostra. L’account di un bambino è firmato da un genitore, quindi non c’è nessun interruttore da girare
- created_at
- last_activel’ultima volta che uno dei tuoi telefoni ha detto ciao
- dormant_warned_atvuoto
- consent_sealedla tua email di registrazione, sigillata con una chiave che sta su carta dal fondatore. Nessun server può leggerla
- uncovered_sincevuoto, a meno che il tuo abbonamento non copra più questo bambino — allora il giorno in cui l'abbiamo notato, così che il mese prima che qualcosa si fermi parta da lì
- keyche cosa si sta ricordando
- valuee che cosa dice
- account_id
- guardian_keyuna chiave autorizzata ad agire per questo bambino
- added_at
- removed_at
- account_id
- device_keyla chiave di un singolo telefono. Una persona può parlare da più di uno
- agreement_keyla chiave a cui viene sigillato un messaggio, così solo quel telefono può aprirlo
- certla firma che ha fatto entrare questo telefono, conservata parola per parola così il tuo telefono può verificarla invece di credere a noi
- kindun telefono, oppure il foglio di recupero stampato
- added_at
- removed_at
- account_id
- device_keyquale dei tuoi telefoni fa squillare
- platformapns o fcm
- tokenun identificatore opaco che arriva da Apple o da Google
- updated_at
- nonce
- expires_at
- edge_hashun hash della coppia, non le due persone
- denied_at
- expires_at
- edge_hashun hash della coppia, non le due persone
- grant_recordil permesso che si sta decidendo, e le firme raccolte finora
- waiting_keydi chi manca ancora la firma
- requested_byil telefono che ha chiesto, così un telefono non può sommergere di domande una famiglia
- originscansionato di persona, oppure un genitore che agisce per il proprio figlio
- delivered_toquali telefoni ce l’hanno già
- declaredil nome scelto da chi chiede, sigillato così può leggerlo solo la famiglia che ha scansionato
- created_at
- expires_at
- id
- recipient_idl’instradamento ha bisogno di questo in chiaro
- recipient_deviceper quale dei loro telefoni è sigillata la scatola. Ogni telefono ha la sua chiave, quindi ognuno riceve la propria scatola
- sender_idcosì il telefono sa quale chiave la apre
- sender_devicequale dei loro telefoni l’ha sigillata, così la copia giusta trova la serratura giusta
- edge_hashla coppia, sotto forma di hash, così questo non si può leggere come una mappa di chi parla con chi
- sealedtesto cifrato. Non c’è nessuna colonna di testo e non ci sarà mai
- sent_at
- expires_at
- edge_hashla coppia, sotto forma di hash
- revoked_at
- recordla registrazione firmata, così un telefono rimasto offline può verificare da sé il taglio invece di fidarsi della nostra parola
- id
- account_iddi chi sta cambiando l’elenco di telefoni e di adulti
- kindsta entrando, o sta venendo tolto
- subject_keyil telefono o l’adulto di cui si parla
- subject_kindquale dei due
- agreement_keyla seconda chiave che serve a un telefono, vuota per la carta
- recordla firma vera e propria, conservata parola per parola così un telefono può verificarla invece di credere a noi
- signed_byquale chiave ha firmato
- by_authorityse ha firmato un foglio di recupero, che è quello che la fa aspettare
- issued_atil momento che dichiara chi firma, mai il nostro orologio
- reasonvuoto, a meno che chi firma non abbia scritto qualcosa
- proposed_at
- effective_atquando diventa vero, due notti dopo la proposta
- contested_at
- contested_bychi si è opposto, e con quale firma
- contest_record
- resolved_at
- resolutionapplicato o annullato, una volta risolto
- change_idquale cambiamento in attesa
- voter_keyquale adulto
- decisionlascia passare, oppure ferma
- recordla sua firma
- at
- account_iddi chi era il telefono
- device_keyla chiave che è stata rubata
- revoked_at
- recordla prova firmata, così un telefono può verificarla senza chiedere a noi
- account_idl’account che non c’è più
- retired_at
- recordla prova firmata, fatta con la chiave di quell’account prima che la chiave fosse distrutta
- account_id
- storeapple, google, oppure offerto da noi
- store_refun identificatore opaco che arriva dallo store. È l’unica cosa che ci permette di fargli una domanda più avanti
- store_ref_hashun’impronta dell’identificatore qui sopra. È quello che impedisce a una ricevuta di coprire due account
- environment
- stateactive, grace, lapsed, lapsed_trial o disabled
- seatsquanti bambini copre. Un numero, mai i loro nomi
- expires_at
- acts_at
- updated_at
- device_keyil telefono a cui non è ancora stato detto
- change_iddi quale cambiamento si tratta
- whatproposto, contestato o risolto
- account_iddi chi è l’elenco di telefoni che si è mosso. Quando lo si dice a un adulto a proposito di suo figlio, qui c’è il bambino
- subject_keyil telefono che è stato aggiunto o tolto
- effective_at
- created_at
- expires_at
- delivered_atquando siamo riusciti a dirlo, oppure vuoto perché non ci siamo riusciti
- id
- about_keydi chi parla la segnalazione. Leggibile, perché qualcuno possa intervenire
- reasonquale delle sei cose è successa, come l’ha scelta l’adulto che segnala
- csa
- sealedquello che è stato scritto, sigillato sul telefono che l’ha mandato con una chiave che sta su carta dal fondatore. Nessun server può leggerlo
- sealed_digestun’impronta della parte sigillata, così quello che si apre dopo è dimostrabilmente quello che è arrivato
- received_at
- edge_snapshotchi era stato autorizzato a raggiungere chi, e quale adulto lo aveva permesso, com’era in quel momento. Questo non si può ricostruire dopo
- reporter_keychi l’ha mandata, oppure niente del tutto quando è stata mandata senza nome
- source
- sealed_key
- receiptil riferimento che tiene chi la manda. È l’unico modo che abbiamo di rispondere a qualcuno su una segnalazione che non possiamo aprire
- acknowledged_at
- decided_at
- actioned_at
- escalated_at
- decided_by
- outcome
Colonne che non esistono
- nome
- età
- foto
- testo dei messaggi
- contenuto delle chiamate
- cronologia delle chiamate
- elenco dei contatti
- posizione
- modello del dispositivo
La tua email viene controllata una volta sola quando ti registri e sigillata nello stesso istante, con una chiave che sta su carta dal fondatore e non ha mai toccato un server. La legge ci chiede di poter dimostrare che un adulto ha dato il consenso. Noi non riusciremmo a rileggerla. Nomi e foto si scelgono su ogni telefono e passano direttamente all’altro telefono. Da noi non arrivano mai, ed è anche per questo che puoi ribattezzare il nonno “Nonnino” e noi non lo sapremo mai. Non potremmo mostrare niente di tutto questo a nessuno nemmeno volendo, e non ci si potrebbe costringere.
Questa sezione è generata dallo schema stesso del server, in accounts.ts e roster-changes.ts, i due file che creano il database. Se un giorno non fossero d’accordo, hanno ragione i file e questa pagina è un bug.
Contatti
Come si crea davvero un contatto.
Il telefono di qualcuno crea un invito usa e getta. L’altro telefono lo legge, scansionato da uno schermo nella stessa stanza oppure aperto da un link mandato da quell’adulto. Leggerlo avvia la presentazione e, nello stesso istante, registra la chiave pubblica dell’altro telefono, così da quel momento entrambi i telefoni sanno esattamente quale chiave appartiene a chi. È la parte che rende impossibile mettersi in mezzo a una chiamata successiva, anche a noi. Niente di tutto questo è collegato finché un adulto dall’altra parte non ha detto sì.
Ancora non è un contatto. Un adulto responsabile deve firmare il contatto sul proprio telefono, dietro un controllo biometrico fatto in quel momento. Quello che firma è tutto quanto. Chi, con chi, e in quale direzione. La sua firma è ciò che il server controlla prima di instradare qualsiasi cosa. Il server non ha nessuna chiave capace di firmare, quindi non può creare un contatto, e non può farlo nemmeno chi gli rubasse il database.
Quando entrambi i telefoni hanno il contatto finito, la riga viene cancellata e il contatto esiste solo sui due dispositivi. Tagliarlo più avanti scrive una revoca firmata, che è l’unica registrazione conservata a tempo indeterminato. È salvata come hash della coppia, quindi dice che un contatto è finito senza dire chi conosceva chi.
Chi altro c’entra
Tre aziende toccano una chiamata. Nessuna può sentirla.
Altre sei aziende toccano il servizio, e sono tutte elencate nella privacy policy. Tre di loro servono a far arrivare una chiamata, ed ecco che cosa ognuna di quelle tre può e non può vedere.
-
Apple & Google
Le notifiche push, così una chiamata fa squillare un telefono che dorme. Inevitabili su tutte e due le piattaforme. Portano un identificatore opaco e nient’altro. Nessun nome, nessun numero, nessun contenuto.
-
Cloudflare
Circa una chiamata su sei non riesce a collegare i due telefoni direttamente, sul Wi-Fi di un albergo o su certe reti mobili, e viene fatta rimbalzare su un relay. Il relay inoltra pacchetti cifrati che non può aprire, ma vede che due identificativi anonimi sono stati collegati, quando, per quanto tempo e da quali indirizzi. Sono metadati che noi non conserviamo, in mano a qualcun altro.
-
Noi
La tabella qui sopra. Un piccolo server nei Paesi Bassi che presenta due telefoni e poi si toglie di mezzo.