wpa_supplicantの動作を理解するためにソースコードを調査しました。
今回はWPAの特徴的な鍵交換のシーケンスである4 way handshakeを行っている部分のデータの流れを調査しました。
まとめ
- 4way handshakeの処理は src/rsn_supp/wpa.cに実装されている。
- wpa_supplicantでは、ドライバから、wpa_supplicant_rx_eapol()を呼ぶことでEAPOLパケットを受信する。
- 受信したEAPOLパケットを処理し、WPAの鍵情報を取り出し、パケットを作成し、l2_packet_send()でパケットを送信する。
- ドライバとしては、パケットの受信、パケットの送信、暗号鍵の設定の APIを使う。
調査対象
- wpa_supplicant 2.5 のソースコード
- https://w1.fi/wpa_supplicant/
- WPAのSTA側 4Way handshakeの部分
4wayの1番めのパケットの受信 から 4wayの2番めのパケットの送信
- Association完了後にAPから4wayの1番めのパケットをSTAに送信する。
- ドライバは受信したパケットをwpa_supplicant_rx_eapol()でwpa_supplicantに渡す。
- wpa_sm_rx_eapol() で下記の処理をする。
- wpa_supplicant_verify_eapol_key_mic()でMICをチェック
- wpa_supplicant_decrypt_key_data()で鍵データを復号
- - HMAC_MD5_RC4 ならrc4_skip()
- - HMAC_SHA1_AESならaes_unwrap()
- wpa_supplicant_process_1_of_4()
- - wpa_supplicant_get_pmk()でPMKを取得
- - wpa_derive_ptk()でPTKを計算
- - wpa_supplicant_send_2_of_4()で2番めのパケットを送信
- - wpa_eapol_key_send() でeapolパケットを送信
- - wpa_sm_ether_send()
- - wpa_sm->ctx->ether_send()
- - wpa_ether_send()
- - l2_packet_send() でドライバに送信
4wayの3番めのパケットの受信 から 4wayの4番めのパケットの送信
- wpa_sm_rx_eapol()の途中までは上と同じ
- wpa_supplicant_process_3_of_4()
- wpa_eapol_key_send() で4番めのパケットを送信
- wpa_sm_ether_send()
- wpa_sm->ctx->ether_send()
- wpa_ether_send()
- l2_packet_send() でドライバに送信
- wpa_supplicant_install_ptk()でPTKをインストール
- wpa_sm_set_key()
- wpa_driver_wext_set_key() でドライバにPTKを設定
- wpa_supplicant_pairwise_gtk()でGTKの交換
よくわらないとこと
- ステートマシンの制御部分
- どのコンテキストで動作しているのか