玩轉「Wi-Fi」系列之wpa
之後的文章基本都是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消息處理
├── rsn_supp // RSN協議,通常的WPA2安全模式
├── tls // tls 協議
├── utils // 包括 RFC1341編解碼, 輔助函數
└── wps // wps 功能的實現
主要文件詳解
1
核心功能
wpa_supplicant.c
程序初始化,主控制迴路
wpa_supplicant/main.c main()
適用於UNIX和Windows操作系統,使用命令參數來配置wpa_supplicant
events.c
驅動事件處理 wpa_supplicant_event() 相關功能
wpa_supplicant_i.h
wpa_supplicant 核心介面定義,不應該包含在獨立模塊中
2
通用功能
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
版本號定義
3
加密功能
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.c
libcrypto的封裝函數 (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庫封裝器
4
TLS 庫
asn1.c 和 asn1.h
ASN.1 DER解析
bignum.c 和 bignum.h
Big number math
rsa.c 和 rsa.h
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 client:讀取握手消息
tlsv1_client_write.c
TLSv1 client:寫握手消息
tlsv1_common.c, tlsv1_common.h
常見的TLSv1常式和定義
tlsv1_cred.c,tlsv1_cred.h
TLSv1 證書
tlsv1_record.c,tlsv1_record.h
TLSv1 記錄協議
5
配置
config_ssid.h
每個網路配置項目的定義
config.h
wpa_supplicant配置的定義
config.c
配置解析器和常用功能
config_file.c
配置文本文件的後端(例如:wpa_supplicant.conf)
config_winreg.c
Windows註冊表的後端配置
6
控制界面
wpa_supplicant有一個控制界面可以用來獲取狀態信息和管理來自外部程序的操作。一個命令行界面的例子(wpa_cli)和GUI(wpa_gui)的介面包含在wpa_supplicant分發中
ctrl_iface.c,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控制界面的示常式序
7
EAP peer
EAP peer implementation是一個單獨的模塊,可以被其它程序使用,而不僅僅是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 and EAP-AKA通用代碼
eap_tls_common.c ,eap_tls_common.h
EAP-PEAP, EAP-TTLS, and 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 (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模式實現
8
EAPOL supplicant
eapol_supp_sm.c,eapol_supp_sm.h
EAPOL supplicant 狀態機和 IEEE 802.1X處理
9
Windows 埠
ndis_events.c
接收NdisMIndicateStatus()事件的代碼,傳遞它們給 wpa_supplicant driver_ndis.c,使用起來更加方便
win_if_list.c
列出當前網路介面的外部程序
10
測試程序
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轉換
※為什麼人家的校服那麼好看?看看英國的校服文化吧
※因為相欠、所以遇見
TAG:全球大搜羅 |