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