wpa_supplicant / hostapd  2.5
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
Data Structures | Macros | Functions | Variables
wpa_common.h File Reference

WPA definitions shared between hostapd and wpa_supplicant. More...

Go to the source code of this file.

Data Structures

struct  wpa_eapol_key
 
struct  wpa_eapol_key_192
 
struct  wpa_ptk
 WPA Pairwise Transient Key IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy. More...
 
struct  wpa_ie_hdr
 
struct  rsn_ie_hdr
 
struct  rsn_error_kde
 
struct  rsn_mdie
 
struct  rsn_ftie
 
struct  rsn_rdie
 
struct  wpa_ie_data
 
struct  wpa_ft_ies
 

Macros

#define PMKID_LEN   16
 
#define PMK_LEN   32
 
#define WPA_REPLAY_COUNTER_LEN   8
 
#define WPA_NONCE_LEN   32
 
#define WPA_KEY_RSC_LEN   8
 
#define WPA_GMK_LEN   32
 
#define WPA_GTK_MAX_LEN   32
 
#define WPA_ALLOWED_PAIRWISE_CIPHERS
 
#define WPA_ALLOWED_GROUP_CIPHERS
 
#define WPA_SELECTOR_LEN   4
 
#define WPA_VERSION   1
 
#define RSN_SELECTOR_LEN   4
 
#define RSN_VERSION   1
 
#define RSN_SELECTOR(a, b, c, d)
 
#define WPA_AUTH_KEY_MGMT_NONE   RSN_SELECTOR(0x00, 0x50, 0xf2, 0)
 
#define WPA_AUTH_KEY_MGMT_UNSPEC_802_1X   RSN_SELECTOR(0x00, 0x50, 0xf2, 1)
 
#define WPA_AUTH_KEY_MGMT_PSK_OVER_802_1X   RSN_SELECTOR(0x00, 0x50, 0xf2, 2)
 
#define WPA_AUTH_KEY_MGMT_CCKM   RSN_SELECTOR(0x00, 0x40, 0x96, 0)
 
#define WPA_CIPHER_SUITE_NONE   RSN_SELECTOR(0x00, 0x50, 0xf2, 0)
 
#define WPA_CIPHER_SUITE_TKIP   RSN_SELECTOR(0x00, 0x50, 0xf2, 2)
 
#define WPA_CIPHER_SUITE_CCMP   RSN_SELECTOR(0x00, 0x50, 0xf2, 4)
 
#define RSN_AUTH_KEY_MGMT_UNSPEC_802_1X   RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
 
#define RSN_AUTH_KEY_MGMT_PSK_OVER_802_1X   RSN_SELECTOR(0x00, 0x0f, 0xac, 2)
 
#define RSN_AUTH_KEY_MGMT_802_1X_SHA256   RSN_SELECTOR(0x00, 0x0f, 0xac, 5)
 
#define RSN_AUTH_KEY_MGMT_PSK_SHA256   RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
 
#define RSN_AUTH_KEY_MGMT_TPK_HANDSHAKE   RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
 
#define RSN_AUTH_KEY_MGMT_SAE   RSN_SELECTOR(0x00, 0x0f, 0xac, 8)
 
#define RSN_AUTH_KEY_MGMT_FT_SAE   RSN_SELECTOR(0x00, 0x0f, 0xac, 9)
 
#define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B   RSN_SELECTOR(0x00, 0x0f, 0xac, 11)
 
#define RSN_AUTH_KEY_MGMT_802_1X_SUITE_B_192   RSN_SELECTOR(0x00, 0x0f, 0xac, 12)
 
#define RSN_AUTH_KEY_MGMT_FT_802_1X_SUITE_B_192   RSN_SELECTOR(0x00, 0x0f, 0xac, 13)
 
#define RSN_AUTH_KEY_MGMT_CCKM   RSN_SELECTOR(0x00, 0x40, 0x96, 0x00)
 
#define RSN_AUTH_KEY_MGMT_OSEN   RSN_SELECTOR(0x50, 0x6f, 0x9a, 0x01)
 
#define RSN_CIPHER_SUITE_NONE   RSN_SELECTOR(0x00, 0x0f, 0xac, 0)
 
#define RSN_CIPHER_SUITE_TKIP   RSN_SELECTOR(0x00, 0x0f, 0xac, 2)
 
#define RSN_CIPHER_SUITE_CCMP   RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
 
#define RSN_CIPHER_SUITE_AES_128_CMAC   RSN_SELECTOR(0x00, 0x0f, 0xac, 6)
 
#define RSN_CIPHER_SUITE_NO_GROUP_ADDRESSED   RSN_SELECTOR(0x00, 0x0f, 0xac, 7)
 
#define RSN_CIPHER_SUITE_GCMP   RSN_SELECTOR(0x00, 0x0f, 0xac, 8)
 
#define RSN_CIPHER_SUITE_GCMP_256   RSN_SELECTOR(0x00, 0x0f, 0xac, 9)
 
#define RSN_CIPHER_SUITE_CCMP_256   RSN_SELECTOR(0x00, 0x0f, 0xac, 10)
 
#define RSN_CIPHER_SUITE_BIP_GMAC_128   RSN_SELECTOR(0x00, 0x0f, 0xac, 11)
 
#define RSN_CIPHER_SUITE_BIP_GMAC_256   RSN_SELECTOR(0x00, 0x0f, 0xac, 12)
 
#define RSN_CIPHER_SUITE_BIP_CMAC_256   RSN_SELECTOR(0x00, 0x0f, 0xac, 13)
 
#define RSN_KEY_DATA_GROUPKEY   RSN_SELECTOR(0x00, 0x0f, 0xac, 1)
 
#define RSN_KEY_DATA_MAC_ADDR   RSN_SELECTOR(0x00, 0x0f, 0xac, 3)
 
#define RSN_KEY_DATA_PMKID   RSN_SELECTOR(0x00, 0x0f, 0xac, 4)
 
#define RSN_KEY_DATA_KEYID   RSN_SELECTOR(0x00, 0x0f, 0xac, 10)
 
#define RSN_KEY_DATA_MULTIBAND_GTK   RSN_SELECTOR(0x00, 0x0f, 0xac, 11)
 
#define RSN_KEY_DATA_MULTIBAND_KEYID   RSN_SELECTOR(0x00, 0x0f, 0xac, 12)
 
#define WFA_KEY_DATA_IP_ADDR_REQ   RSN_SELECTOR(0x50, 0x6f, 0x9a, 4)
 
#define WFA_KEY_DATA_IP_ADDR_ALLOC   RSN_SELECTOR(0x50, 0x6f, 0x9a, 5)
 
#define WPA_OUI_TYPE   RSN_SELECTOR(0x00, 0x50, 0xf2, 1)
 
#define RSN_SELECTOR_PUT(a, val)   WPA_PUT_BE32((u8 *) (a), (val))
 
#define RSN_SELECTOR_GET(a)   WPA_GET_BE32((const u8 *) (a))
 
#define RSN_NUM_REPLAY_COUNTERS_1   0
 
#define RSN_NUM_REPLAY_COUNTERS_2   1
 
#define RSN_NUM_REPLAY_COUNTERS_4   2
 
#define RSN_NUM_REPLAY_COUNTERS_16   3
 
#define WPA_CAPABILITY_PREAUTH   BIT(0)
 
#define WPA_CAPABILITY_NO_PAIRWISE   BIT(1)
 
#define WPA_CAPABILITY_MFPR   BIT(6)
 
#define WPA_CAPABILITY_MFPC   BIT(7)
 
#define WPA_CAPABILITY_PEERKEY_ENABLED   BIT(9)
 
#define WPA_CAPABILITY_SPP_A_MSDU_CAPABLE   BIT(10)
 
#define WPA_CAPABILITY_SPP_A_MSDU_REQUIRED   BIT(11)
 
#define WPA_CAPABILITY_PBAC   BIT(12)
 
#define WPA_CAPABILITY_EXT_KEY_ID_FOR_UNICAST   BIT(13)
 
#define MOBILITY_DOMAIN_ID_LEN   2
 
#define FT_R0KH_ID_MAX_LEN   48
 
#define FT_R1KH_ID_LEN   6
 
#define WPA_PMK_NAME_LEN   16
 
#define WPA_KEY_INFO_TYPE_MASK   ((u16) (BIT(0) | BIT(1) | BIT(2)))
 
#define WPA_KEY_INFO_TYPE_AKM_DEFINED   0
 
#define WPA_KEY_INFO_TYPE_HMAC_MD5_RC4   BIT(0)
 
#define WPA_KEY_INFO_TYPE_HMAC_SHA1_AES   BIT(1)
 
#define WPA_KEY_INFO_TYPE_AES_128_CMAC   3
 
#define WPA_KEY_INFO_KEY_TYPE   BIT(3) /* 1 = Pairwise, 0 = Group key */
 
#define WPA_KEY_INFO_KEY_INDEX_MASK   (BIT(4) | BIT(5))
 
#define WPA_KEY_INFO_KEY_INDEX_SHIFT   4
 
#define WPA_KEY_INFO_INSTALL   BIT(6) /* pairwise */
 
#define WPA_KEY_INFO_TXRX   BIT(6) /* group */
 
#define WPA_KEY_INFO_ACK   BIT(7)
 
#define WPA_KEY_INFO_MIC   BIT(8)
 
#define WPA_KEY_INFO_SECURE   BIT(9)
 
#define WPA_KEY_INFO_ERROR   BIT(10)
 
#define WPA_KEY_INFO_REQUEST   BIT(11)
 
#define WPA_KEY_INFO_ENCR_KEY_DATA   BIT(12) /* IEEE 802.11i/RSN only */
 
#define WPA_KEY_INFO_SMK_MESSAGE   BIT(13)
 
#define WPA_EAPOL_KEY_MIC_MAX_LEN   24
 
#define WPA_KCK_MAX_LEN   24
 
#define WPA_KEK_MAX_LEN   32
 
#define WPA_TK_MAX_LEN   32
 
#define RSN_FT_CAPAB_FT_OVER_DS   BIT(0)
 
#define RSN_FT_CAPAB_FT_RESOURCE_REQ_SUPP   BIT(1)
 
#define FTIE_SUBELEM_R1KH_ID   1
 
#define FTIE_SUBELEM_GTK   2
 
#define FTIE_SUBELEM_R0KH_ID   3
 
#define FTIE_SUBELEM_IGTK   4
 

Functions

int wpa_eapol_key_mic (const u8 *key, size_t key_len, int akmp, int ver, const u8 *buf, size_t len, u8 *mic)
 Calculate EAPOL-Key MIC. More...
 
int wpa_pmk_to_ptk (const u8 *pmk, size_t pmk_len, const char *label, const u8 *addr1, const u8 *addr2, const u8 *nonce1, const u8 *nonce2, struct wpa_ptk *ptk, int akmp, int cipher)
 Calculate PTK from PMK, addresses, and nonces. More...
 
int wpa_parse_wpa_ie_rsn (const u8 *rsn_ie, size_t rsn_ie_len, struct wpa_ie_data *data)
 Parse RSN IE. More...
 
int wpa_parse_wpa_ie_wpa (const u8 *wpa_ie, size_t wpa_ie_len, struct wpa_ie_data *data)
 
void rsn_pmkid (const u8 *pmk, size_t pmk_len, const u8 *aa, const u8 *spa, u8 *pmkid, int use_sha256)
 Calculate PMK identifier. More...
 
const char * wpa_cipher_txt (int cipher)
 Convert cipher suite to a text string. More...
 
const char * wpa_key_mgmt_txt (int key_mgmt, int proto)
 Convert key management suite to a text string. More...
 
u32 wpa_akm_to_suite (int akm)
 
int wpa_compare_rsn_ie (int ft_initial_assoc, const u8 *ie1, size_t ie1len, const u8 *ie2, size_t ie2len)
 
int wpa_insert_pmkid (u8 *ies, size_t ies_len, const u8 *pmkid)
 
int wpa_ft_parse_ies (const u8 *ies, size_t ies_len, struct wpa_ft_ies *parse)
 
int wpa_cipher_key_len (int cipher)
 
int wpa_cipher_rsc_len (int cipher)
 
int wpa_cipher_to_alg (int cipher)
 
int wpa_cipher_valid_group (int cipher)
 
int wpa_cipher_valid_pairwise (int cipher)
 
int wpa_cipher_valid_mgmt_group (int cipher)
 
u32 wpa_cipher_to_suite (int proto, int cipher)
 
int rsn_cipher_put_suites (u8 *pos, int ciphers)
 
int wpa_cipher_put_suites (u8 *pos, int ciphers)
 
int wpa_pick_pairwise_cipher (int ciphers, int none_allowed)
 
int wpa_pick_group_cipher (int ciphers)
 
int wpa_parse_cipher (const char *value)
 
int wpa_write_ciphers (char *start, char *end, int ciphers, const char *delim)
 
int wpa_select_ap_group_cipher (int wpa, int wpa_pairwise, int rsn_pairwise)
 
unsigned int wpa_mic_len (int akmp)
 

Variables

struct wpa_eapol_key STRUCT_PACKED
 

Detailed Description

WPA definitions shared between hostapd and wpa_supplicant.

Macro Definition Documentation

#define RSN_SELECTOR (   a,
  b,
  c,
 
)
Value:
((((u32) (a)) << 24) | (((u32) (b)) << 16) | (((u32) (c)) << 8) | \
(u32) (d))
#define WPA_ALLOWED_GROUP_CIPHERS
Value:
(WPA_CIPHER_CCMP | WPA_CIPHER_GCMP | WPA_CIPHER_TKIP | \
WPA_CIPHER_GCMP_256 | WPA_CIPHER_CCMP_256 | \
WPA_CIPHER_GTK_NOT_USED)
#define WPA_ALLOWED_PAIRWISE_CIPHERS
Value:
(WPA_CIPHER_CCMP | WPA_CIPHER_GCMP | WPA_CIPHER_TKIP | WPA_CIPHER_NONE | \
WPA_CIPHER_GCMP_256 | WPA_CIPHER_CCMP_256)

Function Documentation

void rsn_pmkid ( const u8 *  pmk,
size_t  pmk_len,
const u8 *  aa,
const u8 *  spa,
u8 *  pmkid,
int  use_sha256 
)

Calculate PMK identifier.

Parameters
pmkPairwise master key
pmk_lenLength of pmk in bytes
aaAuthenticator address
spaSupplicant address
pmkidBuffer for PMKID
use_sha256Whether to use SHA256-based KDF

IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy PMKID = HMAC-SHA1-128(PMK, "PMK Name" || AA || SPA)

const char* wpa_cipher_txt ( int  cipher)

Convert cipher suite to a text string.

Parameters
cipherCipher suite (WPA_CIPHER_* enum)
Returns
Pointer to a text string of the cipher suite name
int wpa_eapol_key_mic ( const u8 *  key,
size_t  key_len,
int  akmp,
int  ver,
const u8 *  buf,
size_t  len,
u8 *  mic 
)

Calculate EAPOL-Key MIC.

Parameters
keyEAPOL-Key Key Confirmation Key (KCK)
key_lenKCK length in octets
akmpWPA_KEY_MGMT_* used in key derivation
verKey descriptor version (WPA_KEY_INFO_TYPE_*)
bufPointer to the beginning of the EAPOL header (version field)
lenLength of the EAPOL frame (from EAPOL header to the end of the frame)
micPointer to the buffer to which the EAPOL-Key MIC is written
Returns
0 on success, -1 on failure

Calculate EAPOL-Key MIC for an EAPOL-Key packet. The EAPOL-Key MIC field has to be cleared (all zeroes) when calling this function.

Note: 'IEEE Std 802.11i-2004 - 8.5.2 EAPOL-Key frames' has an error in the description of the Key MIC calculation. It includes packet data from the beginning of the EAPOL-Key header, not EAPOL header. This incorrect change happened during final editing of the standard and the correct behavior is defined in the last draft (IEEE 802.11i/D10).

const char* wpa_key_mgmt_txt ( int  key_mgmt,
int  proto 
)

Convert key management suite to a text string.

Parameters
key_mgmtKey management suite (WPA_KEY_MGMT_* enum)
protoWPA/WPA2 version (WPA_PROTO_*)
Returns
Pointer to a text string of the key management suite name
int wpa_parse_wpa_ie_rsn ( const u8 *  rsn_ie,
size_t  rsn_ie_len,
struct wpa_ie_data data 
)

Parse RSN IE.

Parameters
rsn_ieBuffer containing RSN IE
rsn_ie_lenRSN IE buffer length (including IE number and length octets)
dataPointer to structure that will be filled in with parsed data
Returns
0 on success, <0 on failure
int wpa_pmk_to_ptk ( const u8 *  pmk,
size_t  pmk_len,
const char *  label,
const u8 *  addr1,
const u8 *  addr2,
const u8 *  nonce1,
const u8 *  nonce2,
struct wpa_ptk ptk,
int  akmp,
int  cipher 
)

Calculate PTK from PMK, addresses, and nonces.

Parameters
pmkPairwise master key
pmk_lenLength of PMK
labelLabel to use in derivation
addr1AA or SA
addr2SA or AA
nonce1ANonce or SNonce
nonce2SNonce or ANonce
ptkBuffer for pairwise transient key
akmpNegotiated AKM
cipherNegotiated pairwise cipher
Returns
0 on success, -1 on failure

IEEE Std 802.11i-2004 - 8.5.1.2 Pairwise key hierarchy PTK = PRF-X(PMK, "Pairwise key expansion", Min(AA, SA) || Max(AA, SA) || Min(ANonce, SNonce) || Max(ANonce, SNonce))

STK = PRF-X(SMK, "Peer key expansion", Min(MAC_I, MAC_P) || Max(MAC_I, MAC_P) || Min(INonce, PNonce) || Max(INonce, PNonce))