Tutarlılık

Tink'in tüm programlama dillerinde "aynı" şekilde davranması önemlidir. Bu, açık olmayan bir kavramdır, ancak en önemlisi şudur:

Tink, tutarlılığı korumak için diller arası GitHub deposunda bulunan diller arası testler kullanır. Bu testler, farklı dillerin tutarlılığını ve birlikte çalışabilirliğini doğrular.

Ancak tutarlılığı tanımlamak beklediğiniz kadar kolay değildir. Dolayısıyla bu sayfada işleyiş tanımımızı bulabilirsiniz. Tink temel olarak iki tür tutarlılık sağlar:

İçerik

Tink, genel olarak aşağıdaki API'leri sunar:

  • Anahtar kümesi değiştirme: Tink, anahtar kümesine yeni anahtarlar eklemek, anahtar kümelerinden anahtarları kaldırmak ve anahtar kümesindeki birincil anahtarı değiştirmek için API'ler sağlar.

  • Anahtar kümesi serileştirme: Tink, bir anahtar kümesini bayt dizisine göre serileştirmek ve bir anahtar kümesini bayt dizisinden tersi şekilde ayrıştırmak için API'ler sağlar.

  • Primitive oluşturma: Tink, bir tuş kümesinden basit öğe için arayüz oluşturmak amacıyla API sağlar. Örneğin, Java'daki bir anahtar kümesinden Aead nesnesi oluşturmak için kullanıcı keysetHandle.getPrimitive(Aead.class, config) yöntemini çağırır.

  • Temel kullanım: Temel oluşturma adımında oluşturulan arayüz, şifreleme işlemleri gerçekleştirmek için bir API sağlar.

Bu API'ler hakkında sorulacak iki önemli soru vardır:

  • Oluşturma: Belirli bir serileştirilmiş anahtar kümesi, dil ve temel öğe için dilde bu anahtar kümesinden temel öğe oluşturulması mümkün mü?

  • Değerlendirme: Belirli bir anahtar kümesinden bir temel öğe oluşturulabiliyorsa temel nesne nasıl davranır?

Tink'in, anahtar kümesini ayrıştırırken tutarlılık sağlamadığını unutmamak önemlidir. Örneğin, Tink C++

  • CHACHA20-POLY1305 AEAD işlemleri Tink'te uygulanmasa bile, CHACHA20-POLY1305 anahtarları içeren anahtar kümelerini başarıyla ayrıştırır;
  • 1 bayt uzunluğunda anahtarlarla anahtar kümelerini başarıyla ayrıştırır ve bu işlem tüm şifreleme işlemlerinde başarısız olur.

Alt sürümlerde bu davranışlar değişebilir.

Değerlendirme tutarlılığı

Değerlendirmenin tutarlılığı, oluşturma sürecindeki tüm tutarlılıklardan daha önemlidir: Java'daki bir AEAD, C++'ta AEAD şifrelemesinin şifresini çözemezse kullanıcıların ciddi bir sorunu vardır.

Tink, temel olarak genel olarak basit öğelerin kullandığı yöntemde tutarlı olmayı amaçlar. Örneğin, bir C++ ikili programı public_key_sign->Sign(data) ile bir imza hesaplarsa ilgili Java doğrulama çağrısının publicKeyVerify.verify(signature, data) başarılı olması beklenir.

Ancak burada bile dikkat edilmesi gereken bazı noktalar vardır. Örneğin, Java'da aead.Encrypt dönüş türü byte[] olur. Java Dil Spesifikasyonu (JLS) §10.7 uyarınca bir dizinin uzunluğu int türündedir. §JLS 4.2.1'e göre dizinin uzunluğu en fazla 2147483647 olabilir. Bu nedenle, 2147483647 uzunluğunda bir dizinin şifrelenmesi Java'da başarısız olur. Şifreleme bir miktar ek yükü içerir, yani çıkışın çok uzun olması gerekir. Bununla birlikte, şifrelemenin diğer dillerde bu tür girişler için başarılı olmasına izin verilir.

Bu nedenle Tink, değerlendirme tutarlılığı sağlar: Belirli bir anahtar kümesi için iki dilde ilkel öğe başarıyla oluşturulursa aynı şekilde davranırlar.

Bunun istisnası, bazı işlemlerin bazı istisnai durumlarda başarısız olabilmesidir.

Oluşturma tutarlılığı

Temel öğelerin oluşturulması, tüm anahtar kümelerinde her zaman başarılı olmayabilir. Örneğin, anahtar materyalinin uzunluğu 128 bit iseTink, kullanıcıların AesSivKey oluşturmasına izin vermez.

Bununla birlikte Tink, şu şekilde tutarlılık sağlar: İki dil de bir anahtar türünü destekliyorsa temel öğenin oluşturulabileceği anahtar grubu çakışır. Elbette, bir dil anahtar türünü desteklemiyorsa temel nesne oluşturulamaz.

Oluşturma tutarlılığı, değerlendirme tutarlılığından daha az önemlidir ve bu kuralın değerlendirme tutarlılığından daha fazla istisnası vardır. Bu sınırlamalar, desteklenen anahtar türleri listemizde açıklanmıştır. Örneğin, ECIES anahtar türünde Tink, anahtar anlaşması için hangi elips biçimli eğrinin kullanılacağını belirtir, ancak Java, X25519'u desteklemez. Bu nedenle, Java'da X25519 kullanılarak anahtar oluşturulamaz.


  1. Bu belgede, çoğu dilde KeysetHandle adlı nesneyi belirtmek için Keyset terimi kullanılmıştır.