之后的文章基本都是wpa_supplicant源码分析的介绍, wpa_supplicant 一个庞大的开源项目, 最新版本的为2016-10-V2.6。据目前来开,WiFi相关应用层的操作基本都是wpa_supplicant 的封装,包括Android 。初步统计一下,wpa_supplicant 源文件个数 552个, 20万行代码。 分析起来工作量巨大,这条路非常难走,请读者做好准备。
wpa_supplicant 的源码目录介绍
├── ap // hostapd 相关功能
├── common // 通用函数
├── crypto // 各种加密功能
├── drivers // 对接底层驱动,包括 wext 和nl80211
├── eap_common // eap 相关
├── eapol_auth
├── eapol_supp
├── eap_peer
├── eap_server
├── fst // fst 模块
├── l2_packet // 链路层的访问封装
├── p2p // WiFi P2P协议,
├── pae // ieeee802 协议
├── radius // RADIUS:Remote Authentication Dial In User Service 消息处理
├── rsn_supp // RSN协议, Robust Secure Network,强健安全网络),即通常所说的WPA2安全模式,是WPA 的第二个版本
├── tls // tls 协议
├── utils // 包括 RFC1341编解码, 通用的辅助函数, 双链表, UUID, debug, epool
└── wps // wps 功能的实现
主要文件详解
核心功能
- wpa_supplicant.c 程序初始化,主控制回路
- wpa_supplicant/main.c main()适用于UNIX和Windows操作系统,使用命令参数来配置wpa_supplicant
- events.c 驱动事件处理 wpa_supplicant_event() 相关功能
- wpa_supplicant_i.h wpa_supplicant核心接口定义,不应该包含在独立模块中
通用功能
wpa_supplicant 使用通用的帮助函数,其中一些与hostapd共享,文件如下:
- eloop.c和eloop.h 事件循环(select()循环与注册超时,套接字读取回调,和信号回调)
- common.c和common.h 公共功能
- defs.h 定义由多个文件共享
- l2_packet.h,l2_packet_linux.c和l2_packet_pcap.c
第2层(链路层)访问包装(包括本地Linux实现和libdnet/libpcap的包装).当移植一个新操作系统不支持libdnet/libpcap时,需要添加新的l2_packet实现.Makefile可以选择包含哪个l2_packet实现, l2_packet_linux.c 使用Linux数据包套接字和l2_packet_pcap.c有一个更精简的版本使用libpcap和libdnet
pcsc_funcs.c pcsc_funcs.h PC/SC lite SIM和智能卡读卡器的封装
- priv_netlink.h Linux内核头文件中的netlink定义的私有版本,一旦合适的版本变得可用,可以用C库头文件替换
- version.h版本号定义
加密功能
- md5.c和md5.h MD5(如果包含TLS的支持则用加密库替换)HMAC-MD5(用于消息真实性验证的密钥校验和)
- rc4.c和rc4.h RC4(广播/默认密钥加密)
- sha1.c 和sh1.h SHA-1(如果包含TLS的支持则用加密库替换) HMAC-SHA-1(用于消息真实性验证的密钥校验和)
PRF-SHA-1(伪随机(密钥/随机数生成)函数) PBKDF2-SHA-1(ASCII共享密码)T-PRF (for EAP-FAST) TLS-PRF (RFC 2246) - sha256.c 和sha256.h SHA-256(如果包含TLS的支持则用加密库替换)
- aes-wrap.c, aes_wrap.h aes.c AES(如果包含TLS的支持则用加密库替换)采用128位KEY的AES密钥包装算法
RFC3394(广播/默认密钥加密) One-Key CBC MAC (OMAC1)哈希AES-128,AES-128 CTR模式加密, AES-128 EAX模式加密/解密,AES-128 CBC - crypto.h加密库封装的定义
- crypto_openssl.clibcrypto的封装函数 (OpenSSL)
- crypto_internal.c 内部加密实现的封装函数
- crypto_gnutls.c libgcrypt的封装函数(used by GnuTLS)
- ms_funcs.c 和ms_funcs.h MSCHAPV2 和 LEAP 参考函数
- tls.h TLS库封装的定义
- tls_none.c不包括TLS功能的情况下,TLS库封装的虚拟实现
- tls_openssl.c 用于openssl的TLS库封装器
- tls_internal.c 用于内部TLS实现的TLS库
- tls_gnutls.c 用于GnuTLS的TLS库封装器
TLS 库
- asn1.c 和 asn1.hASN.1 DER解析
- bignum.c 和 bignum.h Big number math
- rsa.c 和 rsa.hrsa.h RSA
- x509v3.c 和x509v3.hX.509v3证书解析和处理
- tlsv1_client.c和tlsv1_client.hTLSv1客户端(RFC 2246)
- tlsv1_client_i.h TLSv1客户端内部结构
- tlsv1_client_read.cTLSv1 client:读取握手消息
- tlsv1_client_write.c TLSv1 client:写握手消息
- tlsv1_common.c和 tlsv1_common.h常见的TLSv1例程和定义
- tlsv1_cred.c和tlsv1_cred.hTLSv1 证书
- tlsv1_record.c和tlsv1_record.hTLSv1记录协议
配置
- config_ssid.h 每个网络配置项目的定义
- config.h wpa_supplicant配置的定义
- config.c 配置解析器和常用功能
- wpa_supplicant/config_file.c配置文本文件的后端(例如:wpa_supplicant.conf)
- config_winreg.c Windows注册表的后端配置
控制界面
wpa_supplicant有一个控制界面可以用来获取状态信息和管理来自外部程序的操作.一个命令行界面的例子(wpa_cli)和GUI(wpa_gui)的接口包含在wpa_supplicant分发中
- wpa_supplicant/ctrl_iface.c和wpa_supplicant/ctrl_iface.h控制界面的 wpa_supplicant-side
- ctrl_iface_unix.c基于UNIX域套接字的控制接口后端
- ctrl_iface_udp.c基于UDP套接字的控制接口后端
- ctrl_iface_named_pipe.c Windows基于管道的控制接口后端
- wpa_ctrl.c和wpa_ctrl.h库函数为外部程序提供对wpa_supplicant控制接口的访问
- wpa_cli.c 使用wpa_supplicant控制界面的示例程序
EAP peer
- EAP peer implementation是一个单独的模块,可以被其它程序使用,而不仅仅是wpa_supplicant
- eap.c和eap.hEAP状态机和模式界面
- eap_defs.h 通用EAP定义
- eap_i.h内部定义的EAP状态机和模式,不包含在其他模块中
- eap_sim_common.c 和eap_sim_common.hEAP-SIM and EAP-AKA通用代码
- eap_tls_common.c 和eap_tls_common.h EAP-PEAP, EAP-TTLS, and EAP-FAST通用代码
- eap_ttls.c和eap_ttls.hEAP-TTLS
- eap_pax.c eap_pax_common.h eap_pax_common.c EAP-PAX
- eap_psk.c eap_psk_common.h eap_psk_common.c EAP-PSK (note: this is not needed for WPA-PSK)
- eap_sake.c eap_sake_common.h eap_sake_common.c EAP-SAKE
- eap_gpsk.c eap_gpsk_common.h eap_gpsk_common.c EAP-GPSK
- eap_aka.c eap_fast.c eap_gtc.c eap_leap.c eap_md5.c
eap_mschapv2.c eap_otp.c eap_peap.c eap_sim.c eap_tls.c 其他 EAP模式实现
EAPOL supplicant
- eapol_supp_sm.c和eapol_supp_sm.h EAPOL supplicant 状态机和 IEEE 802.1X处理
Windows 端口
- ndis_events.c 接收NdisMIndicateStatus()事件的代码,传递它们给 wpa_supplicant driver_ndis.c,使用起来更加方便
- win_if_list.c 列出当前网络接口的外部程序
测试程序
- radius_client.c radius_client.h和 radius_client.h 无线电认证客户端实现eapol_test
- radius.c和radius.h无线电消息处理为eapol_test
- eapol_test.c独立的EPA测试工具并集成RADIUS认证客户端
- preauth_test.c独立的RSN pre-authentication工具
- wpa_passphrase.c WPA ASCII密码到PSK转换
来源:CSDN
作者:程序手艺人
链接:https://blog.csdn.net/z2066411585/article/details/78696215