[RFC PATCH v2 00/13] SAE: DecoyAuth multiple-password support
Jeff Hansen
x at jeffhansen.com
Thu Oct 22 15:59:43 PDT 2026
This series implements DecoyAuth multiple-password authentication for SAE
using H2E, based on Mathy Vanhoef's DecoyAuth work. It retains the
password-only joining workflow while allowing the AP to select policy
based on the authenticated password.
Version 2 also supports SAE Password Identifiers. An identifier selects
an independent candidate set, and DecoyAuth authenticates a password
within that set. For example, tenant-a can have private and guest
passwords under one identifier, while tenant-b has a separate set. A
no-identifier set can coexist. This complements ordinary SAE with
identifiers; it does not conceal an identifier sent in plaintext.
The series includes optional-by-default negotiation, bounded payload
fragmentation in Authentication frames, and password-specific VLAN
retention through PMKSA caching. The first three patches address FT/MLO
integration. Interpolation caching and worker support remain separate
patches and build options. The implementation uses experimental
vendor-specific signaling; it is not a standardized SAE extension.
Changes since v1:
- Rebase onto current hostap main (fcccc8c82e0b).
- Support plaintext password identifiers on AP and station sides, with
independent named and no-identifier candidate sets. Include the PID
in uncached H2E derivation, matching the precomputed path.
- Reject unknown identifiers and identifier changes during fragmented
exchanges without falling back to a different password set.
- Clear rejected, non-accepted infrastructure SAE exchanges so later
attempts can use another identifier without stale keys or candidates.
- Bound identifier lengths, reject embedded NULs, and normalize empty
configured identifiers to absent. Opaque replacement identifiers stay
on the ordinary SAE path in the station implementation.
- Retain the station's pending password after a reflected Commit is
silently discarded, allowing the valid exchange to continue.
- Remove an unused station-tracking refactor and fix an FT variable
declaration for configurations without MLO.
- Isolate the OpenSSL-backed cache test from the internal-crypto tests.
Add hwsim coverage for PID sets, failure recovery, fragmentation,
configuration limits, compatibility, and reflection recovery.
These changes are folded into the corresponding commits; the series
still contains 13 patches.
Hardware testing of the PID implementation passed 22 checks using two
named sets and one unnamed set, each with two passwords. The checks
covered all six credentials, VLAN and IP connectivity, wrong-password
and wrong-identifier rejection, and recovery without an AP restart or
manual station-state removal. Earlier DecoyAuth testing separately
covered 512-password operation, PMKSA caching, MLO, and FT
interoperability.
I would appreciate feedback on the protocol construction, PID binding,
state-machine handling, and integration approach.
Jeff Hansen (13):
FT: Add Multi-Link element to Authentication frames
FT: Update target AP MLO state before response processing
FT: Include MLO link data in MIC calculation
crypto: Add DecoyAuth encoding and interpolation support
crypto: Add DecoyAuth interpolation cache
SAE: Add DecoyAuth multi-password primitives
SAE: Add DecoyAuth fragment handling
SAE: Add DecoyAuth worker support
hostapd: Add DecoyAuth configuration
hostapd: Add DecoyAuth SAE responder
SAE: Preserve password VLAN in PMKSA cache
wpa_supplicant: Add DecoyAuth SAE initiator
tests: Add DecoyAuth cache and password identifier coverage
hostapd/Makefile | 13 +
hostapd/config_file.c | 42 +-
hostapd/defconfig | 11 +
hostapd/hostapd.conf | 25 +
src/ap/ap_config.c | 10 +
src/ap/ap_config.h | 3 +
src/ap/beacon.c | 6 +
src/ap/ieee802_11.c | 473 ++++++-
src/ap/ieee802_11.h | 6 +
src/ap/ieee802_11_eht.c | 2 +-
src/ap/pmksa_cache_auth.c | 1 +
src/common/sae.c | 1815 ++++++++++++++++++++++++-
src/common/sae.h | 68 +
src/crypto/crypto.h | 102 ++
src/crypto/crypto_openssl.c | 1306 ++++++++++++++++++
src/rsn_supp/wpa.c | 23 +
src/rsn_supp/wpa.h | 12 +
src/rsn_supp/wpa_ft.c | 95 +-
tests/Makefile | 10 +
tests/README | 23 +
tests/decoyauth.mk | 15 +
tests/hwsim/test_sae_decoyauth_pid.py | 298 ++++
tests/test-decoyauth-cache.c | 179 +++
wpa_supplicant/Makefile | 3 +
wpa_supplicant/config.c | 19 +
wpa_supplicant/config_file.c | 7 +
wpa_supplicant/config_ssid.h | 6 +
wpa_supplicant/defconfig | 3 +
wpa_supplicant/sme.c | 257 +++-
wpa_supplicant/wpa_supplicant.c | 7 +-
wpa_supplicant/wpa_supplicant.conf | 12 +
wpa_supplicant/wpa_supplicant_i.h | 1 +
32 files changed, 4784 insertions(+), 69 deletions(-)
create mode 100644 tests/decoyauth.mk
create mode 100644 tests/hwsim/test_sae_decoyauth_pid.py
create mode 100644 tests/test-decoyauth-cache.c
base-commit: fcccc8c82e0b33e348f3f34f3777186c9efc73f5
--
2.56.0
More information about the Hostap
mailing list