18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * EAPOL definitions shared between hostapd and wpa_supplicant
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2002-2007, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef EAPOL_COMMON_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAPOL_COMMON_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* IEEE Std 802.1X-2004 */
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(push, 1)
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct ieee802_1x_hdr {
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 version;
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 type;
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	be16 length;
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* followed by length octets of data */
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED;
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
255a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidtstruct ieee8023_hdr {
265a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 dest[ETH_ALEN];
275a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u8 src[ETH_ALEN];
285a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt	u16 ethertype;
295a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt} STRUCT_PACKED;
305a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(pop)
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
355a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#ifdef CONFIG_MACSEC
365a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#define EAPOL_VERSION 3
375a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#else /* CONFIG_MACSEC */
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAPOL_VERSION 2
395a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt#endif /* CONFIG_MACSEC */
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { IEEE802_1X_TYPE_EAP_PACKET = 0,
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       IEEE802_1X_TYPE_EAPOL_START = 1,
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       IEEE802_1X_TYPE_EAPOL_LOGOFF = 2,
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       IEEE802_1X_TYPE_EAPOL_KEY = 3,
455a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt       IEEE802_1X_TYPE_EAPOL_ENCAPSULATED_ASF_ALERT = 4,
465a1480c7c46c4236d93bfd303dde32062bee04acDmitry Shmidt       IEEE802_1X_TYPE_EAPOL_MKA = 5,
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtenum { EAPOL_KEY_TYPE_RC4 = 1, EAPOL_KEY_TYPE_RSN = 2,
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       EAPOL_KEY_TYPE_WPA = 254 };
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
5261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define IEEE8021X_REPLAY_COUNTER_LEN 8
5461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define IEEE8021X_KEY_SIGN_LEN 16
5561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define IEEE8021X_KEY_IV_LEN 16
5661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
5761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define IEEE8021X_KEY_INDEX_FLAG 0x80
5861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#define IEEE8021X_KEY_INDEX_MASK 0x03
5961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
6061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef _MSC_VER
6161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#pragma pack(push, 1)
6261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* _MSC_VER */
6361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
6461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidtstruct ieee802_1x_eapol_key {
6561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 type;
6661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	/* Note: key_length is unaligned */
6761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 key_length[2];
6861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	/* does not repeat within the life of the keying material used to
6961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * encrypt the Key field; 64-bit NTP timestamp MAY be used here */
7061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 replay_counter[IEEE8021X_REPLAY_COUNTER_LEN];
7161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 key_iv[IEEE8021X_KEY_IV_LEN]; /* cryptographically random number */
7261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 key_index; /* key flag in the most significant bit:
7361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       * 0 = broadcast (default key),
7461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       * 1 = unicast (key mapping key); key index is in the
7561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt		       * 7 least significant bits */
7661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	/* HMAC-MD5 message integrity check computed with MS-MPPE-Send-Key as
7761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * the key */
7861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	u8 key_signature[IEEE8021X_KEY_SIGN_LEN];
7961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	/* followed by key: if packet body length = 44 + key length, then the
8161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * key field (of key_length bytes) contains the key in encrypted form;
8261d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * if packet body length = 44, key field is absent and key_length
8361d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * represents the number of least significant octets from
8461d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * MS-MPPE-Send-Key attribute to be used as the keying material;
8561d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt	 * RC4 key used in encryption = Key-IV + MS-MPPE-Recv-Key */
8661d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt} STRUCT_PACKED;
8761d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
8861d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#ifdef _MSC_VER
8961d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#pragma pack(pop)
9061d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt#endif /* _MSC_VER */
9161d9df3e62aaa0e87ad05452fcb95142159a17b6Dmitry Shmidt
928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAPOL_COMMON_H */
93