Spójność

Ważne jest, by Tink działał „tak samo” we wszystkich językach programowania. Ta koncepcja nie jest prosta, ale przede wszystkim:

Aby zachować spójność, Tink stosuje testy w różnych językach, które można znaleźć w repozytorium GitHuba na potrzeby różnych języków. Testy te sprawdzają spójność i interoperacyjność różnych języków.

Jednak definiowanie spójności nie jest tak proste, jak można by się spodziewać. Dlatego też na tej stronie podano naszą roboczą definicję. Tink zapewnia 2 rodzaje spójności:

kontekst,

Ogólnie Tink udostępnia te interfejsy API:

  • Manipulacja zestawem kluczy: Tink udostępnia interfejsy API umożliwiające dodawanie nowych kluczy do zestawu kluczy, usuwanie kluczy z zestawu i zmienianie klucza podstawowego w zestawie.

  • Serializacja zbioru kluczy: Tink udostępnia interfejsy API do serializacji zestawu kluczy do sekwencji bajtów i odwrotnie.

  • Tworzenie podstawowe: Tink udostępnia interfejs API do tworzenia interfejsu dla elementu podstawowego na podstawie zestawu kluczy. Aby np. utworzyć obiekt Aead na podstawie zbioru kluczy w języku Java, użytkownik wywołuje metodę keysetHandle.getPrimitive(Aead.class, config).

  • Użycie prymitywne: interfejs utworzony na etapie prostego tworzenia udostępnia interfejs API do wykonywania operacji kryptograficznych.

Warto zadać 2 ważne pytania dotyczące tych interfejsów API:

  • Tworzenie: czy dla danego zserializowanego zestawu kluczy, języka i elementu podstawowego można utworzyć w danym języku podstawowy zestaw kluczy na podstawie tego zestawu kluczy?

  • Ocena: jak na podstawie określonego zestawu kluczy można utworzyć obiekt podstawowy w określonym języku, jak zachowuje się ten obiekt?

Pamiętaj, że Tink nie zapewnia spójności podczas analizowania zestawu kluczy. Na przykład możliwe jest, że Tink C++

  • pomyślnie analizuje zestawy kluczy zawierające klucze CHACHA20-POLY1305, mimo że operacje AEAD CHACHA20-POLY1305 nie są zaimplementowane w Tink;
  • pomyślnie analizuje zestawy kluczy z kluczami o długości 1 bajta, które nie mogą działać w przypadku wszystkich operacji kryptograficznych.

Te zachowania mogą się zmienić w wersjach podrzędnych.

Spójność oceny

Spójność oceny jest ważniejsza niż jakakolwiek spójność w procesie tworzenia: jeśli AEAD w Javie nie może odszyfrować jego szyfrowania w C++, użytkownicy mają poważny problem.

Ogólnie rzecz biorąc, Tink ma na celu zachowanie spójności w oczywisty sposób w przypadku elementów podstawowych. Jeśli na przykład plik binarny C++ oblicza podpis z atrybutem public_key_sign->Sign(data), odpowiednie wywołanie weryfikacyjne w języku Java publicKeyVerify.verify(signature, data) powinno się powieść.

Jednak nawet w tym przypadku istnieją pewne zastrzeżenia. Na przykład zwracanym typem aead.Encrypt w języku Java jest byte[]. Zgodnie z paragrafem 10.7 specyfikacji języka Java (JLS) długość tablicy jest typu int, a zgodnie z paragrafem 4.2.1 w języku angielskim może wynosić maksymalnie 2147483647. Z tego powodu szyfrowanie tablicy o długości 2 147 483 647 w Javie kończy się niepowodzeniem: szyfrowanie wiąże się z pewnymi obciążeniami, co oznacza, że dane wyjściowe byłyby za długie. Jednak w innych językach szyfrowanie danych wejściowych może się udać.

Z tego względu Tink zapewnia spójność oceny: jeśli utworzenie elementu podstawowego w dwóch językach powiedzie się, w przypadku danego zestawu kluczy elementy podstawowe działają tak samo.

Wyjątkiem są sytuacje, w których niektóre operacje mogą się zakończyć niepowodzeniem.

Spójność tworzenia

Tworzenie elementów podstawowych nie zawsze kończy się powodzeniem w przypadku wszystkich zbiorów kluczy. Na przykład Tink nie zezwala użytkownikom na tworzenie kluczy AesSivKey, jeśli materiał klucza ma długość 128 bitów.

Niemniej jednak Tink zapewnia spójność: jeśli 2 języki obsługują typ klucza, zestaw kluczy, dla których można utworzyć element podstawowy, jest zbieżny. Oczywiście jeśli język nie obsługuje danego typu klucza, nie można utworzyć obiektu podstawowego.

Spójność tworzenia jest mniej ważna niż spójność oceny. Od tej reguły jest więcej wyjątków niż dla spójności oceny. Te ograniczenia znajdziesz na liście obsługiwanych typów kluczy. Na przykład dla typu klucza ECIES Tink oferuje możliwość wyboru krzywej eliptycznej, która ma być używana do uzgadniania klucza, natomiast Java nie obsługuje X25519. Z tego powodu utworzenie klucza X25519 w Javie kończy się niepowodzeniem.


  1. W tym dokumencie termin Keyset oznacza obiekt o nazwie KeysetHandle w większości języków.