hostapd wpa_supplicant madwifi详细分析(十一)——wps原理及实现 三

这篇文章主要整理一下关于WSC的边边角角,对一些比较重要且前面没有解释清楚的一些概念做点补充,如果对前面两篇文章理解比较清楚,可以略过。

首先补充一下关于PBC的内容

前面两篇文章分析的都是关于PIN,而且M3-M7消息的主要工作也就是确认Enrollee和Registrar各自手上的PIN都是相同的,然后用M8给Enrollee发送configdata。但是PBC的WPS连接方式却是一种极为偷懒的行为,它不仅不需要对方输入正确的PIN码,而且直接告诉大家我们交互时验证的PIN码就是“00000000”,可以说M3-M7的安全工作几乎是多余的,Enrollee的安全保证直接依靠

(1).发现阶段的probe request和probe response的Description,以及2min的等待时间窗。使用PBC方式的时候,也就是假定我们约定的某个2min内进行PBC连接是安全的,这个时间段内不会有别人来入侵,如果检测到别人在入侵或有多个Enrollee在尝试连接,registrar就终止一切交互动作,并且等待一段时间后再允许尝试。

(2).DH-key(K_tmp)保密程度,因为在等式中KWK = HMAC-DHKey (N1 || EnrolleeMAC || N2),括号中的内容都是可以通过监听无线WPS交互报文来获取的

其实PBC并不指简单的按一下WPS按钮,它是一个泛指,包括所有能够触发PBC method的条件都可以称为PBC,包括软件模拟触发,DTV和硬件按钮等等。由于PBC method并不是一个可靠的方式,所以不允许使用这种方式来管理AP配置,不管是通过M8消息或者管理接口都是不允许的,这也表示AP不支持使用PBC方式添加外部registrar,也不支持为后面的AP管理派生密钥。

PBC方式的使用要求用户在2min的时间轴内,Enrollee和registrar都要触发PBC运行。在两边都触发了以后,Enrollee如果发现了一个激活的Registrar,它并不会立即执行Registration Protocol,Enrollee首先会扫描所有它自己支持的802.11 channel以发现附近是否还有其他的Registrar有激活PBC模式。

Enrollee通过广播发送携带Device password ID(有置PBC标志位)的probe request然后收集probe response消息,如果Enrollee从收集的probe response消息里面发现有两个以上的Registrar在运行PBC模式,Enrollee就会终止连接,然后发送一个“session overlap”给用户,如果发生了“session overlap”错误,用户就会从UI上收到一个提示信息,指示用户等待一段时间再尝试。值得注意的是,在双频AP和双频STA环境中,STA可能会发现多个registrar有激活PBC模式,如果双频STA发现在双频AP的两个band上都有运行PBC,并且beacon包里面的UUID和probe
response的相同,那么STA将不会把这中情况认为是session overlap事件。如果Enrollee扫描完以后,只发现一个registrar有激活PBC,那么Enrollee就会马上和这个registrar开始执行Registration Protocol。

当registrar激活PBC的时候,registrar就会开始检查接收到的probe request包是否来自多个Enrollee,同时也会检测是否在按下按钮后的120s以内接收到的probe request包。在这个120时间窗里面,如果registrar收到多个Enrollee发送的PBC probe request包,或者registrar接收到的M1报文里面的UUID-E和probe request里面的UUID-E不一样,那么registrar就会生“session overlap”错误,并提示用户。这时registrar就会退出PBC模式,直到同时满足下面两个中的条件时再执行:

(1)用户再次按下PBC按钮

(2)在新的2min时间窗里面,检测到只有一个Enrollee在运行PBC

如果Registrar在和Enrollee进行PBC Registration Protocol交互时发现另外一个Enrollee的probe request包或M1消息,那么registrar也会发生一个“session overla”错误。这时registrar将会在下次接收M1-M8消息时,回复一个WSC_NACK消息回去。

如果在2min再按了一次button,相当于重新来过一次,重新以2min计时。

Registrar在运行PBC时,如果接收到M1 消息,它会先将M1中的UUID-E和probe request中的UUID-E进行比较,以确认是否下一步继续发送M2消息(i.e., if the UUID-E of the PBC M1 message does not match the UUID-E from the PBC probe request message, then the PBC M1 message shall be rejected by the Registrar with
M2D using Configuration Error 12 - Multiple PBC sessions detected).
Enrollee在收到M3以后,就会用device password为00000000进行后面的M3-M8交互。

下图是使用外部Registrar时,PBC的流程图:

接下来补充一些关于attributes各个数据位的含意

1.AP Setup Locked

这个置为1的时候,表示AP进入一种拒绝外部registrar使用AP的PIN码执行Registration Protocol的状态。一般来说,如果在60s内有3次PIN认证失败就会进入这种状态,锁住60s后自动解开,或者重新配置一下AP的设置也会解开。

2.Association State

这个值表示STA发送Discovery request时的当前配置和前面的关联状态

3.Authentication Type

这个值从Authentication Types table里面来,如果Registrar和Enrollee都使用2.0或更高的WPS版本时,可以使用0x0022表示混合加密(both WPA-Personal and WPA2-Personal enabled).1.0h没有混合加密的描述,而且为了向后兼容,只有一个值0x0020 WPA2-Personal可以同时在新版本和旧版本里面使用,只有0x0022这种加密方式可以同时设两个,其他的加密方式都只能设一个。

4.Authentication Type Flags

这个值表示Authentication Type的加密方式

5.Authenticator

它是一个键控哈希数据,它的值依赖于处理的消息内容,WPS规范1.0和2.0都使用的是HMAC-SHA-256算法,在M1-M8的消息里面,HMAC算法使用的默认值都是AuthKey.如果默认KEY不可用,那么就会使用Key Identifier attribute里面指定的KEY。为了减少消息的负载大小,Authenticator attribute一般只取结果中256位的前64位。

这个值其实可以当作校验码来看待,它的作用主要是用来确认消息有正确发送。

6.AuthorizedMACs

这个是一张包含Enrollee MAC地址的一张表,用来登记有启动过WSC过程的Enrollee。这个表会在AP的beacon包和probe response包里面发送,用来告诉Enrollee是否以前有登记启动过WSC过程。

7.Configuration Methods

这个属性很重要,主要用来决定使用哪种方式进行WPS交互,平常用的比较多的是PBC和PIN

Display还需细分为Physical Display或Virtual Display。二者区别是Physical Display表示PIN码能直接显示在设备自带的屏幕上,而Virtual Display只能通过其他方式来查看(由于绝大多数无线路由器都没有屏幕,所以用一般情况下,用户只能在浏览器中通过设备页面来查看)PIN码。Keypad表示可在设备中输入PIN码。另外,是否支持Push Button由Push Button位表达。同PIN码一样,它也分Physical Push Button和Virtual
Push Button。

8.Configuration Error

9.Connection Type & Connection Type Flags

这个值用来表示Enrollee的属性,一般都是ESS

10.Credential

WLAN的接入凭证于以及相关配置信息

11.Device Password ID

这个attribute主要是用来指定device password,有7个预定的值和7个保留值,默认值是PIN码,这个password可能来自label, display或者用户指定。Registrar-specified value表示从Registrar那里获取的device password,获取方式可能是display或者out-of-band方法,这个值将来可能添加到M1中的“Identity” attribute里面。

12.Encryption Type & Encryption Type Flags

指定一种加密类型,在WSC 2.0以上的标准可以支持混合加密(both WPA-Personal with TKIP and WPA2-Personal with AES enabled),但是1.0h和2.0交叉时,只能用0x0008 AES。

13.Message Type

指定消息类型

14.Network Key

Enrollee需要的无线网络加密密钥,这个属性里面不能补0

15.Primary Device Type

Primary Device Type属性代表设备的主类型。在Discovery Phase阶段,交互的一方可指定要搜索的设备类型(需设置Requested Device Type属性,该属性的结构和取值与Primary Device Type一样)。这样,只有那些Primary Device Type和目标设备类型匹配的一方才会进行响应。

规范还定义了一个名为Secondary Device Type List的属性,该属性包含了设备支持的除主设备类型外的设备类型。具体的设备类型取值和Primary Device Type一样。Discovery Phase阶段中,Secondary Device Type List也可作为搜索匹配条件。

16.Request Type & Response Type

·Request Type属性必须包含于Probe/Association Request帧中,代表STA作为Enrollee想要发起的动作。该属性一般取值0x01(含义为Enrollee,open 802802.1X),代表该设备是Enrollee,并且想要开展WSC后续流程。它还有一个取值为0x00(含义为Enrollee,Info only),代表STA只是想搜索周围支持WSC的AP,而暂时还不想加入某个网络。

·Response Type属性代表发送者扮演的角色。对于AP来说,其取值为0x03(含义为AP),对于Registrar来说,其取值为0x02,对于Enrollee来说,其取值可为0x00(Enrollee,Info only)和0x01(Enrollee,open 802.1X)。Standalone AP也属于AP。

17. RF Bands

18.Wi-Fi Simple Configuration State

对于STA来说,它发送的M1中,Wi-Fi Simple Configuration State标志位应该始终为‘Not Configured‘ (0x01).

对于AP来说,它发送的beacon,probe response和M1中,Wi-Fi Simple Configuration State标志位用来表示AP是否已配置,如果AP刚恢复出厂,那么AP就处于“Not Configured” 状态,那么在满足下面的任意一个条件以后,AP会切换到已配置状态“Configured”(0x02):

1.AP被外部registrar配置过后,也就是说AP向外部Registrar发送WSC_Done消息后,AP会变成已配置状态

2.被内部registrar自动配置过,也就是说,AP在处理Enrollee Registration过程中,收到来自第一个Enrollee的WSC_Done response消息后,AP会变成已配置状态。

3.AP被用户手动配置后,也就是说,只要用户修改过SSID,加密算法,认证算法,密码或密钥中的任意一个变量,都会让AP从未配置状态切换到已配置状态,但是当AP恢复出厂的时候,会变为未配置状态。

值得注意的是,不管AP是处于已配置状态或未配置状态都不会影响STA Enrollee Registration Protocol的继续执行,也就是说Enrollee会忽略AP的Wi-Fi Simple Configuration State attribute。

最后简单回顾一下WSC的交互过程

发现阶段:其实发现阶段主要是对设备的兼容性以及两端的配置信息进行鉴定,以确认接下来的交互是否匹配。被check的信息包括使用的WSC版本信息,请求类型,设备类型,RF band,Conguration Method,device password ID, 配置和关联结果等等。 对于Push button的方式还要检查UUID。

认证和关联阶段:这个过程在实际应用中,一般都不会出错,因为它并没有真正的检测认证密钥,它会忽略对应的RSN IE和WPA IE检测,直接回复Auth成功包

身份确认阶段:在STA和AP双方开展EAP-WSC流程前,AP需要确定STA的Identity以及使用的身份验证算法。该过程涉及三次EAP包交换(参考上图)。这三次包交换的内容分别如下。

·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"后,将发送EAP-Request/WSC_Start包以启动EAP-WSC认证流程。这个流程讲涉及M1~M8相关的知识。

M1-M8:具体请参考前文,这里简单回顾一下其间使用到的算法以及一些重要的密钥

(1)Diffie-Hellmen:它是一种密钥交换算法,并不是加密算法。对于正常数据包的加密传输,在双方交换密钥以后,可以使用这个共享密钥(D-HKey)配合一种加密算法对要发送的数据进行加密,对方接收到数据包以后就可以用共享密钥(D-HKey)进行解密。当然在M1-M8中并没有用D-HKey直接用于数据加密,而是用它计算出来一个派生密钥KDK。

(2)HMAC-SHA-256:HMAC是一种消息摘要算法,兼容了MD和SHA算法的特性,HMAC-SHA-256算法则是其中的一种,HMAC,主要是利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。所以在这个算法中,主要变量是密钥和消息。

(3)KDK:KDK = HMAC-SHA-256DHKey (N1 || EnrolleeMAC || N2), 它是由D-HKey作为密钥,N1 || EnrolleeMAC || N2作为消息计算出来的鉴别码,KDK用于后面派生AuthKey, KeyWrapKey 和 EMSK, 这三个密钥各有各的用途,特别是AuthKey, KeyWrapKey对M3-M8的加密有关键的作用。

(4)AuthKey, KeyWrapKey 和 EMSK三个密钥的派生

派生出这三个密钥使用的算法是KDF函数:AuthKey || KeyWrapKey || EMSK = kdf(KDK, “Wi-Fi Easy and Secure Key Derivation”, 640),下面简单介绍一下他们是怎么派生出来的。注:prf函数是一个可键控的HMAC-SHA-256函数

kdf(key, personalization_string, total_key_bits) :

result := “”

iterations = (total_key_bits + prf_digest_size – 1)/prf_digest_size

for i = 1 to iterations do

result := result || prf(key, i || personalization_string || total_key_bits)

return 1st total_key_bits of result and destroy any bits left over

这个函数中,Key是256位的KDK,i和total_key_bits是32bit的整数,personalization_string是不以空格结尾的UTF-8编码字符串,使用大端串联。

所以kdf(KDK, “Wi-Fi Easy and Secure Key Derivation”, 640)

{

      char *digest=“Wi-Fi Easy and Secure Key Derivation”;

      char result[]="";

      iterations=(640 + strlen(digest) )/strlen(digest);

      for(int i=1; i <= iterations; i++)
      {
          result=result||HMAC-SHA-256<em><span style="font-size:10px;">KDK</span></em><span style="font-size:12px;">(i||digest||640)</span><em><span style="font-size:10px;"></span></em>
      }
      return result的前640位
 }

就这样愉快的获取到来640位的计算结果。下面讲讲AuthKey, KeyWrapKey 和 EMSK吧。

 AuthKey (256 bits):用来鉴定 Registration Protocol messages.

 KeyWrapKey (128 bits):用来加密nonces and ConfigData.

 EMSK (256 bits):它是一个 Extended Master Session Key ,它用来派生其他的key或用于其他应用.

不知道细心的你有没有发现256+128+256=?,没错!就是640,到这里应该不用解释AuthKey || KeyWrapKey || EMSK = kdf中,AuthKey, KeyWrapKey 和 EMSK三个值是怎么来的了吧?就是将这640位分成3段,256+128+256分别赋值给AuthKey, KeyWrapKey 和 EMSK。

也许将 “||” 看成“追加拼接”会更好理解。

(5)M1-M3中一些重要的参数计算:

ES1,ES2是Enrollee端生成的128位的随机数,它与N1,N2不同

RS1,RS2是Registrar端生成的128位随机数,它与N1,N2不同

E-Hash1 = HMAC-AuthKey( ES1 || PSK1 || PKE || PKR )

E-Hash2 = HMAC-AuthKey( ES2 || PSK2 || PKE || PKR )

R-Hash1 = HMAC-AuthKey( RS1 || PSK1 || PKE || PKR )

R-Hash2 = HMAC-AuthKey( RS2 || PSK2 || PKE || PKR )

ENC-KeyWrapKey(R-S1)

ENC-KeyWrapKey(E-S1)

ENC-KeWrapKey(R-S2)

ENC-KeyWrapKey(E-S2)

ENC-KeyWrapKey(ConfigData)

HMACAuthKey(Mx || Mx+1*)

从这些表达式中应该看出AuthKey, KeyWrapKey在M3-M8消息中有多么重要的作用了。

断开关联:获取到WLAN的接入凭证以后,就需要和AP断开关联,Enrollee用获取到的信息重新和AP建立正常的连接。

时间: 2024-10-13 21:00:54

hostapd wpa_supplicant madwifi详细分析(十一)——wps原理及实现 三的相关文章

hostapd wpa_supplicant madwifi详细分析(十四)——完结篇

注:这篇文章不谈技术 查看了一下<hostapd wpa_supplicant madwifi详细分析>系列文章,断断续续更新到现在,发现中间的持续时间都快要两年了.记得那时候刚毕业到公司,组长叫我看项目的无线部分代码,自己稀里糊涂的看了一个月,组长问我: vap是怎么创建的?sta和AP是怎么建立连接的?wds是怎么工作的?WPS中PIN和PUSHBUTTON的区别是什么?我们DUT中几种加密方式是怎么实现的?hostapd是用来干什么的? 这些问题把我问的瞠目结舌,十分羞愧,感觉自己花了一

hostapd wpa_supplicant madwifi详细分析(九)——wps原理及实现 一

这篇文章基于<Wi-Fi Simple Configuration Technical Specification Version 2.0.5>文档, 更详细的内容请直接参考文档,这里只将自己的想法做一些简单的记录. 一.WSC的三种实现 WSC(wifi simple configuration),一看这名字就知道这个协议是用来偷懒用的,所以我将它翻译为"快速接入无线网"协议,这个协议主要包括三种快速连接方式: 1. WPS: 看这篇文章的人,应该会知道wps是干嘛用的,

hostapd wpa_supplicant madwifi详细分析(八)——wpa_supplicant的配置文件

距离上一篇文章的更新已经将近半年了,这半年忙项目忙得几乎没有什么时间给自己积累一些东西,也没什么心思转到这边来写点东西,当一个项目放到自己身上的时候,发现并不像开发一个模块或一个功能那么简单,涉及方方面面,各种琐碎的的事情会占据大量的时间. 前面写的关于hostapd的文章都太浅显了,一般都没怎么涉及到具体的功能,只是简单的分析了一下代码的流程,然而对于实际的功能开发和bug调试其实用处不大,后面的文章将从wpa_supplicant入手做进一步的了解.hostapd主要用于AP端的开发,比如路

hostapd wpa_supplicant madwifi详细分析(十三)——EAPOL(802.1X-2004/IEEE Std 802.1X-2010)

这篇文章主要介绍EAPOL,关于它的详细定义可以到802.1X-2004/IEEE Std 802.1X-2010两个文档里面查询.这两个文档核心内容大同小异,只是2010版定义得更细致,同时也更难以理解,建议先了解2004版,会更容易看懂.因为2010版引入来更多的名词,加入了更多的参考资料,对一致性的描述更加细致具体,让标准可以适用于更多的加密场合,补充2004 版中的一下缺陷. 两个标准的前5章的差异,我们可以不用太深究,他们主要包括802.1x的定义,名词解释,适用范围,引用文档,一致性

环信UI开源Demo情景分析十一、聊天界面(三)

前面两章已经了解了大部分功能,不过还有一些东西没有讲到,接下来咱们就继续将剩下的部分讲完. @Override protected void onDestroy() { super.onDestroy(); activityInstance = null; EMGroupManager.getInstance().removeGroupChangeListener(groupListener); } 在结束聊天界面时候清除当前实例,并且结束群组监听, /** * 监测群组解散或者被T事件 * *

uboot的relocation原理详细分析

最近在一直在做uboot的移植工作,uboot中有很多值得学习的东西,之前总结过uboot的启动流程,但uboot一个非常核心的功能没有仔细研究,就是uboot的relocation功能. 这几天研究下uboot的relocation功能,记录在此,跟大家共享. 所谓的relocation,就是重定位,uboot运行后会将自身代码拷贝到sdram的另一个位置继续运行,这个在uboot启动流程分析中说过. 但基于以前的理解,一个完整可运行的bin文件,link时指定的链接地址,load时的加载地址

Android 4.4 KitKat NotificationManagerService使用详解与原理分析(二)__原理分析

前置文章: <Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解> 转载请务必注明出处:http://blog.csdn.net/yihongyuelan 概况 在上一篇文章<Android 4.4 KitKat NotificationManagerService使用详解与原理分析(一)__使用详解>中详细介绍了NotificationListenerService的使用方法,以及在使用过程中遇到的问题和

ZIP压缩算法详细分析及解压实例解释

最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没啥区别,在数学家看来,都是映射.一方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求:另一方面,计算机存储数据的时候,为了减少磁盘容量需求,也会将文件进行压缩,尽管现在的网络带宽越来越高,压缩已经不像90年代初那个时候那么迫切,但在很多场合下仍然需要,其中一个原因是

详细分析contrex-A9的汇编代码__switch_to(进程切换)

//函数原型:版本linux-3.0.8 struct task_struct *__switch_to(structtask_struct *, struct thread_info *, struct thread_info *); #define switch_to(prev,next,last)                                       \ do {