最近在进行和802.11漫游有关的工作,需要对wpa_supplicant认证流程和漫游过程有更多的了解,所以通过阅读论文等方式,记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包括普通漫游流程、三层秘钥原理 和802.11R漫游流程。Part2将包括wpa_supplicant有关部分解析,Part3将包括抓包分析。
本Part为wpa的完整解析,包括wpa_supplicant整个启动-读取参数-扫描-auth-assoc-key*4过程以及一次FT过程,主要用矢量图的方式描述,图的绘制逻辑如下:
初始化过程
初始化nl80211模块(因为wpa启动的时候选择的driver是nl80211)、获取wpa支持的keymgmt、auth flag等信息。
配置传入到wpa流程
根据wpa -i等参数,把接口初始化,根据-c后面的conf文件,把配置信息读入。
扫描流程
得知conf信息后开始进行扫描,网卡使用驱动扫描的方式,wpa只负责传递vendor扫描开始即可,在收到nl80211的扫描完成event的时候开始处理扫描结果,并打印扫描耗时。
AP选择流程
处理扫描结果的过程就把扫到的AP能力和conf里面指定的信息对比,首先看看扫到的列表里面有没有conf指定的ssid,对上了就看有没有缓存对方的PTK,没缓存就看加密方式是否对得上,如AP支持wpa psk+ft psk(0x42),STA的conf里面支持ftpsk(0x40),那么就使用ft psk的加密方式。
发现交集不是空之后就发起associate过程,在正式auth、associate之前,首先停止扫描和转换状态机状态。
发起associate流程
根据多级opcode跳转,wpa drv associate跳转到wpa drv nl80211 associate,虽然这一步叫associate,但最终发出nl80211 命令是控制驱动开始auth,auth的对象也会打印。
associate过程
由于auth过程是不加密的两步对话,不需要wpa参与,驱动会自动完成,在成功auth后会自动发association request,收到association response后会通过NL80211 event通知wpa,wpa会解析FT字段、MDIE、RSNIE等信息等,过程中会获取mobility domain、R0KH R1KH,此时没有进行key 4交换,所以本地SNonce没有生成,AP的ANonce也没有获取。此时STA已经可以计算R0和R1了(在后两步计算),AP因为获取了S0kh,也有了R0和R1。
key 1处理过程
收到association response后,AP回继续给STA发送key1,wpa通过l2 packet收函数获取key1,解析里面的ANonce并打印信息。
生成key2过程
收到Anonce 后STA生成Snonce后即可算出PTK,经过3步连续计算,获取PTK,wpa控制驱动发送key2。
发送key2的过程
调用l2 packet发送key2。
处理key3发送key4的过程
发送的key2里面由Snonce,所以AP也可以算出来和STA一样的PTK,用PTK加密GTK,放到key3
里面发给STA,wpa需要解析GTK信息并保存,STA发送key4表示连接OK
计算、保存PTK并输出信息
wpa将计算好的PTK GTK交给驱动,wpa在首次关联的过程中的所有工作就都完成了,更新状态、打印信息后就结束了。
准备FTIE
由于解析association response、key mgmt等都规定了,STA需要使用FT切换AP,所以在关联后,wpa需要准备好FTIE,含RSNIE(含PMKR0NAME),含MDIE,含FTIE(含SNonce和R0KHID),所以需要再生成一个Snonce。
触发FT到切换完成流程
由于我本次调的驱动将FT触发 offload到驱动做了,所以wpa不负责 FT auth request的发出,wpa将FTIE等信息交给 驱动后,驱动触发FT后自动发出FT auth request,收到FT auth response后会NL80211 event告知wpa,wpa收到后解析出Anonce,还是上面的PTK计算流程,计算出PTK后交给驱动,驱动会把Reassociation request发出去,等等Reassociation response后获取GTK并交给驱动一次FT 切换就完成了。
把PTK等相关内容传递给驱动流程
将PTK发送到驱动用的也是nl80211的途径,通过opcode 的层次转换,最后使用netlink的发送,把PTK发到驱动。