Andrew Zaborowski
8d8b1c1baf
handshake: Split the install_igtk igtk parameter in 2 buffers
...
Split the igtk parameter to handshake_state_install_igtk into one
parameter for the actual IGTK buffer and one for the IPN buffer instead
of requiring the caller to have them both in one continuous buffer.
With FT protocol, one is received encrypted and the other in plain text.
2017-01-31 11:59:02 -06:00
Andrew Zaborowski
367f1ec798
eapol: Free sm->timeout when it expires
2017-01-31 11:45:54 -06:00
Andrew Zaborowski
3f3e60e415
eapol: Check the MSK size supplied by EAP
...
Despite RFC3748 mandating MSKs to be at least 256 bits some EAP methods
return shorter MSKs. Since we call handshake_failed when the MSK is too
short, EAP methods have to be careful with their calls to set_key_material
because it may result in a call to the method's .remove method.
EAP-TLS and EAP-TTLS can't handle that currently and would be difficult to
adapt because of the TLS internals but they always set msk_len to 64 so
handshake_failed will not be called.
2017-01-06 13:24:03 -06:00
Denis Kenzior
221a8f9218
eapol: Fix IGTK key index extraction
2016-12-13 09:25:21 -06:00
Denis Kenzior
fea29229f3
eapol: Fix IGTK key index extraction
...
IGTK key index is a 2-byte little-endian field, not a bit field. This
makes sense since IGTK key id can only be 4 or 5.
2016-12-12 22:07:31 -06:00
Andrew Zaborowski
1a64c4b771
eapol: Send EAPOL-Start if AP starts 4-Way Handshake
...
Make the use of EAPOL-Start the default and send it when configured for
8021x and either we receive no EAPOL-EAP from from the AP before
timeout, or if the AP tries to start a 4-Way Handshake.
2016-11-18 14:10:17 -06:00
Denis Kenzior
413287d5cf
eapol: Relax VERIFY_IS_ZERO condition
...
On certain routers, the 4-Way handshake message 3 of 4 contains a key iv
field which is not zero as it is supposed to. This causes us to fail
the handshake.
Since the iv field is not utilized in this particular case, it is safe
to simply warn rather than fail the handshake outright.
2016-11-18 14:04:07 -06:00
Denis Kenzior
d03f23200a
eap: Load MTU settings from iwd.conf
2016-11-15 16:44:07 -06:00
Andrew Zaborowski
e32ffc4d98
eapol: Use handshake_state to store state
...
Remove the keys and other data from struct eapol_sm, update device.c,
netdev.c and wsc.c to use the handshake_state object instead of
eapol_sm. This also gets rid of eapol_cancel and the ifindex parameter
in some of the eapol functions where sm->handshake->ifindex can be
used instead.
2016-11-03 10:23:58 -05:00
Andrew Zaborowski
d03f4d72f1
eapol: Handle FT-version of step 3 of 4-way handshake
2016-11-03 10:04:34 -05:00
Andrew Zaborowski
9d54a3082e
eapol: Build FT-version step 2 of 4-way handshake
...
If an FT AKM suite is selected, build the FT version of the step 2
of the 4-way handshake frame. Step 1 is same as non-FT version.
2016-11-03 10:03:45 -05:00
Andrew Zaborowski
0d2e5b9849
eapol: Add setters for the FT handshake input data
...
Add space in the eapol_sm struct for the pieces of information required
for the FT 4-Way Handshake and add setters for device.c and netdev.c to
be able to provide the data.
2016-11-03 10:01:41 -05:00
Andrew Zaborowski
424ceb58a3
eapol: Drop len parameter to eapol_sm_set_rsn/wpa
...
The len parameter was only used so it could be validated against ie[1],
but since it was not checked to be > 2, it must have been validated
already, the check was redundant. In any case all users directly
passed ie[1] as len anyway. This makes it consistent with the ie
parsers and builders which didn't require a length.
2016-10-29 23:09:10 -05:00
Rahul Rahul
c16ae02056
eapol: refactor eapol_find_kde and add install_igtk
2016-10-26 16:34:52 -05:00
Denis Kenzior
cc2052d33e
eapol: In case of timeout, mark as NULL
2016-10-15 16:26:41 -05:00
Andrew Zaborowski
c548898635
eapol: Cache early EAPoL frames until ready to process
...
Split eapol_start into two calls, one to register the state machine so
that the PAE read handler knows not to discard frames for that ifindex,
and eapol_start to actually start processing the frames. This is needed
because, as per the comment in netdev.c, due to scheduling the PAE
socket read handler may trigger before the CMD_CONNECT event handler,
which needs to parse the FTE from the Associate Response frame and
supply it to the eapol SM before it can do anything with the message 1
of 4 of the FT handshake.
Another issue is that depending on the driver or timing, the underlying
link might not be marked as 'ready' by the kernel. In this case, our
response to Message 1 of the 4-way Handshake is written and accepted by
the kernel, but gets dropped on the floor internally. Which leads to
timeouts if the AP doesn't retransmit.
2016-10-15 16:25:37 -05:00
Denis Kenzior
d8cb8d7810
eapol: Default to EAPoL 2001 if unset
...
If protocol auto-detection is enabled (e.g. protocol_version is zero),
default to EAPOL 2001 version for EAPOL-Start messages.
2016-10-11 02:33:46 -05:00
Denis Kenzior
91d35987fd
eapol: Add provision to use EAPOL-Start
2016-10-11 01:36:48 -05:00
Andrew Zaborowski
09861f4ebe
eapol: Free the checksum in eapol_verify_mic
2016-10-04 14:11:42 -05:00
Andrew Zaborowski
721be04f95
eapol: Pass actual PTK size to crypto_derive_pairwise_ptk()
...
It doesn't matter for crypto_derive_pairwise_ptk in non-SHA256 mode
but in the FT PTK derivation function, as well as in SHA256 mode all
bytes of the output do actually change with the PTK size.
2016-10-04 14:10:23 -05:00
Denis Kenzior
db8794460f
eapol: Remove io argument from eapol_start
2016-09-13 17:37:13 -05:00
Denis Kenzior
9fde037b8f
eapol: Add eapol_sm_set_event_func
2016-09-13 13:30:54 -05:00
Denis Kenzior
baf72d7f86
eapol: Move to a single PAE socket
...
We used to open a socket for each wireless interface. This patch uses a
single socket with an attached BPF to handle all EAPoL traffic via a
single file descriptor.
2016-09-12 10:02:04 -05:00
Andrew Zaborowski
1b1bf3cf65
eapol: On EAP success save the second 256 bits of MSK
2016-09-06 14:07:35 -05:00
Denis Kenzior
bcfaad2b62
eapol: Make EAP packets use sm->protocol_version
...
Instead of hard-coding the EAPoL version to 2004 for all EAP packets,
use the version from eapol_sm.
2016-08-10 16:37:39 -05:00
Denis Kenzior
abc44fe98a
eapol: Use switch-case instead of if
...
The if statement was shorter, but a bit less readable.
2016-08-10 16:36:14 -05:00
Denis Kenzior
34a537652a
eapol: Store protocol version in eapol_sm
...
Instead of one global protocol_version, we now store it inside eapol_sm.
This allows us to use the same protocol version for our response as the
request from the authenticator.
For unit tests where we had protocol version mismatches, a new method is
introduced to explicitly set the protocol version to use.
2016-08-10 16:32:45 -05:00
Denis Kenzior
169222fb96
eapol: warn if state machine list isn't empty
2016-07-20 15:34:21 -05:00
Denis Kenzior
943acddb49
eapol: Refactor eapol tx path
2016-06-28 18:45:49 -05:00
Denis Kenzior
efe5bed7c5
netdev: Move eapol_read to eapol.c
2016-06-28 18:18:47 -05:00
Denis Kenzior
b6d651dda8
eapol: Move eapol_start
2016-06-28 17:26:03 -05:00
Denis Kenzior
e059ee01a7
eapol: Move eapol_cancel
2016-06-28 17:26:03 -05:00
Rahul Rahul
fb339bcc76
eapol: helper functions for REKEY_OFFLOAD
2016-06-22 18:44:17 -05:00
Denis Kenzior
b93ae37325
eapol: Add eapol_sm_get_own_ie
2016-06-14 19:57:21 -05:00
Denis Kenzior
6d81e0a172
eapol: Add eapol_sm_get_group_cipher
2016-06-14 19:57:21 -05:00
Denis Kenzior
c1ff686ed6
eapol: Add eapol_sm_get_pairwise_cipher
2016-06-14 19:57:21 -05:00
Denis Kenzior
30d1673ba4
eapol: Add support for SHA-256 based AKMs
2016-02-10 19:18:56 -06:00
Denis Kenzior
c35409d73c
eapol: Update to the new API
2016-02-10 16:55:15 -06:00
Denis Kenzior
3320d31ead
sha1: Remove sha1.[ch]
2016-02-10 14:36:14 -06:00
Denis Kenzior
342ad9c61c
eapol: Add clarifying comment
2015-11-03 16:26:34 -06:00
Andrew Zaborowski
14020b2aa6
eapol: Handle EAPoL-EAP packets
2015-11-02 21:45:43 -06:00
Andrew Zaborowski
2bccb7e7dc
eapol: Remove user_data from __eapol_rx_packet args
...
Instead of passing the user_data parameter in every __eapol_rx_packet
call to be used by EAPOL in all tx_packet calls, add
eapol_sm_set_tx_user_data function that sets the value of user_data for
all subsequent tx_packet calls. This way tx_packet can be called from
places that are not necessarily inside an __eapol_rx_packet call.
2015-11-02 21:40:21 -06:00
Andrew Zaborowski
ef9b6f41ce
eapol: Separate EAPOL header from struct eapol_key
...
This is needed so we can better handle sending and receiving EAPoL
packets other than EAPoL-Key.
2015-11-02 21:40:21 -06:00
Denis Kenzior
f1d81cd3c5
eapol: Remove unneded TODO comment
2015-06-08 10:46:48 -05:00
Denis Kenzior
99cdb860c0
eapol: Simplify install_tk callback
2015-05-21 21:10:21 -05:00
Denis Kenzior
e93dd44607
eapol: Simplify GTK install callback
...
Instead of passing in the RSN/WPA elements, simply pass in the
configured cipher. This will make the implementation of the install_gtk
callback much simpler.
2015-05-21 21:08:47 -05:00
Denis Kenzior
9992d3aeda
eapol: Extract & keep track of desired ciphers
...
When our own WPA IE or RSN IE are set, extract group and pairwise
ciphers. These ciphers are the ones we desire to use for the secure
connection.
2015-05-19 00:05:53 -05:00
Denis Kenzior
12551b52ff
eapol: Sanity check 2nd RSNE
...
If the second (optional) RSN element is included in Step 3/4 of the
4-way handshake, parse it and perform basic sanity checks
2015-05-18 23:49:11 -05:00
Denis Kenzior
8593ebaad4
eapol: Set wpa_key_id in WPA1 Step 2 of 2
2015-05-18 14:45:09 -05:00
Andrew Zaborowski
a227d0b00f
eapol: In GTK step 2 of 2, secure bit is always 1
2015-05-18 12:50:50 -05:00
Andrew Zaborowski
a84d232eb1
eapol: Accept 32-byte keys in verify_ptk_3_of_4
...
TKIP key data is 32 bytes long.
2015-05-18 12:37:34 -05:00
Denis Kenzior
619448cacc
eapol: Sanity check wpa_key_id field a bit more
2015-05-05 22:26:11 -05:00
Denis Kenzior
9793054a0a
eapol: Update TODO comment
2015-05-05 22:19:45 -05:00
Denis Kenzior
a38b6f1f9a
eapol: Add missing newline
2015-05-05 22:18:35 -05:00
Denis Kenzior
8f3fd6e47d
eapol: Add eapol_verify_gtk_2_of_2
2015-05-05 22:04:21 -05:00
Denis Kenzior
2ba7867e9f
eapol: Drop unneded check in verify_ptk_4_of_4
...
Step 4 is always sent without encrypted Key Data according to Section
11.6.6.5. In the case of WPA, Encrypted Key Data field is reserved, and
should always be 0. Thus it is safe to drop the !is_wpa condition.
2015-05-05 22:01:53 -05:00
Denis Kenzior
bb17f5df94
eapol: Add sanity checking of the install bit
2015-05-05 21:50:35 -05:00
Andrew Zaborowski
0ea28ba5ad
eapol: Generate new snonce on new 4-Way Handshake
...
Make sure that we handle PTK rekeying.
2015-05-05 21:22:38 -05:00
Andrew Zaborowski
a7846aee85
eapol: WPA-specific handshake quirks
...
To support WPA allow the legacy EAPOL-Key frame formats.
2015-05-05 21:22:31 -05:00
Andrew Zaborowski
a8c0f20510
eapol: Handle the Group Key Handshake
2015-05-05 21:10:07 -05:00
Andrew Zaborowski
169aa04570
eapol: Free eapol_sm even if callback is null
...
If deauthenticate callback was not provided, the state machine was not
being freed / removed.
2015-04-29 08:54:53 -05:00
Andrew Zaborowski
4a27563b5a
eapol: Fix key-IV check in EAPOL-Key verification
...
The comment correctly states the IV is 0 for version 2, but the
check was actually for version 1.
2015-04-29 08:54:47 -05:00
Andrzej Zaborowski
c22d22f5e5
eapol: Remove eapol_sm's from queue when destroying.
...
Prevents a double-free.
2015-04-17 10:40:10 -05:00
Denis Kenzior
bc98bc9ecb
eapol: Add functions to set own/ap WPA IEs
...
If EAPoL is being run for in WPA mode, then instead of RSN elements, the
WPA elements are required.
2015-04-10 23:46:58 -05:00
Denis Kenzior
445ad55796
eapol: Start a handshake timer
...
We start a timer. This handles the case that the Authenticator does
not send us the first message of the 4-way handshake, or disappears
before sending us the 3rd message.
2015-03-29 22:44:08 -05:00
Denis Kenzior
e2badc9828
eapol: Call deauthenticate callback
2015-03-29 22:32:09 -05:00
Denis Kenzior
9f17b71375
eapol: Add eapol_cancel
2015-03-29 20:58:40 -05:00
Denis Kenzior
cf3681efbe
eapol: Add comment for handling MIC failures
2015-03-29 20:57:58 -05:00
Denis Kenzior
f31407dd46
eapol: Add deauthenticate callback
2015-03-29 20:30:14 -05:00
Denis Kenzior
6ec364cb86
eapol: Add __eapol_set_gtk_install_func
2015-03-25 23:28:22 -05:00
Denis Kenzior
bf5a6a3999
eapol: Add __eapol_set_install_tk_func
2015-03-25 22:35:12 -05:00
Denis Kenzior
ddcbb3f2a8
eapol: Add eapol_sm_set_user_data
2015-03-25 22:34:05 -05:00
Ravi kumar Veeramally
3432cfa53e
eapol: Return if eapol_find_sm returns NULL
2015-03-23 20:08:30 -05:00
Ravi kumar Veeramally
a95b0e3a5a
eapol: Fix return value
2015-03-23 15:37:40 -05:00
Denis Kenzior
86e7883c74
eapol: Print a message if MIC calculation fails
2015-03-20 14:52:49 -05:00
Denis Kenzior
d78883a068
eapol: Add default nonce generator
2015-03-20 12:31:14 -05:00
Denis Kenzior
35e3de9cdf
eapol: Add default eapol tx path function
2015-03-20 12:30:56 -05:00
Denis Kenzior
0ee173e23f
eapol: Fix PAE socket code
...
Using SOCK_DGRAM allows us to receive just the frame payload instead
of raw ethernet framing.
2015-03-20 00:28:58 -05:00
Denis Kenzior
19c67c3b3a
eapol: Add user_data argument
...
To __eapol_rx_packet. The same argument is passed to tx_packet
function.
2015-03-19 23:57:37 -05:00
Denis Kenzior
6b84e0da1f
eapol: Rename aa_addr
...
The use of aa_addr was redundant. Use 'AA' instead. 802.11 defines
'AA' as 'Authenticator Address'.
2015-03-19 23:57:36 -05:00
Denis Kenzior
b871d904d5
eapol: Rename sta_addr
...
The use of sta_addr made no sense. Instead, use the terminology from
802.11: 'Supplicant Address (SPA)'
2015-03-19 23:57:36 -05:00
Denis Kenzior
581f4e298f
eapol: Use a queue instead of a hashmap
2015-03-19 23:57:36 -05:00
Denis Kenzior
12d529eddb
eapol: Rearrange data structure members
...
The order follows the rough order of initialization, as information
becomes available from the calling code or via steps of the 4-way
handshake.
2015-03-19 23:57:36 -05:00
Jukka Rissanen
acce7c9034
eapol: Change the interface index data type
...
The ifindex should be uint32_t instead of int.
2015-03-19 20:18:05 -05:00
Denis Kenzior
2bcfc15e96
eapol: Remove unneeded whitespace
2015-03-02 21:47:27 -06:00
Ravi kumar Veeramally
db45cd8dbf
eapol: Provide utility to open raw socket
...
Opens a raw socket to filter ETH_P_PAE based packets. Binds to specific
interface index to read/write eapol frames.
2015-02-26 10:54:05 -06:00
Denis Kenzior
41e82fba77
eapol: Optimize out rsne sizes
...
The RSN IEs contain the sizes of the element inside the data, so it is
not necessary to carry a dedicated size element.
2015-02-24 23:15:20 -06:00
Denis Kenzior
9760bcb5c3
eapol: Add checking that first RSNE is as expected
2015-02-24 22:09:35 -06:00
Denis Kenzior
7f9b8117fd
eapol: Add utility to find GTK KDEs
2015-02-24 17:11:56 -06:00
Denis Kenzior
bfdd4a2328
eapol: Pass decrypted data len
...
to eapol_handle_ptk_3_of_4
2015-02-24 16:03:42 -06:00
Denis Kenzior
c71bfcbb7c
eapol: Decryption of packets changes affects size
2015-02-24 15:59:36 -06:00
Denis Kenzior
f997816a7f
eapol: Handle Step 2 & 4 of the 4-way Handshake
2015-02-24 11:14:11 -06:00
Denis Kenzior
da1180841d
eapol: Handle Step 1 & 2 of 4-way Handshake
2015-02-24 11:13:57 -06:00
Denis Kenzior
9e6cbc5b60
eapol: Add __eapol_rx_packet
2015-02-24 11:13:19 -06:00
Denis Kenzior
4a540526fe
eapol: Add eapol_start
2015-02-24 11:12:22 -06:00
Denis Kenzior
2ee8b8e56e
eapol: Add __eapol_set_protocol_version
2015-02-24 11:11:40 -06:00
Denis Kenzior
87dc9543b2
eapol: Add tx_packet_func and setter
2015-02-24 11:10:42 -06:00
Denis Kenzior
54fa4f29c7
eapol: Add get_nonce func and setter
2015-02-24 11:09:42 -06:00
Denis Kenzior
79bf677e71
eapol: Add eapol_init and eapol_exit
2015-02-24 11:08:03 -06:00
Denis Kenzior
2e1e484f95
eapol: Add eapol_sm_set_own_rsn
2015-02-24 10:58:43 -06:00
Denis Kenzior
08b2980fd6
eapol: Add eapol_sm_set_ap_rsn
2015-02-24 10:58:03 -06:00
Denis Kenzior
f85c860cc3
eapol: Add eapol_sm_set_pmk
2015-02-24 10:57:25 -06:00
Denis Kenzior
ff92e5c5e1
eapol: Add eapol_sm_set_aa_address
2015-02-24 10:56:39 -06:00
Denis Kenzior
122dfe7025
eapol: Add eapol_sm_set_sta_address
2015-02-24 10:55:50 -06:00
Denis Kenzior
2866fbbf91
eapol: Introduce eapol_sm
2015-02-24 10:54:23 -06:00
Denis Kenzior
bf42e3e7a3
eapol: snonce not needed in create_ptk_4_of_4
2015-02-24 10:52:12 -06:00
Denis Kenzior
6ba57c9fa8
eapol: Fix eapol_verify_mic
...
The calculation was using an invalid length
2015-02-24 10:42:20 -06:00
Denis Kenzior
a0bf16c5ca
eapol: Refactor verification functions
...
Use a macro for common checks. Assume that the validate step will be
done separately.
2015-02-23 15:39:26 -06:00
Denis Kenzior
6a4b75cf8d
eapol: Add eapol_verify_mic
2015-02-18 21:13:09 -06:00
Denis Kenzior
ad3e0b6bf2
arc4: Remove and move to src/crypto.c
2015-02-18 21:11:37 -06:00
Denis Kenzior
b3e617838d
aes: Remove and move to src/crypto.c
2015-02-18 21:02:09 -06:00
Denis Kenzior
260ef5bb9d
md5: Remove and move to src/crypto.c
2015-02-18 20:56:18 -06:00
Denis Kenzior
89e4538945
eapol: Rework eapol_decrypt_key_data
...
802.11 uses AES Key Wrap and RC4 with the first 256 bytes skipped. The
IV is also initialized into the RC4 key.
2015-02-17 17:39:47 -06:00
Denis Kenzior
cd08cdfd9f
eapol: Add eapol_decrypt_key_data
2015-02-13 20:37:17 -06:00
Denis Kenzior
85e54c66fe
eapol: Add eapol_verify_ptk_4_of_4
2015-02-13 18:38:10 -06:00
Denis Kenzior
0570940cd7
eapol: Add eapol_verify_ptk_3_of_4
2015-02-13 16:36:52 -06:00
Denis Kenzior
f9515fbe97
eapol: Add additional sanity checks for step 2
2015-02-13 16:36:24 -06:00
Denis Kenzior
9b746cd3c1
eapol: Update comment
2015-02-13 16:12:43 -06:00
Denis Kenzior
54d4090542
eapol: Tweak API
...
We need to extract quite a bit of information from the EAPoL frames, so
tweak the API to just verify that a frame is of a particular type
2015-02-13 16:08:45 -06:00
Denis Kenzior
87f775475a
eapol: Handle cmac_aes in eapol_calcuate_mic
2015-02-13 14:53:16 -06:00
Denis Kenzior
63aae17aa8
eapol: Take out unneeded cast
2015-02-13 14:52:24 -06:00
Denis Kenzior
df8d60d7e1
eapol: Add eapol_create_ptk_4_of_4
2015-02-13 14:10:28 -06:00
Denis Kenzior
005fc0c0d1
eapol: Handle key_replay_counter as a uint64_t
2015-02-13 13:54:50 -06:00
Tomasz Bursztyka
8f946c0cdc
eapol: Change function signatures
...
The frame which comes in is an EAPoL-key frame, thus changing the name
accordingly (as well as the parameter names).
Also, returning the cast pointer instead of a boolean is easier to
use as there won't be any need to perform the cast ourselves afterward
2015-01-22 12:18:17 -06:00
Denis Kenzior
096165d142
eapol: Add eapol_calculate_mic
2014-12-27 23:04:14 -06:00
Denis Kenzior
27d25efc0b
eapol: Add eapol_create_ptk_2_of_4
2014-12-27 23:04:12 -06:00
Denis Kenzior
dc3331a98d
eapol: Add eapol_process_ptk_2_of_4
2014-12-27 22:58:22 -06:00
Denis Kenzior
996e32bf1d
eapol: Add eapol_process_ptk_1_of_4
2014-12-27 22:58:22 -06:00
Denis Kenzior
da8e10cc5f
eapol: Verify key_descriptor_version
2014-12-27 22:34:39 -06:00
Denis Kenzior
5da6ca89e4
eapol: Add eapol_verify
2014-12-27 22:34:39 -06:00
Denis Kenzior
2cc842a302
eapol: Add beginnings of EAPoL utilities
2014-12-18 18:10:10 -06:00