はじめに
Bluetooth Meshの仕様について、Bluetooth SIGで公開されている「Mesh Profile Specification 1.0.1」に基づき、学習を兼ねて記載して行こうと思っています。本文章では、5章の「プロビジョニング」の次の節について記載いたします。
- 5.4 プロビジョニングプロトコル
記載内容に誤り等がありましたら、ご連絡いただければ幸いです。
5.4 プロビジョニングプロトコル
このセクションでは、Provisioning PDU、動作、およびセキュリティの要件を定義します。
5.4.1 Provisioning PDUs
Provisioning PDUは、プロビジョナーとデバイス間の通信に使用されます。
Provisioning PDUの最初のオクテットは、Typeフィールドであり、Provisioning PDUのパラメータのフォーマットを定義します。
Provisioning PDUのフォーマットは表5.13で定義され、図5.11に示されています。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
Padding | 2 | 0b00。 他のすべての値は禁止されています |
Type | 6 | Provisioning PDUのタイプの値(表5.14を参照) |
Parameters | 可変長 | メッセージパラメータ |
Provisioning PDUのTypeの値は、表5.14で定義されています。
タイプ | 名前 | 説明 |
---|---|---|
0x00 | Provisioning Invite | メッシュネットワークに参加するように デバイスを招待します |
0x01 | Provisioning Capabilities | デバイスの機能を示します |
0x02 | Provisioning Start | デバイスの機能に基づいて プロビジョナーが選択した プロビジョニング方法を示します |
0x03 | Provisioning Public Key | デバイスまたはプロビジョナーの 公開鍵が含まれています |
0x04 | Provisioning Input Complete | ユーザーが値の入力を完了したことを 示します |
0x05 | Provisioning Confirmation | デバイスまたはプロビジョナーの プロビジョニング確認値が 含まれます |
0x06 | Provisioning Random | デバイスまたはプロビジョナーの プロビジョニングランダム値が 含まれます |
0x07 | Provisioning Data | プライマリエレメントに割り当てられた ユニキャストアドレス、ネットワークキー、 NetKeyインデックス、フラグ、 およびIVインデックスが含まれます |
0x08 | Provisioning Complete | プロビジョニングが完了したことを 示します |
0x09 | Provisioning Failed | プロビジョニングが失敗したことを 示します |
0x0A – 0xFF | RFU | 将来の使用のために予約済み |
5.4.1.1 Provisioning Invite
プロビジョナーはこのPDUを送信して、プロビジョニングプロセスが開始されていることをデバイスに示します。 このPDUのパラメータのフォーマットは、表5.15で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Attention Duration | 1 | アテンションタイマーの状態 (セクション4.2.9を参照) |
5.4.1.2 Provisioning Capabilities
デバイスはこのPDUを送信して、サポートされているプロビジョニング機能をプロビジョナーに示します。 このPDUのパラメータのフォーマットは、表5.16で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Number of Elements | 1 | デバイスでサポートされている エレメントの数(表5.17を参照) |
Algorithms | 2 | サポートされているアルゴリズム およびその他の機能(表5.18を参照) |
Public Key Type | 1 | サポートされている公開鍵タイプ (表5.19を参照) |
Static OOB Type | 1 | サポートされている静的OOBタイプ (表5.20を参照) |
Output OOB Size | 1 | サポートされる出力OOBの最大サイズ (表5.21を参照) |
Output OOB Action | 2 | サポートされている出力OOBアクション (表5.22を参照) |
Input OOB Size | 1 | サポートされている入力OOBの オクテット単位の最大サイズ (表5.23を参照) |
Input OOB Action | 2 | サポートされている入力OOBアクション (表5.24を参照) |
エレメント数の値は、表5.17で定義されています。
値 | 説明 |
---|---|
0x00 | 禁止 |
0x01 – 0xFF | デバイスでサポートされているエレメントの数 |
アルゴリズムの値は表5.18で定義されています。
Bit | 説明 |
---|---|
0 | FIPS P-256 Elliptic Curve |
1 – 15 | 将来の使用のために予約済み |
少なくとも1つのアルゴリズムがデバイスでサポートされている必要があります。
Public Key Typeの値は、表5.19で定義されています。
Bit | 説明 |
---|---|
0 | Public Key OOB情報が利用可能 |
1 – 7 | 禁止 |
公開鍵OOB情報のサイズは、選択したアルゴリズムによって決定されます。
Static OOB Typeの値は、表5.20で定義されています。
Bit | 説明 |
---|---|
0 | 利用可能なStatic OOB情報 |
1 – 7 | 禁止 |
静的OOB情報の最大サイズは16オクテットです。
値「出力数値」が設定されていて、「出力英数字」がOutput OOB Actionフィールドに設定されていない場合(表5.22を参照)、Output OOB Sizeは、出力(表示または音声など)できる桁数を定義します。Output OOB Sizeは、値出力数値が設定されておらず、出力英数字がOutput OOB Actionフィールドに設定されている場合に出力できる桁数と大文字を定義します。Output OOB Sizeは、Output OOB Actionフィールドで[出力数値]の値が設定され、[出力英数字]が設定されている場合に出力できる桁数と大文字を定義します。Output OOB Sizeの値は、表5.21で定義されています。
値 | 説明 |
---|---|
0x00 | デバイスは出力OOBを サポートしていません |
0x01 – 0x08 | デバイスでサポートされている 出力OOBの最大サイズ |
0x09 – 0xFF | 将来の使用のために予約済み |
Output OOB Actionの値は表5.22で定義されています。
Bit | 説明 | データタイプ |
---|---|---|
0 | 点滅 | 数字 |
1 | ビープ | 数字 |
2 | バイブレーション | 数字 |
3 | 出力数値 | 数字 |
4 | 出力英数字 | 英数字 |
5 – 15 | 将来の使用のために予約済み | n/a |
Input OOB Sizeは、入力数字が設定され、入力英数字がInput OOB Actionフィールドに設定されていない場合に入力できる桁数を定義します(表5.24を参照)。値入力数値が設定されておらず、入力英数字がInput OOB Actionフィールドに設定されている場合、Input OOB Sizeは、入力できる桁数と大文字を定義します。値「入力数値」が設定され、「入力英数字」がInput OOB Actionフィールドに設定されている場合、Input OOB Sizeは、入力できる桁数と大文字を定義します。Input OOB Sizeの値は、表5.23で定義されています。
値 | 説明 |
---|---|
0x00 | デバイスはInput OOBを サポートしていません |
0x01 – 0x08 | デバイスでサポートされている Input OOBの最大サイズ |
0x09 – 0xFF | 将来の使用のために予約済み |
Input OOB Actionは、表5.24で定義されています。
Bit | 説明 | データタイプ |
---|---|---|
0 | Push | 数字 |
1 | Twist | 数字 |
2 | 数値入力 | 数字 |
3 | 英数字入力 | 英数字 |
4 – 15 | 将来の使用のために予約済み | n/a |
5.4.1.3 Provisioning Start
プロビジョナーは、このPDUを送信して、Provisoning Capabilities PDUのオプションから選択した方法を示します。 このPDUのパラメータのフォーマットは、表5.25で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Algorithm | 1 | プロビジョニングに使用されるアルゴリズム (表5.26を参照) |
Public Key | 1 | 使用されるPublic Key(表5.27を参照) |
Authentication Method | 1 | 使用される認証方法(表5.28を参照) |
Authentication Action | 1 | 選択されたOutput OOB Action(表5.29を参照) またはInput OOB Action(表5.31を参照) または0x00 |
Authentication Size | 1 | 使用されるOutput OOBのサイズ(表5.30を参照) または使用されるInput OOBのサイズ(表5.32を参照) または0x00 |
アルゴリズムの値は表5.26で定義されています。
値 | 説明 |
---|---|
0x00 | FIPS P-256 Elliptic Curve |
0x01 – 0xFF | 将来の使用のために予約済み |
Public Keyの値は表5.27で定義されています。
値 | 説明 |
---|---|
0x00 | OOB Public Keyは使用されません |
0x01 | OOB Public Keyが使用されます |
0x02 – 0xFF | 禁止 |
認証方法の値を表5.28に定義します。
値 | 説明 |
---|---|
0x00 | OOB認証は使用されません |
0x01 | Static OOB認証が使用されます |
0x02 | Output OOB認証が使用されます |
0x03 | Input OOB認証が使用されます |
0x04 – 0xFF | 禁止 |
認証方法0x00(OOB認証を使用しない)方式を使用する場合、Authentication Actionフィールドは0x00に設定され、Authentication Sizeフィールドは0x00に設定されます。
認証方法0x01(Static OOBによる認証)方式を使用する場合、Authentication Sizeは0x00に設定され、Authentication Actionフィールドは0x00に設定されます。
認証方法0x02(Output OOBによる認証)を使用する場合、表5.29および表5.30で定義された値を使用して、Authentication ActionとAuthentication Sizeを決定する必要があります。
Authentication Size ActionフィールドのOutput OOB Action値は、表5.29で定義されています。
値 | 説明 |
---|---|
0x00 | Blink |
0x01 | Beep |
0x02 | Vibrate |
0x03 | 出力数値 |
0x04 | 出力英数字 |
0x05 – 0xFF | 将来の使用のために予約済み |
Authentication Sizeフィールド値のOutput OOB Sizeは、表5.30で定義されています。
値 | 説明 |
---|---|
0x00 | 禁止 |
0x01 – 0x08 | 使用するOutput OOB Size |
0x09 – 0xFF | 将来の使用のために予約済み |
認証方式0x03(Input OOBによる認証)方式を使用する場合、表5.31および表5.32で定義された値を使用して、Authentication ActionとAuthentication Sizeを決定する必要があります。
Authentication ActionフィールドのInput OOB Action値は、表5.31で定義されています。
値 | 説明 |
---|---|
0x00 | Push |
0x01 | Twist |
0x02 | 入力数字 |
0x03 | 入力英数字 |
0x04 – 0xFF | 将来の使用のために予約済み |
Authentication SizeフィールドのInput OOB Sizeの値は、表5.32で定義されています。
値 | 説明 |
---|---|
0x00 | 禁止 |
0x01 – 0x08 | 使用するInput OOB Size |
0x09 – 0xFF | 将来の使用のために予約済み |
5.4.1.4 Provisioning Public Key
このプロビジョナーは、このPDUを送信して、ECDH計算で使用されるPublic Keyを配信します。このPDUのパラメータのフォーマットは、表5.33で定義されています。
フィールド | サイズ (オクテット) | 説明 |
---|---|---|
Public Key X | FIPSP-256アルゴリズムの Public KeyのXコンポーネント | |
Public Key Y | FIPSP-256アルゴリズムの Public KeyのYコンポーネント |
5.4.1.5 Provisioning Input Complete
ユーザーが入力操作を完了すると、デバイスはこのPDUを送信します。 このPDUのパラメータはありません。
5.4.1.6 Provisioning Confirmation
プロビジョナーまたはデバイスは、このPDUをピアに送信して、OOB認証値やまだ交換されていない乱数など、これまでに交換された値を確認します。 このPDUのパラメータのフォーマットは、表5.34で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Confirmation | 16 | OOB認証値を含む これまでに交換された値 |
5.4.1.7 Provisioning Random
プロビジョナーまたはデバイスはこのPDUを送信して、ピアデバイスが確認を検証できるようにします。 このPDUのパラメータのフォーマットは、表5.35で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Random | 16 | 確認への最終入力 |
5.4.1.8 Provisioning Data
プロビジョナーはこのPDUを送信して、プロビジョニングデータをデバイスに配信します。 このPDUのパラメータのフォーマットは、表5.36で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Encrypted Provisioning Data | 16 | 暗号化および認証されたネットワークキー、 NetKeyインデックス、キー更新フラグ、 IV更新フラグ、IVインデックスの現在の値、 およびプライマリエレメントのユニキャストアドレス (セクション5.4.2.5を参照) |
Provisioning Data MIC | PDU整合性チェック値 |
5.4.1.9 Provisioning Complete
デバイスはこのPDUを送信して、プロビジョニングデータを正常に受信して処理したことを示します。
このPDUのパラメータはありません。
5.4.1.10 Provisioning Failed
受信したプロビジョニングプロトコルPDUの処理に失敗した場合、デバイスはこのPDUを送信します。 このPDUのパラメータのフォーマットは、表5.37で定義されています。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Error Code | 1 | これは、デバイスで発生した プロビジョニングプロトコルの 特定のエラーを表します |
Provisioning Data MIC | PDU整合性チェック値 |
プロビジョニングエラーコードを表5.38に定義します。
値 | 名前 | 説明 |
---|---|---|
Error Code | Prohibited | 禁止 |
Provisioning Data MIC | Invalid PDU | プロビジョニングプロトコルPDUが デバイスによって認識されない |
Invalid Format | プロトコルPDUの引数が期待値の範囲外であるか、 PDUの長さが期待値と異なる | |
Unexpected PDU | 手順のこの時点では、受信したPDUは 予期されていませんでした | |
Confirmation Failed | 計算された確認値は正常に 検証されませんでした | |
Out of Resources | デバイスのリソースが不足しているため、 プロビジョニングプロトコルを続行できません | |
Decryption Failed | データブロックは正常に復号化されませんでした | |
Unexpected Error | 回復できない可能性のある 予期しないエラーが発生しました | |
Cannot Assign Addresses | デバイスは、連続するユニキャストアドレスを すべてのエレメントに割り当てることはできません | |
RFU | 将来の使用のために予約済み |
5.4.2 Provisioning behavior
プロビジョニングは、図5.12に示すように、ビーコン、招待、Public Keyの交換、認証、およびプロビジョニングデータの配布という5つのステップのプロセスを使用して実行されます。
5.4.2.1 Beaconing
PB-ADVをサポートしプロビジョニングされておらず、プロビジョニング中のデバイスは、 セクション3.9.2で定義されているように、Unprovisioned Device beaconをアドバタイズするものとします。それ以外の場合、デバイスはUnprovisioned Device beaconをアドバタイズしません。デバイスがプロビジョニングされていない場合は、匿名アドバタイジング[2]、解決不可能なプライベートアドレス、または解決可能なプライベートアドレスを使用することをお勧めします。 このビーコンは、次のステップの前にプロビジョナーがユーザーにこのOOBデータを収集するために促すことができるOOBデータの可用性を示している場合があります。
5.4.2.2 Invitation
プロビジョニングベアラを確立した後、プロビジョナーはProvisioning Invite PDUを送信し、デバイスはProvisioning Capabilities PDUで応答する必要があります。Provisioning Invite PDUには、セクション4.2.9で説明されているように、デバイスのプライマリエレメントがアテンションタイマーを使用して自身を識別する時間を決定するために使用されるAttention Durationフィールドが含まれています。プロビジョニングベアラがドロップされた場合、デバイスはプライマリエレメントのAttention Timer状態を0x00(オフ)に設定する必要があります。Provisioning Capabilities PDUには、デバイスに認証に使用できるOOBデータのブロックがある場合、デバイスがサポートするエレメントの数に関する情報、サポートされているセキュリティアルゴリズムのセット、OOBテクノロジを使用したPubic Keyの可用性、このデバイスがユーザーに値を出力する機能、このデバイスがユーザーによる値の入力を許可する機能が含まれています。
Provisioning Inviteのメッセージシーケンスは、以下の図5.13に示されています。
5.4.2.3 Exchanging public keys
このステップには、プロビジョナー側でのプロビジョニングされていないデバイスのPublic Keyの可用性に応じて、2つの可能性があります。 認証ステップの3つの可能性(セクション5.4.2.4を参照)と組み合わせると、6つの可能な交換/認証パスがあります。
プロビジョナーは、デバイスをプロビジョニングできると判断すると、プロビジョナーが使用することを選択した6つの可能なパスの詳細を示すProvisioning Start PDUを送信する必要があります。
プロビジョナーからProvisioning Start PDUを受信すると、デバイスはAttention Timerを0x00に設定する必要があります。
プロビジョナーは、Provisioning Capability PDUで新しいデバイスによって提供されたアルゴリズムから単一のアルゴリズムを選択する必要があります。 プロビジョナーがこのアルゴリズムビットフィールドに設定されたビットを理解できない場合、プロビジョナーはそのビットを無視し、理解できるアルゴリズムからのみ選択します。 プロビジョナーは、最も強力なアルゴリズムを選択する必要があります。
OOBテクノロジーを使用してPublic Keyを使用できなかった場合、Public Keyはプロビジョナーとプロビジョニングされていないデバイスの間で交換されます。 交換ごとに、プロビジョナーとプロビジョニングされていないデバイスによって新しいキーペアが生成されます。
キーがOOBで配信されない場合、デバイスはPubic Keyを送信する必要があります。
プロビジョニングされていないデバイスのPublic Keyが不明な場合の公開鍵交換のメッセージシーケンスを、以下の図5.14に示します。
それ以外の場合、Pubic KeyがOOBメカニズムを介して利用可能である場合、新しい鍵ペアがプロビジョナーによって生成され、生成された鍵ペアのPublic Keyがプロビジョナーからデバイスに送信され、Static Public Keyが送信され、適切なOOBテクノロジーを使用してデバイスから読み取られます。
プロビジョニングされていないデバイスのPublic KeyがOOBである場合の公開鍵交換のメッセージシーケンスは、以下の図5.15に示されています。
プロビジョナーとデバイスは、ピアデバイスまたは取得したOOBによって提供されたPublic Keyが有効かどうかを確認する必要があります(セクション5.4.3.1を参照)。
プロビジョナーが無効なPublic Keyを受信すると、プロビジョニングは失敗し、プロビジョナーはセクション5.4.4で説明されているように動作するものとします。デバイスが無効なPublic Keyを受信すると、プロビジョニングは失敗し、デバイスはセクション5.4.4で説明されているように動作するものとします。
Public Keyが認識されて検証された後、ECDHSecretは次の式を使用して計算されます。
ECDHSecret = P-256(private key, peer public key)
ECDHSecretが計算された後、プロビジョナーとプロビジョニングされていないデバイスは、このステップで生成された秘密公開鍵ペアを削除する必要があります。
5.4.2.4 Authentication
Output OOB認証が使用される場合、Provisioning Start PDUには、所定のアクションを使用してデバイスに1桁または複数桁の値を出力する要求が含まれます。 Output Actionの例には、音を立てる、ライトや音声を点滅させる、ディスプレイに記号を表示するなどがあります。
たとえば、デバイスがLEDを含むドアロックである場合、そのLEDを点滅させるアクションでOutput OOB認証を使用することが可能です。
認証方法0x02(Output OOBを使用した認証)が使用され、認証アクション値のOutput OOB Actionが点滅、ビープ音、またはバイブレーションと等しい場合、 デバイスは、0から10までのランダムな整数を認証サイズの排他的な累乗で選択する必要があります。その乱数は、ユーザーがシーケンスの終了を判断できるように、シーケンス間に少なくとも3秒のギャップがあるイベント(たとえば、500ミリ秒オンと500ミリ秒オフのデューティサイクルで点滅、ビープ音、または振動することによって)のシーケンスとして出力されるものとします。認証アクション値のOutput OOB Actionが出力数値と等しい場合、値は、認証サイズ値によって決定された桁数(つまり、ASCII文字コード0x30-0x39)を使用して出力(たとえば、表示または音声)されます。認証アクション値の出力OOBアクションが出力英数字と等しい場合、値は、認証サイズ値によって決定されたASCII数字と大文字(つまり、ASCII文字コード0x30-0x39および0x41-0x5A)の数を使用して出力されます。
プロビジョナーのユーザーは、そのデバイスを認証するために観察された番号を入力する必要があります。
番号の入力が完了すると、確認交換とそれに続く乱数交換が実行されます。 確認値は、これまでに交換されたすべての値、まだ明らかにされていない乱数、および入力された番号の暗号化ハッシュです。 乱数が交換されると、各デバイスはピアを認証できます。
Output OOB、Input OOB、またはStatic OOBからの認証値は、以下に説明するように確認値を計算する目的でAuthValueで使用されます。
プロビジョナーの確認値は、以下を使用して計算されます。
ConfirmationProvisioner = AES-CMACConfirmationKey (RandomProvisioner || AuthValue)
デバイスの確認値は、以下を使用して計算されます。
ConfirmationDevice = AES-CMACConfirmationKey (RandomDevice || AuthValue)
ここで
ConfirmationKey = k1(ECDHSecret, ConfirmationSalt, “prck”)
ConfirmationSalt = s1(ConfirmationInputs)
ConfirmationInputs = ProvisioningInvitePDUValue || ProvisioningCapabilitiesPDUValue || ProvisioningStartPDUValue || PublicKeyProvisioner || PublicKeyDevice
ProvisioningInvitePDUValueは、送信または受信されたProvisioning Invite PDUフィールド(オペコードを除く)の値です。
ProvisioningCapabilitiesPDUValueは、送信または受信されたProvisioning Capabilities PDUフィールド(オペコードを除く)の値です。
ProvisioningStartPDUValueは、送信または受信されたProvisioning Start PDUフィールド(オペコードを除く)の値です。
PublicKeyProvisionerは、プロビジョナーによって送信されたPublic Key PDUのPublic Key XフィールドとPublic Key Yフィールドの値です。
PublicKeyDeviceは、デバイスによって送信されたPublic Key PDUまたは配信されたOOB Public KeyからのPublic Key XおよびPublic Key Yフィールドの値です。
RandomProvisionerは、プロビジョナーの乱数ジェネレーターによって生成されるランダムビットの文字列です。 乱数ジェネレーターは、コア仕様[1]のボリューム2、パートH、セクション2の要件と互換性がなければなりません。
RandomDeviceは、デバイスの乱数ジェネレーターによって生成されるランダムビットの文字列です。 乱数ジェネレーターは、コア仕様[1]のボリューム2、パートH、セクション2の要件と互換性がなければなりません。
AuthValueは128ビット値です。 AuthValueの計算は、使用されるOutput OOB Action、Input OOB Action、またはStatic OOBタイプのデータ型によって異なります。
データ型がバイナリの場合、AuthValueはオクテットの配列です。 値が128ビットより短い場合、残りのビットは0に設定されます。
たとえば、値が[0x12、0x34、0x56]の場合、AuthValueは[0x12、0x34、0x56、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00]で構成される配列です。
データ型が数値の場合、数値は符号なし128ビット値として表されます。 データ型が英数字の場合、AuthValueは文字のASCIIコードを連結したものでなければなりません。
たとえば、Output OOBメソッドを使用した認証がOutput OOB Actionで点滅として使用され、出力された値が5の場合、AuthValueは0x00000000000000000000000000000005になります。次に、確認値を計算するために、AuthValueがセクション5.1で定義されているようにエンコードされ、結果として、[0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、 0x00、0x00、0x05]で構成される配列になります。
たとえば、Output OOBを使用した認証メソッドが、表示番号としてOutput OOB Actionとともに使用され、表示された番号が019655の場合、AuthValueは0x00000000000000000000000000004CC7になります。 次に、確認値を計算するために、AuthValueがセクション5.1で定義されているようにエンコードされ、結果として、[0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、 0x00、0x4C、0xC7]で構成される配列になります。
たとえば、Output OOBメソッドを使用した認証が表示文字列としてのOutput OOB Actionで使用され、表示される文字列が「123ABC」の場合、AuthValueは0x31323341424300000000000000000000になります。 結果として、[0x31、0x32、0x33、0x41、0x42、0x43、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00]で構成される配列になります。
たとえば、OOBを使用しない認証方法を使用する場合、AuthValueは0x00000000000000000000000000000000に設定されます。これは、認証されていないことを意味します。 結果として、[0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00]で構成される配列になります。
プロビジョナーは、Provisioning Confirmation PDUを受信した後、Provisioning Random PDUを送信する必要があります。 デバイスは、受信した乱数に対して値を確認した後、Provisioning Randomを送信する必要があります。
Output OOBを使用した認証のメッセージシーケンスは、以下の図5.16に示されています。
認証方法0x03(入力OOBによる認証)メソッドが使用され、認証アクション値のInput OOB ActionがPushに等しい場合、プロビジョナーは0から10までのランダムな整数を認証サイズの排他的な累乗で選択する必要があります。その乱数は、Pushアクションの数によって入力されます。認証アクション値のInput OOB ActionがTwistに等しい場合、プロビジョナーは0から10までのランダムな整数を認証サイズの排他的な累乗で選択するものとします。 その乱数は、コントロールの値が入力されるまでのツイストアクションの数によって入力されます。認証アクション値のInput OOB Actionが入力数値と等しい場合、値は、認証サイズ値によって決定された桁数(おそらくテンキーを使用)を入力することによって入力されます。 認証アクション値のInput OOB Actionが入力英数字と等しい場合、値は、認証サイズ値によって決定されるASCII数字と大文字の数(おそらく英数字キーボードを使用)を入力することによって入力されます。
次に、プロビジョナーは、適切なアクションを使用してその値をデバイスに入力するようにユーザーに促します。
認証アクション値のInput OOB ActionがPushまたはTwistに等しい場合、5秒を超えてそれ以上の入力アクションが検出されなくなった後、値が入力されたと見なされます。 認証アクション値のInput OOB Actionが入力数字または入力英数字と等しい場合、値はそのデバイスでローカルに入力されたと見なされます(たとえば、Enterキーを押します)。 たとえば、ライトスイッチを使用すると、ユーザーはボタンを適切な回数押すことで乱数を入力できます。
番号の入力が実行されると、デバイスはProvisioning Input Complete PDUをプロビジョナーに送信して、デバイスに入力値があることを確認する必要があります。 確認交換とそれに続く乱数交換が実行されます。 確認値は、これまでに交換されたすべての値、まだ明らかにされていない乱数、および入力された番号の暗号化ハッシュです。 乱数が交換されると、各デバイスはピアを認証できます。 Input OOBによる認証のメッセージシーケンスは、以下の図5.17に示されています。
Static OOB認証が使用されている場合、またはOutput、Input、またはStatic認証が不可能な場合、プロビジョナーは上記の確認と乱数交換を直ちに使用するものとします。Static OOB値が使用可能な場合、この値は確認値の一部として含まれるものとします。 使用可能なStatic OOB値がない場合、この値はゼロになります。
Static OOBまたはOOBなしでの認証のメッセージシーケンスを以下の図5.18に示します。
5.4.2.5 Distribution of provisioning data
デバイスが認証されると、プロビジョナーとデバイスは、計算されたDiffie-Hellman共有シークレットECDHSecretを使用し、その共有シークレットからセッションキーを生成する必要があります。 次にそのセッションキーを使用して、プロビジョニングデータを暗号化および認証します。次にプロビジョナーは、暗号化および認証されたプロビジョニングデータを含むProvisioning Data PDUをデバイスに送信する必要があります。プロビジョニングデータのフォーマットを表5.39に示します。
フィールド | サイズ (octets) | 説明 |
---|---|---|
Network Key | 16 | NetKey |
Key Index | 2 | NetKeyのインデックス |
Flags | 1 | フラグのビットマスク |
IV Index | 4 | IVインデックスの現在の値 |
Unicast Address | 2 | ユニキャストアドレス |
Network KeyにはNetKeyが含まれている必要があります。
Key Indexフィールドは、Network KeyのグローバルNetKeyインデックスを識別し、セクション4.3.1.1で定義されているようにエンコードされます。
Flagsフィールドは、表3.41で次のように定義されています。
ビット | 定義 |
---|---|
0 | Key Refresh Flag 0: Key Refresh Phase 0 1: Key Refresh Phase 2 |
1 | IV Update Flag 0: Normal operation 1: IV Update active |
2 – 7 | 将来の使用のために予約済み |
IV Indexフィールドには、IVインデックスの現在の値が含まれます。
Unicast Addressには、ネットワークに追加されるノードのプライマリエレメントのユニキャストアドレスが含まれている必要があります。
セッションキーは、次の式を使用して導出されます。
ProvisioningSalt = s1(ConfirmationSalt || RandomProvisioner || RandomDevice)
SessionKey = k1(ECDHSecret、ProvisioningSalt、“ prsk”)
ナンスは、次の13の最下位オクテットでなければなりません。
SessionNonce = k1(ECDHSecret、ProvisioningSalt、“ prsn”)
プロビジョニングデータは、以下を使用して暗号化および認証されるものとします。
Provisioning Data = Network Key || Key Index || Flags || IV Index || Unicast Address
Encrypted Provisioning Data, Provisioning Data MIC = AES-CCM (SessionKey, SessionNonce, Provisioning Data)
Provisioning Data MICのサイズは8オクテットです。
暗号化されたProvisioning DataとProvisioning Data MICは、Provisioning Data PDUのフィールドとして使用されます。 プロビジョナーは、Provisioning Data PDUをデバイスに送信する必要があります。 次に、デバイスは、セクション3.8.6.1で定義されているようにデバイスキーを計算するものとします。 Provisioning Dataを配布するためのメッセージシーケンスを、以下の図5.19に示します。
プロビジョナーとデバイスは、確立されたDiffie-Hellman共有秘密ECDHSecretに基づくk1鍵導出関数を使用してデバイス鍵を計算します。
プロビジョナーからProvisioning Data PDUを受信すると、デバイスはProvisioning Dataを復号化および認証する必要があります。Provisioning Dataの認証が成功すると、デバイスはネットワークキー(キーインデックスで識別)を設定し、IVインデックスを設定し、IV更新フラグに基づいてIV更新手順の状態を設定し、キー更新フラグに基づいてキー更新フェーズを設定し、提供されたユニキャストアドレス値から始まる連続した範囲のアドレスを使用して、プライマリエレメントから始まるすべてのデバイスエレメントにユニキャストアドレスを割り当てます。アドレス割り当て手順が正常に完了すると、デバイスはProvisioning Complete PDUで応答して、プロビジョニングされたことを確認します。 アドレスの割り当てを正常に完了できない場合、デバイスはプロビジョニングが失敗したと見なし、エラーコードパラメータがアドレスを割り当てられないに設定されたProvisioning Failed PDUで応答します。
注:プロビジョナーからのProvisioning Data PDUの処理後、IV更新手順で定義されているIV更新手順の状態を変更するための96時間の制限時間は適用されません。
デバイスからProvisioning Complete PDUを受信すると、プロビジョナーは、プロビジョニングプロセスが正常に完了し、デバイスがユニキャストアドレスの値から始まる連続した範囲のアドレスを使用していると想定するものとします。アドレス範囲の長さは、Provisioning Capabilities PDUでプロビジョナーに報告されます(セクション5.4.1.2を参照)。手順の最後のステップとして、プロビジョナーはプロビジョニングベアラを切断する必要があります。これで、デバイスはメッシュネットワークのノードになります。
プロビジョナーは、プロビジョナーは、デバイスのデバイスUUIDを使用して識別された同じデバイスからメッシュプロビジョニングサービスのプロビジョニングされていないデバイスビーコンまたはサービスデータを受信するまで、デバイスに割り当てられ、Provisioning Data PDUで送信されたユニキャストアドレスを再利用してはなりません。
5.4.3 プロビジョニングセキュリティ
すべてのデバイスとプロビジョナーは、FIPSP-256楕円曲線アルゴリズムをサポートするものとします。
プロビジョニングは安全または安全でない可能性があります。セキュアプロビジョニングには、次の方法が必要です。
- FIPS P-256楕円曲線アルゴリズム、帯域内で転送されないPubic Keyタイプ(つまり、「OOB Public Keyが使用されます」が選択されている)、および任意のサイズのStatic OOB。
- FIPSP-256楕円曲線アルゴリズム。 入力数字、入力英数字、出力数字、または出力英数字のOOBアクション。 および少なくとも6オクテットのOOBサイズ。
それ以外の場合、プロビジョニングは安全でないプロビジョニングです。 デバイスとプロビジョナーがセキュアプロビジョニングをサポートすることをお勧めします。 プロビジョナーは、セキュアプロビジョニングを使用しているデバイスのみをプロビジョニングするポリシーを持っている場合があります。 セキュアプロビジョニングをサポートしていないデバイスは、セキュアプロビジョニングのみを使用しているプロビジョナーがプロビジョニングすることはできません。
5.4.3.1 FIPS P-256 Elliptic Curve definition
FIPS-P256曲線は、FIPS 186-3 [12]で定義されています。
楕円曲線は、p、a、およびbによって次の形式で指定されます。
E: y2 = x3 + ax + b (mod p)
bの値ごとに、一意の曲線を作成できます。 NIST P-256の場合:
a = mod (-3, p)
bが定義され、その生成方法は、SHA-1を使用して検証できます(指定されたシードsを使用し、b2c = -27(mod p)を使用)
以下のパラメーターが与えられます。
- 素数係数p、次数r、基点x座標Gx、基点y座標Gy。
- 整数pとrは10進形式で与えられます。 ビット文字列とフィールド要素は16進数で指定されます。p=115792089210356248762697446949407573530086143415290314195533631308867097853951
r =115792089210356248762697446949407573529996955224135760342422259061068512044369
b = 5ac635d8 aa3a93e7 b3ebbd55 769886bc 651d06b0 cc53b0f6 3bce3c3e 27d2604b
Gx = 6b17d1f2 e12c4247 f8bce6e5 63a440f2 77037d81 2deb33a0 f4a13945 d898c296
Gy = 4fe342e2 fe1a7f9b 8ee7eb4a 7c0f9e16 2bce3357 6b315ece cbb64068 37bf51f5
関数P-256は次のように定義されています。整数u、0 <u <r、および曲線E上の点Vが与えられると、値P-256(u、V)は点Vのu番目の倍数uVのx座標として計算されます。
秘密鍵は1からr / 2の間でなければなりません。ここで、rは楕円曲線上のアーベル群の次数です(つまり、1から2256/2の間)。
有効な公開鍵Q =(XQ、YQ)は、XQとYQが両方とも0からp -1の範囲にあり、関連する曲線の有限体の式(YQ)2 =(XQ)3 + aXQ + b(mod p)を満たすものです。 。
注:Public Keyの検証に関する追加情報については、NIST Special Publication 800-56A、リビジョン3 [13]を参照してください。
5.4.3.2 Provisioning key derivation
図5.20と図5.21は、プロビジョニングキーの導出を示しています。
5.4.4 Provisioning errors
プロビジョニングプロトコルが何らかの理由で失敗した場合、デバイスは保存されている詳細を完全に削除する必要があります。 リカバリ手順はありません。プロビジョナーが選択した場合は、プロビジョニング手順全体を最初から開始する必要があります。
プロトコルエラーを処理する場合、プロビジョニングプロトコルは非対称です。 プロビジョニングプロトコルでエラーが発生すると、プロビジョナーはすぐにプロビジョニングベアラを切断します。 プロビジョニングベアラが閉じるという予期しない状況が発生した場合、プロビジョニングプロトコルが失敗します。
デバイスがプロビジョニングプロトコルでタイムアウト以外のエラーを検出した場合、デバイスは適切なエラーコードを含むProvisioning Failed PDUを送信し、プロビジョニングベアラが閉じるのを待ちます。 この時点でプロビジョナーから受信したプロビジョニングプロトコルPDUは予期しないものと見なされます。
プロビジョナーは、Provisioning Failed PDUを受信すると、プロビジョニングが失敗したと見なし、プロビジョニングベアラをただちに切断します。
プロビジョニングプロトコルには、プロビジョニングプロトコルPDUが送信または受信されるたびにリセットされる60秒の最小タイムアウトが必要です。タイムアウトは、デバイスが最初のプロビジョニングPDUを受信し、プロビジョナーが最初のプロビジョニングPDUを送信したときに開始されます。 タイムアウトが経過する前にPDUが受信されない場合、プロトコルは失敗しています。 プロトコルタイムアウトの場合、デバイスはProvisioning Failed PDUを送信してはなりません。