Tink がすべてのプログラミング言語で「同じ」動作をすることが重要です。このコンセプトは単純ではありませんが、最も重要なのは次の点です。
一貫性を維持するため、Tink はクロス言語 GitHub リポジトリにあるクロス言語テストを使用します。これらのテストでは、さまざまな言語の一貫性と相互運用性を検証します。
しかし、整合性を定義することは、予想ほど簡単ではありません。このページでは、実用的な定義について説明します。基本的に、Tink は次の 2 種類の整合性を提供します。
- 評価の一貫性: 特定の鍵セット1 について、2 つの言語でプリミティブの作成が成功した場合、それらは同じように動作します。
- 作成の一貫性: サポートされている鍵タイプのリストに記載されているように、言語が鍵セット内のすべての鍵タイプをサポートしている場合、その言語でプリミティブの作成が成功します。
コンテキスト
大まかに言うと、Tink には次の API が用意されています。
鍵セットの操作: Tink には、鍵セットに新しい鍵を追加する、鍵セットから鍵を削除する、鍵セットの主キーを変更するための API が用意されています。
鍵セットのシリアル化: Tink には、鍵セットをバイト シーケンスにシリアル化し、逆にバイト シーケンスから鍵セットを解析する API が用意されています。
プリミティブの作成: Tink には、鍵セットからプリミティブのインターフェースを作成するための API が用意されています。たとえば、Java で鍵セットから
Aeadオブジェクトを作成するには、ユーザーはkeysetHandle.getPrimitive(config, Aead.class)を呼び出します。プリミティブの使用: プリミティブ作成ステップで生成されたインターフェースは、暗号オペレーションを実行するための API を提供します。
これらの API については、次の 2 つの重要な質問があります。
作成: シリアル化された特定の鍵セット、言語、プリミティブについて、この鍵セットからその言語でプリミティブを作成することは可能か。
評価: 特定のキーセットから、ある言語でプリミティブを作成できる場合、プリミティブ オブジェクトはどのように動作しますか?
Tink は、鍵セットを解析する際に整合性を提供しません。たとえば、Tink C++ が
- CHACHA20-POLY1305 AEAD オペレーションは Tink に実装されていませんが、CHACHA20-POLY1305 鍵を含む鍵セットを正常に解析します。
- は、1 バイトの長さの鍵を含む鍵セットを正常に解析します。これは、すべての暗号オペレーションで失敗します。
これらの動作はマイナー バージョンで変更される可能性があります。
評価の整合性
評価の一貫性は、作成プロセスの一貫性よりも重要です。Java の AEAD が C++ の AEAD の暗号化を復号できない場合、ユーザーは深刻な問題に直面します。
一般的に、Tink はプリミティブに対して明確な方法で一貫性を保つことを目指しています。たとえば、C++ バイナリが public_key_sign->Sign(data) で署名を計算する場合、対応する Java 検証呼び出し publicKeyVerify.verify(signature, data) は成功するはずです。
ただし、ここでもいくつかの注意点があります。たとえば、Java の aead.Encrypt の戻り値の型は byte[] です。Java 言語仕様(JLS)§10.7 によると、配列の長さは int 型で、§JLS 4.2.1 によると、最大 2147483647 です。したがって、Java では長さが 2147483647 の配列の暗号化は失敗します。暗号化にはオーバーヘッドがあるため、出力が長すぎることになります。ただし、他の言語では、このような入力に対して暗号化が成功することが許可されています。
そのため、Tink は評価の一貫性を提供します。特定の鍵セットに対して、2 つの言語でプリミティブの作成が成功した場合、それらは同じように動作します。
例外として、一部のオペレーションが例外的な状況で失敗することがあります。
一貫性のあるコンテンツ
プリミティブの作成は、すべての鍵セットで必ずしも成功するとは限りません。たとえば、鍵マテリアルの長さが 128 ビットの場合、Tink ではユーザーが AesSivKey を作成することはできません。
それでも、Tink は次のように整合性を維持します。2 つの言語がどちらも鍵タイプをサポートしている場合、プリミティブを作成できる鍵のセットは一致します。もちろん、言語が鍵タイプをサポートしていない場合、プリミティブ オブジェクトは作成できません。
作成の一貫性は、評価の一貫性ほど重要ではありません。また、このルールには、評価の一貫性よりも多くの例外があります。これらの制限事項については、サポートされている鍵タイプのリストをご覧ください。たとえば、鍵タイプ ECIES の場合、Tink では鍵合意に使用する楕円曲線を選択できますが、Java は X25519 をサポートしていません。そのため、Java で X25519 を使用して鍵を作成すると失敗します。
-
このドキュメントでは、ほとんどの言語で
KeysetHandleと呼ばれるオブジェクトをKeysetという用語で表します。 ↩