# strongwind1/wpawolf architecture

> Architecture diagram of the GitHub repository strongwind1/wpawolf, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-29). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/strongwind1/wpawolf
- Repository: https://github.com/strongwind1/wpawolf

## Overview

WPAWolf is a Rust command-line extractor that turns packet captures into WPA-family handshake and PMKID hashes for hashcat, plus optional auxiliary lists and logs. Its main workflow ingests pcap, pcapng, and gzip inputs, decodes supported link headers and 802.11 frames, collects messages and PMKIDs, pairs EAPOL messages across files, and emits configured sinks. The README documents broad phases and capabilities; some handler and output internals are unsampled, so those relationships are shown only where documented or indexed.

Main entry points: [`src/extract/mod.rs`](https://github.com/strongwind1/wpawolf/blob/main/src/extract/mod.rs) (Frame extraction), [`src/output/mod.rs`](https://github.com/strongwind1/wpawolf/blob/main/src/output/mod.rs) (Hash emission), [`src/pair/mod.rs`](https://github.com/strongwind1/wpawolf/blob/main/src/pair/mod.rs) (Pairing orchestrator), [`src/main.rs`](https://github.com/strongwind1/wpawolf/blob/main/src/main.rs) (CLI orchestration)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_ingest["Capture ingest"]
  node_cli["CLI orchestration<br/>[main.rs]"]
  node_readers["Capture readers<br/>[mod.rs]"]
end

subgraph group_decode["Frame decoding"]
  node_link_decode["Link decoding<br/>[mod.rs]"]
  node_wifi_decode["802.11 parsing<br/>[frame.rs]"]
  node_eapol_parse["EAPOL parsing<br/>[eapol.rs]"]
  node_ie_rsn["IE and RSN parsing<br/>[rsn.rs]"]
end

subgraph group_collect["Extraction and stores"]
  node_frame_extract["Frame extraction<br/>[mod.rs]"]
  node_pmkid_extract["Auth PMKID extraction<br/>[auth.rs]"]
  node_message_store[("EAPOL message store<br/>[messages.rs]")]
  node_pmkid_store[("PMKID store<br/>[pmkid.rs]")]
  node_aux_stores[("Auxiliary stores<br/>[auxiliary.rs]")]
  node_essid_store[("ESSID history<br/>[essid.rs]")]
end

subgraph group_emit["Pairing and output"]
  node_pairing["Pairing orchestrator<br/>[mod.rs]"]
  node_combo_gen["Combo generation<br/>[combos.rs]"]
  node_hash_output["Hash emission<br/>[mod.rs]"]
  node_hash_formats["Hashcat formats<br/>[hashcat.rs]"]
  node_aux_output["Auxiliary outputs<br/>[wordlists.rs]"]
end

subgraph group_ops["Run operations"]
  node_memory_fallback[("Disk-backed fallback<br/>[disk_messages.rs]")]
  node_stats["Run statistics<br/>[stats.rs]"]
  node_logger["Processing log<br/>[log.rs]"]
end

node_operator(("Operator"))
node_captures["Capture files"]
node_hashcat(("hashcat"))

node_operator -->|"configures run"| node_cli
node_captures -->|"reads captures"| node_readers
node_cli -->|"selects inputs"| node_readers
node_readers -->|"provides packets"| node_link_decode
node_link_decode -->|"strips headers"| node_wifi_decode
node_wifi_decode -->|"dispatches frames"| node_frame_extract
node_frame_extract -->|"parses EAPOL"| node_eapol_parse
node_frame_extract -->|"reads RSN data"| node_ie_rsn
node_frame_extract -->|"collects messages"| node_message_store
node_pmkid_extract -->|"stores PMKIDs"| node_pmkid_store
node_frame_extract -->|"collects auxiliary data"| node_aux_stores
node_frame_extract -.->|"records ESSIDs"| node_essid_store
node_pairing -->|"reads messages"| node_message_store
node_pairing -->|"generates pairs"| node_combo_gen
node_pairing -->|"delivers pairs"| node_hash_output
node_hash_output -->|"emits PMKIDs"| node_pmkid_store
node_hash_output -->|"resolves ESSIDs"| node_essid_store
node_hash_output -->|"formats hashes"| node_hash_formats
node_hash_output -->|"writes lists"| node_aux_output
node_hash_output -->|"writes crackable hashes"| node_hashcat
node_message_store -.->|"spills under pressure"| node_memory_fallback
node_cli -->|"reports run"| node_stats
node_frame_extract -->|"logs anomalies"| node_logger

click node_cli "https://github.com/strongwind1/wpawolf/blob/main/src/main.rs"
click node_readers "https://github.com/strongwind1/wpawolf/blob/main/src/input/mod.rs"
click node_link_decode "https://github.com/strongwind1/wpawolf/blob/main/src/link/mod.rs"
click node_wifi_decode "https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/frame.rs"
click node_eapol_parse "https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/eapol.rs"
click node_ie_rsn "https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/rsn.rs"
click node_frame_extract "https://github.com/strongwind1/wpawolf/blob/main/src/extract/mod.rs"
click node_pmkid_extract "https://github.com/strongwind1/wpawolf/blob/main/src/extract/auth.rs"
click node_message_store "https://github.com/strongwind1/wpawolf/blob/main/src/store/messages.rs"
click node_pmkid_store "https://github.com/strongwind1/wpawolf/blob/main/src/store/pmkid.rs"
click node_aux_stores "https://github.com/strongwind1/wpawolf/blob/main/src/store/auxiliary.rs"
click node_essid_store "https://github.com/strongwind1/wpawolf/blob/main/src/store/essid.rs"
click node_pairing "https://github.com/strongwind1/wpawolf/blob/main/src/pair/mod.rs"
click node_combo_gen "https://github.com/strongwind1/wpawolf/blob/main/src/pair/combos.rs"
click node_hash_output "https://github.com/strongwind1/wpawolf/blob/main/src/output/mod.rs"
click node_hash_formats "https://github.com/strongwind1/wpawolf/blob/main/src/output/hashcat.rs"
click node_aux_output "https://github.com/strongwind1/wpawolf/blob/main/src/output/wordlists.rs"
click node_memory_fallback "https://github.com/strongwind1/wpawolf/blob/main/src/store/disk_messages.rs"
click node_stats "https://github.com/strongwind1/wpawolf/blob/main/src/stats.rs"
click node_logger "https://github.com/strongwind1/wpawolf/blob/main/src/log.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_readers toneBlue
class node_link_decode,node_wifi_decode,node_eapol_parse,node_ie_rsn toneAmber
class node_frame_extract,node_pmkid_extract,node_message_store,node_pmkid_store,node_aux_stores,node_essid_store toneMint
class node_pairing,node_combo_gen,node_hash_output,node_hash_formats,node_aux_output toneRose
class node_memory_fallback,node_stats,node_logger,node_operator,node_captures,node_hashcat toneIndigo
```

## Components

### Capture ingest

- [CLI orchestration](https://github.com/strongwind1/wpawolf/blob/main/src/main.rs): `src/main.rs`
- [Capture readers](https://github.com/strongwind1/wpawolf/blob/main/src/input/mod.rs): `src/input/mod.rs`

### Frame decoding

- [Link decoding](https://github.com/strongwind1/wpawolf/blob/main/src/link/mod.rs): `src/link/mod.rs`
- [802.11 parsing](https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/frame.rs): `src/ieee80211/frame.rs`
- [EAPOL parsing](https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/eapol.rs): `src/ieee80211/eapol.rs`
- [IE and RSN parsing](https://github.com/strongwind1/wpawolf/blob/main/src/ieee80211/rsn.rs): `src/ieee80211/rsn.rs`

### Extraction and stores

- [Frame extraction](https://github.com/strongwind1/wpawolf/blob/main/src/extract/mod.rs): `src/extract/mod.rs`
- [Auth PMKID extraction](https://github.com/strongwind1/wpawolf/blob/main/src/extract/auth.rs): `src/extract/auth.rs`
- [EAPOL message store](https://github.com/strongwind1/wpawolf/blob/main/src/store/messages.rs): `src/store/messages.rs`
- [PMKID store](https://github.com/strongwind1/wpawolf/blob/main/src/store/pmkid.rs): `src/store/pmkid.rs`
- [Auxiliary stores](https://github.com/strongwind1/wpawolf/blob/main/src/store/auxiliary.rs): `src/store/auxiliary.rs`
- [ESSID history](https://github.com/strongwind1/wpawolf/blob/main/src/store/essid.rs): `src/store/essid.rs`

### Pairing and output

- [Pairing orchestrator](https://github.com/strongwind1/wpawolf/blob/main/src/pair/mod.rs): `src/pair/mod.rs`
- [Combo generation](https://github.com/strongwind1/wpawolf/blob/main/src/pair/combos.rs): `src/pair/combos.rs`
- [Hash emission](https://github.com/strongwind1/wpawolf/blob/main/src/output/mod.rs): `src/output/mod.rs`
- [Hashcat formats](https://github.com/strongwind1/wpawolf/blob/main/src/output/hashcat.rs): `src/output/hashcat.rs`
- [Auxiliary outputs](https://github.com/strongwind1/wpawolf/blob/main/src/output/wordlists.rs): `src/output/wordlists.rs`

### Run operations

- [Disk-backed fallback](https://github.com/strongwind1/wpawolf/blob/main/src/store/disk_messages.rs): `src/store/disk_messages.rs`
- [Run statistics](https://github.com/strongwind1/wpawolf/blob/main/src/stats.rs): `src/stats.rs`
- [Processing log](https://github.com/strongwind1/wpawolf/blob/main/src/log.rs): `src/log.rs`

### Other components

- **Operator**
- **Capture files**
- **hashcat**

## Connections

- Operator → CLI orchestration: configures run (evidence: `README.md`)
- Capture files → Capture readers: reads captures (evidence: `README.md`)
- CLI orchestration → Capture readers: selects inputs (evidence: `src/main.rs`)
- Capture readers → Link decoding: provides packets (evidence: `README.md`)
- Link decoding → 802.11 parsing: strips headers (evidence: `src/link/mod.rs`)
- 802.11 parsing → Frame extraction: dispatches frames (evidence: `README.md`)
- Frame extraction → EAPOL parsing: parses EAPOL
- Frame extraction → IE and RSN parsing: reads RSN data
- Frame extraction → EAPOL message store: collects messages (evidence: `README.md`)
- Auth PMKID extraction → PMKID store: stores PMKIDs (evidence: `src/extract/auth.rs`)
- Frame extraction → Auxiliary stores: collects auxiliary data (evidence: `README.md`)
- Frame extraction → ESSID history: records ESSIDs
- Pairing orchestrator → EAPOL message store: reads messages (evidence: `src/pair/mod.rs`)
- Pairing orchestrator → Combo generation: generates pairs (evidence: `src/pair/mod.rs`)
- Pairing orchestrator → Hash emission: delivers pairs (evidence: `README.md`)
- Hash emission → PMKID store: emits PMKIDs (evidence: `src/output/mod.rs`)
- Hash emission → ESSID history: resolves ESSIDs (evidence: `src/output/mod.rs`)
- Hash emission → Hashcat formats: formats hashes (evidence: `src/output/mod.rs`)
- Hash emission → Auxiliary outputs: writes lists (evidence: `README.md`)
- Hash emission → hashcat: writes crackable hashes (evidence: `README.md`)
- EAPOL message store → Disk-backed fallback: spills under pressure (evidence: `src/store/messages.rs`)
- CLI orchestration → Run statistics: reports run (evidence: `README.md`)
- Frame extraction → Processing log: logs anomalies
