一貫性

Tink がすべてのプログラミング言語で「同じように」動作することが重要です。このコンセプトは単純明快ではありませんが、最も重要な点です。

一貫性を維持するため、Tink は言語間テストを使用します。このテストは、言語間 GitHub リポジトリから入手できます。これらのテストでは、各言語の整合性と相互運用性を検証します。

しかし、整合性の定義は期待ほど単純ではありません。そのため、このページでは、その動作の定義を説明します。基本的に、Tink には 2 種類の整合性があります。

コンテキスト

大まかに言うと、Tink には以下の API があります。

  • キーセットの操作: Tink には、キーセットへの新しいキーの追加、キーセットからのキーの削除、キーセット内の主キーの変更を行うための API が用意されています。

  • キーセットのシリアル化: Tink は、キーセットをバイト シーケンスにシリアル化し、バイト シーケンスからキーセットを逆に解析する API を提供します。

  • プリミティブの作成: Tink は、キーセットからプリミティブのインターフェースを作成する API を提供します。たとえば、Java のキーセットから Aead オブジェクトを作成する場合、ユーザーは keysetHandle.getPrimitive(Aead.class, config) を呼び出します。

  • プリミティブの使用: プリミティブ作成ステップで生成されたインターフェースは、暗号オペレーションを実行するための API を提供します。

これらの API について確認すべき重要な点が 2 つあります。

  • 作成: シリアル化された特定のキーセット、言語、プリミティブについて、その言語でこのキーセットからプリミティブを作成することはできますか?

  • 評価: 特定のキーセットからなんらかの言語でプリミティブを作成できる場合、プリミティブ オブジェクトはどのように動作するか。

重要な点として、Tink は鍵セットの解析時に整合性を提供しません。たとえば、Tink C++ 言語、

  • Tink に CHACHA20-POLY1305 の AEAD オペレーションが実装されていなくても、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 では長さが 2,147,483,647 の配列の暗号化が失敗します。暗号化にはある程度のオーバーヘッドがあり、出力が長くなりすぎます。それでも、他の言語では、このような入力に対して暗号化が成功します。

そのため、Tink には評価の一貫性があります。2 つの言語でプリミティブの作成が成功すると、特定の鍵セットに対して同様に動作します。

ただし、例外的な状況では一部のオペレーションが失敗する可能性があります。

作成の一貫性

プリミティブの作成が、すべての鍵セットで必ずしも成功するとは限りません。たとえば、鍵マテリアルの長さが 128 ビットの場合、Tink は AesSivKey を作成できません。

それにもかかわらず、Tink には整合性があります。2 つの言語の両方がキータイプをサポートしている場合、プリミティブを作成できるキーのセットは一致します。もちろん、言語がキータイプをサポートしていない場合は、プリミティブ オブジェクトを作成できません。

作成の一貫性は評価の一貫性ほど重要ではなく、このルールには、評価の一貫性よりも多くの例外があります。これらの制限事項については、サポートされているキータイプのリストをご覧ください。たとえば、鍵タイプの ECIES では、Tink で鍵合意に使用する楕円曲線を選択できますが、Java では X25519 はサポートされていません。そのため、Java で X25519 を使用した鍵の作成は失敗します。


  1. このドキュメントでは、Keyset という用語を、ほとんどの言語で KeysetHandle というオブジェクトを指すために使用します。