veil

Verifica file e rilasci firmati

Controlla un download con la firma che lo accompagna e la scheda che tiene la chiave: nel browser, con le API o in un flusso di GitHub.

Su veil.rip/verify scegli File o rilascio e trascina il file con la sua firma, oppure incolla la firma. Il tuo browser calcola l’hash del file a pezzi e non lo carica mai. Legge la firma, trova la scheda che tiene la chiave, controlla la scheda con il registro pubblico e i suoi testimoni, e poi dice chi ha firmato, con quale chiave e se quella chiave è sulla scheda oggi.

Legge quattro tipi di firma. Una firma SSH fatta per i file con ssh-keygen -Y sign -n file. Una firma staccata OpenPGP (.asc o .sig) o un testo firmato in chiaro. Un file .minisig, nella forma prefirmata o in quella legacy. Un blocco di Veil il cui messaggio è sha256:<hex> <nome>, oppure un elenco di checksum.

cURL
ssh-keygen -Y sign -n file -f ~/.ssh/id_ed25519 veil-1.2.tar.gz
gpg --armor --detach-sign veil-1.2.tar.gz
minisign -Sm veil-1.2.tar.gz

Una firma OpenPGP dichiara una data, scritta dall’orologio di chi firma. La pagina controlla lo stato della chiave a quella data e dice che la data viene da chi firma, perché chi ha una chiave rubata può scriverne una qualunque. Le firme SSH e minisign non hanno data, quindi per una chiave che la scheda ha tolto la pagina non sa dire se ha firmato prima della rimozione.

Un rilascio con un elenco di checksum#

Firma un solo file SHA256SUMS o SHA512SUMS invece di ogni download. Trascina l’elenco, la sua firma e i file che hai scaricato: la pagina controlla la firma una volta, poi ogni file con la sua riga, ed elenca i file che corrispondono, quelli che non corrispondono, quelli che l’elenco non nomina e le righe senza file.

cURL
sha256sum veil-1.2.tar.gz veil-1.2.zip > SHA256SUMS
gpg --armor --detach-sign SHA256SUMS

Firma con la tua scheda#

Sulla tua scheda, accanto a Firma un messaggio, Firma un file calcola l’hash di un file nel tuo browser e firma sha256:<hex> <nome> con la chiave di dispositivo di questo browser, come blocco di Veil. Firma un rilascio fa lo stesso per più file: scrive il loro elenco SHA256SUMS e lo firma come blocco. Pubblica il blocco accanto ai file.

La pagina di un rilascio può avere un link a veil.rip/verify?u=<scheda>&sha256=<hex>. La pagina si apre con la scheda e l’hash atteso già scritti, e chi visita trascina il file, che resta nel suo browser. veil.rip/verify#b=<blocco> apre allo stesso modo un blocco di Veil, e nessun server vede quello che segue il #.

Chiedi alle API#

POST /v1/verify prende la firma con gli hash del file, che calcoli tu: il server non vede mai il file. Da un hash controlla le firme SSH, le firme minisign prefirmate e i blocchi di Veil, e su un elenco di checksum che mandi controlla ogni formato. Una firma staccata OpenPGP o una firma minisign legacy del file stesso risponde 422 file_needed, perché solo i byte la possono controllare.

cURL
sha512=$(sha512sum veil-1.2.tar.gz | cut -d' ' -f1)
jq -n --rawfile sig veil-1.2.tar.gz.sig --arg h "$sha512" \
  '{signature: $sig, sha512: $h, name: "veil-1.2.tar.gz"}' \
  | curl -fsS https://veil.rip/v1/verify --json @-

In un flusso di GitHub#

L’azione in integrations/github-action-veil-verify controlla i file e le firme di un rilascio in un job e lo fa fallire con una firma sbagliata, un file che non corrisponde al suo elenco o un file senza firma. Legge le chiavi della scheda da GET /u/{card}/keys.txt e verifica sulla macchina del job, quindi vanno bene file di qualunque dimensione.