360 lines
12 KiB
Plaintext
360 lines
12 KiB
Plaintext
Automatic regression and interoperability testing of wpa_supplicant's
|
|
IEEE 802.1X/EAPOL authentication
|
|
|
|
Test program:
|
|
- Linked some parts of IEEE 802.1X Authenticator implementation from
|
|
hostapd (RADIUS client and RADIUS processing, EAP<->RADIUS
|
|
encapsulation/decapsulation) into wpa_supplicant.
|
|
- Replaced wpa_supplicant.c and wpa.c with test code that trigger
|
|
IEEE 802.1X authentication automatically without need for wireless
|
|
client card or AP.
|
|
- For EAP methods that generate keying material, the key derived by the
|
|
Supplicant is verified to match with the one received by the (now
|
|
integrated) Authenticator.
|
|
|
|
The full automated test suite can now be run in couple of seconds, but
|
|
I'm more than willing to add new RADIUS authentication servers to make
|
|
this take a bit more time.. ;-) As an extra bonus, this can also be
|
|
seen as automatic regression/interoperability testing for the RADIUS
|
|
server, too.
|
|
|
|
In order for me to be able to use a new authentication server, the
|
|
server need to be available from Internet (at least from one static IP
|
|
address) and I will need to get suitable user name/password pairs,
|
|
certificates, and private keys for testing use. Other alternative
|
|
would be to get an evaluation version of the server so that I can
|
|
install it on my own test setup. If you are interested in providing
|
|
either server access or evaluation version, please contact me
|
|
(j@w1.fi).
|
|
|
|
|
|
Test matrix
|
|
|
|
+) tested successfully
|
|
F) failed
|
|
-) server did not support
|
|
?) not tested
|
|
|
|
Cisco ACS ----------------------------------------------------------.
|
|
hostapd --------------------------------------------------------. |
|
|
Cisco Aironet 1200 AP (local RADIUS server) ----------------. | |
|
|
Periodik Labs Elektron ---------------------------------. | | |
|
|
Lucent NavisRadius ---------------------------------. | | | |
|
|
Interlink RAD-Series ---------------------------. | | | | |
|
|
Radiator -----------------------------------. | | | | | |
|
|
Meetinghouse Aegis ---------------------. | | | | | | |
|
|
Funk Steel-Belted ------------------. | | | | | | | |
|
|
Funk Odyssey -------------------. | | | | | | | | |
|
|
Microsoft IAS --------------. | | | | | | | | | |
|
|
FreeRADIUS -------------. | | | | | | | | | | |
|
|
| | | | | | | | | | | |
|
|
|
|
EAP-MD5 + - - + + + + + - - + +
|
|
EAP-GTC + - - ? + + + + - - + -
|
|
EAP-OTP - - - - - + - - - - - -
|
|
EAP-MSCHAPv2 + - - + + + + + - - + -
|
|
EAP-TLS + + + + + + + + - - + +
|
|
EAP-PEAPv0/MSCHAPv2 + + + + + + + + + - + +
|
|
EAP-PEAPv0/GTC + - + - + + + + - - + +
|
|
EAP-PEAPv0/OTP - - - - - + - - - - - -
|
|
EAP-PEAPv0/MD5 + - - + + + + + - - + -
|
|
EAP-PEAPv0/TLS - + - + + + F + - - - -
|
|
EAP-PEAPv1/MSCHAPv2 - - + + + +1 + +5 +8 - + +
|
|
EAP-PEAPv1/GTC - - + + + +1 + +5 +8 - + +
|
|
EAP-PEAPv1/OTP - - - - - +1 - - - - - -
|
|
EAP-PEAPv1/MD5 - - - + + +1 + +5 - - + -
|
|
EAP-PEAPv1/TLS - - - + + +1 F +5 - - - -
|
|
EAP-TTLS/CHAP + - +2 + + + + + + - + -
|
|
EAP-TTLS/MSCHAP + - + + + + + + + - + -
|
|
EAP-TTLS/MSCHAPv2 + - + + + + + + + - + -
|
|
EAP-TTLS/PAP + - + + + + + + + - + -
|
|
EAP-TTLS/EAP-MD5 + - +2 + + + + + + - + -
|
|
EAP-TTLS/EAP-GTC + - +2 ? + + + + - - + -
|
|
EAP-TTLS/EAP-OTP - - - - - + - - - - - -
|
|
EAP-TTLS/EAP-MSCHAPv2 + - +2 + + + + + + - + -
|
|
EAP-TTLS/EAP-TLS - - +2 + F + + + - - - -
|
|
EAP-SIM +3 - - ? - + - ? - - + -
|
|
EAP-AKA - - - - - + - - - - + -
|
|
EAP-PSK +7 - - - - - - - - - + -
|
|
EAP-PAX - - - - - - - - - - + -
|
|
EAP-SAKE - - - - - - - - - - + -
|
|
EAP-GPSK - - - - - - - - - - + -
|
|
EAP-FAST - - - + - - - - - + - +
|
|
LEAP + - + + + + F +6 - + - +
|
|
|
|
1) PEAPv1 required new label, "client PEAP encryption" instead of "client EAP
|
|
encryption", during key derivation (requires phase1="peaplabel=1" in the
|
|
network configuration in wpa_supplicant.conf)
|
|
2) used FreeRADIUS as inner auth server
|
|
3) required a patch to FreeRADIUS to fix EAP-SIM
|
|
5) PEAPv1 required termination of negotiation on tunneled EAP-Success and new
|
|
label in key deriviation
|
|
(phase1="peap_outer_success=0 peaplabel=1") (in "IETF Draft 5" mode)
|
|
6) Authenticator simulator required patching for handling Access-Accept within
|
|
negotiation (for the first EAP-Success of LEAP)
|
|
7) EAP-PSK is not included in FreeRADIUS distribution; used external
|
|
rlm_eap_psk implementation from
|
|
http://perso.rd.francetelecom.fr/bersani/EAP_PSK/
|
|
EAP-PSKWindowsimplementations.html
|
|
8) PEAPv1 used non-standard version negotiation (client had to force v1 even
|
|
though server reported v0 as the highest supported version)
|
|
|
|
|
|
Automated tests:
|
|
|
|
FreeRADIUS (1.0pre and CVS snapshot)
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-SIM
|
|
* not supported in FreeRADIUS
|
|
- EAP-PEAP / TLS (Unable to tunnel TLS inside of TLS)
|
|
- EAP-TTLS / EAP-TLS (Unable to tunnel TLS inside of TLS)
|
|
|
|
Microsoft Windows Server 2003 / IAS
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / TLS
|
|
- EAP-MD5
|
|
* IAS does not seem to support other EAP methods
|
|
|
|
Funk Odyssey 2.01.00.653
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / GTC
|
|
Note: PEAPv1 requires TLS key derivation to use label "client EAP encryption"
|
|
- EAP-TTLS / CHAP (using FreeRADIUS as inner auth srv)
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge (using FreeRADIUS as inner auth srv)
|
|
- EAP-TTLS / EAP-GTC (using FreeRADIUS as inner auth srv)
|
|
- EAP-TTLS / EAP-MSCHAPv2 (using FreeRADIUS as inner auth srv)
|
|
- EAP-TTLS / EAP-TLS (using FreeRADIUS as inner auth srv)
|
|
* not supported in Odyssey:
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-PEAP / MD5-Challenge
|
|
- EAP-PEAP / TLS
|
|
|
|
Funk Steel-Belted Radius Enterprise Edition v4.71.739
|
|
- EAP-MD5-Challenge
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / MD5
|
|
- EAP-PEAPv0 / TLS
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / MD5
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / TLS
|
|
Note: PEAPv1 requires TLS key derivation to use label "client EAP encryption"
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-TTLS / EAP-TLS
|
|
|
|
Meetinghouse Aegis 1.1.4
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / TLS
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / TLS
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / MD5-Challenge
|
|
Note: PEAPv1 requires TLS key derivation to use label "client EAP encryption"
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
* did not work
|
|
- EAP-TTLS / EAP-TLS
|
|
(Server rejects authentication without any reason in debug log. It
|
|
looks like the inner TLS negotiation starts properly and the last
|
|
packet from Supplicant looks like the one sent in the Phase 1. The
|
|
server generates a valid looking reply in the same way as in Phase
|
|
1, but then ends up sending Access-Reject. Maybe an issue with TTLS
|
|
fragmentation in the Aegis server(?) The packet seems to include
|
|
1328 bytes of EAP-Message and this may go beyond the fragmentation
|
|
limit with AVP encapsulation and TLS tunneling. Note: EAP-PEAP/TLS
|
|
did work, so this issue seems to be with something TTLS specific.)
|
|
|
|
Radiator 3.9 (eval, with all patches up to and including 2004-08-30)
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-OTP
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / OTP
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-PEAPv0 / TLS
|
|
Note: Needed to use unknown identity in outer auth and some times the server
|
|
seems to get confused and fails to send proper Phase 2 data.
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / OTP
|
|
- EAP-PEAPv1 / MD5-Challenge
|
|
- EAP-PEAPv1 / TLS
|
|
Note: This has some additional requirements for EAPTLS_MaxFragmentSize.
|
|
Using 1300 for outer auth and 500 for inner auth seemed to work.
|
|
Note: Needed to use unknown identity in outer auth and some times the server
|
|
seems to get confused and fails to send proper Phase 2 data.
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-OTP
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-TTLS / EAP-TLS
|
|
Note: This has some additional requirements for EAPTLS_MaxFragmentSize.
|
|
Using 1300 for outer auth and 500 for inner auth seemed to work.
|
|
- EAP-SIM
|
|
- EAP-AKA
|
|
|
|
Interlink Networks RAD-Series 6.1.2.7
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / MD5-Challenge
|
|
Note: PEAPv1 requires TLS key derivation to use label "client EAP encryption"
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-TTLS / EAP-TLS
|
|
* did not work
|
|
- EAP-PEAPv0 / TLS
|
|
- EAP-PEAPv1 / TLS
|
|
(Failed to decrypt Phase 2 data)
|
|
|
|
Lucent NavisRadius 4.4.0
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / TLS
|
|
- EAP-PEAPv1 / MD5-Challenge
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / TLS
|
|
"IETF Draft 5" mode requires phase1="peap_outer_success=0 peaplabel=1"
|
|
'Cisco ACU 5.05' mode works without phase1 configuration
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-TLS
|
|
|
|
Note: user certificate from NavisRadius had private key in a format
|
|
that wpa_supplicant could not use. Converting this to PKCS#12 and then
|
|
back to PEM allowed wpa_supplicant to use the key.
|
|
|
|
|
|
hostapd v0.3.3
|
|
- EAP-MD5-Challenge
|
|
- EAP-GTC
|
|
- EAP-MSCHAPv2
|
|
- EAP-TLS
|
|
- EAP-PEAPv0 / MSCHAPv2
|
|
- EAP-PEAPv0 / GTC
|
|
- EAP-PEAPv0 / MD5-Challenge
|
|
- EAP-PEAPv1 / MSCHAPv2
|
|
- EAP-PEAPv1 / GTC
|
|
- EAP-PEAPv1 / MD5-Challenge
|
|
- EAP-TTLS / CHAP
|
|
- EAP-TTLS / MSCHAP
|
|
- EAP-TTLS / MSCHAPv2
|
|
- EAP-TTLS / PAP
|
|
- EAP-TTLS / EAP-MD5-Challenge
|
|
- EAP-TTLS / EAP-GTC
|
|
- EAP-TTLS / EAP-MSCHAPv2
|
|
- EAP-SIM
|
|
- EAP-PAX
|
|
|
|
Cisco Secure ACS 3.3(1) for Windows Server
|
|
- PEAPv1/GTC worked, but PEAPv0/GTC failed in the end after password was
|
|
sent successfully; ACS is replying with empty PEAP packet (TLS ACK);
|
|
wpa_supplicant tries to decrypt this.. Replying with TLS ACK and and
|
|
marking the connection completed was enough to make this work.
|
|
|
|
|
|
PEAPv1:
|
|
|
|
Funk Odyssey 2.01.00.653:
|
|
- uses tunneled EAP-Success, expects reply in tunnel or TLS ACK, sends MPPE
|
|
keys with outer EAP-Success message after this
|
|
- uses label "client EAP encryption"
|
|
- (peap_outer_success 1 and 2 work)
|
|
|
|
Funk Steel-Belted Radius Enterprise Edition v4.71.739
|
|
- uses tunneled EAP-Success, expects reply in tunnel or TLS ACK, sends MPPE
|
|
keys with outer EAP-Success message after this
|
|
- uses label "client EAP encryption"
|
|
- (peap_outer_success 1 and 2 work)
|
|
|
|
Radiator 3.9:
|
|
- uses TLV Success and Reply, sends MPPE keys with outer EAP-Success message
|
|
after this
|
|
- uses label "client PEAP encryption"
|
|
|
|
Lucent NavisRadius 4.4.0 (in "IETF Draft 5" mode):
|
|
- sends tunneled EAP-Success with MPPE keys and expects the authentication to
|
|
terminate at this point (gets somewhat confused with reply to this)
|
|
- uses label "client PEAP encryption"
|
|
- phase1="peap_outer_success=0 peaplabel=1"
|
|
|
|
Lucent NavisRadius 4.4.0 (in "Cisco ACU 5.05" mode):
|
|
- sends tunneled EAP-Success with MPPE keys and expects to receive TLS ACK
|
|
as a reply
|
|
- uses label "client EAP encryption"
|
|
|
|
Meetinghouse Aegis 1.1.4
|
|
- uses tunneled EAP-Success, expects reply in tunnel or TLS ACK, sends MPPE
|
|
keys with outer EAP-Success message after this
|
|
- uses label "client EAP encryption"
|
|
- peap_outer_success 1 and 2 work
|