Lightning ノード間のすべての通信は暗号化されており、ノード間のすべての通信内容の機密性を提供します。また、悪意のある干渉を避けるために認証されています。各ノードは、Bitcoin の secp256k1
曲線上の公開鍵である既知の長期識別子を持っています。この長期公開鍵は、ピアとの暗号化および認証された接続を確立するためにプロトコル内で使用され、ノードを代表して広告される情報を認証するためにも使用されます。
- 暗号メッセージの概要
- 認証された鍵交換ハンドシェイクの仕様
- Lightning メッセージの仕様
- Lightning メッセージの鍵ローテーション
- セキュリティに関する考慮事項
- 付録 A: トランスポートテストベクトル
- 謝辞
- 参考文献
- 著者
Lightning メッセージを送信する前に、ノードはまずノード間で送信されるすべてのメッセージを暗号化および認証するために使用される暗号セッション状態を初期化しなければなりません (MUST)。この暗号セッション状態の初期化は、内部プロトコルメッセージヘッダや慣習とは完全に別個のものです。
2 つのノード間の通信は、2 つの異なるセグメントに分かれています。
- 実際のデータ転送の前に、両方のノードが認証された鍵合意ハンドシェイクに参加します。これは Noise Protocol Framework2 に基づいています。
- 初期ハンドシェイクが成功した場合、ノードは Lightning メッセージ交換フェーズに入ります。Lightning メッセージ交換フェーズでは、すべてのメッセージが認証付き暗号化 (AEAD) の暗号文です。
認証された鍵交換のために選ばれたハンドシェイクは Noise_XK
です。プレメッセージとして、イニシエータはレスポンダのアイデンティティ公開鍵を知っている必要があります。これにより、レスポンダの静的公開鍵がハンドシェイク中に 決して 送信されないため、レスポンダのアイデンティティをある程度隠すことができます。代わりに、認証は一連の楕円曲線ディフィー・ヘルマン (ECDH) 操作とその後の MAC チェックを通じて暗黙的に達成されます。
認証された鍵合意 (Noise_XK
) は 3 つの異なるステップ (アクト) で実行されます。ハンドシェイクの各アクト中に以下が行われます。いくつかの (暗号化されている可能性のある) 鍵素材が他方に送信されます。実行されているアクトに基づいて ECDH が実行され、その結果が現在の暗号化鍵セット (ck
チェイン鍵と k
暗号化鍵) に混合されます。そして、ゼロ長の暗号文を持つ AEAD ペイロードが送信されます。このペイロードには長さがないため、MAC のみが送信されます。ECDH 出力をハッシュダイジェストに混合することで、インクリメンタルな TripleDH ハンドシェイクが形成されます。
Noise Protocol の言語を使用すると、e
と s
(どちらも公開鍵で、e
はエフェメラル鍵、s
は静的鍵で、通常は nodeid
です) は暗号化されている可能性のある鍵素材を示し、es
、ee
、se
はそれぞれ 2 つの鍵間の ECDH 操作を示します。ハンドシェイクは次のように配置されます。
Noise_XK(s, rs):
<- s
...
-> e, es
<- e, ee
-> s, se
送信されるすべてのハンドシェイクデータ、鍵素材を含む、はセッション全体の「ハンドシェイクダイジェスト」h
にインクリメンタルにハッシュされます。ハンドシェイク状態 h
はハンドシェイク中に送信されることはありません。代わりに、ダイジェストはゼロ長 AEAD メッセージ内の関連データとして使用されます。
送信される各メッセージを認証することで、中間者攻撃 (MITM) がハンドシェイクの一部として送信されたデータを改ざんまたは置換していないことを保証します。もしそうであれば、MAC チェックが相手側で失敗します。
受信者による MAC のチェックが成功した場合、それは暗黙的にその時点までのすべての認証が成功したことを示します。ハンドシェイクプロセス中に MAC チェックが失敗した場合、接続は直ちに終了されるべきです。
初期ハンドシェイク中に送信される各メッセージは、現在のハンドシェイクに使用されるバージョンを示す単一の先頭バイトで始まります。バージョンが 0 の場合、変更は必要ありませんが、非ゼロのバージョンはクライアントがこのドキュメント内で最初に指定されたプロトコルから逸脱したことを示します。
クライアントは未知のバージョンで開始されたハンドシェイクの試みを拒否しなければなりません。
Noise プロトコルの具体的な実装には、3 つの抽象的な暗号オブジェクトの定義が必要です。ハッシュ関数、楕円曲線、および AEAD 暗号スキームです。Lightning では、SHA-256
がハッシュ関数として選ばれ、secp256k1
が楕円曲線として選ばれ、ChaChaPoly-1305
が AEAD 構造として選ばれています。
使用される ChaCha20
と Poly1305
の組み合わせは、RFC 8439
1 に準拠していなければなりません。
Noise の Lightning バリアントの公式プロトコル名は Noise_XK_secp256k1_ChaChaPoly_SHA256
です。この値の ASCII 文字列表現は、開始ハンドシェイク状態を初期化するために使用されるダイジェストにハッシュされます。2 つのエンドポイントのプロトコル名が異なる場合、ハンドシェイクプロセスは直ちに失敗します。
ハンドシェイクは 1.5 ラウンドトリップを要する 3 つのアクトで進行します。各ハンドシェイクはヘッダーや追加のメタデータが付いていない 固定 サイズのペイロードです。各アクトの正確なサイズは以下の通りです:
- アクト 1:50 バイト
- アクト 2:50 バイト
- アクト 3:66 バイト
ハンドシェイクプロセス全体を通じて、各側はこれらの変数を維持します:
-
ck
: チェインキー。この値は、すべての以前の ECDH 出力の累積ハッシュです。ハンドシェイクの最後に、ck
は Lightning メッセージの暗号化キーを導出するために使用されます。 -
h
: ハンドシェイクハッシュ。この値は、ハンドシェイクプロセス中に送受信されたすべてのハンドシェイクデータの累積ハッシュです。 -
temp_k1
,temp_k2
,temp_k3
: 中間キー。これらは、各ハンドシェイクメッセージの最後にゼロ長の AEAD ペイロードを暗号化および復号化するために使用されます。 -
e
: パーティのエフェメラルキーペア。各セッションごとに、ノードは強力な暗号ランダム性を持つ新しいエフェメラルキーを生成しなければなりません。 -
s
: パーティの静的キーペア(ls
はローカル、rs
はリモート)
以下の関数も参照されます:
-
ECDH(k, rk)
:k
(有効なsecp256k1
秘密鍵)とrk
(有効な公開鍵)を使用して楕円曲線ディフィー・ヘルマン操作を実行します。- 返される値は、生成されたポイントの圧縮形式の SHA256 です。
-
HKDF(salt,ikm)
:RFC 5869
3 で定義された関数で、ゼロ長のinfo
フィールドで評価されます。HKDF
のすべての呼び出しは、HKDF
の抽出および拡張コンポーネントを使用して 64 バイトの暗号ランダム性を暗黙的に返します。
-
encryptWithAD(k, n, ad, plaintext)
:encrypt(k, n, ad, plaintext)
を出力します。- ここで
encrypt
は、渡された引数でChaCha20-Poly1305
(IETF バリアント)を評価したもので、ノンスn
は 32 ビットのゼロビットとしてエンコードされ、その後に リトルエンディアン の 64 ビット値が続きます。注:これは通常のエンディアンではなく、Noise プロトコルの慣例に従います。
- ここで
-
decryptWithAD(k, n, ad, ciphertext)
:decrypt(k, n, ad, ciphertext)
を出力します。- ここで
decrypt
は、渡された引数でChaCha20-Poly1305
(IETF バリアント)を評価したもので、ノンスn
は 32 ビットのゼロビットとしてエンコードされ、その後に リトルエンディアン の 64 ビット値が続きます。
- ここで
-
generateKey()
: 新しいsecp256k1
キーペアを生成して返します。generateKey
によって返されるオブジェクトには 2 つの属性があります:.pub
は公開鍵を表す抽象オブジェクトを返します。.priv
は公開鍵を生成するために使用される秘密鍵を表します。
- オブジェクトには 1 つのメソッドもあります:
.serializeCompressed()
-
a || b
は、2 つのバイト列a
とb
の連結を表します。
Act One の開始前に、両側はセッションごとの状態を次のように初期化します。
-
h = SHA-256(protocolName)
- ここで
protocolName = "Noise_XK_secp256k1_ChaChaPoly_SHA256"
は ASCII 文字列としてエンコードされます。
- ここで
-
ck = h
-
h = SHA-256(h || prologue)
- ここで
prologue
は ASCII 文字列:lightning
です。
- ここで
最後のステップとして、両側は応答者の公開鍵をハンドシェイクダイジェストに混ぜ込みます。
-
開始ノードは、応答ノードの静的公開鍵を Bitcoin の圧縮形式でシリアライズして混ぜ込みます。
h = SHA-256(h || rs.pub.serializeCompressed())
-
応答ノードは、ローカルの静的公開鍵を Bitcoin の圧縮形式でシリアライズして混ぜ込みます。
h = SHA-256(h || ls.pub.serializeCompressed())
-> e, es
Act One は開始者から応答者に送信されます。Act One の間、開始者は応答者による暗黙のチャレンジを満たそうとします。このチャレンジを完了するには、開始者は応答者の静的公開鍵を知っている必要があります。
ハンドシェイクメッセージは 正確に 50 バイトです。1 バイトはハンドシェイクバージョン、33 バイトは開始者の圧縮されたエフェメラル公開鍵、16 バイトは poly1305
タグです。
送信者のアクション:
e = generateKey()
h = SHA-256(h || e.pub.serializeCompressed())
- 新しく生成されたエフェメラルキーが進行中のハンドシェイクダイジェストに蓄積されます。
es = ECDH(e.priv, rs)
- 開始者は、新しく生成されたエフェメラルキーとリモートノードの静的公開鍵の間で ECDH を実行します。
ck, temp_k1 = HKDF(ck, es)
- 新しい一時的な暗号化キーが生成され、認証 MAC を生成するために使用されます。
c = encryptWithAD(temp_k1, 0, h, zero)
- ここで
zero
はゼロ長の平文です。
- ここで
h = SHA-256(h || c)
- 最後に、生成された暗号文が認証ハンドシェイクダイジェストに蓄積されます。
m = 0 || e.pub.serializeCompressed() || c
をネットワークバッファを介して応答者に送信します。
受信者のアクション:
- ネットワークバッファから「正確に」50バイトを読み取ります。
- 読み取ったメッセージ (
m
) をv
、re
、c
に解析します:v
はm
の「最初の」バイト、re
はm
の次の 33 バイト、c
はm
の最後の 16 バイトです- リモートパーティの一時的な公開鍵 (
re
) の生のバイトは、鍵のシリアライズされた構成フォーマットによってエンコードされたアフィン座標を使用して曲線上の点にデシリアライズされます。
v
が認識されないハンドシェイクバージョンの場合、応答者は接続試行を中止しなければなりません。h = SHA-256(h || re.serializeCompressed())
- 応答者は、イニシエータの一時的な鍵を認証ハンドシェイクダイジェストに蓄積します。
es = ECDH(s.priv, re)
- 応答者は、その静的秘密鍵とイニシエータの一時的な公開鍵の間で ECDH を実行します。
ck, temp_k1 = HKDF(ck, es)
- 新しい一時的な暗号化鍵が生成され、これはすぐに認証 MAC を確認するために使用されます。
p = decryptWithAD(temp_k1, 0, h, c)
- この操作で MAC チェックが失敗した場合、イニシエータは応答者の静的公開鍵を知らないことになります。この場合、応答者はこれ以上のメッセージを送信せずに接続を終了しなければなりません。
h = SHA-256(h || c)
- 受信した暗号文がハンドシェイクダイジェストに混ぜられます。このステップは、ペイロードが MITM によって変更されていないことを保証するためのものです。
<- e, ee
Act Two は応答者からイニシエータに送信されます。Act Two は、Act One が成功した場合にのみ行われます。Act One が成功したのは、応答者が Act One の最後に送信されたタグの MAC を正しく復号し、確認できた場合です。
ハンドシェイクは「正確に」50バイトです:1 バイトのハンドシェイクバージョン、33 バイトの応答者の圧縮された一時的な公開鍵、16 バイトの poly1305
タグです。
送信者のアクション:
e = generateKey()
h = SHA-256(h || e.pub.serializeCompressed())
- 新しく生成された一時的な鍵が実行中のハンドシェイクダイジェストに蓄積されます。
ee = ECDH(e.priv, re)
- ここで
re
は、Act One 中に受信されたイニシエータの一時的な鍵です
- ここで
ck, temp_k2 = HKDF(ck, ee)
- 新しい一時的な暗号化鍵が生成され、これは認証 MAC を生成するために使用されます。
c = encryptWithAD(temp_k2, 0, h, zero)
- ここで
zero
はゼロ長の平文です
- ここで
h = SHA-256(h || c)
- 最後に、生成された暗号文が認証ハンドシェイクダイジェストに蓄積されます。
m = 0 || e.pub.serializeCompressed() || c
をネットワークバッファを介してイニシエータに送信します。
受信者のアクション:
- ネットワークバッファから「正確に」50バイトを読み取ります。
- 読み取ったメッセージ (
m
) をv
、re
、c
に解析します:v
はm
の「最初の」バイト、re
はm
の次の 33 バイト、c
はm
の最後の 16 バイトです。
v
が認識されないハンドシェイクバージョンの場合、応答者は接続試行を中止しなければなりません。h = SHA-256(h || re.serializeCompressed())
ee = ECDH(e.priv, re)
re
は応答者の一時的な公開鍵です- リモートパーティの一時的な公開鍵 (
re
) の生のバイトは、鍵のシリアライズされた構成フォーマットによってエンコードされたアフィン座標を使用して曲線上のポイントにデシリアライズされます。
ck, temp_k2 = HKDF(ck, ee)
- 新しい一時的な暗号化キーが生成され、認証 MAC を生成するために使用されます。
p = decryptWithAD(temp_k2, 0, h, c)
- この操作で MAC チェックが失敗した場合、開始者はさらなるメッセージなしに接続を終了しなければなりません。
h = SHA-256(h || c)
- 受信した暗号文はハンドシェイクダイジェストに混ぜられます。このステップは、ペイロードが MITM によって改ざんされていないことを保証するためのものです。
-> s, se
アクトスリーは、このセクションで説明されている認証済み鍵合意の最終段階です。このアクトは、開始者から応答者に送信される締めくくりのステップです。アクトスリーは、アクトツーが成功した場合にのみ実行されます。アクトスリーの間、開始者はハンドシェイクのこの時点で蓄積された HKDF
派生秘密鍵を使用して、強力な前方秘匿性で暗号化された静的公開鍵を応答者に送信します。
ハンドシェイクは「正確に」66バイトです:1バイトはハンドシェイクバージョン、33バイトは ChaCha20
ストリーム暗号で暗号化された静的公開鍵、16バイトは AEAD 構造によって生成された暗号化された公開鍵のタグ、16バイトは最終的な認証タグです。
送信者のアクション:
c = encryptWithAD(temp_k2, 1, h, s.pub.serializeCompressed())
s
は開始者の静的公開鍵です
h = SHA-256(h || c)
se = ECDH(s.priv, re)
re
は応答者の一時的な公開鍵です
ck, temp_k3 = HKDF(ck, se)
- 最終的な中間共有秘密が実行中のチェーンキーに混ぜられます。
t = encryptWithAD(temp_k3, 0, h, zero)
zero
はゼロ長のプレーンテキストです
sk, rk = HKDF(ck, zero)
zero
はゼロ長のプレーンテキストであり、sk
は開始者が応答者にメッセージを暗号化するために使用するキー、rk
は開始者が応答者から送信されたメッセージを復号するために使用するキーです- セッションの期間中にメッセージを送受信するために使用される最終的な暗号化キーが生成されます。
rn = 0, sn = 0
- 送信および受信ノンスは 0 に初期化されます。
rck = sck = ck
- 送信および受信チェーンキーは同じように初期化されます。
m = 0 || c || t
をネットワークバッファに送信します。
受信者のアクション:
- ネットワークバッファから 正確に 66 バイトを読み取ります。
- 読み取ったメッセージ (
m
) をv
、c
、t
に解析します:v
はm
の 最初の バイト、c
はm
の次の 49 バイト、t
はm
の最後の 16 バイトです。
v
が認識されないハンドシェイクバージョンの場合、応答者は接続試行を中止しなければなりません。rs = decryptWithAD(temp_k2, 1, h, c)
- この時点で、応答者はイニシエータの静的公開鍵を復元しています。
- この操作で MAC チェックが失敗した場合、応答者はこれ以上メッセージを送信せずに接続を終了しなければなりません。
h = SHA-256(h || c)
se = ECDH(e.priv, rs)
- ここで
e
は応答者の元のエフェメラルキーです。
- ここで
ck, temp_k3 = HKDF(ck, se)
p = decryptWithAD(temp_k3, 0, h, t)
- この操作で MAC チェックが失敗した場合、応答者はこれ以上メッセージを送信せずに接続を終了しなければなりません。
rk, sk = HKDF(ck, zero)
- ここで
zero
はゼロ長のプレーンテキストであり、rk
はイニシエータが送信するメッセージを応答者が復号するために使用するキーで、sk
は応答者がイニシエータにメッセージを暗号化するために使用するキーです。 - セッションの期間中にメッセージの送受信に使用する最終的な暗号化キーが生成されます。
- ここで
rn = 0, sn = 0
- 送信および受信のノンスが 0 に初期化されます。
rck = sck = ck
- 送信および受信のチェインキーが同じように初期化されます。
アクト 3 の終了時に、両側はセッションの残りの期間中にメッセージを暗号化および復号するために使用する暗号化キーを導出します。
実際の Lightning プロトコルメッセージは AEAD 暗号文内にカプセル化されます。各メッセージは、次の Lightning メッセージの総長をエンコードする別の AEAD 暗号文でプレフィックスされます(その MAC を含まない)。
いかなる Lightning メッセージの最大サイズも 65535
バイトを超えてはなりません。最大サイズを 65535
にすることで、テストが簡単になり、メモリ管理が容易になり、メモリ枯渇攻撃を軽減するのに役立ちます。
トラフィック解析をより困難にするために、すべての暗号化された Lightning メッセージの長さプレフィックスも暗号化されます。さらに、16 バイトの Poly-1305
タグが暗号化された長さプレフィックスに追加され、パケットの長さが転送中に変更されていないことを確認し、復号オラクルを作成しないようにします。
パケットの構造は次のようになります:
+-------------------------------
|2-byte encrypted message length|
+-------------------------------
| 16-byte MAC of the encrypted |
| message length |
+-------------------------------
| |
| |
| encrypted Lightning |
| message |
| |
+-------------------------------
| 16-byte MAC of the |
| Lightning message |
+-------------------------------
プレフィックス付きメッセージの長さは 2 バイトのビッグエンディアン整数としてエンコードされ、パケットの最大長は 2 + 16 + 65535 + 16
= 65569
バイトです。
Lightning メッセージ ( m
) をネットワークストリームに暗号化して送信するために、送信キー ( sk
) とノンス ( sn
) が与えられた場合、次の手順を実行します:
l = len(m)
とします。- ここで
len
は Lightning メッセージのバイト長を取得します
- ここで
l
を 2 バイトのビッグエンディアン整数としてシリアライズします。l
を暗号化して (ChaChaPoly-1305
、sn
、およびsk
を使用)、lc
(18 バイト) を取得します。- ノンス
sn
は 96 ビットのリトルエンディアン数としてエンコードされます。デコードされたノンスは 64 ビットであるため、96 ビットのノンスは次のようにエンコードされます:32 ビットの先行する 0 と 64 ビットの値。- このステップの後、ノンス
sn
はインクリメントされなければなりません。
- このステップの後、ノンス
- ゼロ長のバイトスライスを AD (関連データ) として渡します。
- ノンス
- 最後に、メッセージ自体 (
m
) を長さプレフィックスを暗号化するのと同じ手順を使用して暗号化します。暗号化された暗号文をc
とします。- このステップの後、ノンス
sn
はインクリメントされなければなりません。
- このステップの後、ノンス
lc || c
をネットワークバッファに送信します。
ネットワークストリーム内の次のメッセージを復号するために、次の手順を実行します:
- ネットワークバッファから正確に 18 バイトを読み取ります。
- 暗号化された長さプレフィックスを
lc
とします。 lc
を復号して (ChaCha20-Poly1305
、rn
、およびrk
を使用)、暗号化されたパケットのサイズl
を取得します。- ゼロ長のバイトスライスを AD (関連データ) として渡します。
- このステップの後、ノンス
rn
はインクリメントされなければなりません。
- ネットワークバッファから正確に
l+16
バイトを読み取り、バイトをc
とします。 c
を復号して (ChaCha20-Poly1305
、rn
、およびrk
を使用)、復号されたプレーンテキストパケットp
を取得します。- このステップの後、ノンス
rn
はインクリメントされなければなりません。
- このステップの後、ノンス
定期的にキーを変更し、以前のキーを忘れることは、後にキーが漏洩した場合(すなわち後方秘匿性)に古いメッセージの復号を防ぐのに役立ちます。
キーのローテーションは、それぞれの キー(sk
と rk
)に対して 個別に 行われ、sck
と rck
をそれぞれ使用します。キーは、あるパーティがそれを使って 1000 回暗号化または復号した後(すなわち 500 メッセージごと)にローテーションされるべきです。これは、専用のノンスが 1000 に達したときにキーをローテーションすることで適切に管理できます。
キー k
のローテーションは、次のステップに従って行われます:
ck
をチェインキーとする(すなわちrk
の場合はrck
、sk
の場合はsck
)ck', k' = HKDF(ck, k)
- キーのノンスを
n = 0
にリセットします。 k = k'
ck = ck'
暗号化と復号には、既存の一般的に使用されている検証済みのライブラリを使用することを強く推奨します。これにより、多くの実装上の落とし穴を避けることができます。
繰り返し可能なテストハンドシェイクを行うために、以下では各サイドに対して generateKey()
が返すもの(すなわち e.priv
の値)を指定します。これはランダム性を要求する仕様の違反であることに注意してください。
イニシエーターは、この入力を与えられたときに指定された出力を生成するべきです。コメントはデバッグ目的での内部状態を反映しています。
name: transport-initiator successful handshake
rs.pub: 0x028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
ls.priv: 0x1111111111111111111111111111111111111111111111111111111111111111
ls.pub: 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
e.priv: 0x1212121212121212121212121212121212121212121212121212121212121212
e.pub: 0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
# Act One
# h=0x9e0e7de8bb75554f21db034633de04be41a2b8a18da7a319a03c803bf02b396c
# ss=0x1e2fb3c8fe8fb9f262f649f64d26ecf0f2c0a805a767cf02dc2d77a6ef1fdcc3
# HKDF(0x2640f52eebcd9e882958951c794250eedb28002c05d7dc2ea0f195406042caf1,0x1e2fb3c8fe8fb9f262f649f64d26ecf0f2c0a805a767cf02dc2d77a6ef1fdcc3)
# ck,temp_k1=0xb61ec1191326fa240decc9564369dbb3ae2b34341d1e11ad64ed89f89180582f,0xe68f69b7f096d7917245f5e5cf8ae1595febe4d4644333c99f9c4a1282031c9f
# encryptWithAD(0xe68f69b7f096d7917245f5e5cf8ae1595febe4d4644333c99f9c4a1282031c9f, 0x000000000000000000000000, 0x9e0e7de8bb75554f21db034633de04be41a2b8a18da7a319a03c803bf02b396c, <empty>)
# c=0df6086551151f58b8afe6c195782c6a
# h=0x9d1ffbb639e7e20021d9259491dc7b160aab270fb1339ef135053f6f2cebe9ce
output: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
input: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# re=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# h=0x38122f669819f906000621a14071802f93f2ef97df100097bcac3ae76c6dc0bf
# ss=0xc06363d6cc549bcb7913dbb9ac1c33fc1158680c89e972000ecd06b36c472e47
# HKDF(0xb61ec1191326fa240decc9564369dbb3ae2b34341d1e11ad64ed89f89180582f,0xc06363d6cc549bcb7913dbb9ac1c33fc1158680c89e972000ecd06b36c472e47)
# ck,temp_k2=0xe89d31033a1b6bf68c07d22e08ea4d7884646c4b60a9528598ccb4ee2c8f56ba,0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc
# decryptWithAD(0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc, 0x000000000000000000000000, 0x38122f669819f906000621a14071802f93f2ef97df100097bcac3ae76c6dc0bf, 0x6e2470b93aac583c9ef6eafca3f730ae)
# h=0x90578e247e98674e661013da3c5c1ca6a8c8f48c90b485c0dfa1494e23d56d72
# Act Three
# encryptWithAD(0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc, 0x000000000100000000000000, 0x90578e247e98674e661013da3c5c1ca6a8c8f48c90b485c0dfa1494e23d56d72, 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa)
# c=0xb9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c3822
# h=0x5dcb5ea9b4ccc755e0e3456af3990641276e1d5dc9afd82f974d90a47c918660
# ss=0xb36b6d195982c5be874d6d542dc268234379e1ae4ff1709402135b7de5cf0766
# HKDF(0xe89d31033a1b6bf68c07d22e08ea4d7884646c4b60a9528598ccb4ee2c8f56ba,0xb36b6d195982c5be874d6d542dc268234379e1ae4ff1709402135b7de5cf0766)
# ck,temp_k3=0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01,0x981a46c820fb7a241bc8184ba4bb1f01bcdfafb00dde80098cb8c38db9141520
# encryptWithAD(0x981a46c820fb7a241bc8184ba4bb1f01bcdfafb00dde80098cb8c38db9141520, 0x000000000000000000000000, 0x5dcb5ea9b4ccc755e0e3456af3990641276e1d5dc9afd82f974d90a47c918660, <empty>)
# t=0x8dc68b1c466263b47fdf31e560e139ba
output: 0x00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba
# HKDF(0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01,zero)
output: sk,rk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9,0xbb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442
name: transport-initiator act2 short read test
rs.pub: 0x028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
ls.priv: 0x1111111111111111111111111111111111111111111111111111111111111111
ls.pub: 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
e.priv: 0x1212121212121212121212121212121212121212121212121212121212121212
e.pub: 0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
output: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
input: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730
output: ERROR (ACT2_READ_FAILED)
name: transport-initiator act2 bad version test
rs.pub: 0x028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
ls.priv: 0x1111111111111111111111111111111111111111111111111111111111111111
ls.pub: 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
e.priv: 0x1212121212121212121212121212121212121212121212121212121212121212
e.pub: 0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
output: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
input: 0x0102466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
output: ERROR (ACT2_BAD_VERSION 1)
name: transport-initiator act2 bad key serialization test
rs.pub: 0x028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
ls.priv: 0x1111111111111111111111111111111111111111111111111111111111111111
ls.pub: 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
e.priv: 0x1212121212121212121212121212121212121212121212121212121212121212
e.pub: 0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
output: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
input: 0x0004466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
output: ERROR (ACT2_BAD_PUBKEY)
name: transport-initiator act2 bad MAC test
rs.pub: 0x028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
ls.priv: 0x1111111111111111111111111111111111111111111111111111111111111111
ls.pub: 0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
e.priv: 0x1212121212121212121212121212121212121212121212121212121212121212
e.pub: 0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
output: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
input: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730af
output: ERROR (ACT2_BAD_TAG)
レスポンダーは、この入力を与えられたときに指定された出力を生成するべきです。
name: transport-responder successful handshake
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# re=0x036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f7
# h=0x9e0e7de8bb75554f21db034633de04be41a2b8a18da7a319a03c803bf02b396c
# ss=0x1e2fb3c8fe8fb9f262f649f64d26ecf0f2c0a805a767cf02dc2d77a6ef1fdcc3
# HKDF(0x2640f52eebcd9e882958951c794250eedb28002c05d7dc2ea0f195406042caf1,0x1e2fb3c8fe8fb9f262f649f64d26ecf0f2c0a805a767cf02dc2d77a6ef1fdcc3)
# ck,temp_k1=0xb61ec1191326fa240decc9564369dbb3ae2b34341d1e11ad64ed89f89180582f,0xe68f69b7f096d7917245f5e5cf8ae1595febe4d4644333c99f9c4a1282031c9f
# decryptWithAD(0xe68f69b7f096d7917245f5e5cf8ae1595febe4d4644333c99f9c4a1282031c9f, 0x000000000000000000000000, 0x9e0e7de8bb75554f21db034633de04be41a2b8a18da7a319a03c803bf02b396c, 0x0df6086551151f58b8afe6c195782c6a)
# h=0x9d1ffbb639e7e20021d9259491dc7b160aab270fb1339ef135053f6f2cebe9ce
# Act Two
# e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27 e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
# h=0x38122f669819f906000621a14071802f93f2ef97df100097bcac3ae76c6dc0bf
# ss=0xc06363d6cc549bcb7913dbb9ac1c33fc1158680c89e972000ecd06b36c472e47
# HKDF(0xb61ec1191326fa240decc9564369dbb3ae2b34341d1e11ad64ed89f89180582f,0xc06363d6cc549bcb7913dbb9ac1c33fc1158680c89e972000ecd06b36c472e47)
# ck,temp_k2=0xe89d31033a1b6bf68c07d22e08ea4d7884646c4b60a9528598ccb4ee2c8f56ba,0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc
# encryptWithAD(0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc, 0x000000000000000000000000, 0x38122f669819f906000621a14071802f93f2ef97df100097bcac3ae76c6dc0bf, <empty>)
# c=0x6e2470b93aac583c9ef6eafca3f730ae
# h=0x90578e247e98674e661013da3c5c1ca6a8c8f48c90b485c0dfa1494e23d56d72
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba
# decryptWithAD(0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc, 0x000000000100000000000000, 0x90578e247e98674e661013da3c5c1ca6a8c8f48c90b485c0dfa1494e23d56d72, 0xb9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c3822)
# rs=0x034f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
# h=0x5dcb5ea9b4ccc755e0e3456af3990641276e1d5dc9afd82f974d90a47c918660
# ss=0xb36b6d195982c5be874d6d542dc268234379e1ae4ff1709402135b7de5cf0766
# HKDF(0xe89d31033a1b6bf68c07d22e08ea4d7884646c4b60a9528598ccb4ee2c8f56ba,0xb36b6d195982c5be874d6d542dc268234379e1ae4ff1709402135b7de5cf0766)
# ck,temp_k3=0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01,0x981a46c820fb7a241bc8184ba4bb1f01bcdfafb00dde80098cb8c38db9141520
# decryptWithAD(0x981a46c820fb7a241bc8184ba4bb1f01bcdfafb00dde80098cb8c38db9141520, 0x000000000000000000000000, 0x5dcb5ea9b4ccc755e0e3456af3990641276e1d5dc9afd82f974d90a47c918660, 0x8dc68b1c466263b47fdf31e560e139ba)
# HKDF(0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01,zero)
output: rk,sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9,0xbb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442
name: transport-responder act1 short read test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c
output: ERROR (ACT1_READ_FAILED)
name: transport-responder act1 bad version test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x01036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
output: ERROR (ACT1_BAD_VERSION)
name: transport-responder act1 bad key serialization test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00046360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
output: ERROR (ACT1_BAD_PUBKEY)
name: transport-responder act1 bad MAC test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6b
output: ERROR (ACT1_BAD_TAG)
name: transport-responder act3 bad version test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x01b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba
output: ERROR (ACT3_BAD_VERSION 1)
name: transport-responder act3 short read test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139
output: ERROR (ACT3_READ_FAILED)
name: transport-responder act3 bad MAC for ciphertext test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x00c9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139ba
output: ERROR (ACT3_BAD_CIPHERTEXT)
name: transport-responder act3 bad rs test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x00bfe3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa2235536ad09a8ee351870c2bb7f78b754a26c6cef79a98d25139c856d7efd252c2ae73c
# decryptWithAD(0x908b166535c01a935cf1e130a5fe895ab4e6f3ef8855d87e9b7581c4ab663ddc, 0x000000000000000000000001, 0x90578e247e98674e661013da3c5c1ca6a8c8f48c90b485c0dfa1494e23d56d72, 0xd7fedc211450dd9602b41081c9bd05328b8bf8c0238880f7b7cb8a34bb6d8354081e8d4b81887fae47a74fe8aab3008653)
# rs=0x044f355bdcb7cc0af728ef3cceb9615d90684bb5b2ca5f859ab0f0b704075871aa
output: ERROR (ACT3_BAD_PUBKEY)
name: transport-responder act3 bad MAC test
ls.priv=2121212121212121212121212121212121212121212121212121212121212121
ls.pub=028d7500dd4c12685d1f568b4c2b5048e8534b873319f3a8daa612b469132ec7f7
e.priv=0x2222222222222222222222222222222222222222222222222222222222222222
e.pub=0x02466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f27
# Act One
input: 0x00036360e856310ce5d294e8be33fc807077dc56ac80d95d9cd4ddbd21325eff73f70df6086551151f58b8afe6c195782c6a
# Act Two
output: 0x0002466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276e2470b93aac583c9ef6eafca3f730ae
# Act Three
input: 0x00b9e3a702e93e3a9948c2ed6e5fd7590a6e1c3a0344cfc9d5b57357049aa22355361aa02e55a8fc28fef5bd6d71ad0c38228dc68b1c466263b47fdf31e560e139bb
output: ERROR (ACT3_BAD_TAG)
このテストでは、イニシエーターが長さ 5 のメッセージ "hello" を 1001 回送信します。簡潔さと 2 回のキーのローテーションをテストするために、6 つの例のみを示します:
name: transport-message test
ck=0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01
sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9
rk=0xbb9020b8965f4df047e07f955f3c4b88418984aadc5cdb35096b9ea8fa5c3442
# encrypt l: cleartext=0x0005, AD=NULL, sn=0x000000000000000000000000, sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9 => 0xcf2b30ddf0cf3f80e7c35a6e6730b59fe802
# encrypt m: cleartext=0x68656c6c6f, AD=NULL, sn=0x000000000100000000000000, sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9 => 0x473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95
output 0: 0xcf2b30ddf0cf3f80e7c35a6e6730b59fe802473180f396d88a8fb0db8cbcf25d2f214cf9ea1d95
# encrypt l: cleartext=0x0005, AD=NULL, sn=0x000000000200000000000000, sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9 => 0x72887022101f0b6753e0c7de21657d35a4cb
# encrypt m: cleartext=0x68656c6c6f, AD=NULL, sn=0x000000000300000000000000, sk=0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9 => 0x2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1
output 1: 0x72887022101f0b6753e0c7de21657d35a4cb2a1f5cde2650528bbc8f837d0f0d7ad833b1a256a1
# 0xcc2c6e467efc8067720c2d09c139d1f77731893aad1defa14f9bf3c48d3f1d31, 0x3fbdc101abd1132ca3a0ae34a669d8d9ba69a587e0bb4ddd59524541cf4813d8 = HKDF(0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01, 0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9)
# 0xcc2c6e467efc8067720c2d09c139d1f77731893aad1defa14f9bf3c48d3f1d31, 0x3fbdc101abd1132ca3a0ae34a669d8d9ba69a587e0bb4ddd59524541cf4813d8 = HKDF(0x919219dbb2920afa8db80f9a51787a840bcf111ed8d588caf9ab4be716e42b01, 0x969ab31b4d288cedf6218839b27a3e2140827047f2c0f01bf5c04435d43511a9)
output 500: 0x178cb9d7387190fa34db9c2d50027d21793c9bc2d40b1e14dcf30ebeeeb220f48364f7a4c68bf8
output 501: 0x1b186c57d44eb6de4c057c49940d79bb838a145cb528d6e8fd26dbe50a60ca2c104b56b60e45bd
# 0x728366ed68565dc17cf6dd97330a859a6a56e87e2beef3bd828a4c4a54d8df06, 0x9e0477f9850dca41e42db0e4d154e3a098e5a000d995e421849fcd5df27882bd = HKDF(0xcc2c6e467efc8067720c2d09c139d1f77731893aad1defa14f9bf3c48d3f1d31, 0x3fbdc101abd1132ca3a0ae34a669d8d9ba69a587e0bb4ddd59524541cf4813d8)
# 0x728366ed68565dc17cf6dd97330a859a6a56e87e2beef3bd828a4c4a54d8df06, 0x9e0477f9850dca41e42db0e4d154e3a098e5a000d995e421849fcd5df27882bd = HKDF(0xcc2c6e467efc8067720c2d09c139d1f77731893aad1defa14f9bf3c48d3f1d31, 0x3fbdc101abd1132ca3a0ae34a669d8d9ba69a587e0bb4ddd59524541cf4813d8)
output 1000: 0x4a2f3cc3b5e78ddb83dcb426d9863d9d9a723b0337c89dd0b005d89f8d3c05c52b76b29b740f09
output 1001: 0x2ecd8c8a5629d0d02ab457a0fdd0f7b90a192cd46be5ecb6ca570bfc5e268338b1a16cf4ef2d36
TODO(roasbeef); fin
- https://tools.ietf.org/html/rfc8439
- http://noiseprotocol.org/noise.html
- https://tools.ietf.org/html/rfc5869
FIXME
この作品は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下にライセンスされています。