ロック解除フロー
ネットワークロック解除機能のエミュレートに先立ち、まずはメッセージフローを理解するところから始めます。一通りのロック解除の流れは、以下のようになります。
なお、文中の用語は下部にまとめておきます。
- クライアントは、以下の情報を含むNKPU要求パケットをブロードキャストします。
・キープロテクター(KP)
・KPの暗号化に使用したX.509証明書の拇印 - サーバは、当該要求を処理してよいか、以下の観点で確認します。
・(オプション)クライアントIPが、許可IPリストに掲載されているものと一致するか
・要求で使用された公開鍵に対応する秘密鍵にアクセス可能か(証明書の拇印を用いる) - サーバは、解除要求を許可する場合、以下のようにNKPU応答パケットを生成し、クライアント向けにユニキャストします。
・保有する秘密鍵を用いて、KPを復号する
・KPに含まれるクライアント鍵(CK), セッション鍵(SK)を用いてキープロテクターレスポンス(KPR)を生成する
・DHCPパケットのオプションにKPRを含める
フローを図示すると、以下のようになります。(公式ドキュメントより引用)
出典:[MS-NKPU]: Network Key Protector Unlock Protocol 1.3.1 Message Flow Figure 1: Network key protector unlock process
用語集
- ・キープロテクター (KP) : CK並びにSKを、X.509公開鍵(PK)にてPKCS#1 v1.5を用いて暗号化したもの。復号すると64 bytesのデータとなり、前半の32 bytesがCK, 後半の32bytesがSKである。
- ・クライアント鍵 (CK) : クライアントがKPを用いてサーバに送り、サーバからKPRにて返送されることを期待している鍵。サイズは32 bytes
- ・セッション鍵 (SK) : KPR生成時に使用する、ランダムに生成された32 bytesの鍵。
- ・キープロテクターレスポンス (KPR) : CKヘッダ(12 bytes固定値, 0x2C 00 00 00 01 00 00 00 06 20 00 00)並びにCKを、SKにてAES-CCMを用いて暗号化し、得られたMAC(16 bytes)と暗号化データをこの順で並べたもの
パケット仕様
では本題の、NKPUで使用されるパケットの仕様を確認していきます。
仕様書上はIPv6, IPv4双方の定義が掲載されていますが、IPv4のみを紹介・実装することにします。
パケット仕様 (1) ― 共通事項
NKPUパケットは、要求/応答共に RFC2131 で規定されるDHCPパケット仕様に準拠します。NKPUに必要な情報は、すべてオプション領域に格納されます。
以下にDHCPパケット並びにそのオプション部のデータ構造を示します。表には参考まで、NKPU応答時に各フィールドにセットする値を記載しますが、独自研究であることに留意してください。

フィールド名 | サイズ [byte] | 説明 | 応答時の値 |
op | 1 | opコード | 0x02 |
htype | 1 | ハードウェアアドレス種別 | 0x01 |
hlen | 1 | ハードウェアアドレス長 | 0x06 |
hops | 1 | ホップ数 | 0x00 |
xid | 4 | トランザクションID | 要求時と同一 |
secs | 2 | 経過秒数 | 0x00 00 |
flags | 2 | フラグ | 0x00 00 |
ciaddr | 4 | クライアントIPアドレス | 0x00 00 00 00 |
yiaddr | 4 | “あなたの”IPアドレス | 要求時と同一 |
siaddr | 4 | 起動処理に使用されるIPアドレス | 要求時と同一 |
giaddr | 4 | リレーエージェントのIPアドレス | 要求時と同一 |
chaddr | 16 | クライアントのHWアドレス | 要求時と同一 |
sname | 64 | サーバーホスト名 | 要求時と同一 |
file | 128 | ブートファイル名 | 要求時と同一 |
option | variable | オプションパラメータ | 別途詳細解説 |

フィールド名 | サイズ [byte] | 説明 | 値 |
Magic Cookie | 4 | オプション部の開始を表す | 0x63 82 53 63 |
Option Code | 1 | オプションコード | 可変 |
Option Len | 1 | Option Data の長さ | 可変 |
Option Data | variable | オプションデータ本体 | 可変 |
End Code | 1 | オプション部の終了を表す | 0xFF |
なお、NKPUで使用されるDHCPオプションは、以下の通りです。
Option Code | 要求時 | 応答時 | 含まれる情報 |
43 (0x2B) | 〇 | 〇 | NKPUデータ |
60 (0x3C) | 〇 | 〇 | 固定文字列(ASCII) “BITLOCKER” |
125 (0x7D) | 〇 | ― | NKPUデータ |
パケット仕様 (2) ― NKPU要求時のオプション
(2) ― 1 オプション43仕様
本オプションの第1サブオプションには使用される証明書のフィンガープリントが、第2サブオプションにはキープロテクター(KP)の前半部分が含まれます。データ構造並びに各値(独自研究)は以下のとおりです。

フィールド名 | サイズ [byte] | 説明 | 値 |
1st Suboption Code | 1 | サブオプション番号 | 0x01 |
1st Suboption Len | 1 | 第1サブオプションの長さ | 0x14 |
1st Suboption Data | 20 | 証明書フィンガープリント | 可変 |
2nd Suboption Code | 1 | サブオプション番号 | 0x02 |
2nd Suboption Len | 1 | 第2サブオプションの長さ | 0x80 |
2nd Suboption Data | 128 | KPの前半128byte | 可変 |
(2) ― 2 オプション125仕様
本オプションには、企業識別番号並びにKPの後半部分が含まれます。データ構造並びに各値(独自研究)は以下のとおりです。

フィールド名 | サイズ [byte] | 説明 | 値 |
Enteerprise Number | 4 | 企業識別番号 | 0x00 00 01 37 |
Data Len | 1 | 本フィールド以降の長さ | 0x82 |
Suboption Code | 1 | サブオプション番号 | 0x01 |
Suboption Len | 1 | サブオプションの長さ | 0x80 |
Suboption Data | 128 | KPの後半128byte | 可変 |
パケット仕様 (3) ― NKPU応答時のオプション
NKPU応答時は、オプション43(とオプション60)が必要となります。オプション43にはキープロテクターレスポンス(KPR)が含まれ、そのデータ構造並びに各値(独自研究)は以下のとおりです。

フィールド名 | サイズ [byte] | 説明 | 値 |
Suboption Code | 1 | サブオプション番号 | 0x02 |
Suboption Len | 1 | サブオプションの長さ | 0x3C |
Suboption Data | 60 | KPR | 可変 |
ここまでで、サーバ側のエミュレートに必要な情報は揃いました。次回はクライアント側の設定について確認していきます。