/* SPDX-License-Identifier: GPL-2.0 */ #ifndef EAP_PACKET_H #define EAP_PACKET_H #include #define WBIT(n) (1 << (n)) #ifndef ETH_ALEN #define ETH_ALEN 6 #endif #define ETHER_HDR_SIZE 20 struct ether_hdr { unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ unsigned char h_source[ETH_ALEN]; /* source ether addr */ unsigned char h_dest_snap; unsigned char h_source_snap; unsigned char h_command; unsigned char h_vendor_id[3]; __be16 h_proto; /* packet type ID field */ #define ETHER_PROTOCOL_TYPE_EAP 0x888e #define ETHER_PROTOCOL_TYPE_IP 0x0800 #define ETHER_PROTOCOL_TYPE_ARP 0x0806 /* followed by length octets of data */ } __packed; struct ieee802_1x_hdr { unsigned char version; unsigned char type; unsigned short length; /* followed by length octets of data */ } __packed; #define EAPOL_VERSION 2 enum { IEEE802_1X_TYPE_EAP_PACKET = 0, IEEE802_1X_TYPE_EAPOL_START = 1, IEEE802_1X_TYPE_EAPOL_LOGOFF = 2, IEEE802_1X_TYPE_EAPOL_KEY = 3, IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT = 4 }; enum { EAPOL_KEY_TYPE_RC4 = 1, EAPOL_KEY_TYPE_RSN = 2, EAPOL_KEY_TYPE_WPA = 254 }; #define IEEE8021X_REPLAY_COUNTER_LEN 8 #define IEEE8021X_KEY_SIGN_LEN 16 #define IEEE8021X_KEY_IV_LEN 16 #define IEEE8021X_KEY_INDEX_FLAG 0x80 #define IEEE8021X_KEY_INDEX_MASK 0x03 struct ieee802_1x_eapol_key { unsigned char type; unsigned short key_length; /* * does not repeat within the life of the keying material used to * encrypt the Key field; 64-bit NTP timestamp MAY be used here */ unsigned char replay_counter[IEEE8021X_REPLAY_COUNTER_LEN]; unsigned char key_iv[IEEE8021X_KEY_IV_LEN]; /* cryptographically random * number */ unsigned char key_index; /* * key flag in the most significant bit: * 0 = broadcast (default key), * 1 = unicast (key mapping key); * key index is in the 7 least * significant bits */ /* * HMAC-MD5 message integrity check computed with MS-MPPE-Send-Key as * the key */ unsigned char key_signature[IEEE8021X_KEY_SIGN_LEN]; /* * followed by key: if packet body length = 44 + key length, then the * key field (of key_length bytes) contains the key in encrypted form; * if packet body length = 44, key field is absent and key_length * represents the number of least significant octets from * MS-MPPE-Send-Key attribute to be used as the keying material; * RC4 key used in encryption = Key-IV + MS-MPPE-Recv-Key */ } __packed; #define WPA_NONCE_LEN 32 #define WPA_REPLAY_COUNTER_LEN 8 struct wpa_eapol_key { unsigned char type; __be16 key_info; unsigned short key_length; unsigned char replay_counter[WPA_REPLAY_COUNTER_LEN]; unsigned char key_nonce[WPA_NONCE_LEN]; unsigned char key_iv[16]; unsigned char key_rsc[8]; unsigned char key_id[8]; /* Reserved in IEEE 802.11i/RSN */ unsigned char key_mic[16]; unsigned short key_data_length; /* followed by key_data_length bytes of key_data */ } __packed; #define WPA_KEY_INFO_TYPE_MASK (WBIT(0) | WBIT(1) | WBIT(2)) #define WPA_KEY_INFO_TYPE_HMAC_MD5_RC4 WBIT(0) #define WPA_KEY_INFO_TYPE_HMAC_SHA1_AES WBIT(1) #define WPA_KEY_INFO_KEY_TYPE WBIT(3) /* 1 = Pairwise, 0 = Group key */ /* bit4..5 is used in WPA, but is reserved in IEEE 802.11i/RSN */ #define WPA_KEY_INFO_KEY_INDEX_MASK (WBIT(4) | WBIT(5)) #define WPA_KEY_INFO_KEY_INDEX_SHIFT 4 #define WPA_KEY_INFO_INSTALL WBIT(6) /* pairwise */ #define WPA_KEY_INFO_TXRX WBIT(6) /* group */ #define WPA_KEY_INFO_ACK WBIT(7) #define WPA_KEY_INFO_MIC WBIT(8) #define WPA_KEY_INFO_SECURE WBIT(9) #define WPA_KEY_INFO_ERROR WBIT(10) #define WPA_KEY_INFO_REQUEST WBIT(11) #define WPA_KEY_INFO_ENCR_KEY_DATA WBIT(12) /* IEEE 802.11i/RSN only */ #define WPA_CAPABILITY_PREAUTH WBIT(0) #define GENERIC_INFO_ELEM 0xdd #define RSN_INFO_ELEM 0x30 enum { REASON_UNSPECIFIED = 1, REASON_DEAUTH_LEAVING = 3, REASON_INVALID_IE = 13, REASON_MICHAEL_MIC_FAILURE = 14, REASON_4WAY_HANDSHAKE_TIMEOUT = 15, REASON_GROUP_KEY_UPDATE_TIMEOUT = 16, REASON_IE_IN_4WAY_DIFFERS = 17, REASON_GROUP_CIPHER_NOT_VALID = 18, REASON_PAIRWISE_CIPHER_NOT_VALID = 19, REASON_AKMP_NOT_VALID = 20, REASON_UNSUPPORTED_RSN_IE_VERSION = 21, REASON_INVALID_RSN_IE_CAPAB = 22, REASON_IEEE_802_1X_AUTH_FAILED = 23, REASON_CIPHER_SUITE_REJECTED = 24 }; #endif /* EAP_PACKET_H */