EN JA
IEEE80211_CRYPTO(9)
IEEE80211_CRYPTO(9) FreeBSD Kernel Developer's Manual IEEE80211_CRYPTO(9)

名称

ieee80211_crypto802.11 暗号化サポート

書式

#include < net80211/ieee80211_var.h>


void
ieee80211_crypto_register( const struct ieee80211_cipher *);

void
ieee80211_crypto_unregister( const struct ieee80211_cipher *);

int
ieee80211_crypto_available( int cipher);


void
ieee80211_notify_replay_failure( struct ieee80211vap *, const struct ieee80211_frame *, const struct ieee80211_key *, uint64_t rsc, int tid);

void
ieee80211_notify_michael_failure( struct ieee80211vap *, const struct ieee80211_frame *, u_int keyix);

int
ieee80211_crypto_newkey( struct ieee80211vap *, int cipher, int flags, struct ieee80211_key *);

int
ieee80211_crypto_setkey( struct ieee80211vap *, struct ieee80211_key *);

int
ieee80211_crypto_delkey( struct ieee80211vap *, struct ieee80211_key *);

void
ieee80211_key_update_begin( struct ieee80211vap *);

void
ieee80211_key_update_end( struct ieee80211vap *);

void
ieee80211_crypto_delglobalkeys( struct ieee80211vap *);

void
ieee80211_crypto_reload_keys( struct ieee80211com *);


struct ieee80211_key *
ieee80211_crypto_encap( struct ieee80211_node *, struct mbuf *);

struct ieee80211_key *
ieee80211_crypto_decap( struct ieee80211_node *, struct mbuf *, int flags);

int
ieee80211_crypto_demic( struct ieee80211vap *, struct ieee80211_key *, struct mbuf *, int force);

int
ieee80211_crypto_enmic( struct ieee80211vap *, struct ieee80211_key *, struct mbuf *, int force);

解説

net80211 レイヤ (層) は、802.11 のプロトコルのための包括的な暗号化のサポートを含んでいます。 WPA と 802.11i によって必要とされた暗号 (cipher) のソフトウェアの実装は、 802.11 のフレームの encap/decap 処理と同様に提供されます。ソフトウェア暗号 (cipher) は、カーネルモジュールとして書かれ、コア暗号化サポートとともに登録されます。暗号化のフレームワークは、ドライバが必要なハードウェアサービスを提供できないとき、ソフトウェア実装への自動フォールバックとともにドライバによって暗号 (cipher) のハードウェアアクセラレーション (加速) をサポートしています。

暗号化暗号 (cipher) モジュール

net80211 暗号 (cipher) モジュールは、 ieee80211_crypto_register() を使用してそれらのサービスを登録し、それらの操作について説明するテンプレートを供給します。この ieee80211_cipher 構造は、encap/decap とセットアップキーのためのエントリポイントの間を予約するか、または取り除くために、そして暗号化の操作を行うために 802.11 ヘッダの空白のバイト数のようなプロトコル関連の状態を定義します。

暗号 (cipher) モジュールは、 wk_private 構造のメンバを通してプライベートな状態を各キーに関連づけることができます。状態がモジュールによってセットアップされるなら、キーが破壊される前に呼び出されるので、リソースを再要求することができます。

暗号化モジュールは、システムの 2 つのイベントを通知できます。パケット応答イベントが認識されるとき、イベントのシグナルを起こすために ieee80211_notify_replay_failure() を使用することができます。 TKIP Michael 故障が検出されるとき、 ieee80211_notify_michael_failure() を呼び出すことができます。また、ドライバは、ハードウェアによって検出されたイベントのシグナルを起こすためにこれらのルーチンを使用できます。

暗号キー管理

net80211 レイヤ (層) は、WPA、802.1x、と 802.11i のようなプロトコルのために vap ごとの 4 エレメントの“global key table” (グローバルキーテーブル) とステーションことの“unicast key” (ユニキャストキー) を実装しています。グローバルキーテーブルは、古い WEP 操作と Multicast/Group キーをサポートするように設計されています、しかしながら、また、いくつかのアプリケーションは、ステーションモードで WPA を実装するためにそれを使用します。グローバルテーブルのキーは、範囲 0-3 のキーインデックスによって識別されます。ステーションごとのキーは、ステーションの MAC アドレスによって識別され、ユニキャスト PTK バインドに通常使用されます。

net80211 は、グローバルなキーとステーションごとのキーの両方を管理するために ioctl(2) 操作を提供しています。ドライバは、通常ソフトウェアキー管理に参加しません。それらは、暗号化操作のハードウェア加速を提供するときだけ、必要とされます。

ieee80211_crypto_newkey() は、新しい net80211 キーを割り付けるか、または既存のキーを再設定するために使用されます。暗号 (cipher) は、任意の固定のキーのインデックスと共に指定されなければなりません。 net80211 レイヤ (層) は、キーをサポートするための割り付けられた暗号 (cipher) とドライバリソースを取り扱います。

いったんキーが割り付けられると、(任意の暗号と再要求されたドライバリソースで) その内容を ieee80211_crypto_setkey() を使用して設定することができ、 ieee80211_crypto_delkey() で削除できます。

ieee80211_crypto_delglobalkeys() は、vap のためにグローバルキーテーブルのすべてのキーを再要求するために使用されます。通常、それは、 net80211 レイヤ (層) 内だけで使用されます。

ieee80211_crypto_reload_keys() は、suspend/resume サイクルの後に要求されるような、ソフトウェアキー状態から再ロードされるハードウェアキー状態を取り扱います。

ドライバ暗号化サポート

ドライバは、それらが ieee80211com 構造の ic_cryptocaps フィールドを通してハードウェアサポートがある暗号 (cipher) を識別します。ハードウェアサポートが利用可能であるなら、ドライバは、また、デバイスでの使用のために作成された、各 ieee80211vapiv_key_alloc, iv_key_setiv_key_delete メソッドで書き込まれるべきです。さらに、メソッド iv_key_update_beginiv_key_update_end を、ハードウェアキー状態をアップデートするための同期要件を扱うためにはセットアップすることができます。

net80211 がソフトウェアキーを割り付けて、ドライバが暗号 (cipher) 操作を加速できるなら、 iv_key_alloc メソッドが呼び出されます。ドライバは、(フレームを暗号化するために使用される) 外向きのトラフィックに関連しているトークンを返します。そうでなければ、例えば、ハードウェアのリソースが利用可能でないなら、ドライバは、トークンを返さず、 net80211 は、ソフトウェアで動作して、転送のために既に準備されるドライバへのフレームを渡すようにアレンジします。

受信のために、ドライバは、ハードウェアには、復号化されたペイロードがあることを示すために M_WEP mbuf フラグでフレームをマークします。フレームには、それらの 802.11 ヘッダでマークされた IEEE80211_FC1_WEP ビットがあり、 M_WEP でタグ付けされれいないなら、復号化は、ソフトウェアで行われます。より複雑なシナリオにおいて、ソフトウェアキー状態が調べられます。例えば、 Michael の検証が、ハードウェアが TKIP 復号化を扱った後に、ソフトウェアで行われる必要があるかどうか決めるために。

複雑なキーデータ構造を管理するドライバは、例えば、ハードウェアキーキャッシュへのソフトウェアキーの失敗、 ieee80211_key_update_begin() と ieee80211_key_update_end() への呼び出しでそれらの作業をまとめることによって安全にソフトウェアキー状態を操作することができます。また、これらの呼び出しは、受信トラフィックがアクティブであるとき、ハードウェアキー状態の更新を同期させます。

March 29, 2010 FreeBSD