xref: /freebsd/contrib/wpa/src/common/eapol_common.h (revision 780fb4a2fa9a9aee5ac48a60b790f567c0dc13e9)
139beb93cSSam Leffler /*
239beb93cSSam Leffler  * EAPOL definitions shared between hostapd and wpa_supplicant
339beb93cSSam Leffler  * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
439beb93cSSam Leffler  *
5f05cddf9SRui Paulo  * This software may be distributed under the terms of the BSD license.
6f05cddf9SRui Paulo  * See README for more details.
739beb93cSSam Leffler  */
839beb93cSSam Leffler 
939beb93cSSam Leffler #ifndef EAPOL_COMMON_H
1039beb93cSSam Leffler #define EAPOL_COMMON_H
1139beb93cSSam Leffler 
1239beb93cSSam Leffler /* IEEE Std 802.1X-2004 */
1339beb93cSSam Leffler 
1439beb93cSSam Leffler #ifdef _MSC_VER
1539beb93cSSam Leffler #pragma pack(push, 1)
1639beb93cSSam Leffler #endif /* _MSC_VER */
1739beb93cSSam Leffler 
1839beb93cSSam Leffler struct ieee802_1x_hdr {
1939beb93cSSam Leffler 	u8 version;
2039beb93cSSam Leffler 	u8 type;
2139beb93cSSam Leffler 	be16 length;
2239beb93cSSam Leffler 	/* followed by length octets of data */
2339beb93cSSam Leffler } STRUCT_PACKED;
2439beb93cSSam Leffler 
255b9c547cSRui Paulo struct ieee8023_hdr {
265b9c547cSRui Paulo 	u8 dest[ETH_ALEN];
275b9c547cSRui Paulo 	u8 src[ETH_ALEN];
28*780fb4a2SCy Schubert 	be16 ethertype;
295b9c547cSRui Paulo } STRUCT_PACKED;
305b9c547cSRui Paulo 
3139beb93cSSam Leffler #ifdef _MSC_VER
3239beb93cSSam Leffler #pragma pack(pop)
3339beb93cSSam Leffler #endif /* _MSC_VER */
3439beb93cSSam Leffler 
355b9c547cSRui Paulo #ifdef CONFIG_MACSEC
365b9c547cSRui Paulo #define EAPOL_VERSION 3
375b9c547cSRui Paulo #else /* CONFIG_MACSEC */
3839beb93cSSam Leffler #define EAPOL_VERSION 2
395b9c547cSRui Paulo #endif /* CONFIG_MACSEC */
4039beb93cSSam Leffler 
4139beb93cSSam Leffler enum { IEEE802_1X_TYPE_EAP_PACKET = 0,
4239beb93cSSam Leffler        IEEE802_1X_TYPE_EAPOL_START = 1,
4339beb93cSSam Leffler        IEEE802_1X_TYPE_EAPOL_LOGOFF = 2,
4439beb93cSSam Leffler        IEEE802_1X_TYPE_EAPOL_KEY = 3,
455b9c547cSRui Paulo        IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT = 4,
465b9c547cSRui Paulo        IEEE802_1X_TYPE_EAPOL_MKA = 5,
4739beb93cSSam Leffler };
4839beb93cSSam Leffler 
4939beb93cSSam Leffler enum { EAPOL_KEY_TYPE_RC4 = 1, EAPOL_KEY_TYPE_RSN = 2,
5039beb93cSSam Leffler        EAPOL_KEY_TYPE_WPA = 254 };
5139beb93cSSam Leffler 
52f05cddf9SRui Paulo 
53f05cddf9SRui Paulo #define IEEE8021X_REPLAY_COUNTER_LEN 8
54f05cddf9SRui Paulo #define IEEE8021X_KEY_SIGN_LEN 16
55f05cddf9SRui Paulo #define IEEE8021X_KEY_IV_LEN 16
56f05cddf9SRui Paulo 
57f05cddf9SRui Paulo #define IEEE8021X_KEY_INDEX_FLAG 0x80
58f05cddf9SRui Paulo #define IEEE8021X_KEY_INDEX_MASK 0x03
59f05cddf9SRui Paulo 
60f05cddf9SRui Paulo #ifdef _MSC_VER
61f05cddf9SRui Paulo #pragma pack(push, 1)
62f05cddf9SRui Paulo #endif /* _MSC_VER */
63f05cddf9SRui Paulo 
64f05cddf9SRui Paulo struct ieee802_1x_eapol_key {
65f05cddf9SRui Paulo 	u8 type;
66f05cddf9SRui Paulo 	/* Note: key_length is unaligned */
67f05cddf9SRui Paulo 	u8 key_length[2];
68f05cddf9SRui Paulo 	/* does not repeat within the life of the keying material used to
69f05cddf9SRui Paulo 	 * encrypt the Key field; 64-bit NTP timestamp MAY be used here */
70f05cddf9SRui Paulo 	u8 replay_counter[IEEE8021X_REPLAY_COUNTER_LEN];
71f05cddf9SRui Paulo 	u8 key_iv[IEEE8021X_KEY_IV_LEN]; /* cryptographically random number */
72f05cddf9SRui Paulo 	u8 key_index; /* key flag in the most significant bit:
73f05cddf9SRui Paulo 		       * 0 = broadcast (default key),
74f05cddf9SRui Paulo 		       * 1 = unicast (key mapping key); key index is in the
75f05cddf9SRui Paulo 		       * 7 least significant bits */
76f05cddf9SRui Paulo 	/* HMAC-MD5 message integrity check computed with MS-MPPE-Send-Key as
77f05cddf9SRui Paulo 	 * the key */
78f05cddf9SRui Paulo 	u8 key_signature[IEEE8021X_KEY_SIGN_LEN];
79f05cddf9SRui Paulo 
80f05cddf9SRui Paulo 	/* followed by key: if packet body length = 44 + key length, then the
81f05cddf9SRui Paulo 	 * key field (of key_length bytes) contains the key in encrypted form;
82f05cddf9SRui Paulo 	 * if packet body length = 44, key field is absent and key_length
83f05cddf9SRui Paulo 	 * represents the number of least significant octets from
84f05cddf9SRui Paulo 	 * MS-MPPE-Send-Key attribute to be used as the keying material;
85f05cddf9SRui Paulo 	 * RC4 key used in encryption = Key-IV + MS-MPPE-Recv-Key */
86f05cddf9SRui Paulo } STRUCT_PACKED;
87f05cddf9SRui Paulo 
88f05cddf9SRui Paulo #ifdef _MSC_VER
89f05cddf9SRui Paulo #pragma pack(pop)
90f05cddf9SRui Paulo #endif /* _MSC_VER */
91f05cddf9SRui Paulo 
9239beb93cSSam Leffler #endif /* EAPOL_COMMON_H */
93