È importante che Tink si comporti "come" in tutti i linguaggi di programmazione. Questo concetto non è semplice, ma soprattutto:
Per mantenere la coerenza, Tink utilizza test in più lingue disponibili nel repository GitHub multilingue. Questi test verificano la coerenza e l'interoperabilità delle diverse lingue.
Tuttavia, definire la coerenza non è così semplice come ci si aspetterebbe. Pertanto, questa pagina fornisce la nostra definizione operativa. In pratica, Tink offre due tipi di coerenza:
- Coerenza della valutazione: per un determinato set di chiavi1, se la creazione della primitiva ha esito positivo in due lingue, il comportamento è lo stesso.
- Coerenza di creazione: la creazione di una primitiva ha esito positivo in una lingua se supporta tutti i tipi di chiave in un set di chiavi, come documentato nel nostro elenco di tipi di chiavi supportati.
Contesto
A livello generale, Tink fornisce le seguenti API:
Manipolazione del set di chiavi: Tink fornisce le API per aggiungere nuove chiavi a un set di chiavi, rimuovere le chiavi da un set e modificare la chiave primaria in un set di chiavi.
Serializzazione del set di chiavi: Tink fornisce le API per serializzare un set di chiavi in una sequenza di byte e, al contrario, analizza un set di chiavi da una sequenza di byte.
Primitive Creation: Tink fornisce un'API per creare un'interfaccia per una primitiva da un set di chiavi. Ad esempio, per creare un oggetto
Aead
da un set di chiavi in Java, l'utente chiamakeysetHandle.getPrimitive(Aead.class, config)
.Utilizzo primitivo: l'interfaccia prodotta nel passaggio di creazione primitivo fornisce un'API per eseguire operazioni crittografiche.
È necessario porti due domande importanti su queste API:
Creazione: per un determinato set di chiavi serializzato, linguaggio e primitiva, è possibile creare la primitiva da questo set di chiavi nel linguaggio?
Valutazione: se una primitiva può essere creata in un determinato linguaggio a partire da un determinato set di chiavi, come si comporta l'oggetto primitivo?
È importante notare che Tink non fornisce coerenza durante l'analisi di un set di chiavi. 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 della lunghezza di 1 byte, operazione che non riesce in tutte le operazioni crittografiche.
Questi comportamenti potrebbero cambiare nelle versioni secondarie.
Coerenza della valutazione
La coerenza nella valutazione è più importante di qualsiasi coerenza nel processo di creazione: se un AEAD in Java non è in grado di decriptare la crittografia dell'AEAD in C++, gli utenti riscontrano un serio problema.
In generale, Tink mira a essere ovvio in modo coerente per le primitive. Ad esempio, se un programma binario di C++ calcola una firma con public_key_sign->Sign(data)
, la chiamata di verifica Java publicKeyVerify.verify(signature, data)
corrispondente dovrebbe avere esito positivo.
Tuttavia, anche qui ci sono alcune avvertenze. Ad esempio,
il tipo restituito di aead.Encrypt
in Java è byte[]
.
Secondo Java Language Specification (JLS) §10.7, la lunghezza di un array è di tipo int
, che in base a §JLS 4.2.1 può essere al massimo 2147483647. Di conseguenza, in Java la crittografia di un array con una lunghezza di 2147483647 non va a buon fine: la crittografia ha un certo overhead, il che significa che l'output sarebbe troppo lungo. Ciononostante, in altre lingue la crittografia
può avere successo per questi input.
Quindi, Tink fornisce coerenza di valutazione: per un determinato set di chiavi, se la creazione della primitiva ha esito positivo in due lingue, il comportamento è lo stesso.
L'unica eccezione è che alcune operazioni potrebbero non riuscire in determinate circostanze eccezionali.
Coerenza della creazione
La creazione di primitive non sempre riesce per tutti i set di chiavi. Ad esempio, Tink non consente agli utenti di creare un oggetto AesSivKey se il materiale della chiave ha una lunghezza di 128 bit.
Tuttavia, Tink fornisce coerenza come segue: se due linguaggi supportano entrambi un tipo di chiave, il set di chiavi per cui è possibile creare la primitiva coincide. Naturalmente, se un linguaggio non supporta un tipo di chiave, non è possibile creare oggetti primitivi.
La coerenza della creazione è meno importante della coerenza della valutazione e esistono più eccezioni a questa regola rispetto alla coerenza della valutazione. Queste limitazioni sono documentate nel nostro elenco dei tipi di chiavi supportati. Ad esempio, per il tipo di chiave ECIES, Tink consente di scegliere quale curva ellittica utilizzare per l'accordo sulla chiave, ma Java non supporta X25519. Di conseguenza, la creazione di una chiave utilizzando X25519 in Java non va a buon fine.
-
In questo documento, utilizziamo il termine
Keyset
per indicare l'oggetto denominatoKeysetHandle
nella maggior parte delle lingue.↩