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 // ieee802协议 ├── 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和sha1.h实现SHA-1(如果包含TLS支持则用加密库替换),HMAC-SHA-1用于消息真实性验证的密钥校验和,PRF-SHA-1用于伪随机(密钥/随机数生成)函数,PBKDF2-SHA-1用于ASCII共享密码,T-PRF用于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.c封装libcrypto的函数(OpenSSL);crypto_internal.c封装内部加密实现的函数;crypto_gnutls.c封装libgcrypt的函数(用于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.h实现ASN.1 DER解析,bignum.c和bignum.h实现大数数学,rsa.c和rsa.h实现RSA,x509v3.c和x509v3.h实现X.509v3证书解析和处理,tlsv1_client.c和tlsv1_client.h实现TLSv1客户端(RFC 2246),tlsv1_client_i.h定义TLSv1客户端内部结构,tlsv1_client_read.c实现TLSv1客户端读取握手消息,tlsv1_client_write.c实现TLSv1客户端写入握手消息,tlsv1_common.c和tlsv1_common.h提供常见的TLSv1例程和定义,tlsv1_cred.c和tlsv1_cred.h提供TLSv1证书,tlsv1_record.c和tlsv1_record.h提供TLSv1记录协议。
配置包括:
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实现是一个独立的模块,可以被其他程序使用,而不仅仅是wpa_supplicant。
eap.c和eap.h实现EAP状态机和模式界面;eap_defs.h定义通用EAP定义;eap_i.h定义内部的EAP状态机和模式,不包含在其他模块中;eap_sim_common.c和eap_sim_common.h实现EAP-SIM和EAP-AKA通用代码;eap_tls_common.c和eap_tls_common.h实现EAP-PEAP,EAP-TTLS,和EAP-FAST通用代码;eap_ttls.c和eap_ttls.h实现EAP-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(注意:这与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_testradius.c和radius.h实现无线电消息处理,用于eapol_test;eapol_test.c实现独立的EPA测试工具并集成RADIUS认证客户端;preauth_test.c实现独立的RSN pre-authentication工具;wpa_passphrase.c实现WPA ASCII密码到PSK转换。

以上就是玩转「Wi-Fi」系列之wpa_supplicant 目录介绍(八)的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号