2 * Copyright (c) 2009 Joshua Oreman <oremanj@rwcr.net>.
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License as
6 * published by the Free Software Foundation; either version 2 of the
7 * License, or any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 FILE_LICENCE ( GPL2_OR_LATER
);
21 #include <gpxe/net80211.h>
22 #include <gpxe/sec80211.h>
24 #include <gpxe/eapol.h>
25 #include <gpxe/crypto.h>
26 #include <gpxe/arc4.h>
27 #include <gpxe/crc32.h>
28 #include <gpxe/sha1.h>
29 #include <gpxe/hmac.h>
30 #include <gpxe/list.h>
31 #include <gpxe/ethernet.h>
38 * Handler for the aspects of WPA handshaking that are independent of
39 * 802.1X/PSK or TKIP/CCMP; this mostly involves the 4-Way Handshake.
42 /** List of WPA contexts in active use. */
43 struct list_head wpa_contexts
= LIST_HEAD_INIT ( wpa_contexts
);
47 * Return an error code and deauthenticate
49 * @v ctx WPA common context
50 * @v rc Return status code
51 * @ret rc The passed return status code
53 static int wpa_fail ( struct wpa_common_ctx
*ctx
, int rc
)
55 net80211_deauthenticate ( ctx
->dev
, rc
);
61 * Find a cryptosystem handler structure from a crypto ID
63 * @v crypt Cryptosystem ID
64 * @ret crypto Cryptosystem handler structure
66 * If support for @a crypt is not compiled in to gPXE, or if @a crypt
67 * is NET80211_CRYPT_UNKNOWN, returns @c NULL.
69 static struct net80211_crypto
*
70 wpa_find_cryptosystem ( enum net80211_crypto_alg crypt
)
72 struct net80211_crypto
*crypto
;
74 for_each_table_entry ( crypto
, NET80211_CRYPTOS
) {
75 if ( crypto
->algorithm
== crypt
)
84 * Find WPA key integrity and encryption handler from key version field
86 * @v ver Version bits of EAPOL-Key info field
87 * @ret kie Key integrity and encryption handler
89 struct wpa_kie
* wpa_find_kie ( int version
)
93 for_each_table_entry ( kie
, WPA_KIES
) {
94 if ( kie
->version
== version
)
103 * Construct RSN or WPA information element
105 * @v dev 802.11 device
106 * @ret ie_ret RSN or WPA information element
107 * @ret rc Return status code
109 * This function allocates, fills, and returns a RSN or WPA
110 * information element suitable for including in an association
111 * request frame to the network identified by @c dev->associating.
112 * If it is impossible to construct an information element consistent
113 * with gPXE's capabilities that is compatible with that network, or
114 * if none should be sent because that network's beacon included no
115 * security information, returns an error indication and leaves
116 * @a ie_ret unchanged.
118 * The returned IE will be of the same type (RSN or WPA) as was
119 * included in the beacon for the network it is destined for.
121 int wpa_make_rsn_ie ( struct net80211_device
*dev
, union ieee80211_ie
**ie_ret
)
126 enum net80211_crypto_alg gcrypt
;
129 struct ieee80211_ie_rsn
*ie
;
130 struct ieee80211_frame
*hdr
;
131 struct ieee80211_beacon
*beacon
;
133 if ( ! dev
->associating
) {
134 DBG ( "WPA: Can't make RSN IE for a non-associating device\n" );
138 hdr
= dev
->associating
->beacon
->data
;
139 beacon
= ( struct ieee80211_beacon
* ) hdr
->data
;
140 rsn
= sec80211_find_rsn ( beacon
->info_element
,
141 dev
->associating
->beacon
->tail
, &is_rsn
,
144 DBG ( "WPA: Can't make RSN IE when we didn't get one\n" );
148 rsn
+= 2; /* skip version */
149 group_cipher
= *( u32
* ) rsn
;
150 gcrypt
= sec80211_rsn_get_net80211_crypt ( group_cipher
);
152 if ( ! wpa_find_cryptosystem ( gcrypt
) ||
153 ! wpa_find_cryptosystem ( dev
->associating
->crypto
) ) {
154 DBG ( "WPA: No support for (GC:%d, PC:%d)\n",
155 gcrypt
, dev
->associating
->crypto
);
159 /* Everything looks good - make our IE. */
161 /* WPA IEs need 4 more bytes for the OUI+type */
162 ie_len
= ieee80211_rsn_size ( 1, 1, 0, is_rsn
) + ( 4 * ! is_rsn
);
163 iep
= malloc ( ie_len
);
167 *ie_ret
= ( union ieee80211_ie
* ) iep
;
169 /* Store ID and length bytes. */
170 *iep
++ = ( is_rsn
? IEEE80211_IE_RSN
: IEEE80211_IE_VENDOR
);
173 /* Store OUI+type for WPA IEs. */
175 *( u32
* ) iep
= IEEE80211_WPA_OUI_VEN
;
179 /* If this is a WPA IE, the id and len bytes in the
180 ieee80211_ie_rsn structure will not be valid, but by doing
181 the cast we can fill all the other fields much more
184 ie
= ( struct ieee80211_ie_rsn
* ) ( iep
- 2 );
185 ie
->version
= IEEE80211_RSN_VERSION
;
186 ie
->group_cipher
= group_cipher
;
187 ie
->pairwise_count
= 1;
188 ie
->pairwise_cipher
[0] =
189 sec80211_rsn_get_crypto_desc ( dev
->associating
->crypto
,
193 sec80211_rsn_get_akm_desc ( dev
->associating
->handshaking
,
205 * Set up generic WPA support to handle 4-Way Handshake
207 * @v dev 802.11 device
208 * @v ctx WPA common context
209 * @v pmk Pairwise Master Key to use for session
210 * @v pmk_len Length of PMK, almost always 32
211 * @ret rc Return status code
213 int wpa_start ( struct net80211_device
*dev
, struct wpa_common_ctx
*ctx
,
214 const void *pmk
, size_t pmk_len
)
216 struct io_buffer
*iob
;
217 struct ieee80211_frame
*hdr
;
218 struct ieee80211_beacon
*beacon
;
219 u8
*ap_rsn_ie
= NULL
, *ap_rsn_ie_end
;
221 if ( ! dev
->rsn_ie
|| ! dev
->associating
)
225 memcpy ( ctx
->pmk
, pmk
, ctx
->pmk_len
= pmk_len
);
226 ctx
->state
= WPA_READY
;
229 iob
= dev
->associating
->beacon
;
231 beacon
= ( struct ieee80211_beacon
* ) hdr
->data
;
232 ap_rsn_ie
= sec80211_find_rsn ( beacon
->info_element
, iob
->tail
,
233 &ctx
->ap_rsn_is_rsn
, &ap_rsn_ie_end
);
235 ctx
->ap_rsn_ie
= malloc ( ap_rsn_ie_end
- ap_rsn_ie
);
236 if ( ! ctx
->ap_rsn_ie
)
238 memcpy ( ctx
->ap_rsn_ie
, ap_rsn_ie
, ap_rsn_ie_end
- ap_rsn_ie
);
239 ctx
->ap_rsn_ie_len
= ap_rsn_ie_end
- ap_rsn_ie
;
244 ctx
->crypt
= dev
->associating
->crypto
;
245 ctx
->gcrypt
= NET80211_CRYPT_UNKNOWN
;
247 list_add_tail ( &ctx
->list
, &wpa_contexts
);
253 * Disable handling of received WPA handshake frames
255 * @v dev 802.11 device
257 void wpa_stop ( struct net80211_device
*dev
)
259 struct wpa_common_ctx
*ctx
, *tmp
;
261 list_for_each_entry_safe ( ctx
, tmp
, &wpa_contexts
, list
) {
262 if ( ctx
->dev
== dev
) {
263 free ( ctx
->ap_rsn_ie
);
264 ctx
->ap_rsn_ie
= NULL
;
265 list_del ( &ctx
->list
);
272 * Check PMKID consistency
274 * @v ctx WPA common context
275 * @v pmkid PMKID to check against (16 bytes long)
276 * @ret rc Zero if they match, or a negative error code if not
278 int wpa_check_pmkid ( struct wpa_common_ctx
*ctx
, const u8
*pmkid
)
280 u8 sha1_ctx
[SHA1_CTX_SIZE
];
281 u8 my_pmkid
[SHA1_SIZE
];
282 u8 pmk
[ctx
->pmk_len
];
288 } __attribute__ (( packed
)) pmkid_data
;
290 memcpy ( pmk
, ctx
->pmk
, ctx
->pmk_len
);
291 pmk_len
= ctx
->pmk_len
;
293 memcpy ( pmkid_data
.name
, "PMK Name", 8 );
294 memcpy ( pmkid_data
.aa
, ctx
->dev
->bssid
, ETH_ALEN
);
295 memcpy ( pmkid_data
.spa
, ctx
->dev
->netdev
->ll_addr
, ETH_ALEN
);
297 hmac_init ( &sha1_algorithm
, sha1_ctx
, pmk
, &pmk_len
);
298 hmac_update ( &sha1_algorithm
, sha1_ctx
, &pmkid_data
,
299 sizeof ( pmkid_data
) );
300 hmac_final ( &sha1_algorithm
, sha1_ctx
, pmk
, &pmk_len
, my_pmkid
);
302 if ( memcmp ( my_pmkid
, pmkid
, WPA_PMKID_LEN
) != 0 )
310 * Derive pairwise transient key
312 * @v ctx WPA common context
314 static void wpa_derive_ptk ( struct wpa_common_ctx
*ctx
)
319 u8 nonce1
[WPA_NONCE_LEN
];
320 u8 nonce2
[WPA_NONCE_LEN
];
321 } __attribute__ (( packed
)) ptk_data
;
323 /* The addresses and nonces are stored in numerical order (!) */
325 if ( memcmp ( ctx
->dev
->netdev
->ll_addr
, ctx
->dev
->bssid
,
327 memcpy ( ptk_data
.mac1
, ctx
->dev
->netdev
->ll_addr
, ETH_ALEN
);
328 memcpy ( ptk_data
.mac2
, ctx
->dev
->bssid
, ETH_ALEN
);
330 memcpy ( ptk_data
.mac1
, ctx
->dev
->bssid
, ETH_ALEN
);
331 memcpy ( ptk_data
.mac2
, ctx
->dev
->netdev
->ll_addr
, ETH_ALEN
);
334 if ( memcmp ( ctx
->Anonce
, ctx
->Snonce
, WPA_NONCE_LEN
) < 0 ) {
335 memcpy ( ptk_data
.nonce1
, ctx
->Anonce
, WPA_NONCE_LEN
);
336 memcpy ( ptk_data
.nonce2
, ctx
->Snonce
, WPA_NONCE_LEN
);
338 memcpy ( ptk_data
.nonce1
, ctx
->Snonce
, WPA_NONCE_LEN
);
339 memcpy ( ptk_data
.nonce2
, ctx
->Anonce
, WPA_NONCE_LEN
);
342 DBGC2 ( ctx
, "WPA %p A1 %s, A2 %s\n", ctx
, eth_ntoa ( ptk_data
.mac1
),
343 eth_ntoa ( ptk_data
.mac2
) );
344 DBGC2 ( ctx
, "WPA %p Nonce1, Nonce2:\n", ctx
);
345 DBGC2_HD ( ctx
, ptk_data
.nonce1
, WPA_NONCE_LEN
);
346 DBGC2_HD ( ctx
, ptk_data
.nonce2
, WPA_NONCE_LEN
);
348 prf_sha1 ( ctx
->pmk
, ctx
->pmk_len
,
349 "Pairwise key expansion",
350 &ptk_data
, sizeof ( ptk_data
),
351 &ctx
->ptk
, sizeof ( ctx
->ptk
) );
353 DBGC2 ( ctx
, "WPA %p PTK:\n", ctx
);
354 DBGC2_HD ( ctx
, &ctx
->ptk
, sizeof ( ctx
->ptk
) );
359 * Install pairwise transient key
361 * @v ctx WPA common context
362 * @v len Key length (16 for CCMP, 32 for TKIP)
363 * @ret rc Return status code
365 static inline int wpa_install_ptk ( struct wpa_common_ctx
*ctx
, int len
)
367 DBGC ( ctx
, "WPA %p: installing %d-byte pairwise transient key\n",
369 DBGC2_HD ( ctx
, &ctx
->ptk
.tk
, len
);
371 return sec80211_install ( &ctx
->dev
->crypto
, ctx
->crypt
,
372 &ctx
->ptk
.tk
, len
, NULL
);
376 * Install group transient key
378 * @v ctx WPA common context
379 * @v len Key length (16 for CCMP, 32 for TKIP)
380 * @v rsc Receive sequence counter field in EAPOL-Key packet
381 * @ret rc Return status code
383 static inline int wpa_install_gtk ( struct wpa_common_ctx
*ctx
, int len
,
386 DBGC ( ctx
, "WPA %p: installing %d-byte group transient key\n",
388 DBGC2_HD ( ctx
, &ctx
->gtk
.tk
, len
);
390 return sec80211_install ( &ctx
->dev
->gcrypto
, ctx
->gcrypt
,
391 &ctx
->gtk
.tk
, len
, rsc
);
395 * Search for group transient key, and install it if found
397 * @v ctx WPA common context
398 * @v ie Pointer to first IE in key data field
399 * @v ie_end Pointer to first byte not in key data field
400 * @v rsc Receive sequence counter field in EAPOL-Key packet
401 * @ret rc Return status code
403 static int wpa_maybe_install_gtk ( struct wpa_common_ctx
*ctx
,
404 union ieee80211_ie
*ie
, void *ie_end
,
409 if ( ! ieee80211_ie_bound ( ie
, ie_end
) )
413 if ( ie
->id
== IEEE80211_IE_VENDOR
&&
414 ie
->vendor
.oui
== WPA_KDE_GTK
)
417 ie
= ieee80211_next_ie ( ie
, ie_end
);
423 if ( ie
->len
- 6u > sizeof ( ctx
->gtk
.tk
) ) {
424 DBGC ( ctx
, "WPA %p: GTK KDE is too long (%d bytes, max %d)\n",
425 ctx
, ie
->len
- 4, sizeof ( ctx
->gtk
.tk
) );
429 /* XXX We ignore key ID for now. */
430 kde
= ( struct wpa_kde
* ) ie
;
431 memcpy ( &ctx
->gtk
.tk
, &kde
->gtk_encap
.gtk
, kde
->len
- 6 );
433 return wpa_install_gtk ( ctx
, kde
->len
- 6, rsc
);
438 * Allocate I/O buffer for construction of outgoing EAPOL-Key frame
440 * @v kdlen Maximum number of bytes in the Key Data field
441 * @ret iob Newly allocated I/O buffer
443 * The returned buffer will have space reserved for the link-layer and
444 * EAPOL headers, and will have @c iob->tail pointing to the start of
445 * the Key Data field. Thus, it is necessary to use iob_put() in
446 * filling the Key Data.
448 static struct io_buffer
* wpa_alloc_frame ( int kdlen
)
450 struct io_buffer
*ret
= alloc_iob ( sizeof ( struct eapol_key_pkt
) +
451 kdlen
+ EAPOL_HDR_LEN
+
456 iob_reserve ( ret
, MAX_LL_HEADER_LEN
+ EAPOL_HDR_LEN
);
457 memset ( iob_put ( ret
, sizeof ( struct eapol_key_pkt
) ), 0,
458 sizeof ( struct eapol_key_pkt
) );
465 * Send EAPOL-Key packet
467 * @v iob I/O buffer, with sufficient headroom for headers
468 * @v dev 802.11 device
469 * @v kie Key integrity and encryption handler
470 * @v is_rsn If TRUE, handshake uses new RSN format
471 * @ret rc Return status code
473 * If a KIE is specified, the MIC will be filled in before transmission.
475 static int wpa_send_eapol ( struct io_buffer
*iob
, struct wpa_common_ctx
*ctx
,
476 struct wpa_kie
*kie
)
478 struct eapol_key_pkt
*pkt
= iob
->data
;
479 struct eapol_frame
*eapol
= iob_push ( iob
, EAPOL_HDR_LEN
);
481 pkt
->info
= htons ( pkt
->info
);
482 pkt
->keysize
= htons ( pkt
->keysize
);
483 pkt
->datalen
= htons ( pkt
->datalen
);
484 pkt
->replay
= cpu_to_be64 ( pkt
->replay
);
485 eapol
->version
= EAPOL_THIS_VERSION
;
486 eapol
->type
= EAPOL_TYPE_KEY
;
487 eapol
->length
= htons ( iob
->tail
- iob
->data
- sizeof ( *eapol
) );
489 memset ( pkt
->mic
, 0, sizeof ( pkt
->mic
) );
491 kie
->mic ( &ctx
->ptk
.kck
, eapol
, EAPOL_HDR_LEN
+
492 sizeof ( *pkt
) + ntohs ( pkt
->datalen
),
495 return net_tx ( iob
, ctx
->dev
->netdev
, &eapol_protocol
,
501 * Send second frame in 4-Way Handshake
503 * @v ctx WPA common context
504 * @v pkt First frame, to which this is a reply
505 * @v is_rsn If TRUE, handshake uses new RSN format
506 * @v kie Key integrity and encryption handler
507 * @ret rc Return status code
509 static int wpa_send_2_of_4 ( struct wpa_common_ctx
*ctx
,
510 struct eapol_key_pkt
*pkt
, int is_rsn
,
511 struct wpa_kie
*kie
)
513 struct io_buffer
*iob
= wpa_alloc_frame ( ctx
->dev
->rsn_ie
->len
+ 2 );
514 struct eapol_key_pkt
*npkt
;
520 memcpy ( npkt
, pkt
, sizeof ( *pkt
) );
521 npkt
->info
&= ~EAPOL_KEY_INFO_KEY_ACK
;
522 npkt
->info
|= EAPOL_KEY_INFO_KEY_MIC
;
525 memcpy ( npkt
->nonce
, ctx
->Snonce
, sizeof ( npkt
->nonce
) );
526 npkt
->datalen
= ctx
->dev
->rsn_ie
->len
+ 2;
527 memcpy ( iob_put ( iob
, npkt
->datalen
), ctx
->dev
->rsn_ie
,
530 DBGC ( ctx
, "WPA %p: sending 2/4\n", ctx
);
532 return wpa_send_eapol ( iob
, ctx
, kie
);
537 * Handle receipt of first frame in 4-Way Handshake
539 * @v ctx WPA common context
540 * @v pkt EAPOL-Key packet
541 * @v is_rsn If TRUE, frame uses new RSN format
542 * @v kie Key integrity and encryption handler
543 * @ret rc Return status code
545 static int wpa_handle_1_of_4 ( struct wpa_common_ctx
*ctx
,
546 struct eapol_key_pkt
*pkt
, int is_rsn
,
547 struct wpa_kie
*kie
)
551 if ( ctx
->state
== WPA_WAITING
)
554 ctx
->state
= WPA_WORKING
;
555 memcpy ( ctx
->Anonce
, pkt
->nonce
, sizeof ( ctx
->Anonce
) );
556 if ( ! ctx
->have_Snonce
) {
557 get_random_bytes ( ctx
->Snonce
, sizeof ( ctx
->Snonce
) );
558 ctx
->have_Snonce
= 1;
561 if ( is_rsn
&& pkt
->datalen
) {
562 union ieee80211_ie
*ie
= ( union ieee80211_ie
* ) pkt
->data
;
563 void *ie_end
= pkt
->data
+ pkt
->datalen
;
565 if ( ! ieee80211_ie_bound ( ie
, ie_end
) ) {
566 DBGC ( ctx
, "WPA %p: malformed PMKID KDE\n", ctx
);
567 return wpa_fail ( ctx
, -EINVAL
);
571 if ( ie
->id
== IEEE80211_IE_VENDOR
&&
572 ie
->vendor
.oui
== WPA_KDE_PMKID
) {
573 rc
= wpa_check_pmkid ( ctx
, ie
->vendor
.data
);
575 DBGC ( ctx
, "WPA %p ALERT: PMKID "
576 "mismatch in 1/4\n", ctx
);
577 return wpa_fail ( ctx
, rc
);
581 ie
= ieee80211_next_ie ( ie
, ie_end
);
585 DBGC ( ctx
, "WPA %p: received 1/4, looks OK\n", ctx
);
587 wpa_derive_ptk ( ctx
);
589 return wpa_send_2_of_4 ( ctx
, pkt
, is_rsn
, kie
);
594 * Send fourth frame in 4-Way Handshake, or second in Group Key Handshake
596 * @v ctx WPA common context
597 * @v pkt EAPOL-Key packet for frame to which we're replying
598 * @v is_rsn If TRUE, frame uses new RSN format
599 * @v kie Key integrity and encryption handler
600 * @ret rc Return status code
602 static int wpa_send_final ( struct wpa_common_ctx
*ctx
,
603 struct eapol_key_pkt
*pkt
, int is_rsn
,
604 struct wpa_kie
*kie
)
606 struct io_buffer
*iob
= wpa_alloc_frame ( 0 );
607 struct eapol_key_pkt
*npkt
;
613 memcpy ( npkt
, pkt
, sizeof ( *pkt
) );
614 npkt
->info
&= ~( EAPOL_KEY_INFO_KEY_ACK
| EAPOL_KEY_INFO_INSTALL
|
615 EAPOL_KEY_INFO_KEY_ENC
);
618 memset ( npkt
->nonce
, 0, sizeof ( npkt
->nonce
) );
619 memset ( npkt
->iv
, 0, sizeof ( npkt
->iv
) );
622 if ( npkt
->info
& EAPOL_KEY_INFO_TYPE
)
623 DBGC ( ctx
, "WPA %p: sending 4/4\n", ctx
);
625 DBGC ( ctx
, "WPA %p: sending 2/2\n", ctx
);
627 return wpa_send_eapol ( iob
, ctx
, kie
);
633 * Handle receipt of third frame in 4-Way Handshake
635 * @v ctx WPA common context
636 * @v pkt EAPOL-Key packet
637 * @v is_rsn If TRUE, frame uses new RSN format
638 * @v kie Key integrity and encryption handler
639 * @ret rc Return status code
641 static int wpa_handle_3_of_4 ( struct wpa_common_ctx
*ctx
,
642 struct eapol_key_pkt
*pkt
, int is_rsn
,
643 struct wpa_kie
*kie
)
646 u8
*this_rsn
, *this_rsn_end
;
647 u8
*new_rsn
, *new_rsn_end
;
648 int this_is_rsn
, new_is_rsn
;
650 if ( ctx
->state
== WPA_WAITING
)
653 ctx
->state
= WPA_WORKING
;
656 if ( memcmp ( ctx
->Anonce
, pkt
->nonce
, WPA_NONCE_LEN
) != 0 ) {
657 DBGC ( ctx
, "WPA %p ALERT: nonce mismatch in 3/4\n", ctx
);
658 return wpa_fail ( ctx
, -EACCES
);
662 this_rsn
= sec80211_find_rsn ( ( union ieee80211_ie
* ) pkt
->data
,
663 pkt
->data
+ pkt
->datalen
,
664 &this_is_rsn
, &this_rsn_end
);
666 new_rsn
= sec80211_find_rsn ( ( union ieee80211_ie
* )
668 pkt
->data
+ pkt
->datalen
,
669 &new_is_rsn
, &new_rsn_end
);
673 if ( ! ctx
->ap_rsn_ie
|| ! this_rsn
||
674 ctx
->ap_rsn_ie_len
!= ( this_rsn_end
- this_rsn
) ||
675 ctx
->ap_rsn_is_rsn
!= this_is_rsn
||
676 memcmp ( ctx
->ap_rsn_ie
, this_rsn
, ctx
->ap_rsn_ie_len
) != 0 ) {
677 DBGC ( ctx
, "WPA %p ALERT: RSN mismatch in 3/4\n", ctx
);
678 DBGC2 ( ctx
, "WPA %p RSNs (in 3/4, in beacon):\n", ctx
);
679 DBGC2_HD ( ctx
, this_rsn
, this_rsn_end
- this_rsn
);
680 DBGC2_HD ( ctx
, ctx
->ap_rsn_ie
, ctx
->ap_rsn_ie_len
);
681 return wpa_fail ( ctx
, -EACCES
);
684 /* Don't switch if they just supplied both styles of IE
685 simultaneously; we need two RSN IEs or two WPA IEs to
686 switch ciphers. They'll be immediately consecutive because
687 of ordering guarantees. */
688 if ( new_rsn
&& this_is_rsn
== new_is_rsn
) {
689 struct net80211_wlan
*assoc
= ctx
->dev
->associating
;
690 DBGC ( ctx
, "WPA %p: accommodating bait-and-switch tactics\n",
692 DBGC2 ( ctx
, "WPA %p RSNs (in 3/4+beacon, new in 3/4):\n",
694 DBGC2_HD ( ctx
, this_rsn
, this_rsn_end
- this_rsn
);
695 DBGC2_HD ( ctx
, new_rsn
, new_rsn_end
- new_rsn
);
697 if ( ( rc
= sec80211_detect_ie ( new_is_rsn
, new_rsn
,
700 &assoc
->crypto
) ) != 0 )
701 DBGC ( ctx
, "WPA %p: bait-and-switch invalid, staying "
702 "with original request\n", ctx
);
705 new_is_rsn
= this_is_rsn
;
706 new_rsn_end
= this_rsn_end
;
709 /* Grab group cryptosystem ID */
710 ctx
->gcrypt
= sec80211_rsn_get_net80211_crypt ( *( u32
* )
713 /* Check for a GTK, if info field is encrypted */
714 if ( pkt
->info
& EAPOL_KEY_INFO_KEY_ENC
) {
715 rc
= wpa_maybe_install_gtk ( ctx
,
716 ( union ieee80211_ie
* ) pkt
->data
,
717 pkt
->data
+ pkt
->datalen
,
720 DBGC ( ctx
, "WPA %p did not install GTK in 3/4: %s\n",
721 ctx
, strerror ( rc
) );
723 return wpa_fail ( ctx
, rc
);
727 DBGC ( ctx
, "WPA %p: received 3/4, looks OK\n", ctx
);
729 /* Send final message */
730 rc
= wpa_send_final ( ctx
, pkt
, is_rsn
, kie
);
732 return wpa_fail ( ctx
, rc
);
735 rc
= wpa_install_ptk ( ctx
, pkt
->keysize
);
737 DBGC ( ctx
, "WPA %p failed to install PTK: %s\n", ctx
,
739 return wpa_fail ( ctx
, rc
);
742 /* Mark us as needing a new Snonce if we rekey */
743 ctx
->have_Snonce
= 0;
746 ctx
->state
= WPA_SUCCESS
;
752 * Handle receipt of first frame in Group Key Handshake
754 * @v ctx WPA common context
755 * @v pkt EAPOL-Key packet
756 * @v is_rsn If TRUE, frame uses new RSN format
757 * @v kie Key integrity and encryption handler
758 * @ret rc Return status code
760 static int wpa_handle_1_of_2 ( struct wpa_common_ctx
*ctx
,
761 struct eapol_key_pkt
*pkt
, int is_rsn
,
762 struct wpa_kie
*kie
)
767 * WPA and RSN do this completely differently.
769 * The idea of encoding the GTK (or PMKID, or various other
770 * things) into a KDE that looks like an information element
771 * is an RSN innovation; old WPA code never encapsulates
772 * things like that. If it looks like an info element, it
773 * really is (for the WPA IE check in frames 2/4 and 3/4). The
774 * "key data encrypted" bit in the info field is also specific
777 * So from an old WPA host, 3/4 does not contain an
778 * encapsulated GTK. The first frame of the GK handshake
779 * contains it, encrypted, but without a KDE wrapper, and with
780 * the key ID field (which gPXE doesn't use) shoved away in
781 * the reserved bits in the info field, and the TxRx bit
782 * stealing the Install bit's spot.
785 if ( is_rsn
&& ( pkt
->info
& EAPOL_KEY_INFO_KEY_ENC
) ) {
786 rc
= wpa_maybe_install_gtk ( ctx
,
787 ( union ieee80211_ie
* ) pkt
->data
,
788 pkt
->data
+ pkt
->datalen
,
791 DBGC ( ctx
, "WPA %p: failed to install GTK in 1/2: "
792 "%s\n", ctx
, strerror ( rc
) );
793 return wpa_fail ( ctx
, rc
);
796 rc
= kie
->decrypt ( &ctx
->ptk
.kek
, pkt
->iv
, pkt
->data
,
799 DBGC ( ctx
, "WPA %p: failed to decrypt GTK: %s\n",
800 ctx
, strerror ( rc
) );
801 return rc
; /* non-fatal */
803 if ( pkt
->datalen
> sizeof ( ctx
->gtk
.tk
) ) {
804 DBGC ( ctx
, "WPA %p: too much GTK data (%d > %d)\n",
805 ctx
, pkt
->datalen
, sizeof ( ctx
->gtk
.tk
) );
806 return wpa_fail ( ctx
, -EINVAL
);
809 memcpy ( &ctx
->gtk
.tk
, pkt
->data
, pkt
->datalen
);
810 wpa_install_gtk ( ctx
, pkt
->datalen
, pkt
->rsc
);
813 DBGC ( ctx
, "WPA %p: received 1/2, looks OK\n", ctx
);
815 return wpa_send_final ( ctx
, pkt
, is_rsn
, kie
);
820 * Handle receipt of EAPOL-Key frame for WPA
823 * @v netdev Network device
824 * @v ll_source Source link-layer address
826 static int eapol_key_rx ( struct io_buffer
*iob
, struct net_device
*netdev
,
827 const void *ll_source
)
829 struct net80211_device
*dev
= net80211_get ( netdev
);
830 struct eapol_key_pkt
*pkt
= iob
->data
;
831 int is_rsn
, found_ctx
;
832 struct wpa_common_ctx
*ctx
;
835 u8 their_mic
[16], our_mic
[16];
837 if ( pkt
->type
!= EAPOL_KEY_TYPE_WPA
&&
838 pkt
->type
!= EAPOL_KEY_TYPE_RSN
) {
839 DBG ( "EAPOL-Key: packet not of 802.11 type\n" );
844 is_rsn
= ( pkt
->type
== EAPOL_KEY_TYPE_RSN
);
847 DBG ( "EAPOL-Key: packet not from 802.11\n" );
852 if ( memcmp ( dev
->bssid
, ll_source
, ETH_ALEN
) != 0 ) {
853 DBG ( "EAPOL-Key: packet not from associated AP\n" );
858 if ( ! ( ntohs ( pkt
->info
) & EAPOL_KEY_INFO_KEY_ACK
) ) {
859 DBG ( "EAPOL-Key: packet sent in wrong direction\n" );
865 list_for_each_entry ( ctx
, &wpa_contexts
, list
) {
866 if ( ctx
->dev
== dev
) {
873 DBG ( "EAPOL-Key: no WPA context to handle packet for %p\n",
879 if ( ( void * ) ( pkt
+ 1 ) + ntohs ( pkt
->datalen
) > iob
->tail
) {
880 DBGC ( ctx
, "WPA %p: packet truncated (has %d extra bytes, "
881 "states %d)\n", ctx
, iob
->tail
- ( void * ) ( pkt
+ 1 ),
882 ntohs ( pkt
->datalen
) );
887 /* Get a handle on key integrity/encryption handler */
888 kie
= wpa_find_kie ( ntohs ( pkt
->info
) & EAPOL_KEY_INFO_VERSION
);
890 DBGC ( ctx
, "WPA %p: no support for packet version %d\n", ctx
,
891 ntohs ( pkt
->info
) & EAPOL_KEY_INFO_VERSION
);
892 rc
= wpa_fail ( ctx
, -ENOTSUP
);
897 if ( ntohs ( pkt
->info
) & EAPOL_KEY_INFO_KEY_MIC
) {
898 memcpy ( their_mic
, pkt
->mic
, sizeof ( pkt
->mic
) );
899 memset ( pkt
->mic
, 0, sizeof ( pkt
->mic
) );
900 kie
->mic ( &ctx
->ptk
.kck
, ( void * ) pkt
- EAPOL_HDR_LEN
,
901 EAPOL_HDR_LEN
+ sizeof ( *pkt
) +
902 ntohs ( pkt
->datalen
), our_mic
);
903 DBGC2 ( ctx
, "WPA %p MIC comparison (theirs, ours):\n", ctx
);
904 DBGC2_HD ( ctx
, their_mic
, 16 );
905 DBGC2_HD ( ctx
, our_mic
, 16 );
906 if ( memcmp ( their_mic
, our_mic
, sizeof ( pkt
->mic
) ) != 0 ) {
907 DBGC ( ctx
, "WPA %p: EAPOL MIC failure\n", ctx
);
912 /* Fix byte order to local */
913 pkt
->info
= ntohs ( pkt
->info
);
914 pkt
->keysize
= ntohs ( pkt
->keysize
);
915 pkt
->datalen
= ntohs ( pkt
->datalen
);
916 pkt
->replay
= be64_to_cpu ( pkt
->replay
);
918 /* Check replay counter */
919 if ( ctx
->replay
!= ~0ULL && ctx
->replay
>= pkt
->replay
) {
920 DBGC ( ctx
, "WPA %p ALERT: Replay detected! "
921 "(%08x:%08x >= %08x:%08x)\n", ctx
,
922 ( u32
) ( ctx
->replay
>> 32 ), ( u32
) ctx
->replay
,
923 ( u32
) ( pkt
->replay
>> 32 ), ( u32
) pkt
->replay
);
924 rc
= 0; /* ignore without error */
927 ctx
->replay
= pkt
->replay
;
929 /* Decrypt key data */
930 if ( pkt
->info
& EAPOL_KEY_INFO_KEY_ENC
) {
931 rc
= kie
->decrypt ( &ctx
->ptk
.kek
, pkt
->iv
, pkt
->data
,
934 DBGC ( ctx
, "WPA %p: failed to decrypt packet: %s\n",
935 ctx
, strerror ( rc
) );
940 /* Hand it off to appropriate handler */
941 switch ( pkt
->info
& ( EAPOL_KEY_INFO_TYPE
|
942 EAPOL_KEY_INFO_KEY_MIC
) ) {
943 case EAPOL_KEY_TYPE_PTK
:
944 rc
= wpa_handle_1_of_4 ( ctx
, pkt
, is_rsn
, kie
);
947 case EAPOL_KEY_TYPE_PTK
| EAPOL_KEY_INFO_KEY_MIC
:
948 rc
= wpa_handle_3_of_4 ( ctx
, pkt
, is_rsn
, kie
);
951 case EAPOL_KEY_TYPE_GTK
| EAPOL_KEY_INFO_KEY_MIC
:
952 rc
= wpa_handle_1_of_2 ( ctx
, pkt
, is_rsn
, kie
);
956 DBGC ( ctx
, "WPA %p: Invalid combination of key flags %04x\n",
967 struct eapol_handler eapol_key_handler __eapol_handler
= {
968 .type
= EAPOL_TYPE_KEY
,
972 /* WPA always needs EAPOL in order to be useful */
973 REQUIRE_OBJECT ( eapol
);