はじめに
最初の接続
ステップ1:Optional OOB Information Collection
OOB(Out of Band:Bluetoothバンド以外)に関することですので、このステップは関係ありません。無視します。ところで、OOBとは、Bluetooth以外の方法と併せて認証作業を行うものです。Bluetooth以外の方法の具体例として有名なのはNFC(Near Field Communication:近距離対話)通信です。OOBは、PCにBluetoot+NFC機器を近づけると自動的に認証作業が終わるといった用途に採用されます。
ステップ2:Enable Simple Pairing
HCIプロトコル・レベルでSimple Pairing機能を有効化(enable)させるためのステップです。具体的には、ドングルの初期化の段階(HCIプロトコルによる接続の節を参照)で、PCやPICから、それらに接続されているドングルに対してWrite Simple Pairing Mode命令を出すことにより、Simple Pairing機能を有効化させます。例えばPIC側では次のような命令を出しています。
命令 56 0c 01 01
03 0c:オペコード命令が03でオペコード・グループが03(0cを4で割る)で、Write Simple Pairing Mode Command
01:以下に続くデータの数が1バイト
01:Simple pairingを可能とする
これに対してPICに繋がっているドングル(PICドングル)は、以下の応答を返してきます
応答 0E 04 01 56 0C 00
0E:Command Complete Event
04:以下に続くデータの数が4バイト
01:これ以降にドングル・ホストからドングルへ送って良いHCI命令の数
56 0C:HCI命令56 0Cに対する応答であることを示している。
00:Write Simple Pairing Mode CommandのReturn Parametersを見るとStatusを表していることが分かる。00は成功という意味
ところで、ドングルからSSPに関係するイベントを受け取るためには、ドングルの初期化の段階で、イベントマスクをきちんと設定しなければいけません。PIC側では、次のような命令を出しています。
命令 01 0c 08 ff ff ff ff ff 1f ff 00
01 0c:オペコード命令が01でオペコード・グループが03(0cを4で割る)で、Write Simple Pairing Mode Command
08:以下に続くデータの数が8バイト
ff ff ff ff ff 1f ff 00:リトルエンディアンなので、数値0x00 ff 1f ff ff ff ff ffを表しています。この数値の赤で示した箇所がSimple Pairingに関係する部分です。この箇所(ff)の各ビットの意味はBluetooth Ver. 2.1のマニュアルをご覧ください。
これに対してPICドングルは、 0E 04 01 01 0C 00 なる応答を返してきますが、これについては簡単に理解できると思いますので説明は省略します。
一方、PC側でも、以上と全く同じ作業をしています。
ステップ3a:L2CAP Connection Request for a Secure Service
L2CAPにおいて、チャンネル確保から始まる作業を、認証開始のために一時中断します。認証が終わったら中断が解除されますPICとしては特に何もすることはありません。
ステップ4:Start Simple Pairing
Simple Pairingを開始するステップです。PCとPCに繋がっているドングル(PCドングル)間の命令・応答のシーケンスです。PICとPICドングルは関与しません。作業内容は下図を参照ください。
① 認証要求命令(PCドングルに出す)
11 04 02 2B 00
11 04:オペコード命令が11でオペコード・グループが01で、Authentication Requested Command
02:以下に続くデータの数が2バイト
2B 00:Connection Handle
② リンクキー要求イベント(PCに返って来る)
17 06 4D E0 03 DC 1B 00
17:Link Key Request Event
06:以下に続くデータの数が6バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR(Bluetooth Device Address)
③ リンクキー未所有応答(PCはリンクキーをまだ持っていないことをPCドングルに伝える)
0C 04 06 4D E0 03 DC 1B 00
0C 04:オペコード命令が0Cでオペコード・グループが01で、Link Key Request Negative Reply Command
06:以下に続くデータの数が6バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
ステップ5:IO Capability Exchange
IOは入出力(Input Output)を意味します。Capabilityは能力という意味ですから、PCやPICがどんな入出力に関する能力を持つかについての情報を、PCとPIC間で交換(Exchange)するステップです。作業内容は下図を参照ください。PINコード入力を避けるためには、PICの入出力に関する能力について、PINコードを入力するためのボタンもディスプレイも無いと回答する必要があります。PINコードを入力するためのボタンがなければ、当然PINコードを入力できませんから、認証過程でPINコード入力を求められることは無くなります。SSPのJust Worksと呼ばれる認証過程になります。
① I/O能力要求イベント(PCドングルからPCに入るイベント)
31 06 4D E0 03 DC 1B 00
31:IO Capability Request Event
06:以下に続くデータの数が6バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR(Bluetooth Device Address)
② I/O能力応答(PCがPCドングルに応答)
2B 04 09 4D E0 03 DC 1B 00 01 00 05
2B 04:オペコード命令が2Bでオペコード・グループが01で、IO Capability Request Reply Command
09:以下に続くデータの数が9バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR(Bluetooth Device Address)
01:IO_Capabilityで0x01(DisplayYesNo)。これは、PCがディスプレイを持ち、YesNoを入力できるボタンを持っていることを示しています。
00:OOB_Data_Presentで0x00はOOBは使用しないことを意味します。
05:Authentication_Requirementsで、これが0x05であるMITM防御が要求されるという意味です。
③ LMPレベルでのI/O能力要求(PCドングルからPICドングルへ)
LMP(Link Manager プロトコル)レベルでのI/O能力要求であり、ファームウェアでは関与しないので説明は省略します。
④ I/O能力応答イベント
32 09 0A 6F FE 33 24 00 01 00 05
32:IO Capability Response Event
09:以下に続くデータの数が9バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
01 00 05:③の最後の3バイトと同じもので、意味も同じ。
⑤ I/O能力要求イベント(PICドングルからPICに入るイベント)
31 06 0A 6F FE 33 24 00
31:IO Capability Request Event
06:以下に続くデータの数が6バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
①と比較してください。
⑥ I/O能力応答(PICがPICドングルに応答)
2B 04 09 0A 6F FE 33 24 00 03 00 00
2B 04:オペコード命令が2Bでオペコード・グループが01で、IO Capability Request Reply Command
09:以下に続くデータの数が9バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR(Bluetooth Device Address)
03:IO_Capabilityで0x03(NoInputNoOutput)。これは、PICがディスプレイもYesNoを入力できるボタンも持っていないとしています。これでJust Works方式になります。
00:OOB_Data_Presentで0x00はOOBは使用しないことを意味します。
00:Authentication_Requirementsで、これが0x00であるとはMITM防御は必要ないと応答したという意味です。
②と比較してください。
⑦ LMPレベルでのI/O能力応答(PICドングルからPCドングルへ)
LMP(Link Manager プロトコル)レベルでのI/O能力応答であり、ファームウェアでは関与しないので説明は省略します。
⑧ I/O能力応答イベント(PCドングルからPCへ応答)
32 09 4D E0 03 DC 1B 00 03 00 00
32:IO Capability Response Event
09:以下に続くデータの数が9バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
03 00 00:⑥の最後の3バイトと同じもので、意味も同じ。
④と比較してください。
ステップ6:Public Key Exchange
公開鍵(Public Key)を交換(Exchange)するステップです。ただ、PICドングルとPCドングル間だけでの作業なので、ファームウェアを開発する上では理解する必要ありません(PIC、PCともに何もすることがありません)。
ステップ7a:Numeric Comparison
Just Works方式のときの動作です。まず、PCドングルとPICドングル間でPINキーを交換します。
① ユーザー確認要求イベント(PC)
33 0A 4D E0 03 DC 1B 00 F8 FA 08 00
33:User Confirmation Request Event
0A:以下に続くデータの数が10バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
F8 FA 08 00:PINキー(確認すべき数値)
② ユーザー確認応答(PC)
2C 04 06 4D E0 03 DC 1B 00
2C 04:User Confirmation Request Reply Command
06:以下に続くデータの数が6バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
③ ユーザー確認要求イベント(PIC)
33 0A 0A 6F FE 33 24 00 F8 FA 08 00
33:User Confirmation Request Event
0A:以下に続くデータの数が10バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
F8 FA 08 00:PINキー(確認すべき数値) ①と同じ数値を確認しあうことになる。
④ ユーザー確認応答(PIC)
2C 04 06 0A 6F FE 33 24 00
2C 04:User Confirmation Request Reply Command
06:以下に続くデータの数が6バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
ステップ8:DHKey Checks
DHKey (Diffie-Hellman Key)なる鍵(Key)をチェックするステップですが、理解していません。PICドングルとPCドングル間だけでの作業だけで、チェックが完了すると、Simple Pairing Complete EventがPICやPCに通知されます。
① Simple Paring 完了イベント(PC)
36 07 00 4D E0 03 DC 1B 00
36:Simple Pairing Complete Event
07:以下に続くデータの数が7バイト
00:ステータスで00はペアリングの成功を意味します。
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
② Simple Paring 完了イベント(PIC)
36 07 00 0A 6F FE 33 24 00
36:Simple Pairing Complete Event
07:以下に続くデータの数が7バイト
00:ステータスで00はペアリングの成功を意味します。
0A 6F FE 33 24 00:PCドングルのBD_ADDR
ステップ9:Calculate Link Key
再接続時に必要なリンク・キーが計算され、それがLink key Notification EventとしてがPICやPCに通知されます。
④ リンクキー通知イベント(PC)
18 17 4D E0 03 DC 1B 00 CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF 04
18:Link Key Notification Event
17:以下に続くデータの数が23バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF:リンクキー
04キータイプ 04はUnauthenticated Combination Keyですが、理解していません。
④ リンクキー通知イベント(PIC)
18 17 0A 6F FE 33 24 00 CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF 04
18:Link Key Notification Event
17:以下に続くデータの数が23バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF:リンクキー
04キータイプ 04はUnauthenticated Combination Keyですが、理解していません。
ステップ10:Enable Encryption
① 認証完了イベント
06 03 00 2B 00
06:Authentication Complete Event
03:以下に続くデータの数が3バイト
00:ステータスで00は認証の成功を意味します。
2B 00:Connection Handle (PC)
② 暗号化接続設定
13 04 03 2B 00 01
13 04:Set Connection Encryption Command
03:以下に続くデータの数が3バイト
2B 00:Connection Handle (PC)
01:01はリンクレベルでの暗号を可能とするという意味
③ 暗号設定変化イベント(PC)
08 04 00 2B 00 01
08:Encryption Change Event
04:以下に続くデータの数が4バイト
00:ステータスで00は暗号変化の成功(暗号が可能となったこと)を意味します。
2B 00Connection Handle (PC)
01:01はリンクレベルでの暗号を可能とするという意味。
④ 暗号設定変化イベント(PIC)
08 04 00 2A 00 01
08:Encryption Change Event
04:以下に続くデータの数が4バイト
00:ステータスで00は暗号変化の成功(暗号が可能となったこと)を意味します。
2A 00Connection Handle (PIC)
01:01はリンクレベルでの暗号を可能とするという意味。
再接続
スッテプ1:Authentication Requested
注意:再接続時には、PCとPICで、ホストとマスターの役割が初めての接続の時とは逆になります。
① 認証要求命令(PICドングルに出す)
② リンクキー要求イベント(PICに返って来る)
17 06 0A 6F FE 33 24 00
17:Link Key Request Event
06:以下に続くデータの数が6バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
③ リンクキー応答(PIC)
0B 04 16 0A 6F FE 33 24 00 CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF
0B 04:Link Key Request Reply Command
16:以下に続くデータの数が22バイト
0A 6F FE 33 24 00:PCドングルのBD_ADDR
CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF最初の接続時に得たリンクキー
④ リンクキー要求イベント(PCに返って来る)
17 06 4D E0 03 DC 1B 00
17:Link Key Request Event
06:以下に続くデータの数が6バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
⑤ リンクキー応答(PC)
0B 04 16 4D E0 03 DC 1B 00 CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF
0B 04:Link Key Request Reply Command
16:以下に続くデータの数が22バイト
4D E0 03 DC 1B 00:PICドングルのBD_ADDR
CB 34 A6 D7 64 53 9D 39 B9 D2 17 66 28 83 0A AF最初の接続時に得たリンクキー
⑥ 認証完了イベント(PIC)
06 03 00 2A 00
06:Authentication Complete Event
03:以下に続くデータの数が3バイト
00:ステータスで00は認証の成功を意味します。
2A 00::Connection Handle (PIC)
スッテプ2:Set Connection Encryption
① 暗号化接続設定(PIC)
13 04 03 2A 00 0
13 04:Set Connection Encryption Command
03:以下に続くデータの数が3バイト
2A 00:Connection Handle (PIC)
01:01はリンクレベルでの暗号を可能とするという意味。
② 暗号設定変化イベント(PC)
08 04 00 2B 00 01
08:Encryption Change Event
04:以下に続くデータの数が4バイト
00:ステータスで00は暗号変化の成功(暗号が可能となったこと)を意味します。
2B 00:Connection Handle (PC)
01:01はリンクレベルでの暗号を可能とするという意味。
③ 暗号設定変化イベント(PIC)
08 04 00 2A 00 01
08:Encryption Change Event
04:以下に続くデータの数が4バイト
00:ステータスで00は暗号変化の成功(暗号が可能となったこと)を意味します。
2A 00:Connection Handle (PIC)
01:01はリンクレベルでの暗号を可能とするという意味。