プロトコルの名称と修飾子 - Noise Protocol Framework (4)
Noiseプロトコル名とは、ハンドシェイクの手順や使用する関数を表す為の文字列です。
基本的には以下を"_"で連結したものになります。
固定文字列であるプレフィックス: "Noise"
ハンドシェイクパターン: "XX"や"NK"など
DH関数: "25519"や"448"など
共通鍵暗号: "AESGCM"や"ChaChaPoly"など
ハッシュ関数: "SHA256"や"BLAKE2s"など
これらの各セクションは英数字(A-Z, a-z, 0-9)で構成される必要があります。また、これとは別に特殊な意味を持つ記号"+"と"/"が使用できます。
例:
Noise_XX_25519_AESGCM_SHA256
Noise_N_25519_ChaChaPoly_BLAKE2s
Noise_XXfallback+psk0_448_ChaChaPoly_BLAKE2b
ハンドシェイクパターン名のセクション
上記の例に出てきたXXやNはハンドシェイクパターンと呼ばれています。これは、メッセージの手順をパターン化したものです。それぞれの文字には意味があり、例えば、
NやXなど1文字の場合は、通信が一方向であることを意味します。
XXはお互いの静的公開鍵を暗号化して交換する、Nは静的公開鍵を送信しない
などです。これ以外にも様々なパターンが定義されています。
ハンドシェイクパターン名は、大文字の英字または数字でなければなりません。
ハンドシェイクパターン名のセクションには、ハンドシェイクパターン名(NやXXなど)に加えて、パターン修飾子が含まれる場合があります。
パターン修飾子は、ハンドシェイクパターンで指定された動作に対して、何らかのルールにしたがって動作を変更することを意味しています。。例としては、"psk0"や"fallback"があります。パターン修飾子は、小文字の英字と数字でなければいけません。
修飾子が1つの場合は、単純にハンドシェイクパターン名の末尾に追加します。 "fallback"修飾子を "XX"パターンに追加すると、 "XXfallback"となります。修飾子が複数あるばいは、追加の修飾子はプラス記号で区切ります。したがって、 "psk0"修飾子を追加すると、ハンドシェイクパターン名のセクションは"XXfallback+psk0"となります。この時のプロトコル名全体では"Noise_XXfallback+psk0_25519_AESGCM_SHA256"などのようになります。
場合によっては、修飾子の順番が異なるプロトコル名は別のプロトコルであることを意味します。ただし、修飾子の順序が重要でない場合は、アルファベット順に並べ替える必要があります。これは相互運用性を保証するための任意の規則です。
暗号アルゴリズム(関数)名のセクション
DH関数、共通鍵暗号、ハッシュ関数の各セクションは英数字(大文字、小文字を含む)とスラッシュ("/")のみで構成されます。
スラッシュは曖昧さを避けるために必要な場合にのみ使用します(たとえば、SHA3256と表現するよりも、SHA3/256の方がよいでしょう)。また、1つのセクションで複数のアルゴリズム/関数を用いる場合は"+"で繋げます。(例えば、"25519+NewHope"のように)
ほとんどの場合では各セクションには1つのアルゴリズム(関数)のみを含みます。複数のアルゴリズム/関数を使用するのは、特定の修飾子によって必要となる場合です。
標準では、複数のアルゴリズム/関数は必須ではありませんが、将来の機能拡張で活用される可能性があります。たとえば、"ハイブリッド"なポスト量子暗号を使用するためには、DH操作のセクションで複数のアルゴリズムが使用されます。
例
Lightning Networkで使用されているNoiseプロトコルの名称は"Noise_XK_secp256k1_ChaChaPoly_SHA256"です。これは以下を意味しています。
メッセージパターンはXK
イニシエーターはレスポンダーの静的公開鍵を事前に知っている前提。
イニシエーターの静的公開鍵は暗号化した上でレスポンダーに送信する。
DH鍵交換に使用する暗号化方式は楕円曲線暗号であるsecp256k1
ハンドシェイク確立後に使用する共通鍵暗号はChaCha20Poly1305
内部的に使用するハッシュ関数はSHA256
WireGuardでは"Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"
Libraでは"Noise_IX_25519_AESGCM_SHA256"
WhatsAppはCurve25519, AES-GCM, SHA256によるNoise Pipeを利用しているようです。
ハンドシェイクパターンは不明