Konsistensi

Tink harus berperilaku "sama" dalam semua bahasa pemrograman. Konsep ini tidak mudah dipahami, tetapi yang paling penting:

Untuk mempertahankan konsistensi, Tink menggunakan pengujian lintas bahasa yang dapat ditemukan di repositori GitHub lintas bahasa. Pengujian ini memverifikasi konsistensi dan interoperabilitas dari berbagai bahasa.

Namun, menentukan konsistensi tidak semudah yang diharapkan. Oleh karena itu, halaman ini memberikan definisi dasar. Pada dasarnya, Tink menyediakan dua jenis konsistensi:

Konteks

Pada tingkat 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 membuat serialisasi keyset ke urutan byte, dan sebaliknya mengurai kumpulan kunci dari urutan byte.

  • Pembuatan primitif: Tink menyediakan API untuk membuat antarmuka bagi primitif dari keyset. Misalnya, untuk membuat objek Aead dari keyset di Java, pengguna akan memanggil keysetHandle.getPrimitive(Aead.class, config).

  • Penggunaan primitif: Antarmuka yang dihasilkan dalam langkah pembuatan primitif menyediakan API untuk melakukan operasi kriptografi.

Ada dua pertanyaan penting yang perlu diajukan tentang API ini:

  • Pembuatan: Untuk keyset, bahasa, dan primitif serial tertentu, apakah mungkin membuat primitif dari keyset ini dalam bahasa tersebut?

  • Evaluasi: Jika primitif dapat dibuat dalam bahasa tertentu dari keyset tertentu, bagaimana perilaku objek primitif tersebut?

Perlu diperhatikan bahwa Tink tidak memberikan konsistensi saat mengurai keyset. Misalnya, ada kemungkinan bahwa Tink C++

  • berhasil mengurai keyset yang berisi kunci CHACHA20-POLY1305, meskipun operasi AEAD CHACHA20-POLY1305 tidak diterapkan 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 dalam proses pembuatan: jika AEAD di Java tidak dapat mendekripsi enkripsi AEAD dalam C++, pengguna memiliki masalah serius.

Secara umum, Tink bertujuan untuk konsisten dengan cara yang sudah jelas untuk primitif. Misalnya, jika biner C++ menghitung tanda tangan dengan public_key_sign->Sign(data), publicKeyVerify.verify(signature, data) panggilan verifikasi Java yang sesuai diharapkan akan berhasil.

Namun, bahkan di sini ada beberapa peringatan. Misalnya, jenis nilai yang ditampilkan aead.Encrypt di Java adalah byte[]. Sesuai Spesifikasi Bahasa Java (JLS) §10.7, panjang array berjenis int, yang per §JLS 4.2.1 dapat menjadi maksimum 2147483647. Oleh karena itu, enkripsi array dengan panjang 2147483647 gagal di Java: enkripsi memiliki beberapa overhead, yang berarti output-nya akan terlalu panjang. Meskipun demikian, dalam bahasa lain, enkripsi dimungkinkan berhasil untuk {i>input<i} tersebut.

Oleh karena itu, Tink memberikan konsistensi evaluasi: Untuk keyset tertentu, jika pembuatan primitif berhasil dalam dua bahasa, keduanya akan berperilaku sama.

Namun, dalam beberapa situasi tertentu, beberapa operasi mungkin gagal.

Konsistensi pembuatan konten

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 suatu jenis kunci, kumpulan kunci tempat primitif dapat dibuat bertepatan. Tentu saja, jika suatu bahasa tidak mendukung suatu jenis kunci, tidak ada objek primitif yang dapat dibuat.

Konsistensi pembuatan kurang penting dibandingkan konsistensi evaluasi, dan ada lebih banyak pengecualian untuk aturan ini dibandingkan untuk konsistensi evaluasi. Batasan ini didokumentasikan dalam daftar jenis kunci yang didukung. Misalnya, untuk jenis kunci, ECIES, Tink, menawarkan pilihan kurva eliptis yang akan digunakan untuk perjanjian kunci, tetapi Java tidak mendukung X25519. Oleh karena itu, pembuatan kunci menggunakan X25519 dalam Java akan gagal.


  1. Dalam dokumen ini, kami menggunakan istilah Keyset untuk menunjukkan objek yang disebut KeysetHandle dalam sebagian besar bahasa.