LoginSignup
1
0

More than 5 years have passed since last update.

wpa_supplicant の 4 way handshake (STA側) を読む

Posted at

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を使う。

調査対象

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の交換

よくわらないとこと

  • ステートマシンの制御部分
  • どのコンテキストで動作しているのか
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0