Es importante que Tink se comporte "igual" en todos los lenguajes de programación. Este concepto no es sencillo, pero es el más importante:
Para mantener la coherencia, Tink usa pruebas entre lenguajes, que se pueden encontrar en el repositorio de GitHub entre lenguajes. Estas pruebas verifican la coherencia y la interoperabilidad de diferentes lenguajes.
Sin embargo, definir la coherencia no es tan sencillo como se espera. Por lo tanto, esta página proporciona nuestra definición de trabajo. En pocas palabras, Tink proporciona dos tipos de coherencia:
- Coherencia de la evaluación: Para un conjunto de claves1 determinado, si la creación de la primitiva se realiza correctamente en dos lenguajes, estos se comportan de la misma manera.
- Coherencia de la creación: La creación de una primitiva se realiza correctamente en un lenguaje si este admite todos los tipos de claves en un conjunto de claves, como se indica en nuestra lista de tipos de claves compatibles.
contexto
En general, Tink proporciona las siguientes APIs:
Manipulación de conjuntos de claves: Tink proporciona APIs para agregar claves nuevas a un conjunto de claves, quitar claves de un conjunto y cambiar la clave primaria en un conjunto.
Serialización de conjunto de claves: Tink proporciona APIs para serializar un conjunto de claves en una secuencia de bytes y, a la inversa, analizar un conjunto de claves a partir de una secuencia de bytes.
Creación básica: Tink proporciona una API a fin de crear una interfaz para un tipo primitivo a partir de un conjunto de claves. Por ejemplo, para crear un objeto
Aead
a partir de un conjunto de claves en Java, el usuario llama akeysetHandle.getPrimitive(Aead.class, config)
.Uso básico: La interfaz producida en el paso de creación básico proporciona una API para realizar operaciones criptográficas.
Hay dos preguntas importantes que debes hacer sobre estas APIs:
Creación: Para un conjunto de claves, un lenguaje y un primitivo serializados, ¿es posible crear el primitivo a partir de este conjunto de claves en el lenguaje?
Evaluación: Si se puede crear un primitivo en algún lenguaje a partir de un conjunto de claves determinado, ¿cómo se comporta?
Es importante tener en cuenta que Tink no proporciona coherencia cuando analiza un conjunto de claves. Por ejemplo, es posible que Tink C++
- analiza correctamente los conjuntos de claves que contienen claves CHACHA20-POLY1305, aunque las operaciones CHACHA20-POLY1305 AEAD no se hayan implementado en Tink.
- analiza correctamente los conjuntos de claves con claves que tienen una longitud de 1 byte, lo que fallará en todas las operaciones criptográficas.
Estos comportamientos pueden cambiar en versiones secundarias.
Coherencia de la evaluación
La coherencia de la evaluación es más importante que cualquier coherencia en el proceso de creación: si un AEAD en Java no puede desencriptar la encriptación del AEAD en C++, los usuarios tendrán un problema grave.
En general, Tink busca ser coherente en la forma obvia para las primitivas. Por ejemplo, si un objeto binario de C++ calcula una firma con public_key_sign->Sign(data)
, se espera que la llamada de verificación de Java correspondiente publicKeyVerify.verify(signature, data)
tenga éxito.
Sin embargo, incluso en este caso, existen algunas advertencias. Por ejemplo, el tipo de datos que se muestra de aead.Encrypt
en Java es byte[]
.
Según la Especificación del lenguaje Java (JLS) §10.7, la longitud de un array es del tipo int
, según §JLS 4.2.1 puede ser un máximo de 2,147,483,647. Por lo tanto, la encriptación de un arreglo con una longitud de 2147483647 falla en Java: la encriptación tiene cierta sobrecarga, lo que significa que el resultado sería demasiado largo. Sin embargo, en otros lenguajes, la encriptación puede tener éxito para esas entradas.
Por lo tanto, Tink proporciona coherencia de evaluación: para un conjunto de claves determinado, si la creación del tipo primitivo se realiza correctamente en dos lenguajes, ambos se comportan de la misma manera.
La excepción es que algunas operaciones pueden fallar en circunstancias excepcionales.
Coherencia en la creación
La creación de primitivas no siempre funciona correctamente para todos los conjuntos de claves. Por ejemplo, Tink no permite que los usuarios creen una AesSivKey si el material de la clave tiene una longitud de 128 bits.
Sin embargo, Tink proporciona coherencia de la siguiente manera: si dos lenguajes admiten un tipo de clave, el conjunto de claves para las que se pueden crear coincidencias se pueden crear con la primitiva. Por supuesto, si un lenguaje no admite un tipo de clave, no se puede crear ningún objeto primitivo.
La coherencia de creación es menos importante que la coherencia de la evaluación y hay más excepciones a esta regla que a la coherencia de evaluación. Estas limitaciones están documentadas en nuestra lista de tipos de claves compatibles. Por ejemplo, para el tipo de clave ECIES, Tink ofrece la opción de qué curva elíptica usar para la concordancia de claves, pero Java no es compatible con X25519. Por lo tanto, la creación de una clave con X25519 en Java falla.
-
En este documento, usamos el término
Keyset
para denotar el objeto llamadoKeysetHandle
en la mayoría de los idiomas. ↩