hostapd wpa_supplicant madwifi详细分析(十二)——EAP(RFC3748)及EAP状态机分析(RFC4137)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lee244868149/article/details/51878093

这篇文章分两个部分:EAP(RFC3748)及EAP状态机分析(RFC4137),其中主要内容来自RFC以及网络文章。

一、EAP拓展认证协议

EAP的可拓展性主要表现在它的method可拓展,EAP只是一个载体,传送不同method间的交互。

EAP可用于专用的链接,以及开关电路和有线和无线链路。到目前为止,EAP已经通过连接交换电路或拨号链路使用PPP协议,实施在主机和路由器上。同时也通过使用IEEE802协议,应用在交换机和接入点。在IEEE802有线媒体封装的EAP在IEEE802.1X中得以描述,并且在IEEE无线局域网中封装,由IEEE802.11i描述。

EAP架构的优势之一就是它的灵活性。EAP是用来选择一个专门的认证机制,通常是在验证请求需要更多的信息来确认专门的认证方法被使用,而不是需要验证者需要更新来支持每个新的验证方法,EAP允许使用后台认证服务器,他可以实现一些或所有认证方法,当认证者为部分或所有的方法和对等体作为一个传递。

EAP通常直接运行在数据链路层,利于ppp协议或者IEEE802,不需要IP地址。EAP提供了它自己支持的重复性淘汰和转发,但是在较低层排序保证自力更生。EAP本身不支持碎片,然而单独的EAP方法可能支持这个。1. 关于EAP的一些基本概念

·Authenticator(验证者):简单点说,Authenticator就是响应认证请求的实体(Entity)。对无线网络来说,Authenticator往往是AP。

·Supplicant(验证申请者①)发起验证请求的实体。对于无线网络来说,Supplicant就是智能手机。

·BAS(Backend Authentication Server,后端认证服务器):某些情况下(例如企业级应用)Authenticator并不真正处理身份验证,它仅仅将验证请求发给后台认证服务器去处理。正是这种架构设计拓展了EAP的适用范围。
·AAA(Authentication、Authorization and Accounting,认证、授权和计费):另外一种基于EAP的协议。实现它的实体属于BAS的一种具体形式,AAA包括常用的RADIUS服务器等。在RFC3748中,AAA和BAS的概念可互相替代。
·EAP Server:表示真正处理身份验证的实体。如果没有BAS,则EAP Server功能就在Authenticator中,否则该功能由BAS实现。

下图是EAP认证的架构:

由图可知,EAP没有强制定义位于最底层(Lower Layer,LL)的传输层。目前支持EAP协议的网络有PPP、有线网(EAPOL,也就是802.1X协议)、无线网络(即802.11 WLAN)、TCP、UDP等。另外,由于EAP报文是由LL层进行封装的,LL可能是EAPOL或直接驱动转发,LL本身的特性(例如以太网和无线网都支持数据重排及分片的特性)会影响其上一层EAP的具体实现。

·EAP Layer用于收发数据,同时处理数据重传及重复(Duplicate)包。
·EAP Supplicant/Authenticator Layer根据收到EAP数据包中Type字段(见下文介绍)的不同,将其转给不同的EAP Method处理。
·EAP Method属于具体的身份验证算法层。不同的身份验证方法有不同的MethodType。

通过IEEE802压缩EAP被定义在IEEE802.1X。在IEEE802封装的EAP不包含PPP,IEEE802.1X不包含对链路的支持,或网络层的协商。因此,在IEEE802.1X中,不可能通过非EAP的认证方法,例如PAP或CHAP。


2.EAP认证交换过程如下:


[1] 认证器(Authenticator)发送了一个请求来认证对等端(supplicant/peer)。这个请求有一个类型字段来指出什么正在被请求。请求的例子包括身份、MD5的挑战等。MD5挑战的类型与CHAP认证协议对应密切。通常情况下,认证器将发送一个最初的身份认证请求,然而,一个最初的身份请求是不需要的,可能被掠过。例如,在对等端已经确定连接到端口时,或身份被另外的方式获得时,身份就不需要了。

[2] 对等端发送一个回应包来回复合法的请求。和请求包一样,回应包包含了一个类型字段,与请求的类型字段相对应。

[3] 认证器返送一个附加的请求包,对等体回复一个数据包。请求和回复的序列继续和需要的一样长。EAP是一个锁步协议,因此除了初始请求外,一个新的请求不能够在收到有效相应之前被提前发送。认证器像对重传请求包有责任。经过适当数量的转发后,认证器应该结束EAP谈话,认证器不能够发送成功或者失败数据包,当重传或它没有从对等端收到回应。

[4] 通信继续知道认证器不能认证对等端,在这种情况下,必须发送一个EAP失败。或者,认证谈话继续直到认证成功认证,在这种情况下,认证器必须发送一个EAP成功。

图中第三和第四步时,Authenticator要求使用MD5质询法进行身份验证,但Supplicant不支持,故其回复NAK消息,并通知Authenticator使用GTC方法进行身份验证。第六步中,如果Supplicant回复了错误的GTC密码时,Authenticator可能会重新发送Request消息以允许Supplicant重新尝试身份验证。一般认证失败超过3次才会回复Failure消息。


3. EAP报文格式


(1)Code:代码字段是一个字节,鉴定EAP数据包的类型。EAP代码被下列指派:1--请求  2--回应   3--成功   4--失败

由于EAP仅仅定义了代码1-4,EAP数据包其他的代码被认证器和对等端默默的丢弃。

(2)Identifier:消息编号(ID),用于配对Request和Response

(3)Length:2字节,用于表示EAP消息包长度(包括EAP头和数据的长度)。长度字段是两个字节,显示了长度,字节数,EAP数据包包含代码,标识符,长度和数据字段。字节外的长度字段范围应该被当作数据链路层填料,一旦接受必须被忽略。带有长度字段的消息的字节数大于接收到的字节数是,必须被默默的丢弃。

(3)Type:就是EAP Method Type。EAP Method Type取值如下。
1:代表Identity。用于Request消息中。其Type Data字段一般将携带申请者的一些信息。一般简写为EAP-Request/Identity或者Request/Identity。
2:代表Notification。Authenticator用它传递一些消息(例如密码已过期、账号被锁等)给Supplicant。一般简写为Request/Notification。
3:代表Nak,仅用于Response帧,表示否定确认。例如Authenticator用了Supplicant不支持的验证类型发起请求,Supplicant可利用Response/Nak消息以告知Authenticator其支持的验证类型。

4:代表身份验证方法中的MD5质询法。Authenticator将发送一段随机的明文给Supplicant。Supplicant收到该明文后,将其和密码一起做MD5计算得到结果A,然后将
结果A返回给Authenticator。Authenticator再根据正确密码和MD5质询文做MD5计算得到结果B。A和B一比较就知道Supplicant使用的密码是否正确。
5:代表身份验证方法为OTP(One Time Password,一次性密码)。这是目前最安全的身份验证机制。相信网购过的读者都用过它,例如网银付费时系统会通过短信发送一
个密码,这就是OTP。
6:代表身份验证方法为GTC(Generic Token Card,通用令牌卡)。GTC和OTP类似,只不过GTC往往对应一个实际的设备,例如许多国内银行都会给申请网银的用户一
个动态口令牌。它就是GTC。
254:代表扩展验证方法(Expanded Types)。

255:代表其他试验性用途(Experimental Use)。

(4)Data:EAP中具体的数据(Payload)。当Code为Request或Response的时候,Data字段还可细分为Type以及Type Data。


4. 关于EAP加密的安全性分析请参数RFC3748,这里就不相信描述了。


二、EAP状态机分析

wpa_supplicant/hostapd程序里面的核心部分,应该要算它的状态机了,前面分析了WPS的实现过程,但是在看代码的时候,不管是加密部分还是WSC部分,都绕不过它的状态机,它就像路上的一块石头,如果不搬开它,很难继续往下走。下面是wpa_supplicant 模块结构图,红线部分是状态机模块,它就像一个桥架在那里,如果左边进来的的数据想要到右边去实现加密或者解密,就必须经过这座桥,而且这座桥有三条道,不幸的是,这三条道并不是直线的,这是一条立交桥,三条道是交织在一起的,他们相互关联,相互串通,相互协作。

这篇文章先分析EAP状态机,更加详细的描述都在RFC4137里面,个人建议查询资料尽量去找官方文档,经过别人整理的东西有可能出错,而且像博客、个人笔记这种文章更容易不负责任的出错,知识总结是给自己的,标准才是给大家的。

根据RFC4317的定义,对应supplicant来说,其实它的EAP加密过程是分层的,一些包需要通过触发event loop 来启动EAPOL SM,而一些包则可以直接触发EAPOL SM,下面这个图就是一些包经过driver i/f直接转给EAPOL SM的处理过程。supplicant SM分三层,最底层是LowerLayer(LL),在wpa_supplicant中其实就是EAPOL层,这一层的作用是接收和发送EAP包。位于中间的SUPP SM层实现了Supplican状态机。最上层是EAP Method(EM)层,它实现了具体的EAP方法。

SUPP SM将接收到的数据一步一步往上传,要发送的数据一步一步往下走。一个最典型的交互例子就是LL收到EAP数据包后,将该数据包交给EAP层去处理。如果该EAP包需要EM层处理(例如具体的验证算法需要EM完成),则SUPP SM层将该包交给EM。EM处理完的结果将由EAP转交给LL去发送。

需要说明的是,虽然在wpa_supplicant中有对EAP的加密方法进行分层,但是他们都是工作在链路层的。

EAPOL层和EAP层的交互比较简单,主要包括三个步骤。
1)EAPOL层收到EAP数据包后,将其保存在eapReqData变量中,然后设置eapReq变量为TRUE。这个变量的改变对EAP层来说是一个触发信号(signal)。EAP可能
会发生状态转换。
2)EAP层从eapReqData中取出数据后进行处理。如果有需要回复的数据,则设置eapResp值为TRUE,否则设置eapNoResp值为TRUE。回复数据存储在eapRespData
中。EAPOL层将发送此回复包。
3)如果EAP完成身份验证后,它将设置eapSuccess或eapFailure变量以告知EAPOL层其验证结果。eapSuccess为TRUE,表明验证成功。eapFailure为TRUE,则验证失
败。

这篇文章主要对EAP层进行分析,EAP METHODs不分析,这个只要在具体应用的时候再看就好了,毕竟eap methods 太多了,不同的场合有用不同的method。后面将会用新的文章分析EAPOL层。

下面是wpa_supplicant EAP层的状态机转移图:

1. 状态机图中每一个状态都是由一个方框来表示的,上面用大写的部分表示当前的状态,而下面绿色的部分表示进入这个状态后将会执行的伪代码。箭头上的数据表示条件,UTC表示无条件转移(unconditional transition)


下面就是EAP Peer State Machine,也就是peer的EAP状态转移图,peer可以看作是前面文章中的Enrollee或者supplicant,当然还有EAP Stand-Alone Authenticator State Machine和EAP Backend Authenticator State Machine,分析这些图表大同小异,这里就只分析peer的状态机转移。


当lower layer(LL链路层)需要将消息传递给EAP peer状态机的时候,它会将数据存放在eapReqData结构体中,同时将eapReq设为TURE。值得注意的是,eapReq设为TURE并不代表接收到的一定是Request消息,它有可能收到的是Success消息或者Failure消息,尽管这个变量这样命名,实际上LL层并没有检查EAP包中的内容。

当EAP peer状态机处理完成接收到的消息后,它就会根据实际情况设置eapResp or eapNoResp位。如果eapResp置1,那么对应的response包就会存在eapRespData结构体中,那么LL层就会给对方传送这个消息。如果EAP peer状态机完成了认证,它就会将eapSuccess or eapFailure置1,用来告诉LL层认证成功或者失败。

一些重要的结构体及变量:

1.EAPOL层传给EAP状态机的变量(Lower Layer to Peer)

eapReq (boolean):由LL层设为TURE,或者由Peer state machine设为FALSE,用来表明LL层是否有请求到达

eapReqData (EAP packet):当eapReq设为TURE的时候,会将请求包中的内容存放在这个结构体中

portEnabled (boolean):置为1的时候表示EAP peer state machine已经准备好了通信,如果EAP对话由LL层触发开始,这个值就会设为TURE。如果在对话过程中,端口或session不再可用,那么portEnabled就会设为FALSE,同时状态机也会切换成DISABLED状态。为了避免不必要的重置,当LL层能够确信只是暂时的关闭而且马上能够恢复的情况下,LL层可能不会设断开标志(see [RFC3748],Section 7.12)。在这种情况下,portEnabled的值可能和LL层的link up标识并不一直保持相等。

idleWhile (integer):它是一个外部计时器,用来表示peer状态机在等待一个请求时剩余的超时时间。

eapRestart (boolean):表示LL层可能要重启认证过程

altAccept (boolean):

altReject (boolean):

这两个变量取名为lowerLayerSuccess和lowerLayerFailure更合适,它们用于通知LL层Success或Failure信息。
·当supplicant收到Disassociate帧或者Deauthenticate帧时,表示lowerLayerFailure。
·当收到4-Way Handshake第一个Message时(WPA KEY handshake),表示lowerLayerSuccess。

这两个变量是EAPOL状态机传给EAP状态机的,用来确认EAPOL和EAP层都成功时,表示成功,只要其中有一个失败,就表示失败。


2.EAP传给EAPOL层的变量(peer to lower layer)

eapResp (boolean):在peer state machine中置为TURE,在LL层中置为FALSE。这个值用来表示将要发送一个response包

eapNoResp (boolean):在peer state machine中置为TURE,在LL层中置为FALSE。表示请求已经被处理,但是没有EAP response包要发送

eapSuccess (boolean):在peer state machine中置为TURE,在LL层中置为FALSE。表示peer进入SUCCESS状态

eapFail (boolean):在peer state machine中置为TURE,在LL层中置为FALSE。表示peer进入FAILURE状态

eapRespData (EAP packet):当eapResp为TURE时,它指向response数据

eapKeyData (EAP key):当key相关的数据可用时,会在peer state machine中的METHOD状态设置这个值。RFC4137里面没有定义“EAP key”结构体,但是定义在【Keying】里面

eapKeyAvailable (boolean):在SUCCESS状态时设置,如果key相关的属性可用,则会设为TURE,相关的数据存放在eapKeyData里面

ClientTimeout (integer):表示EAP request消息的超时时间,它和idleWhile相对应,ClientTimeout表示固定的总时间,idleWhile表示还剩多少时间


3. EAP层和EAP METHODS层之间的交互变量

下图来自《深入理解Android:WiFi模块 NFC和GPS卷》

注意,methodState和decision的值由具体的认证方法(即Method)来确定。对EAP SUPP SM来说,methodState和decision的取值情况才是最重要的,因为它
们会直接影响EAP的状态切换。


4. EAP层,Peer State Machine本地变量

(1)长久型变量(在数据包之间维护)

selectMethod(EAP Type): 在GET_METHOD状态中设置,表示peer在当前处理过程中所选的方法

methodState(枚举类型):同上

lastID(整型):0-255或空,在SEND_RESPONSE状态中设置,表示上一次EAP包的标记(identifier)

lastRespData(EAP 包):在SEND_RESPONSE状态中设置,表示上一次发送的EAP Packet

decision(枚举类型):同上表

(2)短暂型变量(一次用完后将不再维护)

rxReq(bool):表示当前接收的EAP包类型为EAP Request包

rxSuccess(bool):表示当前接收的EAP包类型为EAP Success包

rxFailure(bool):表示当前接收的EAP包类型为EAP Fail包

reqID(int):表示当前EAP请求的ID

reqMethod(EAP type):表示当前EAP请求包的认证方法(EAP METHOD)

ignore(bool):在Method状态设置,表示是否丢弃当前EAP包


5. EAP层,Peer State Machine相关函数

下图来自《深入理解Android:WiFi模块 NFC和GPS卷》


6. EAP层,Peer State Machine的相关状态

下图来自《深入理解Android:WiFi模块 NFC和GPS卷》


这里分析的wpa_supplicant的EAP状态机,关于hostapd的部分可以自己查阅RFC4137,其实都是大同小异。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值