4#include <esp_wifi_types.h>
9#ifndef POLITICIAN_MAX_AP_CACHE
10#define POLITICIAN_MAX_AP_CACHE 48
13#ifndef POLITICIAN_MAX_SESSIONS
14#define POLITICIAN_MAX_SESSIONS 8
17#ifndef POLITICIAN_MAX_CAPTURED
18#define POLITICIAN_MAX_CAPTURED 64
21#ifndef POLITICIAN_MAX_CHANNELS
22#define POLITICIAN_MAX_CHANNELS 50
42#define FC_TYPE_MASK 0x000C
43#define FC_SUBTYPE_MASK 0x00F0
44#define FC_TODS_MASK 0x0100
45#define FC_FROMDS_MASK 0x0200
46#define FC_TYPE_MGMT 0x0000
47#define FC_TYPE_CTRL 0x0004
48#define FC_TYPE_DATA 0x0008
49#define FC_ORDER_MASK 0x8000
51#define MGMT_SUB_ASSOC_REQ 0x00
52#define MGMT_SUB_ASSOC_RESP 0x10
53#define MGMT_SUB_PROBE_REQ 0x40
54#define MGMT_SUB_PROBE_RESP 0x50
55#define MGMT_SUB_BEACON 0x80
56#define MGMT_SUB_DEAUTH 0xC0
59#define EAPOL_LLC_OFFSET 0
60#define EAPOL_ETHERTYPE_HI 0x88
61#define EAPOL_ETHERTYPE_LO 0x8E
62#define EAPOL_LLC_SIZE 8
63#define EAPOL_MIN_FRAME_LEN (EAPOL_LLC_SIZE + 4)
65#define EAPOL_KEY_DESC_TYPE 0
66#define EAPOL_KEY_INFO 1
67#define EAPOL_KEY_LEN 3
68#define EAPOL_REPLAY_COUNTER 5
69#define EAPOL_KEY_NONCE 13
70#define EAPOL_KEY_IV 45
71#define EAPOL_KEY_RSC 61
72#define EAPOL_KEY_ID 69
73#define EAPOL_KEY_MIC 77
74#define EAPOL_KEY_DATA_LEN 93
75#define EAPOL_KEY_DATA 95
77#define KEYINFO_TYPE_MASK 0x0007
78#define KEYINFO_PAIRWISE 0x0008
79#define KEYINFO_ACK 0x0080
80#define KEYINFO_MIC 0x0100
81#define KEYINFO_SECURE 0x0200
82#define KEYINFO_INSTALL 0x0040
118 void setIgnoreList(
const uint8_t (*bssids)[6], uint8_t count);
198 using PacketCb = void (*)(
const uint8_t *payload, uint16_t len, int8_t rssi, uint32_t ts_usec);
227 static void IRAM_ATTR _promiscuousCb(
void *buf, wifi_promiscuous_pkt_type_t type);
230 void _handleFrame(
const wifi_promiscuous_pkt_t *pkt, wifi_promiscuous_pkt_type_t type);
231 void _handleMgmt(
const ieee80211_hdr_t *hdr,
const uint8_t *payload, uint16_t len, int8_t rssi);
232 void _handleData(
const ieee80211_hdr_t *hdr,
const uint8_t *payload, uint16_t len, int8_t rssi);
233 bool _parseEapol(
const uint8_t *bssid,
const uint8_t *sta,
234 const uint8_t *eapol, uint16_t len, int8_t rssi);
235 void _parseEapIdentity(
const uint8_t *bssid,
const uint8_t *sta,
236 const uint8_t *eapol, uint16_t len, int8_t rssi);
237 void _parseSsid(
const uint8_t *ie, uint16_t ie_len,
char *out, uint8_t &out_len);
238 uint8_t _classifyEnc(
const uint8_t *ie, uint16_t ie_len);
250 uint8_t _targetBssid[6];
251 uint8_t _targetChannel;
254 uint32_t _m1LockEndMs;
257 uint32_t _probeLockEndMs;
260 uint8_t _customChannelCount;
264 LogCb _logCb =
nullptr;
271 void _log(
const char *fmt, ...);
273 static const int MAX_IGNORE = 128;
274 uint8_t _ignoreList[MAX_IGNORE][6];
275 uint8_t _ignoreCount;
278 struct ApCacheEntry {
285 uint32_t last_probe_ms;
286 uint32_t last_stimulate_ms;
287 bool has_active_clients;
290 ApCacheEntry _apCache[MAX_AP_CACHE];
293 void _cacheAp(
const uint8_t *bssid,
const char *ssid, uint8_t ssid_len,
294 uint8_t enc, uint8_t channel,
bool is_wpa3_only =
false);
295 bool _lookupSsid(
const uint8_t *bssid,
char *out_ssid, uint8_t &out_len);
297 enum FishState : uint8_t { FISH_IDLE = 0, FISH_CONNECTING = 1, FISH_CSA_WAIT = 2 };
298 FishState _fishState;
299 uint32_t _fishStartMs;
300 uint8_t _fishBssid[6];
303 uint8_t _fishSsidLen;
304 uint8_t _fishChannel;
305 uint8_t _ownStaMac[6];
306 bool _fishAuthLogged;
307 bool _fishAssocLogged;
308 bool _csaSecondBurstSent;
310 void _startFishing(
const uint8_t *bssid,
const char *ssid,
311 uint8_t ssid_len, uint8_t channel);
312 void _processFishing();
313 void _randomizeMac();
314 void _sendCsaBurst();
315 void _sendDeauthBurst();
316 void _markCapturedSsidGroup(
const char *ssid, uint8_t ssid_len);
317 void _markCaptured(
const uint8_t *bssid);
330 uint8_t eapol_m2[256];
331 uint16_t eapol_m2_len;
336 Session _sessions[MAX_SESSIONS];
338 Session* _findSession(
const uint8_t *bssid,
const uint8_t *sta);
339 Session* _createSession(
const uint8_t *bssid,
const uint8_t *sta);
340 void _expireSessions(uint32_t timeoutMs);
343 struct CapturedEntry {
347 CapturedEntry _captured[MAX_CAPTURED];
350 bool _isCaptured(
const uint8_t *bssid)
const;
352 static const uint8_t HOP_SEQ[];
353 static const uint8_t HOP_COUNT;
#define POLITICIAN_MAX_CHANNELS
#define POLITICIAN_MAX_AP_CACHE
#define POLITICIAN_MAX_SESSIONS
#define POLITICIAN_MAX_CAPTURED
The core WiFi handshake capturing engine.
Error lockChannel(uint8_t ch)
Stops hopping and locks the radio to a specific channel.
void clearCapturedList()
Clears the captured BSSID list.
void markCaptured(const uint8_t *bssid)
Manually adds a BSSID to the "already captured" list to skip it.
void tick()
Main worker method.
int8_t getLastRssi() const
void(*)(const uint8_t *payload, uint16_t len, int8_t rssi, uint32_t ts_usec) PacketCb
bool(*)(const ApRecord &ap) FilterCb
void setPacketLogger(PacketCb cb)
Sets the callback for raw promiscuous mode packets.
void setLogger(LogCb cb)
Sets a custom logging callback to intercept library output.
void(*)(const HandshakeRecord &rec) EapolCb
void(*)(const ApRecord &ap) ApFoundCb
void setActive(bool active)
Enables or disables frame processing.
void setApFoundCallback(ApFoundCb cb)
Sets the callback for when a new Access Point is discovered.
uint8_t getChannel() const
void(*)(const EapIdentityRecord &rec) IdentityCb
void stopHopping()
Stops autonomous channel hopping and goes idle.
void setIgnoreList(const uint8_t(*bssids)[6], uint8_t count)
Sets a list of BSSIDs that should always be ignored by the engine.
void setEapolCallback(EapolCb cb)
Sets the callback for when a handshake (EAPOL or PMKID) is captured.
Error setTarget(const uint8_t *bssid, uint8_t channel)
Focuses the engine on a single BSSID.
void setIdentityCallback(IdentityCb cb)
Sets the callback for passive 802.1X Enterprise Identity harvesting.
Error setChannel(uint8_t ch)
Manually sets the WiFi radio to a specific channel.
void clearTarget()
Clears the specific target and resumes autonomous wardriving.
Error begin(const Config &cfg=Config())
Initializes the WiFi driver in promiscuous mode.
void startHopping(uint16_t dwellMs=0)
Starts autonomous channel hopping.
void setAttackMask(uint8_t mask)
Configures which attack techniques are enabled.
void setTargetFilter(FilterCb cb)
Sets an early filter callback.
void setChannelList(const uint8_t *channels, uint8_t count)
Restricts hopping to a specific list of channels.
void(* LogCb)(const char *msg)
Configuration for the Politician engine.