Tink'in tüm programlama dillerinde "aynı" şekilde davranması önemlidir. Bu kavramı anlamak kolay değildir ancak en önemli noktalar şunlardır:
Tink, tutarlılığı korumak için diller arası GitHub deposunda bulunan diller arası testleri kullanır. Bu testler, farklı dillerin tutarlılığını ve birlikte çalışabilirliğini doğrular.
Ancak tutarlılığı tanımlamak beklendiği kadar kolay değildir. Bu nedenle, bu sayfada çalışma tanımımız verilmiştir. Tink temel olarak iki tür tutarlılık sağlar:
- Değerlendirme tutarlılığı: Belirli bir anahtar grubu1 için temel öğenin oluşturulması iki dilde başarılı olursa aynı şekilde davranırlar.
- Oluşturma tutarlılığı: Bir dil, anahtar grubundaki tüm anahtar türlerini destekliyorsa o dilde temel öğe oluşturma işlemi başarılı olur. Bu konu, desteklenen anahtar türleri listemizde açıklanmıştır.
Bağlam
Tink, genel olarak aşağıdaki API'leri sağlar:
Anahtar grubu üzerinde işlem yapma: Tink, anahtar grubuna yeni anahtar ekleme, anahtar grubundan anahtar kaldırma ve anahtar grubundaki birincil anahtarı değiştirme için API'ler sunar.
Anahtar grubu serileştirme: Tink, bir anahtar grubunu bayt dizisine serileştirmek ve bayt dizisindeki bir anahtar grubunu ayrıştırmak için API'ler sağlar.
Temel öğe oluşturma: Tink, bir anahtar grubundan temel öğe için arayüz oluşturmaya yönelik bir API sağlar. Örneğin, Java'da bir anahtar grubundan
Aeadnesnesi oluşturmak için kullanıcıkeysetHandle.getPrimitive(config, Aead.class)yöntemini çağırır.Temel öğe kullanımı: Temel öğe oluşturma adımında üretilen arayüz, kriptografik işlemleri gerçekleştirmek için bir API sağlar.
Bu API'lerle ilgili sorulması gereken iki önemli soru vardır:
Oluşturma: Belirli bir serileştirilmiş anahtar grubu, dil ve temel öğe için, dildeki bu anahtar grubundan temel öğeyi oluşturmak mümkün mü?
Değerlendirme: Belirli bir anahtar grubundan bir dilde temel öğe oluşturulabiliyorsa temel nesne nasıl davranır?
Tink'in, anahtar grubu ayrıştırırken tutarlılık sağlamadığını belirtmek önemlidir. Örneğin, Tink C++'ın
- CHACHA20-POLY1305 AEAD işlemleri Tink'te uygulanmasa bile CHACHA20-POLY1305 anahtarları içeren anahtar gruplarını başarıyla ayrıştırır.
- 1 bayt uzunluğunda anahtarlar içeren anahtar kümelerini başarıyla ayrıştırır. Bu anahtarlar tüm kriptografik işlemlerde başarısız olur.
Bu davranışlar alt sürümlerde değişebilir.
Değerlendirme tutarlılığı
Değerlendirmenin tutarlılığı, oluşturma sürecindeki tutarlılıktan daha önemlidir: Java'daki bir AEAD, C++'taki AEAD'nin şifrelemesini çözemezse kullanıcılar ciddi bir sorun yaşar.
Genel olarak Tink, temel öğeler için belirgin bir şekilde tutarlı olmayı amaçlar. Örneğin, bir C++ ikili programı public_key_sign->Sign(data) ile bir imza hesaplarsa karşılık gelen Java doğrulama çağrısının (publicKeyVerify.verify(signature, data)) başarılı olması beklenir.
Ancak bu durumda bile dikkat edilmesi gereken bazı noktalar vardır. Örneğin, Java'da aead.Encrypt işlevinin dönüş türü byte[]'dir.
Java Dil Spesifikasyonu (JLS) §10.7'ye göre bir dizinin uzunluğu int türündedir ve §JLS 4.2.1'e göre maksimum 2147483647 olabilir. Bu nedenle, Java'da 2.147.483.647 uzunluğundaki bir dizinin şifrelenmesi başarısız olur. Şifreleme, ek yük oluşturur. Bu da çıkışın çok uzun olacağı anlamına gelir. Ancak diğer dillerde bu tür girişler için şifreleme başarılı olur.
Bu nedenle Tink, değerlendirme tutarlılığı sağlar: Belirli bir anahtar grubu için temel öğenin oluşturulması iki dilde başarılı olursa aynı şekilde davranırlar.
Bazı istisnai durumlarda bazı işlemler başarısız olabilir.
İçerik üretme tutarlılığı
Temel öğelerin oluşturulması her zaman tüm anahtar kümeleri için başarılı olmaz. Örneğin, anahtar materyalinin uzunluğu 128 bit ise Tink, 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ığına kıyasla daha fazla istisnası vardır. Bu sınırlamalar, desteklenen anahtar türleri listemizde belgelenmiştir. Örneğin, ECIES anahtar türü için Tink, anahtar anlaşması için hangi eliptik eğrinin kullanılacağını seçme imkanı sunar ancak Java, X25519'u desteklemez. Bu nedenle, Java'da X25519 kullanılarak anahtar oluşturma işlemi başarısız olur.
-
Bu belgede, çoğu dilde
KeysetHandleolarak adlandırılan nesneyi belirtmek içinKeysetterimini kullanıyoruz. ↩