wpa_supplicant[^①]是一個開源軟件項目,它實現了Station[1]對無線網絡進行管理和控制的功能。根據官方[2]描述,wpa_supplicant所支持的功能非常多,此處列舉其中幾個重要的功能點。
**1)支持WPA和IEEE 802.11i所定義的大部分功能**:
這部分功能集中在安全方面,包括:
* 支持WPA-PSK(即WPA-Personal)和WPA-Enterprise(即利用RAIDUS認證服務器來完成身份認證的情況)。
* 數據加密方面支持CCMP、TKIP、WEP104和WEP40。注意,WEP104和WEP40中的數字代表密鑰的長度。104表示密鑰長度為104個二進制位(如以ASCII字符個數來計算的話,WEP104支持的密鑰長度為13個ASCII字符)。
* 完全支持WPA和WPA2,包括PMKSA緩存,預認證(pre-authentication)等功能。
* 支持IEEE 802.11r和802.11w,其中802.11r規范定義了快速基礎服務轉移(Fast Transition)功能,而802.11w則新增了對管理幀的安全保護機制。
* 支持WFA制定的Wi-Fi Proctected Setup功能、P2P、TDLS等。
**2)支持多種EAP Method**:
主要和802.1X中Supplicant的功能有關,wpa_supplicant支持多達25種EAP Method,包括:
* EAP-TLS:TLS(Transport Layer Security)本身是一種傳輸層安全協議,它利用密鑰算法提供端點身份認證與通訊保密,其基礎是公鑰基礎設施(public key infrastructure,簡稱PKI)。EAP-TLS定義于RFC 5216。
* EAP-PEAP:PEAP(Protected Extensible Authentication Protocol,可擴展EAP)由微軟、思科以及RSA Security三個公司共同開發,是一種利用證書加用戶名和密碼來進行身份驗證的方法。
* EAP-TTLS:它是TLS的拓展,全名為Tunneled Transport Layer Security(隧道傳輸層安全協議),相比TLS,它簡化了認證過程中客戶端的工作。
* EAP-SIM、EAP-PSK、EAP-GPSK等其他認證方法。
**提示**:讀者可閱讀參考資料[1]以了解更多EAP方法的知識。
**3)對各種無線網卡和驅動的支持**:
* 支持nl80211/cfg80211驅動和Linux Wireless Extension驅動[^②]。
* 支持Windows平臺中的NDIS驅動。
**提示**:wpa_supplicant雖然支持Windows平臺,但筆者相信絕大多數讀者使用的都是Windows自帶的無線網絡管理程序(或者Intel芯片相關軟件提供的無線網絡管理程序)。從功能角度來說,讀者可認為wpa_supplicant是這些私有程序的一種開源實現。
Android做為開源世界的集大成者,它在無線網絡管理和控制方面直接使用了wpa_supplicant。Android 4.1中,external目錄下有兩個和wpa_supplicant相關的目錄,分別是wpa_supplicant_6和wpa_supplicant_8。6和8分別代表對應wpa_supplicant的版本號為0.6.10和2.0-devel。
**提示**:關于wpa_supplicant的發布歷史,請讀者參考http://hostap.epitest.fi/releases.html。
本書的分析目標是wpa_supplicant_8,它包含三個主要子目錄,分別是:
* **hostapd**:當手機進入SoftAP模式時,手機將扮演AP的角色,故需要hostapd來提供AP的功能。
* **wpa_supplicant**:Station模式,也叫Managed模式。它是本書分析的重點。
* **src**:hostapd和wpa_supplicant中都包含了一些通用的數據結構和處理方法,這些內容都放在此src目錄中。注意,hostapd/src和wpa_supplicant/src子目錄均鏈接到此src目錄。
wpa_supplicant是Android用戶空間中無線網絡部分的核心模塊,所有Framework層中和Wi-Fi相關的操作最終都將借由wpa_supplicant來完成。另外,wpa_supplicant本身對802.11、802.1X和Wi-Fi Alliance定義的一些規范都有極好的支持。所以,分析它將是加深理解802.11及相關理論知識的一個非常重要的途徑。
本章擬打算帶領讀者從兩條分析路線來掌握wpa_supplicant和相關的功能模塊。
* **路線一**:首先將介紹wpa_supplicant的初始化過程。這條路線將幫助讀者了解wpa_supplicant中常見的數據結構及之間的關系。這條路非常難走,請讀者做好心理準備。
* 路線二:我們將通過命令行發送命令的方式觸發wpa_supplicant進行相關工作,使得手機加入一個利用WPA-PSK進行認證的無線網絡。這條路線將幫助讀者了解wpa_supplicant中的命令處理、scan、association、4-way handshake等相關處理流程。
**提示**:后續章節還將圍繞Android中無線網絡技術開展更多的討論:
1)第5章將介紹Android Framework中的WifiService及其相關模塊。
2)第6、7章節將繼續wpa_supplicant之旅,其內容和WPS、Wi-Fi P2P以及WifiP2pService有關。
為了行文方便,本書將用WPAS來表示wpa_supplicant。另外,后文代碼分析中還能見到一種重要的數據結構,它也叫wpa_supplicant。請讀者根據上下文信息來理解wpa_supplicant的含義。
正式開始分析之旅前,我們先來簡單了解下wpa_supplicant。
[^①]:注意,wpa_supplicant項目中還包含一個名為hostapd程序的代碼,它實現了AP的功能,本書不討論。官方地址為http://hostap.epitest.fi/。
[^②]:根據審稿專家的反饋,wpa_supplicant僅支持Linux Wireless Extension V19以后的版本。
- 前言
- 第1章 準備工作
- 1.1 Android系統架構
- 1.2 工具使用
- 1.2.1 Source Insight的使用
- 1.2.2 Eclipse的使用
- 1.2.3 BusyBox的使用
- 1.3 本書資源下載說明
- 第2章 深入理解Netd
- 2.1 概述
- 2.2 Netd工作流程
- 2.2.1 main函數分析
- 2.2.2 NetlinkManager分析
- 2.2.3 CommandListener分析
- 2.2.4 DnsProxyListener分析
- 2.2.5 MDnsSdListener分析
- 2.3 CommandListener中的命令
- 2.3.1 iptables、tc和ip命令
- 2.3.2 CommandListener構造函數和測試工具ndc
- 2.3.3 InterfaceCmd命令
- 2.3.4 IpFwd和FirewallCmd命令
- 2.3.5 ListTtysCmd和PppdCmd命令
- 2.3.6 BandwidthControlCmd和IdletimerControlCmd命令
- 2.3.7 NatCmd命令
- 2.3.8 TetherCmd和SoftapCmd命令
- 2.3.9 ResolverCmd命令
- 2.4 NetworkManagementService介紹
- 2.4.1 create函數詳解
- 2.4.2 systemReady函數詳解
- 2.5 本章總結和參考資料說明
- 2.5.1 本章總結
- 2.5.2 參考資料說明
- 第3章 Wi-Fi基礎知識
- 3.1 概述
- 3.2 無線電頻譜和802.11協議的發展歷程
- 3.2.1 無線電頻譜知識
- 3.2.2 IEEE 802.11發展歷程
- 3.3 802.11無線網絡技術
- 3.3.1 OSI基本參考模型及相關基本概念
- 3.3.2 802.11知識點導讀
- 3.3.3 802.11組件
- 3.3.4 802.11 Service介紹
- 3.3.5 802.11 MAC服務和幀
- 3.3.6 802.11 MAC管理實體
- 3.3.7 無線網絡安全技術知識點
- 3.4 Linux Wi-Fi編程API介紹
- 3.4.1 Linux Wireless Extensions介紹
- 3.4.2 nl80211介紹
- 3.5 本章總結和參考資料說明
- 3.5.1 本章總結
- 3.5.2 參考資料說明
- 第4章 深入理解wpa_supplicant
- 4.1 概述
- 4.2 初識wpa_supplicant
- 4.2.1 wpa_supplicant架構
- 4.2.2 wpa_supplicant編譯配置
- 4.2.3 wpa_supplicant命令和控制API
- 4.2.4 git的使用
- 4.3 wpa_supplicant初始化流程
- 4.3.1 main函數分析
- 4.3.2 wpa_supplicant_init函數分析
- 4.3.3 wpa_supplicant_add_iface函數分析
- 4.3.4 wpa_supplicant_init_iface函數分析
- 4.4 EAP和EAPOL模塊
- 4.4.1 EAP模塊分析
- 4.4.2 EAPOL模塊分析
- 4.5 wpa_supplicant連接無線網絡分析
- 4.5.1 ADD_NETWORK命令處理
- 4.5.2 SET_NETWORK命令處理
- 4.5.3 ENABLE_NETWORK命令處理
- 4.6 本章總結和參考資料說明
- 4.6.1 本章總結
- 4.6.2 參考資料說明
- 第5章 深入理解WifiService
- 5.1 概述
- 5.2 WifiService的創建及初始化
- 5.2.1 HSM和AsyncChannel介紹
- 5.2.2 WifiService構造函數分析
- 5.2.3 WifiStateMachine介紹
- 5.3 加入無線網絡分析
- 5.3.1 Settings操作Wi-Fi分析
- 5.3.2 WifiService操作Wi-Fi分析
- 5.4 WifiWatchdogStateMachine介紹
- 5.5 Captive Portal Check介紹
- 5.6 本章總結和參考資料說明
- 5.6.1 本章總結
- 5.6.2 參考資料說明
- 第6章 深入理解Wi-Fi Simple Configuration
- 6.1 概述
- 6.2 WSC基礎知識
- 6.2.1 WSC應用場景
- 6.2.2 WSC核心組件及接口
- 6.3 Registration Protocol詳解
- 6.3.1 WSC IE和Attribute介紹
- 6.3.2 802.11管理幀WSC IE設置
- 6.3.3 EAP-WSC介紹
- 6.4 WSC代碼分析
- 6.4.1 Settings中的WSC處理
- 6.4.2 WifiStateMachine的處理
- 6.4.3 wpa_supplicant中的WSC處理
- 6.4.4 EAP-WSC處理流程分析
- 6.5 本章總結和參考資料說明
- 6.5.1 本章總結
- 6.5.2 參考資料說明
- 第7章 深入理解Wi-Fi P2P
- 7.1 概述
- 7.2 P2P基礎知識
- 7.2.1 P2P架構
- 7.2.2 P2P Discovery技術
- 7.2.3 P2P工作流程
- 7.3 WifiP2pSettings和WifiP2pService介紹
- 7.3.1 WifiP2pSettings工作流程
- 7.3.2 WifiP2pService工作流程
- 7.4 wpa_supplicant中的P2P
- 7.4.1 P2P模塊初始化
- 7.4.2 P2P Device Discovery流程分析
- 7.4.3 Provision Discovery流程分析
- 7.4.4 GO Negotiation流程分析
- 7.5 本章總結和參考資料說明
- 7.5.1 本章總結
- 7.5.2 參考資料說明
- 第8章 深入理解NFC
- 8.1 概述
- 8.2 NFC基礎知識
- 8.2.1 NFC概述
- 8.2.2 NFC R/W運行模式
- 8.2.3 NFC P2P運行模式
- 8.2.4 NFC CE運行模式
- 8.2.5 NCI原理
- 8.2.6 NFC相關規范
- 8.3 Android中的NFC
- 8.3.1 NFC應用示例
- 8.3.2 NFC系統模塊
- 8.4 NFC HAL層討論
- 8.5 本章總結和參考資料說明
- 8.5.1 本章總結
- 8.5.2 參考資料說明
- 第9章 深入理解GPS
- 9.1 概述
- 9.2 GPS基礎知識
- 9.2.1 衛星導航基本原理
- 9.2.2 GPS系統組成及原理
- 9.2.3 OMA-SUPL協議
- 9.3 Android中的位置管理
- 9.3.1 LocationManager架構
- 9.3.2 LocationManager應用示例
- 9.3.3 LocationManager系統模塊
- 9.4 本章總結和參考資料說明
- 9.4.1 本章總結
- 9.4.2 參考資料說明
- 附錄