Formato cavo Tink

Questa pagina descrive il formato di trasmissione di Tink per le chiavi e l'output primitivo. La documentazione è rivolta ai crittografisti che vogliono aggiungere altre lingue a Tink e ai manutentori di altre librerie di crittografia di alto livello che vogliono una modalità compatibile con Wire. Non è destinato al pubblico generico.

Serializzazione del set di chiavi

Tink utilizza Google protobuf per serializzare i set di chiavi.

  • Un set di chiavi serializzato in formato binario è un proto Keyset serializzato definito in tink.proto. La proprietà del valore KeyData di una chiave è un proto serializzato del tipo di chiave corrispondente.
  • Un keyset serializzato in JSON è un proto Keyset serializzato in formato JSON. Tieni presente che il valore KeyData è ancora un proto serializzato binario.
  • Un set di chiavi criptato è un proto EncryptedKeyset serializzato definito in tink.proto. Contiene un insieme di chiavi serializzato binario criptato e, facoltativamente, alcuni metadati KeysetInfo non criptati.

Prefisso output Tink

La maggior parte delle primitive Tink supporta un prefisso di output di 5 byte composto da:

  • Versione 1 byte: 0x01
  • Suggerimento chiave di 4 byte: si tratta dell'ID chiave della chiave utilizzata.

Alcune chiavi precedenti potrebbero supportare anche il byte di versione 0x00.

Tieni presente che questo prefisso non è autenticato e non può essere considerato attendibile per motivi di sicurezza. Tink lo utilizza come suggerimento per velocizzare la decrittografia o la verifica.

AEAD

In generale, Tink formatta le cifre AEAD come:

prefix || IV || ciphertext || tag

salvo diversa indicazione nell'RFC corrispondente. prefix è vuoto o un prefisso di output Tink di 5 byte.

AES-CTR-HMAC

Per AES-CTR-HMAC, Tink calcola il MAC con i dati associati (AD) come segue:

AD || IV || ciphertext || bitlen(AD)

dove bitlen(AD) è la lunghezza dell'annuncio in bit rappresentata come numero intero non firmato a 64 bit in big endian. Questo schema HMAC segue la bozza per AES-CBC-HMAC di Mcgrew.

AEAD deterministico

Tink implementa RFC 5297 per AES-SIV, inserendo il vettore di inizializzazione sintetico (SIV) all'inizio del testo cifrato. L'elemento primitivo potrebbe aggiungere un prefisso di output Tink di 5 byte.

Sebbene RFC 5297 supporti un elenco di dati associati, Tink supporta solo esattamente un dato associato, che corrisponde a un elenco con un elemento in RFC 5297. Dati associati vuoti è un elenco con un elemento vuoto e non un elenco vuoto.

AEAD in streaming

Vedi AES-CTR HMAC e AES-GCM-HKDF.

Crittografia envelope

La crittografia dell'involucro cripta i dati con una chiave di crittografia dei dati DEK utilizzando le primitive AEAD di Tink. La crittografia funziona nel seguente modo:

  • Viene generato un nuovo DEK utilizzando un determinato modello di chiave (o parametri chiave).
  • DEK viene serializzato in una stringa di byte. Il formato di serializzazione della serializzazione del buffer di protocollo del tipo di chiave proto. Ad esempio, si tratta di un messaggio Protocol Buffer AesGcmKey serializzato definito in aes_gcm.proto per la DEK di tipo di chiave AES GCM. Per informazioni su come serializzare un buffer di protocollo, consulta la sezione Serializzazione dei buffer di protocollo.
  • Il DEK serializzato viene criptato da un fornitore esterno (ad esempio Google Cloud) in un encrypted DEK.
  • DEK viene utilizzato per criptare il testo non criptato con i dati associati in ciphertext. Pertanto, ciphertext ha lo stesso formato della primitiva AEAD corrispondente a DEK.

Il formato di output della crittografia envelope è il seguente:

encrypted DEK length || encrypted DEK || ciphertext

encrypted DEK length è costituito da 4 byte che memorizzano la lunghezza di encrypted DEK come numero intero big endian a 32 bit.

MAC

Tink segue le RFC corrispondenti. I primi possono aggiungere un prefisso di output Tink di 5 byte al tag.

Set PRF

Tink segue le RFC corrispondenti. Tieni presente che per l'insieme PRF il tipo di chiave è diverso da quello della chiave MAC dello stesso algoritmo perché non include la lunghezza dell'output. Le chiavi del set PRF non aggiungono mai un prefisso di output Tink. In questo modo, l'output è effettivamente un file PRF.

Crittografia ibrida

Il formato generale del cavo per la crittografia ibrida di Tink è il seguente:

prefix || encapsulated_key || encrypted_data

prefix è vuoto o un prefisso di output Tink di 5 byte. Ogni tipo di chiave contiene le informazioni su quanti byte analizzare e su come analizzarli da encapsulated_key.

HPKE (Hybrid Public Key Encryption)

Tink segue lo standard HPKE definito nel documento RFC 9180. Una suite di crittografia HPKE include le seguenti tre primitive.

  • Meccanismo di incapsulamento delle chiavi (KEM)
  • Funzione di derivazione della chiave (KDF)
  • Crittografia autenticata con dati associati (AEAD)

Lo standard HPKE non definisce un formato generale per i dati in RFC 9180, sezione 10. L'implementazione HPKE di Tink utilizza i seguenti valori encapsulated_key e encrypted_data.

  • encapsulated_key
    • Chiave pubblica serializzata del mittente
    • Definite come enc nella RFC 9180, sezione 4.1
    • Formato determinato dal KEM HPKE specifico utilizzato
  • encrypted_data
    • Testo criptato e tag (ad es. ciphertext || tag senza IV)
    • Definito come ct nella sezione 4 del documento RFC 9180
    • Formato determinato dall'AEAD HPKE specifico utilizzato
KEM basato su Diffie-Hellman X25519

Per le chiavi DHKEM X25519, il valore enc è la chiave pubblica Diffie-Hellman di 32 byte del mittente.

ECIES-AEAD-HKDF

Per l'implementazione ECIES-AEAD-HKDF di Tink, encapsulated_key è l'output del meccanismo di incapsulamento delle chiavi (KEM) e encrypted_data è l'output del meccanismo di incapsulamento dei dati (DEM).

KEM

A seconda del tipo di chiave, Tink utilizza punti di curve ellittiche compressi e non compressi, in base agli standard di codifica RFC 8422/ANSI.X9-62.2005. Per i punti non compressi, il byte 0x04 è seguito dalle coordinate x e y come numeri interi di dimensioni fisse. Per le coordinate compresse, viene utilizzato il byte 0x02 o 0x03 e la coordinata x come numero intero di dimensioni fisse. Per X25519 viene utilizzata la definizione della RFC 7748 (coordinate x come numero intero di dimensioni fisse).

DEM

Per encrypted_data, Tink utilizza lo stesso formato dell'AEAD. È inclusa anche la specifica di un IV.

Derivazione delle chiavi

Innanzitutto viene calcolata la coordinata x x_ss del punto condiviso. La chiave per il AEAD viene impostata su:

HKDF(ikm = encapsulated_key || x_ss, salt = salt_of_key, info = context_info, length = dem_key_size)

dove encapsulated_key è l'output completo del KEM in byte.

Firme digitali

Tink segue le RFC corrispondenti. I primi possono aggiungere un prefisso di output Tink di 5 byte al tag generato.

ECDSA

A seconda del campo EcdsaSignatureEncoding nella chiave, il formato di una firma ECDSA è IEEE P1363 o ASN.1 DER.

Il formato della firma IEEE P1363 è r || s, dove r e s sono con spaziatura zero e hanno le stesse dimensioni in byte dell'ordine della curva. Ad esempio, per la curva NIST P-256, r e s sono riempiti con zeri fino a 32 byte.

La firma DER è codificata utilizzando ASN.1:

ECDSA-Sig-Value :: = SEQUENCE { r INTEGER, s INTEGER }

In particolare, la codifica è:

0x30 || totalLength || 0x02 || r's length || r || 0x02 || s's length || s

Tink segue le best practice per la verifica delle firme, accettando solo firme ECDSA con codifica DER (le firme con codifica BER alternativa non sono valide).

In questo modo è possibile evitare attacchi di malleabilità della firma, che spesso colpiscono i sistemi di criptovaluta.