• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * 802.1x EAPOL definitions
3  *
4  * See
5  * IEEE Std 802.1X-2001
6  * IEEE 802.1X RADIUS Usage Guidelines
7  *
8  * Copyright (C) 2002 Broadcom Corporation
9  *
10  * $Id: eapol.h,v 9.18.260.1.2.1.6.6 2009/04/08 05:00:08 Exp $
11  */
12 
13 #ifndef _eapol_h_
14 #define _eapol_h_
15 
16 #ifndef _TYPEDEFS_H_
17 #include <typedefs.h>
18 #endif
19 
20 /* This marks the start of a packed structure section. */
21 #include <packed_section_start.h>
22 
23 #define AKW_BLOCK_LEN	8	/* The only def we need here */
24 
25 /* EAPOL for 802.3/Ethernet */
26 typedef struct {
27 	struct ether_header eth;	/* 802.3/Ethernet header */
28 	unsigned char version;		/* EAPOL protocol version */
29 	unsigned char type;		/* EAPOL type */
30 	unsigned short length;		/* Length of body */
31 	unsigned char body[1];		/* Body (optional) */
32 } eapol_header_t;
33 
34 #define EAPOL_HEADER_LEN 18
35 
36 /* EAPOL version */
37 #define WPA2_EAPOL_VERSION	2
38 #define WPA_EAPOL_VERSION	1
39 #define LEAP_EAPOL_VERSION	1
40 #define SES_EAPOL_VERSION	1
41 
42 /* EAPOL types */
43 #define EAP_PACKET		0
44 #define EAPOL_START		1
45 #define EAPOL_LOGOFF		2
46 #define EAPOL_KEY		3
47 #define EAPOL_ASF		4
48 
49 /* EAPOL-Key types */
50 #define EAPOL_RC4_KEY		1
51 #define EAPOL_WPA2_KEY		2	/* 802.11i/WPA2 */
52 #define EAPOL_WPA_KEY		254	/* WPA */
53 
54 /* RC4 EAPOL-Key header field sizes */
55 #define EAPOL_KEY_REPLAY_LEN	8
56 #define EAPOL_KEY_IV_LEN	16
57 #define EAPOL_KEY_SIG_LEN	16
58 
59 /* RC4 EAPOL-Key */
60 typedef BWL_PRE_PACKED_STRUCT struct {
61 	unsigned char type;			/* Key Descriptor Type */
62 	unsigned short length;			/* Key Length (unaligned) */
63 	unsigned char replay[EAPOL_KEY_REPLAY_LEN];	/* Replay Counter */
64 	unsigned char iv[EAPOL_KEY_IV_LEN];		/* Key IV */
65 	unsigned char index;				/* Key Flags & Index */
66 	unsigned char signature[EAPOL_KEY_SIG_LEN];	/* Key Signature */
67 	unsigned char key[1];				/* Key (optional) */
68 } BWL_POST_PACKED_STRUCT eapol_key_header_t;
69 
70 #define EAPOL_KEY_HEADER_LEN 	44
71 
72 /* RC4 EAPOL-Key flags */
73 #define EAPOL_KEY_FLAGS_MASK	0x80
74 #define EAPOL_KEY_BROADCAST	0
75 #define EAPOL_KEY_UNICAST	0x80
76 
77 /* RC4 EAPOL-Key index */
78 #define EAPOL_KEY_INDEX_MASK	0x7f
79 
80 /* WPA/802.11i/WPA2 EAPOL-Key header field sizes */
81 #define EAPOL_WPA_KEY_REPLAY_LEN	8
82 #define EAPOL_WPA_KEY_NONCE_LEN		32
83 #define EAPOL_WPA_KEY_IV_LEN		16
84 #define EAPOL_WPA_KEY_ID_LEN		8
85 #define EAPOL_WPA_KEY_RSC_LEN		8
86 #define EAPOL_WPA_KEY_MIC_LEN		16
87 #define EAPOL_WPA_KEY_DATA_LEN		(EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN)
88 #define EAPOL_WPA_MAX_KEY_SIZE		32
89 
90 /* WPA EAPOL-Key */
91 typedef BWL_PRE_PACKED_STRUCT struct {
92 	unsigned char type;		/* Key Descriptor Type */
93 	unsigned short key_info;	/* Key Information (unaligned) */
94 	unsigned short key_len;		/* Key Length (unaligned) */
95 	unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN];	/* Replay Counter */
96 	unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN];	/* Nonce */
97 	unsigned char iv[EAPOL_WPA_KEY_IV_LEN];		/* Key IV */
98 	unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN];	/* Key RSC */
99 	unsigned char id[EAPOL_WPA_KEY_ID_LEN];		/* WPA:Key ID, 802.11i/WPA2: Reserved */
100 	unsigned char mic[EAPOL_WPA_KEY_MIC_LEN];	/* Key MIC */
101 	unsigned short data_len;			/* Key Data Length */
102 	unsigned char data[EAPOL_WPA_KEY_DATA_LEN];	/* Key data */
103 } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t;
104 
105 #define EAPOL_WPA_KEY_LEN 		95
106 
107 /* WPA/802.11i/WPA2 KEY KEY_INFO bits */
108 #define WPA_KEY_DESC_V1		0x01
109 #define WPA_KEY_DESC_V2		0x02
110 #define WPA_KEY_PAIRWISE	0x08
111 #define WPA_KEY_INSTALL		0x40
112 #define WPA_KEY_ACK		0x80
113 #define WPA_KEY_MIC		0x100
114 #define WPA_KEY_SECURE		0x200
115 #define WPA_KEY_ERROR		0x400
116 #define WPA_KEY_REQ		0x800
117 
118 /* WPA-only KEY KEY_INFO bits */
119 #define WPA_KEY_INDEX_0		0x00
120 #define WPA_KEY_INDEX_1		0x10
121 #define WPA_KEY_INDEX_2		0x20
122 #define WPA_KEY_INDEX_3		0x30
123 #define WPA_KEY_INDEX_MASK	0x30
124 #define WPA_KEY_INDEX_SHIFT	0x04
125 
126 /* 802.11i/WPA2-only KEY KEY_INFO bits */
127 #define WPA_KEY_ENCRYPTED_DATA	0x1000
128 
129 /* Key Data encapsulation */
130 typedef BWL_PRE_PACKED_STRUCT struct {
131 	uint8 type;
132 	uint8 length;
133 	uint8 oui[3];
134 	uint8 subtype;
135 	uint8 data[1];
136 } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t;
137 
138 #define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 	6
139 
140 #define WPA2_KEY_DATA_SUBTYPE_GTK	1
141 #define WPA2_KEY_DATA_SUBTYPE_STAKEY	2
142 #define WPA2_KEY_DATA_SUBTYPE_MAC	3
143 #define WPA2_KEY_DATA_SUBTYPE_PMKID	4
144 
145 /* GTK encapsulation */
146 typedef BWL_PRE_PACKED_STRUCT struct {
147 	uint8	flags;
148 	uint8	reserved;
149 	uint8	gtk[EAPOL_WPA_MAX_KEY_SIZE];
150 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t;
151 
152 #define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 	2
153 
154 #define WPA2_GTK_INDEX_MASK	0x03
155 #define WPA2_GTK_INDEX_SHIFT	0x00
156 
157 #define WPA2_GTK_TRANSMIT	0x04
158 
159 /* STAKey encapsulation */
160 typedef BWL_PRE_PACKED_STRUCT struct {
161 	uint8	reserved[2];
162 	uint8	mac[ETHER_ADDR_LEN];
163 	uint8	stakey[EAPOL_WPA_MAX_KEY_SIZE];
164 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t;
165 
166 #define WPA2_KEY_DATA_PAD	0xdd
167 
168 
169 /* This marks the end of a packed structure section. */
170 #include <packed_section_end.h>
171 
172 #endif /* _eapol_h_ */
173