由图6-7所示的RP协议交互流程可知,Discovery Phase阶段之后,STA和AP将通过EAP包交换来完成安全信息协商。WSC规范利用EAP的扩展功能新定义了一种EAP算法,即EAPWSC。EAP-WSC的包格式如图6-22所示。
:-: ![](https://box.kancloud.cn/dd718e1e9dee1b5819bed797432690ee_1192x490.jpg)
图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的取值。
:-: ![](https://box.kancloud.cn/0360ba4a62bd0ecc0c33cab794237fb6_1267x593.jpg)
表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。
:-: ![](https://box.kancloud.cn/7b6d3fe92d5331b3e92c6ceac53dc7ae_620x678.jpg)
图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两个属性的取值情况。
:-: ![](https://box.kancloud.cn/3b0b862f049da615669295d81bc01f73_1199x233.jpg)
图6-24 Authentication/Encryption Type Flags取值示例
图6-24左图所示为Authentication Type Flags的取值情况。其中,"WPA"和"WPA2"标志位是"WPA-Enterprise"以及"WPA2-Enterprise"之意。
AP收到并处理M1后,将回复M2。M2的内容如图6-25所示。
:-: ![](https://box.kancloud.cn/dde233bb19176e9b2c24bd3d6e7b24fa_600x693.jpg)
图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所示。
:-: ![](https://box.kancloud.cn/91c247f7850c85f45a1013b6b8e9d351_873x667.jpg)
图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所示。
:-: ![](https://box.kancloud.cn/324e7e73ffd1f072e39635c58bc90305_840x561.jpg)
图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所示。
:-: ![](https://box.kancloud.cn/f2fd897bbb2ba5eef2dc1a750d9b68fd_845x473.jpg)
图6-28 M5消息示例
图6-28所示的Encrypted Settings为STA利用KeyWrapKey加密E-S1得来。
M6消息如图6-29所示。
:-: ![](https://box.kancloud.cn/2c91e60d1cd26b52fc444eeabcb27c7f_837x391.jpg)
图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所示。
:-: ![](https://box.kancloud.cn/6457f15d5afba8c862b28f4358fd6a72_840x477.jpg)
图6-30 M7消息示例
当AP确定M7消息正确无误后,它将发送M8消息,而M8将携带至关重要的安全配置信息,如图6-31所示。
:-: ![](https://box.kancloud.cn/19895ba3edab961f600200327c7c16d1_847x305.jpg)
图6-31 M8消息示例
图6-31中,安全配置信息保存在Encrypted Settings中,它由KeyWrapKey加密。WSC规范规定,当Enrollee为STA时(对Registrar来说,AP也是Enrollee),Encrypted Settings将包含若干属性,其中最重要的就是Credential属性集合,该属性集的内容如表6-6所示。
:-: ![](https://box.kancloud.cn/433eac38b405140b2679d5c948d0c8a5_1264x407.jpg)
表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所示。
:-: ![](https://box.kancloud.cn/88fc2cab0b3d0b269bf8a335ef530cd2_599x447.jpg)
图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 参考资料说明
- 附录