Tink harus berperilaku "sama" di semua bahasa pemrograman. Konsep ini tidak mudah, tetapi yang paling penting:
Untuk menjaga konsistensi, Tink menggunakan pengujian lintas bahasa yang dapat ditemukan di repositori GitHub lintas bahasa. Pengujian ini memverifikasi konsistensi dan interoperabilitas berbagai bahasa.
Namun, menentukan konsistensi tidak sesederhana yang diperkirakan. Oleh karena itu, halaman ini memberikan definisi kerja kami. Pada dasarnya, Tink menyediakan dua jenis konsistensi:
- Konsistensi evaluasi: Untuk keyset1 tertentu, jika pembuatan primitif berhasil dalam dua bahasa, keduanya akan berperilaku sama.
- Konsistensi pembuatan: Pembuatan primitif berhasil dalam suatu bahasa jika bahasa tersebut mendukung semua jenis kunci dalam keyset, seperti yang didokumentasikan dalam daftar jenis kunci yang didukung.
Konteks
Pada level tinggi, Tink menyediakan API berikut:
Manipulasi keyset: Tink menyediakan API untuk menambahkan kunci baru ke keyset, menghapus kunci dari keyset, dan mengubah kunci utama dalam keyset.
Serialisasi keyset: Tink menyediakan API untuk melakukan serialisasi keyset ke urutan byte, dan sebaliknya mengurai keyset dari urutan byte.
Pembuatan primitif: Tink menyediakan API untuk membuat antarmuka bagi primitif dari keyset. Misalnya, untuk membuat objek
Aeaddari keyset di Java, pengguna memanggilkeysetHandle.getPrimitive(config, Aead.class).Penggunaan primitif: Antarmuka yang dihasilkan dalam langkah pembuatan primitif menyediakan API untuk melakukan operasi kriptografi.
Ada dua pertanyaan penting yang perlu diajukan terkait API ini:
Pembuatan: Untuk keyset, bahasa, dan primitif yang diserialisasi, apakah mungkin untuk membuat primitif dari keyset ini dalam bahasa tersebut?
Evaluasi: Jika primitif dapat dibuat dalam beberapa bahasa dari keyset tertentu, bagaimana perilaku objek primitif?
Penting untuk diperhatikan bahwa Tink tidak memberikan konsistensi saat mengurai keyset. Misalnya, Tink C++ mungkin
- berhasil mengurai keyset yang berisi kunci CHACHA20-POLY1305, meskipun operasi AEAD CHACHA20-POLY1305 tidak diimplementasikan di Tink;
- berhasil mengurai keyset dengan kunci yang memiliki panjang 1 byte, yang akan gagal dalam semua operasi kriptografi.
Perilaku ini dapat berubah dalam versi minor.
Konsistensi evaluasi
Konsistensi evaluasi lebih penting daripada konsistensi apa pun dalam proses pembuatan: jika AEAD di Java tidak dapat mendekripsi enkripsi AEAD di C++, pengguna akan mengalami masalah serius.
Secara umum, Tink bertujuan untuk konsisten dengan cara yang jelas untuk primitif. Misalnya, jika biner C++ menghitung tanda tangan dengan public_key_sign->Sign(data), panggilan verifikasi Java publicKeyVerify.verify(signature, data) yang sesuai diharapkan akan berhasil.
Namun, bahkan di sini ada beberapa peringatan. Misalnya,
jenis nilai yang ditampilkan aead.Encrypt di Java adalah byte[].
Sesuai dengan Java Language Specification (JLS) §10.7, panjang array adalah
jenis int yang sesuai dengan §JLS 4.2.1 dapat memiliki maksimum 2147483647. Oleh karena itu,
enkripsi array dengan panjang 2147483647 gagal di Java: enkripsi
memiliki beberapa overhead, yang berarti
outputnya akan terlalu panjang. Namun, dalam bahasa lain, enkripsi
diizinkan untuk berhasil untuk input tersebut.
Oleh karena itu, Tink memberikan konsistensi evaluasi: Untuk keyset tertentu, jika pembuatan primitif berhasil dalam dua bahasa, keduanya akan berperilaku sama.
Pengecualiannya adalah beberapa operasi mungkin gagal dalam beberapa keadaan luar biasa.
Konsistensi pembuatan
Pembuatan primitif tidak selalu berhasil untuk semua keyset. Misalnya, Tink tidak mengizinkan pengguna membuat AesSivKey jika materi kunci memiliki panjang 128 bit.
Meskipun demikian, Tink memberikan konsistensi sebagai berikut: jika dua bahasa mendukung jenis kunci, set kunci yang dapat dibuat primitifnya akan bertepatan. Tentu saja, jika bahasa tidak mendukung jenis kunci, objek primitif tidak dapat dibuat.
Konsistensi pembuatan kurang penting dibandingkan konsistensi evaluasi, dan ada lebih banyak pengecualian untuk aturan ini daripada konsistensi evaluasi. Batasan ini didokumentasikan dalam daftar jenis kunci yang didukung. Misalnya, untuk jenis kunci ECIES, Tink menawarkan pilihan kurva elips yang akan digunakan untuk perjanjian kunci, tetapi Java tidak mendukung X25519. Oleh karena itu, pembuatan kunci menggunakan X25519 di Java akan gagal.
-
Dalam dokumen ini, kami menggunakan istilah
Keysetuntuk menunjukkan objek yang disebutKeysetHandledalam sebagian besar bahasa. ↩