È importante che Tink si comporti "allo stesso modo" in tutti i linguaggi di programmazione. Questo concetto non è semplice, ma soprattutto:
Per mantenere la coerenza, Tink utilizza test cross-language che possono essere trovati nel repository GitHub cross-language. Questi test verificano la coerenza e l'interoperabilità di diverse lingue.
Tuttavia, definire la coerenza non è così semplice come ci si potrebbe aspettare. Pertanto, questa pagina fornisce la nostra definizione pratica. In sostanza, Tink fornisce due tipi di coerenza:
- Coerenza della valutazione: per un determinato keyset1, se la creazione della primitiva va a buon fine in due linguaggi, questi si comportano allo stesso modo.
- Coerenza di creazione: la creazione di una primitiva ha esito positivo in un linguaggio se questo supporta tutti i tipi di chiave in un set di chiavi, come documentato nel nostro elenco di tipi di chiave supportati.
Contesto
A livello generale, Tink fornisce le seguenti API:
Manipolazione dei set di chiavi:Tink fornisce API per aggiungere nuove chiavi a un set di chiavi, rimuovere chiavi da un set di chiavi e modificare la chiave primaria in un set di chiavi.
Serializzazione del set di chiavi:Tink fornisce API per serializzare un set di chiavi in una sequenza di byte e, viceversa, analizzare un set di chiavi da una sequenza di byte.
Creazione di primitive: Tink fornisce un'API per creare un'interfaccia per una primitiva da un set di chiavi. Ad esempio, per creare un oggetto
Aeadda un keyset in Java, l'utente chiamakeysetHandle.getPrimitive(config, Aead.class).Utilizzo della primitiva: l'interfaccia prodotta nel passaggio di creazione della primitiva fornisce un'API per eseguire operazioni di crittografia.
Ci sono due domande importanti da porsi su queste API:
Creazione: per un determinato keyset serializzato, un linguaggio e una primitiva, è possibile creare la primitiva da questo keyset nel linguaggio?
Valutazione: se è possibile creare una primitiva in un determinato linguaggio da un determinato keyset, come si comporta l'oggetto della primitiva?
È importante notare che Tink non garantisce la coerenza durante l'analisi di un keyset. Ad esempio, è possibile che Tink C++
- analizza correttamente i set di chiavi contenenti chiavi CHACHA20-POLY1305, anche se le operazioni AEAD CHACHA20-POLY1305 non sono implementate in Tink;
- analizza correttamente i set di chiavi con chiavi di lunghezza pari a 1 byte, che non riusciranno in tutte le operazioni crittografiche.
Questi comportamenti potrebbero cambiare nelle versioni secondarie.
Coerenza della valutazione
La coerenza della valutazione è più importante di qualsiasi coerenza nel processo di creazione: se un AEAD in Java non può decriptare la crittografia dell'AEAD in C++, gli utenti hanno un problema serio.
In generale, Tink mira a essere coerente nel modo ovvio per le primitive. Ad esempio, se un programma binario C++ calcola una firma con public_key_sign->Sign(data), la chiamata di verifica Java corrispondente publicKeyVerify.verify(signature, data) dovrebbe andare a buon fine.
Tuttavia, anche in questo caso ci sono alcune avvertenze. Ad esempio, il tipo restituito di aead.Encrypt in Java è byte[].
In base alla specifica del linguaggio Java (JLS) §10.7, la lunghezza di un array è di tipo int, che in base a §JLS 4.2.1 può essere al massimo 2147483647. Pertanto, la crittografia di un array con una lunghezza di 2147483647 non va a buon fine in Java: la crittografia ha un overhead, il che significa che l'output sarebbe troppo lungo. Tuttavia, in altri linguaggi la crittografia
è consentita per questi input.
Pertanto, Tink fornisce la coerenza della valutazione: per un determinato keyset, se la creazione della primitiva riesce in due lingue, si comportano allo stesso modo.
L'eccezione è che alcune operazioni potrebbero non riuscire in alcune circostanze eccezionali.
Coerenza della creazione
La creazione di primitive non va sempre a buon fine per tutti i set di chiavi. Ad esempio, Tink non consente agli utenti di creare un AesSivKey se il materiale della chiave ha una lunghezza di 128 bit.
Tuttavia, Tink garantisce la coerenza nel seguente modo: se due linguaggi supportano entrambi un tipo di chiave, l'insieme di chiavi per cui è possibile creare la primitiva coincide. Naturalmente, se un linguaggio non supporta un tipo di chiave, non è possibile creare un oggetto primitivo.
La coerenza della creazione è meno importante della coerenza della valutazione e ci sono più eccezioni a questa regola rispetto alla coerenza della valutazione. Queste limitazioni sono documentate nel nostro elenco di tipi di chiavi supportati. Ad esempio, per il tipo di chiave ECIES, Tink offre la possibilità di scegliere quale curva ellittica utilizzare per l'accordo chiave, ma Java non supporta X25519. Pertanto, la creazione di una chiave utilizzando X25519 in Java non va a buon fine.
-
In questo documento, utilizziamo il termine
Keysetper indicare l'oggetto chiamatoKeysetHandlenella maggior parte delle lingue. ↩