由圖6-7所示的RP協議交互流程可知,Discovery Phase階段之后,STA和AP將通過EAP包交換來完成安全信息協商。WSC規范利用EAP的擴展功能新定義了一種EAP算法,即EAPWSC。EAP-WSC的包格式如圖6-22所示。
:-: 
圖6-22 EAP-WSC包格式
對于EAP-WSC來說,圖6-22中各字段取值情況如下。
* Type取值為254,代表EAP包中的內容由Vendor定義。
* 對于WSC來說,Vendor-Id取值為0x00372a,Vendor Type取值為0x0000-0001(WFA中,該值表示Simple-Config)。
* Op-Code及以后的內容由EAP-WSC定義,其取值有六種情況(見表6-5)。
* Flags包含兩個標志位,一個是MF標志位(More Fragments,取值為0x01,代表EAP分片包),另一個是LF標志位(Length Field,值為0x02)。
* 如果LF標志位被設置,則Message Length字段存在。該字段表示Message data的長度。
* Message data為WSC定義的Attribute。和WSC IE類似,WSC規范對不同EAP-WSC包攜帶的Attribute有嚴格要求。
表6-5所示為EAP-WSC Op-Code的取值。
:-: 
表6-5 EAP-WSC Op-Code取值說明
EAP-WSC和第4章介紹的4-Way Handshake類似,STA和AP雙方要派生一些Key用于加密所傳輸的信息。
在STA和AP雙方開展EAP-WSC流程前,AP需要確定STA的Identity以及使用的身份驗證算法。該過程涉及三次EAP包交換(參考圖3-38)。這三次包交換的內容分別如下。
* AP發送EAP-Request/Identity以確定STA的ID。
* 對于打算使用WSC認證方法的STA來說,它需要在回復的EAP-Response/Identity包中設置Identity為"WFA-SimpleConfig-Enrollee-1-0"。
* AP確定STA的Identity為"WFA-SimpleConfig-Enrollee-1-0"后,將發送EAPRequest/WSC_Start包以啟動EAP-WSC認證流程。這個流程講涉及M1~M8相關的知識。
下面我們將結合實例來介紹。
>[info] 注意 這些知識也是后續分析代碼時的理論依據,請讀者務必認真體會。
**1、M1和M2**
M1消息由STA發送給AP。圖6-23所示為Galaxy Note 2發送的M1消息。
如前文所述,EAP-WSC消息的組成結構也是一個一個Attribute。圖6-23所示的大部分Attribute在前文都已見過了,此處僅介紹黑框中所列的幾個Attribute。
:-: 
圖6-23 M1消息示例
* Message Type:代表Enrollee和Registrar發送的消息類型,其可取值從0x01(代表Beacon幀)到0x0F(代表WSC_DONE)。該屬性一般只在EAP-WSC幀中用到。對于M1消息而言,其Message Type取值為0x04。
* UUID-E:代表STA的UUID。MAC Address代表STA的MAC地址。
* Enrollee Nonce:代表STA產生的一串隨機數,它用于后續的密鑰派生等工作。
* Public Key:STA和AP的密鑰派生源頭也是PMK。不過和第4章介紹的PSK不同的是,在WSC PIN法中并沒有使用PSK(PIN碼的作用不是PSK)。雙方采用了Diffie-Hellman[6](D-H)密鑰交換算法。該算法使得通信的雙方可以用這個方法確定對稱密鑰。注意,D-H算法只能用于密鑰的交換,而不能進行消息的加密和解密。通信雙方確定要用的密鑰后,要使用其他對稱密
* 鑰操作加密算法以加密和解密消息。Public Key屬性包含了Enrollee的D-H Key值。
* Authentication Type Flags和Encryption Type Flags:表示Enrollee支持的身份驗證算法以及加密算法類型。
* Connection Type Flags:代表設備支持的802.11網絡類型,值0x01代表ESS,值0x02代表IBSS。
圖6-24所示為Galaxy Note 2中Authentication Type Flags和Encryption Type Flags兩個屬性的取值情況。
:-: 
圖6-24 Authentication/Encryption Type Flags取值示例
圖6-24左圖所示為Authentication Type Flags的取值情況。其中,"WPA"和"WPA2"標志位是"WPA-Enterprise"以及"WPA2-Enterprise"之意。
AP收到并處理M1后,將回復M2。M2的內容如圖6-25所示。
:-: 
圖6-25 M2消息示例
圖6-25中,AP的M2將攜帶以下信息。
* Registrar Nonce:Registrar生成的隨機數。
* Public Key:D-H算法中,Registrar一方的D-H Key值。
* Authenticator:由HMAC-SHA-256及AuthKey(詳情見下文)算法得來一個256位的二進制串。注意,Authenticator屬性只包含其中的前64位二進制內容。
>[info] 提示 AP發送M2之前,會根據Enrollee Nonce、Enrollee MAC以及Registrar Nonce并通過DH算法計算一個KDK(Key Derivation Key),KDK密鑰用于其他三種Key派生,這三種Key分別用于加密RP協議中的一些屬性的AuthKey(256位)、加密Nonce和ConfigData(即一些安全配置信息)的KeyWrapKey(128位)以及派生其他用途Key的EMSK(Extended Master Session Key)。
**2、M3和M4**
STA處理完M2消息后,將回復M3消息,其內容如圖6-26所示。
:-: 
圖6-26 M3消息示例
圖6-26中:
* Registrar Nonce值來源于M2的Registrar Nonce屬性。
* E Hash1和E Hash2屬性的計算比較復雜,詳情見下文。
* Authenticator是STA利用AuthKey(STA收到M2的Registrar Nonce后也將計算一個AuthKey)計算出來的一串二進制位。
根據WSC規范,E Hash1和E Hash2的計算過程如下。
1. 利用AuthKey和PIN碼利用HMAC算法分別生成兩個PSK。其中,PSK1由PIN碼前半部分生成,PSK2由PIN碼后半部分生成。
2. 利用AuthKey對兩個新隨機數128 Nonce進行加密,以得到E-S1和E-S2。
3. 利用HMAC算法及AuthenKey分別對(E-S1、PSK1、STA的D-H Key和AP的D-H Key)計算得到E Hash1。E Hash2則由E-S2、PSK2、STA的D-H Key和AP的D-H Key計算而來。
AP收到并處理完M3后將回復M4,其內容如圖6-27所示。
:-: 
圖6-27 M4消息示例
由圖6-27可知:
* AP將計算R Hash1和R Hash2。其使用的PIN碼為用戶通過AP設置界面輸入的PIN碼。很顯然,如果AP設置了錯誤PIN碼的話,STA在比較R Hash 1/2和E Hash 1/2時就會發現二者不一致,從而可終止EAP-WSC流程。
* Encrypted Settings為AP利用KeyWrapKey加密R-S1得到的數據。
**3、M5和M6**
M5消息和M4消息類似,如圖6-28所示。
:-: 
圖6-28 M5消息示例
圖6-28所示的Encrypted Settings為STA利用KeyWrapKey加密E-S1得來。
M6消息如圖6-29所示。
:-: 
圖6-29 M6消息示例
圖6-29所示的M6消息中,Encryped Settings為AP利用KeyWrapKey加密R-S2而來。
**4、M7和M8**
由M5、M6的內容可知,STA的M7將發送利用KeyWrapKey加密E-S2的信息給AP以進行驗證,如圖6-30所示。
:-: 
圖6-30 M7消息示例
當AP確定M7消息正確無誤后,它將發送M8消息,而M8將攜帶至關重要的安全配置信息,如圖6-31所示。
:-: 
圖6-31 M8消息示例
圖6-31中,安全配置信息保存在Encrypted Settings中,它由KeyWrapKey加密。WSC規范規定,當Enrollee為STA時(對Registrar來說,AP也是Enrollee),Encrypted Settings將包含若干屬性,其中最重要的就是Credential屬性集合,該屬性集的內容如表6-6所示。
:-: 
表6-6 Credential屬性集合的內容
由表6-6可知,當STA收到M8并解密其中的Credential屬性集合后,將得到AP的安全設置信息。很顯然,如果不使用WSC,用戶需要手動設置這些信息。使用了WSC后,這些信息將在M8中由AP發送給STA。
接下來,STA就可以利用這些信息加入AP對應的目標無線網絡了。
**5、EAP-WSC總結**
EAP-WSC M1~M8一共涉及8次EAP包交換,每次幀交換的內容如圖6-32所示。
:-: 
圖6-32 EAP-WSC幀交換內容
圖6-32對前面幾小節所提到的EAP-WSC幀內容進行了簡化,其中:
* Description代表UUID、Manufacturer、MAC地址等信息。
* PKE和PKR代表D-H算法的Enrollee方的Key以及Registrar方的Key。
* M*x代表沒有包含HMAC-SHA-256結果的第X次消息內容。
* HMACAuthenKey代表利用AuthenKey和HMAC-SHA-256算法進行計算。
* ENCKeyWrapKey代表利用KeyWrapKey進行加密。
* “[…]”中的內容為可選信息。
* N1和N2分別代表Enrollee和Registrar的Nonce。
STA處理完M8消息后,將回復WSC_DONE消息給AP,表示自己已經成功處理M8消息。接下來的工作就如圖6-7所示一樣。
* AP發送EAP-FAIL以及Deauthentication幀給STA。STA收到該幀后將取消和AP的關聯。
* STA將重新掃描周圍的無線網絡。由于STA以及獲取了AP的配置信息,所以它可以利用這些信息加入AP所在的無線網絡。
以上對WSC理論知識進行了一番介紹。其中有一些知識點請讀者注意。
* WSC的組成結構。規范中定義了AP、Enrollee和Registrar三大組件。日常生活中比較常見的實體是作為Enrollee的智能手機,以及集成了AP和Registrar功能的無線路由器(StandaloneAP)。
* WSC拓展了802.11 IE的內容,而WSC IE包含了由WSC定義的不同Attribute。了解這些Attribute的作用對于理解WSC非常重要。另外,規范還對管理幀包含什么樣的Attribute有嚴格規定。
* STA和Standalone AP使用RP協議交互的流程如圖6-7所示。另外,請讀者掌握EAP-WSCM1到M8幀包含的屬性及作用。
>[info] 注意 完整的WSC規范所包含的知識點比本節闡述得要多。在此,建議讀者先學完本章內容后再去研讀WSC規范。
下面來看Android中WSC相關的實現代碼。如果讀者真正掌握本節所示知識點的話,下面一節的學習過程將非常輕松。
- 前言
- 第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 參考資料說明
- 附錄