Home | History | Annotate | Download | only in proto
      1 /*
      2  * Copyright (C) 1999-2013, Broadcom Corporation
      3  *
      4  * Permission to use, copy, modify, and/or distribute this software for any
      5  * purpose with or without fee is hereby granted, provided that the above
      6  * copyright notice and this permission notice appear in all copies.
      7  *
      8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
      9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
     11  * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
     13  * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
     14  * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     15  *
     16  * $Id: eapol.h 382882 2013-02-04 23:24:31Z $
     17  */
     18 
     19 #ifndef _eapol_h_
     20 #define _eapol_h_
     21 
     22 #ifndef _TYPEDEFS_H_
     23 #include <typedefs.h>
     24 #endif
     25 
     26 /* This marks the start of a packed structure section. */
     27 #include <packed_section_start.h>
     28 
     29 #include <bcmcrypto/aeskeywrap.h>
     30 
     31 /* EAPOL for 802.3/Ethernet */
     32 typedef BWL_PRE_PACKED_STRUCT struct {
     33 	struct ether_header eth;	/* 802.3/Ethernet header */
     34 	unsigned char version;		/* EAPOL protocol version */
     35 	unsigned char type;		/* EAPOL type */
     36 	unsigned short length;		/* Length of body */
     37 	unsigned char body[1];		/* Body (optional) */
     38 } BWL_POST_PACKED_STRUCT eapol_header_t;
     39 
     40 #define EAPOL_HEADER_LEN 18
     41 
     42 typedef struct {
     43 	unsigned char version;		/* EAPOL protocol version */
     44 	unsigned char type;		/* EAPOL type */
     45 	unsigned short length;		/* Length of body */
     46 } eapol_hdr_t;
     47 
     48 #define EAPOL_HDR_LEN 4
     49 
     50 /* EAPOL version */
     51 #define WPA2_EAPOL_VERSION	2
     52 #define WPA_EAPOL_VERSION	1
     53 #define LEAP_EAPOL_VERSION	1
     54 #define SES_EAPOL_VERSION	1
     55 
     56 /* EAPOL types */
     57 #define EAP_PACKET		0
     58 #define EAPOL_START		1
     59 #define EAPOL_LOGOFF		2
     60 #define EAPOL_KEY		3
     61 #define EAPOL_ASF		4
     62 
     63 /* EAPOL-Key types */
     64 #define EAPOL_RC4_KEY		1
     65 #define EAPOL_WPA2_KEY		2	/* 802.11i/WPA2 */
     66 #define EAPOL_WPA_KEY		254	/* WPA */
     67 
     68 /* RC4 EAPOL-Key header field sizes */
     69 #define EAPOL_KEY_REPLAY_LEN	8
     70 #define EAPOL_KEY_IV_LEN	16
     71 #define EAPOL_KEY_SIG_LEN	16
     72 
     73 /* RC4 EAPOL-Key */
     74 typedef BWL_PRE_PACKED_STRUCT struct {
     75 	unsigned char type;			/* Key Descriptor Type */
     76 	unsigned short length;			/* Key Length (unaligned) */
     77 	unsigned char replay[EAPOL_KEY_REPLAY_LEN];	/* Replay Counter */
     78 	unsigned char iv[EAPOL_KEY_IV_LEN];		/* Key IV */
     79 	unsigned char index;				/* Key Flags & Index */
     80 	unsigned char signature[EAPOL_KEY_SIG_LEN];	/* Key Signature */
     81 	unsigned char key[1];				/* Key (optional) */
     82 } BWL_POST_PACKED_STRUCT eapol_key_header_t;
     83 
     84 #define EAPOL_KEY_HEADER_LEN 	44
     85 
     86 /* RC4 EAPOL-Key flags */
     87 #define EAPOL_KEY_FLAGS_MASK	0x80
     88 #define EAPOL_KEY_BROADCAST	0
     89 #define EAPOL_KEY_UNICAST	0x80
     90 
     91 /* RC4 EAPOL-Key index */
     92 #define EAPOL_KEY_INDEX_MASK	0x7f
     93 
     94 /* WPA/802.11i/WPA2 EAPOL-Key header field sizes */
     95 #define EAPOL_WPA_KEY_REPLAY_LEN	8
     96 #define EAPOL_WPA_KEY_NONCE_LEN		32
     97 #define EAPOL_WPA_KEY_IV_LEN		16
     98 #define EAPOL_WPA_KEY_RSC_LEN		8
     99 #define EAPOL_WPA_KEY_ID_LEN		8
    100 #define EAPOL_WPA_KEY_MIC_LEN		16
    101 #define EAPOL_WPA_KEY_DATA_LEN		(EAPOL_WPA_MAX_KEY_SIZE + AKW_BLOCK_LEN)
    102 #define EAPOL_WPA_MAX_KEY_SIZE		32
    103 
    104 /* WPA EAPOL-Key */
    105 typedef BWL_PRE_PACKED_STRUCT struct {
    106 	unsigned char type;		/* Key Descriptor Type */
    107 	unsigned short key_info;	/* Key Information (unaligned) */
    108 	unsigned short key_len;		/* Key Length (unaligned) */
    109 	unsigned char replay[EAPOL_WPA_KEY_REPLAY_LEN];	/* Replay Counter */
    110 	unsigned char nonce[EAPOL_WPA_KEY_NONCE_LEN];	/* Nonce */
    111 	unsigned char iv[EAPOL_WPA_KEY_IV_LEN];		/* Key IV */
    112 	unsigned char rsc[EAPOL_WPA_KEY_RSC_LEN];	/* Key RSC */
    113 	unsigned char id[EAPOL_WPA_KEY_ID_LEN];		/* WPA:Key ID, 802.11i/WPA2: Reserved */
    114 	unsigned char mic[EAPOL_WPA_KEY_MIC_LEN];	/* Key MIC */
    115 	unsigned short data_len;			/* Key Data Length */
    116 	unsigned char data[EAPOL_WPA_KEY_DATA_LEN];	/* Key data */
    117 } BWL_POST_PACKED_STRUCT eapol_wpa_key_header_t;
    118 
    119 #define EAPOL_WPA_KEY_LEN 		95
    120 
    121 /* WPA/802.11i/WPA2 KEY KEY_INFO bits */
    122 #define WPA_KEY_DESC_V1		0x01
    123 #define WPA_KEY_DESC_V2		0x02
    124 #define WPA_KEY_DESC_V3		0x03
    125 #define WPA_KEY_PAIRWISE	0x08
    126 #define WPA_KEY_INSTALL		0x40
    127 #define WPA_KEY_ACK		0x80
    128 #define WPA_KEY_MIC		0x100
    129 #define WPA_KEY_SECURE		0x200
    130 #define WPA_KEY_ERROR		0x400
    131 #define WPA_KEY_REQ		0x800
    132 
    133 #define WPA_KEY_DESC_V2_OR_V3 WPA_KEY_DESC_V2
    134 
    135 /* WPA-only KEY KEY_INFO bits */
    136 #define WPA_KEY_INDEX_0		0x00
    137 #define WPA_KEY_INDEX_1		0x10
    138 #define WPA_KEY_INDEX_2		0x20
    139 #define WPA_KEY_INDEX_3		0x30
    140 #define WPA_KEY_INDEX_MASK	0x30
    141 #define WPA_KEY_INDEX_SHIFT	0x04
    142 
    143 /* 802.11i/WPA2-only KEY KEY_INFO bits */
    144 #define WPA_KEY_ENCRYPTED_DATA	0x1000
    145 
    146 /* Key Data encapsulation */
    147 typedef BWL_PRE_PACKED_STRUCT struct {
    148 	uint8 type;
    149 	uint8 length;
    150 	uint8 oui[3];
    151 	uint8 subtype;
    152 	uint8 data[1];
    153 } BWL_POST_PACKED_STRUCT eapol_wpa2_encap_data_t;
    154 
    155 #define EAPOL_WPA2_ENCAP_DATA_HDR_LEN 	6
    156 
    157 #define WPA2_KEY_DATA_SUBTYPE_GTK	1
    158 #define WPA2_KEY_DATA_SUBTYPE_STAKEY	2
    159 #define WPA2_KEY_DATA_SUBTYPE_MAC	3
    160 #define WPA2_KEY_DATA_SUBTYPE_PMKID	4
    161 #define WPA2_KEY_DATA_SUBTYPE_IGTK	9
    162 
    163 /* GTK encapsulation */
    164 typedef BWL_PRE_PACKED_STRUCT struct {
    165 	uint8	flags;
    166 	uint8	reserved;
    167 	uint8	gtk[EAPOL_WPA_MAX_KEY_SIZE];
    168 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_gtk_encap_t;
    169 
    170 #define EAPOL_WPA2_KEY_GTK_ENCAP_HDR_LEN 	2
    171 
    172 #define WPA2_GTK_INDEX_MASK	0x03
    173 #define WPA2_GTK_INDEX_SHIFT	0x00
    174 
    175 #define WPA2_GTK_TRANSMIT	0x04
    176 
    177 /* IGTK encapsulation */
    178 typedef BWL_PRE_PACKED_STRUCT struct {
    179 	uint16	key_id;
    180 	uint8	ipn[6];
    181 	uint8	key[EAPOL_WPA_MAX_KEY_SIZE];
    182 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_igtk_encap_t;
    183 
    184 #define EAPOL_WPA2_KEY_IGTK_ENCAP_HDR_LEN 	8
    185 
    186 /* STAKey encapsulation */
    187 typedef BWL_PRE_PACKED_STRUCT struct {
    188 	uint8	reserved[2];
    189 	uint8	mac[ETHER_ADDR_LEN];
    190 	uint8	stakey[EAPOL_WPA_MAX_KEY_SIZE];
    191 } BWL_POST_PACKED_STRUCT eapol_wpa2_key_stakey_encap_t;
    192 
    193 #define WPA2_KEY_DATA_PAD	0xdd
    194 
    195 
    196 /* This marks the end of a packed structure section. */
    197 #include <packed_section_end.h>
    198 
    199 #endif /* _eapol_h_ */
    200