Bluetooth Mesh 仕様 – Provisioning(その2)

仕様

はじめに

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に示されています。

フィールドサイズ
(オクテット)
説明
Padding20b00。 他のすべての値は禁止されています
Type6Provisioning PDUのタイプの値(表5.14を参照)
Parameters可変長メッセージパラメータ
表5.13:Provisioning PDUのフォーマット
図5.11:プロビジョニングPDUのフォーマット

Provisioning PDUのTypeの値は、表5.14で定義されています。

タイプ名前説明
0x00Provisioning Inviteメッシュネットワークに参加するように
デバイスを招待します
0x01Provisioning Capabilitiesデバイスの機能を示します
0x02Provisioning Startデバイスの機能に基づいて
プロビジョナーが選択した
プロビジョニング方法を示します
0x03Provisioning Public Keyデバイスまたはプロビジョナーの
公開鍵が含まれています
0x04Provisioning Input Completeユーザーが値の入力を完了したことを
示します
0x05Provisioning Confirmationデバイスまたはプロビジョナーの
プロビジョニング確認値が
含まれます
0x06Provisioning Randomデバイスまたはプロビジョナーの
プロビジョニングランダム値が
含まれます
0x07Provisioning Dataプライマリエレメントに割り当てられた
ユニキャストアドレス、ネットワークキー、
NetKeyインデックス、フラグ、
およびIVインデックスが含まれます
0x08Provisioning Completeプロビジョニングが完了したことを
示します
0x09Provisioning Failedプロビジョニングが失敗したことを
示します
0x0A – 0xFFRFU将来の使用のために予約済み
表5.14:Provisioning PDUのType
5.4.1.1 Provisioning Invite

プロビジョナーはこのPDUを送信して、プロビジョニングプロセスが開始されていることをデバイスに示します。 このPDUのパラメータのフォーマットは、表5.15で定義されています。

フィールドサイズ
(octets)
説明
Attention Duration1アテンションタイマーの状態
(セクション4.2.9を参照)
表5.15: Provisioning Invite PDU パラメータのフォーマット
5.4.1.2 Provisioning Capabilities

デバイスはこのPDUを送信して、サポートされているプロビジョニング機能をプロビジョナーに示します。 このPDUのパラメータのフォーマットは、表5.16で定義されています。

フィールドサイズ
(octets)
説明
Number of Elements1デバイスでサポートされている
エレメントの数(表5.17を参照)
Algorithms2サポートされているアルゴリズム
およびその他の機能(表5.18を参照)
Public Key Type1サポートされている公開鍵タイプ
(表5.19を参照)
Static OOB Type1サポートされている静的OOBタイプ
(表5.20を参照)
Output OOB Size1サポートされる出力OOBの最大サイズ
(表5.21を参照)
Output OOB Action2サポートされている出力OOBアクション
(表5.22を参照)
Input OOB Size1サポートされている入力OOBの
オクテット単位の最大サイズ
(表5.23を参照)
Input OOB Action2サポートされている入力OOBアクション
(表5.24を参照)
表5.16:Provisioning Capabilities PDUパラメータのフォーマット

エレメント数の値は、表5.17で定義されています。

説明
0x00禁止
0x01 – 0xFFデバイスでサポートされているエレメントの数
表5.17:Number of Elementsフィールド値

アルゴリズムの値は表5.18で定義されています。

Bit説明
0FIPS P-256 Elliptic Curve
1 – 15将来の使用のために予約済み
表5.18:Algorithmsフィールド値

少なくとも1つのアルゴリズムがデバイスでサポートされている必要があります。

Public Key Typeの値は、表5.19で定義されています。

Bit説明
0Public Key OOB情報が利用可能
1 – 7禁止
表5.19:公開鍵タイプのフィールド値

公開鍵OOB情報のサイズは、選択したアルゴリズムによって決定されます。

Static OOB Typeの値は、表5.20で定義されています。

Bit説明
0利用可能なStatic OOB情報
1 – 7禁止
表5.20:静的OOBタイプのフィールド値

静的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将来の使用のために予約済み
表5.21:Output OOB Sizeフィールドの値

Output OOB Actionの値は表5.22で定義されています。

Bit説明データタイプ
0点滅数字
1ビープ数字
2バイブレーション数字
3出力数値数字
4出力英数字英数字
5 – 15将来の使用のために予約済みn/a
表5.22:Output OOB Actionフィールドの値

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将来の使用のために予約済み
表5.23:Input OOB Sizeフィールドの値

Input OOB Actionは、表5.24で定義されています。

Bit説明データタイプ
0Push数字
1Twist数字
2数値入力数字
3英数字入力英数字
4 – 15将来の使用のために予約済みn/a
表5.24:Input OOB Actionフィールドの値
5.4.1.3 Provisioning Start

プロビジョナーは、このPDUを送信して、Provisoning Capabilities PDUのオプションから選択した方法を示します。 このPDUのパラメータのフォーマットは、表5.25で定義されています。

フィールドサイズ
(octets)
説明
Algorithm1プロビジョニングに使用されるアルゴリズム
(表5.26を参照)
Public Key1使用されるPublic Key(表5.27を参照)
Authentication Method1使用される認証方法(表5.28を参照)
Authentication Action1選択されたOutput OOB Action(表5.29を参照)
またはInput OOB Action(表5.31を参照)
または0x00
Authentication Size1使用されるOutput OOBのサイズ(表5.30を参照)
または使用されるInput OOBのサイズ(表5.32を参照)
または0x00
表5.25:Provisioning Start PDUパラメーターのフォーマット

アルゴリズムの値は表5.26で定義されています。

説明
0x00FIPS P-256 Elliptic Curve
0x01 – 0xFF将来の使用のために予約済み
表5.26:Algorithmフィールドの値

Public Keyの値は表5.27で定義されています。

説明
0x00OOB Public Keyは使用されません
0x01OOB Public Keyが使用されます
0x02 – 0xFF禁止
表5.27:Public Keyフィールドの値

認証方法の値を表5.28に定義します。

説明
0x00OOB認証は使用されません
0x01Static OOB認証が使用されます
0x02Output OOB認証が使用されます
0x03Input OOB認証が使用されます
0x04 – 0xFF禁止
表5.28:Authentication Methodフィールドの値

認証方法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で定義されています。

説明
0x00Blink
0x01Beep
0x02Vibrate
0x03出力数値
0x04出力英数字
0x05 – 0xFF将来の使用のために予約済み
表5.29:Authentication ActionフィールドのOutput OOB Actionの値

Authentication Sizeフィールド値のOutput OOB Sizeは、表5.30で定義されています。

説明
0x00禁止
0x01 – 0x08使用するOutput OOB Size
0x09 – 0xFF将来の使用のために予約済み
表5.30:Authentication SizeフィールドのOutput OOB Sizeの値

認証方式0x03(Input OOBによる認証)方式を使用する場合、表5.31および表5.32で定義された値を使用して、Authentication ActionとAuthentication Sizeを決定する必要があります。
Authentication ActionフィールドのInput OOB Action値は、表5.31で定義されています。

説明
0x00Push
0x01Twist
0x02入力数字
0x03入力英数字
0x04 – 0xFF将来の使用のために予約済み
表5.31:Authentication ActionフィールドへのInput OOB Actionの値

Authentication SizeフィールドのInput OOB Sizeの値は、表5.32で定義されています。

説明
0x00禁止
0x01 – 0x08使用するInput OOB Size
0x09 – 0xFF将来の使用のために予約済み
表5.32:Authentication SizeフィールドのInput OOB Sizeの値
5.4.1.4 Provisioning Public Key

このプロビジョナーは、このPDUを送信して、ECDH計算で使用されるPublic Keyを配信します。このPDUのパラメータのフォーマットは、表5.33で定義されています。

フィールドサイズ
(オクテット)
説明
Public Key XFIPSP-256アルゴリズムの
Public KeyのXコンポーネント
Public Key YFIPSP-256アルゴリズムの
Public KeyのYコンポーネント
表5.33:Provisioning Public Key PDUパラメーターのフォーマット
5.4.1.5 Provisioning Input Complete

ユーザーが入力操作を完了すると、デバイスはこのPDUを送信します。 このPDUのパラメータはありません。

5.4.1.6 Provisioning Confirmation

プロビジョナーまたはデバイスは、このPDUをピアに送信して、OOB認証値やまだ交換されていない乱数など、これまでに交換された値を確認します。 このPDUのパラメータのフォーマットは、表5.34で定義されています。

フィールドサイズ
(octets)
説明
Confirmation16OOB認証値を含む
これまでに交換された値
表5.34:Provisioning Confirmation PDUパラメータのフォーマット
5.4.1.7 Provisioning Random

プロビジョナーまたはデバイスはこのPDUを送信して、ピアデバイスが確認を検証できるようにします。 このPDUのパラメータのフォーマットは、表5.35で定義されています。

フィールドサイズ
(octets)
説明
Random16確認への最終入力
表5.35:Provisioning Random PDUパラメータのフォーマット
5.4.1.8 Provisioning Data

プロビジョナーはこのPDUを送信して、プロビジョニングデータをデバイスに配信します。 このPDUのパラメータのフォーマットは、表5.36で定義されています。

フィールドサイズ
(octets)
説明
Encrypted Provisioning Data16暗号化および認証されたネットワークキー、
NetKeyインデックス、キー更新フラグ、
IV更新フラグ、IVインデックスの現在の値、
およびプライマリエレメントのユニキャストアドレス
(セクション5.4.2.5を参照)
Provisioning Data MICPDU整合性チェック値
表5.36:Provisioning Data PDUパラメータのフォーマット
5.4.1.9 Provisioning Complete

デバイスはこのPDUを送信して、プロビジョニングデータを正常に受信して処理したことを示します。

このPDUのパラメータはありません。

5.4.1.10 Provisioning Failed

受信したプロビジョニングプロトコルPDUの処理に失敗した場合、デバイスはこのPDUを送信します。 このPDUのパラメータのフォーマットは、表5.37で定義されています。

フィールドサイズ
(octets)
説明
Error Code1これは、デバイスで発生した
プロビジョニングプロトコルの
特定のエラーを表します
Provisioning Data MICPDU整合性チェック値
表5.7:Provisioning Failed PDUパラメータのフォーマット

プロビジョニングエラーコードを表5.38に定義します。

名前説明
Error CodeProhibited禁止
Provisioning Data MICInvalid PDUプロビジョニングプロトコルPDUが
デバイスによって認識されない
Invalid FormatプロトコルPDUの引数が期待値の範囲外であるか、
PDUの長さが期待値と異なる
Unexpected PDU手順のこの時点では、受信したPDUは
予期されていませんでした
Confirmation Failed計算された確認値は正常に
検証されませんでした
Out of Resourcesデバイスのリソースが不足しているため、
プロビジョニングプロトコルを続行できません
Decryption Failedデータブロックは正常に復号化されませんでした
Unexpected Error回復できない可能性のある
予期しないエラーが発生しました
Cannot Assign Addressesデバイスは、連続するユニキャストアドレスを
すべてのエレメントに割り当てることはできません
RFU将来の使用のために予約済み
表5.38:プロビジョニングエラーコード

5.4.2 Provisioning behavior

プロビジョニングは、図5.12に示すように、ビーコン、招待、Public Keyの交換、認証、およびプロビジョニングデータの配布という5つのステップのプロセスを使用して実行されます。

図5.12:プロビジョニングの動作
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.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に示します。

図5.14:プロビジョニングされていないデバイスのPublic Keyが不明な場合の公開鍵交換

それ以外の場合、Pubic KeyがOOBメカニズムを介して利用可能である場合、新しい鍵ペアがプロビジョナーによって生成され、生成された鍵ペアのPublic Keyがプロビジョナーからデバイスに送信され、Static Public Keyが送信され、適切なOOBテクノロジーを使用してデバイスから読み取られます。

プロビジョニングされていないデバイスのPublic KeyがOOBである場合の公開鍵交換のメッセージシーケンスは、以下の図5.15に示されています。

図5.15:プロビジョニングされていないデバイスのPublic Keyが帯域外である場合の公開鍵交換

プロビジョナーとデバイスは、ピアデバイスまたは取得した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に示されています。

図5.16:Output OOBを使用した認証

認証方法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に示されています。

図5.17:Input OOBを使用した認証

Static OOB認証が使用されている場合、またはOutput、Input、またはStatic認証が不可能な場合、プロビジョナーは上記の確認と乱数交換を直ちに使用するものとします。Static OOB値が使用可能な場合、この値は確認値の一部として含まれるものとします。 使用可能なStatic OOB値がない場合、この値はゼロになります。

Static OOBまたはOOBなしでの認証のメッセージシーケンスを以下の図5.18に示します。

図5.18:Static OOBを使用した認証またはOOBを使用しない認証
5.4.2.5 Distribution of provisioning data

デバイスが認証されると、プロビジョナーとデバイスは、計算されたDiffie-Hellman共有シークレットECDHSecretを使用し、その共有シークレットからセッションキーを生成する必要があります。 次にそのセッションキーを使用して、プロビジョニングデータを暗号化および認証します。次にプロビジョナーは、暗号化および認証されたプロビジョニングデータを含むProvisioning Data PDUをデバイスに送信する必要があります。プロビジョニングデータのフォーマットを表5.39に示します。

フィールドサイズ
(octets)
説明
Network Key16NetKey
Key Index2NetKeyのインデックス
Flags1フラグのビットマスク
IV Index4IVインデックスの現在の値
Unicast Address2ユニキャストアドレス
表5.39:Provisioning data format

Network KeyにはNetKeyが含まれている必要があります。

Key Indexフィールドは、Network KeyのグローバルNetKeyインデックスを識別し、セクション4.3.1.1で定義されているようにエンコードされます。

Flagsフィールドは、表3.41で次のように定義されています。

ビット定義
0Key Refresh Flag
0: Key Refresh Phase 0
1: Key Refresh Phase 2
1IV Update Flag
0: Normal operation
1: IV Update active
2 – 7将来の使用のために予約済み
表5.40:フラグフィールドの定義

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に示します。

図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)を使用)

以下のパラメーターが与えられます。

  1. 素数係数p、次数r、基点x座標Gx、基点y座標Gy。
  2. 整数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.20:ConfirmationKeyの導出
図5.21:SessionKeyおよびSessionNonceキーの導出

5.4.4 Provisioning errors

プロビジョニングプロトコルが何らかの理由で失敗した場合、デバイスは保存されている詳細を完全に削除する必要があります。 リカバリ手順はありません。プロビジョナーが選択した場合は、プロビジョニング手順全体を最初から開始する必要があります。

プロトコルエラーを処理する場合、プロビジョニングプロトコルは非対称です。 プロビジョニングプロトコルでエラーが発生すると、プロビジョナーはすぐにプロビジョニングベアラを切断します。 プロビジョニングベアラが閉じるという予期しない状況が発生した場合、プロビジョニングプロトコルが失敗します。

デバイスがプロビジョニングプロトコルでタイムアウト以外のエラーを検出した場合、デバイスは適切なエラーコードを含むProvisioning Failed PDUを送信し、プロビジョニングベアラが閉じるのを待ちます。 この時点でプロビジョナーから受信したプロビジョニングプロトコルPDUは予期しないものと見なされます。

プロビジョナーは、Provisioning Failed PDUを受信すると、プロビジョニングが失敗したと見なし、プロビジョニングベアラをただちに切断します。

プロビジョニングプロトコルには、プロビジョニングプロトコルPDUが送信または受信されるたびにリセットされる60秒の最小タイムアウトが必要です。タイムアウトは、デバイスが最初のプロビジョニングPDUを受信し、プロビジョナーが最初のプロビジョニングPDUを送信したときに開始されます。 タイムアウトが経過する前にPDUが受信されない場合、プロトコルは失敗しています。 プロトコルタイムアウトの場合、デバイスはProvisioning Failed PDUを送信してはなりません。

タイトルとURLをコピーしました