Ignore:
Timestamp:
2015-04-06T10:47:51Z (10 years ago)
Author:
Jan Kolarik <kolarik@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d7dadcb4
Parents:
59fa7ab
Message:

Scanning whole 2.4GHz spectrum, created supplicant for managing connection between device STA and AP, finished association process between STA and AP, handling 4way handshake protocol used for key management, written needed cryptographic algorithms (AES, SHA1, HMAC, PBKDF2) for CCMP protocol, data communication on OPEN/CCMP networks.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/ieee80211/include/ieee80211_private.h

    r59fa7ab r1dcc0b9  
    4040#define LIBNET_IEEE80211_PRIVATE_H
    4141
     42#include <fibril_synch.h>
    4243#include <byteorder.h>
    4344#include <ddf/driver.h>
     
    4647#include <ieee80211/ieee80211.h>
    4748#include "ieee80211.h"
     49
     50/* Timeout in us for waiting to authentication/association response. */
     51#define AUTH_TIMEOUT 200000
     52
     53/* Timeout in us for waiting to finish 4-way handshake process. */
     54#define HANDSHAKE_TIMEOUT 3000000
     55
     56/* Max period to rerun scan. */
     57#define MAX_SCAN_SPAN_SEC 30
     58
     59/* Max time to keep scan result. */
     60#define MAX_KEEP_SCAN_SPAN_SEC 120
     61
     62/* Security bit in capability info field. */
     63#define CAP_SECURITY 0x10
     64
     65/* Protocol type used in EAPOL frames. */
     66#define ETH_TYPE_PAE 0x888E
     67
     68/* WPA OUI used in vendor specific IE. */
     69#define WPA_OUI 0x0050F201
     70
     71/* GTK OUI used in vendor specific IE. */
     72#define GTK_OUI 0x000FAC01
     73
     74/* Max PTK key length. */
     75#define MAX_PTK_LENGTH 64
     76
     77/* Max GTK key length. */
     78#define MAX_GTK_LENGTH 64
     79
     80/* KEK offset inside PTK. */
     81#define KEK_OFFSET 16
     82
     83/* TK offset inside PTK. */
     84#define TK_OFFSET 32
     85
     86/* Length of CCMP header we need to reserve. */
     87#define IEEE80211_CCMP_HEADER_LENGTH 8
     88
     89/*
     90 * Length of data to be encrypted by PRF function:
     91 * NONCE + SNONCE (2 * 32) + DEST_MAC + SOURCE_MAC (2 * ETH_ADDR)
     92 */
     93#define PRF_CRYPT_DATA_LENGTH 2*32 + 2*ETH_ADDR
     94
     95/** IEEE 802.11 PTK key length. */
     96typedef enum {
     97        IEEE80211_PTK_CCMP_LENGTH = 48,
     98        IEEE80211_PTK_TKIP_LENGTH = 64
     99} ieee80211_ptk_length_t;
     100
     101/** IEEE 802.11 GTK key length. */
     102typedef enum {
     103        IEEE80211_GTK_CCMP_LENGTH = 16,
     104        IEEE80211_GTK_TKIP_LENGTH = 32
     105} ieee80211_gtk_length_t;
    48106
    49107/** IEEE 802.11 frame types. */
     
    55113} ieee80211_frame_type_t;
    56114
    57 /** IEEE 802.11 frame subtypes. */
     115/** IEEE 802.11 management frame subtypes. */
    58116typedef enum {
    59117        IEEE80211_MGMT_ASSOC_REQ_FRAME = 0x00,
     
    64122        IEEE80211_MGMT_PROBE_RESP_FRAME = 0x50,
    65123        IEEE80211_MGMT_BEACON_FRAME = 0x80,
    66         IEEE80211_MGMT_DIASSOC_FRAME = 0xA0,
     124        IEEE80211_MGMT_DISASSOC_FRAME = 0xA0,
    67125        IEEE80211_MGMT_AUTH_FRAME = 0xB0,
    68126        IEEE80211_MGMT_DEAUTH_FRAME = 0xC0,
    69 } ieee80211_frame_subtype_t;
     127} ieee80211_frame_mgmt_subtype_t;
     128
     129/** IEEE 802.11 data frame subtypes. */
     130typedef enum {
     131        IEEE80211_DATA_DATA_FRAME = 0x0000,
     132        IEEE80211_DATA_QOS_FRAME = 0x0080
     133} ieee80211_frame_data_subtype_t;
    70134
    71135/** IEEE 802.11 frame control value masks. */
     
    73137        IEEE80211_FRAME_CTRL_FRAME_TYPE = 0x000C,
    74138        IEEE80211_FRAME_CTRL_FRAME_SUBTYPE = 0x00F0,
    75 } ieee80211_frame_control_mask_t;
     139        IEEE80211_FRAME_CTRL_PROTECTED = 0x4000
     140} ieee80211_frame_ctrl_mask_t;
     141
     142/** IEEE 802.11 frame control DS field values. */
     143typedef enum {
     144        IEEE80211_FRAME_CTRL_TODS = 0x0100,
     145        IEEE80211_FRAME_CTRL_FROMDS = 0x0200
     146} ieee80211_frame_ctrl_ds_t;
     147
     148/** IEEE 802.11 authentication cipher suites values. */
     149typedef enum {
     150        IEEE80211_AUTH_CIPHER_TKIP = 0x02,
     151        IEEE80211_AUTH_CIPHER_CCMP = 0x04
     152} ieee80211_auth_cipher_type_t;
     153
     154/** IEEE 802.11 AKM suites values. */
     155typedef enum {
     156        IEEE80211_AUTH_AKM_8021X = 0x01,
     157        IEEE80211_AUTH_AKM_PSK = 0x02
     158} ieee80211_auth_akm_type_t;
     159
     160typedef enum {
     161        IEEE80211_EAPOL_START = 0x1,
     162        IEEE80211_EAPOL_KEY = 0x3
     163} ieee80211_eapol_frame_type_t;
     164
     165typedef enum {
     166        IEEE80211_EAPOL_KEY_KEYINFO_KEYTYPE = 0x0008,
     167        IEEE80211_EAPOL_KEY_KEYINFO_INSTALL = 0x0040,
     168        IEEE80211_EAPOL_KEY_KEYINFO_ACK = 0x0080,
     169        IEEE80211_EAPOL_KEY_KEYINFO_MIC = 0x0100,
     170        IEEE80211_EAPOL_KEY_KEYINFO_SECURE = 0x0200,
     171        IEEE80211_EAPOL_KEY_KEYINFO_ENCDATA = 0x1000
     172} ieee80211_eapol_key_keyinfo_t;
    76173
    77174/** IEEE 802.11 information element types. */
     
    80177        IEEE80211_RATES_IE = 1,         /**< Supported data rates. */
    81178        IEEE80211_CHANNEL_IE = 3,       /**< Current channel number. */
    82         IEEE80211_EXT_RATES_IE = 50     /**< Extended data rates. */
     179        IEEE80211_CHALLENGE_IE = 16,    /**< Challenge text. */
     180        IEEE80211_RSN_IE = 48,          /**< RSN. */
     181        IEEE80211_EXT_RATES_IE = 50,    /**< Extended data rates. */
     182        IEEE80211_VENDOR_IE = 221       /**< Vendor specific IE. */
    83183} ieee80211_ie_type_t;
     184
     185/** IEEE 802.11 authentication phases. */
     186typedef enum {
     187        IEEE80211_AUTH_DISCONNECTED,
     188        IEEE80211_AUTH_AUTHENTICATED,
     189        IEEE80211_AUTH_ASSOCIATED
     190} ieee80211_auth_phase_t;
     191
     192/** Link with scan result info. */
     193typedef struct {
     194        link_t link;
     195        time_t last_beacon;
     196        ieee80211_scan_result_t scan_result;
     197        uint8_t rsn_copy[256];
     198        size_t rsn_copy_len;
     199} ieee80211_scan_result_link_t;
     200
     201/** List of scan results info. */
     202typedef struct {
     203        list_t list;
     204        time_t last_scan;
     205        fibril_mutex_t scan_mutex;
     206        size_t size;
     207} ieee80211_scan_result_list_t;
     208
     209/** BSSID info. */
     210typedef struct {
     211        uint16_t aid;
     212        char password[IEEE80211_WPA_MAX_PASSWORD_LENGTH];
     213        uint8_t ptk[MAX_PTK_LENGTH];
     214        uint8_t gtk[MAX_GTK_LENGTH];
     215        ieee80211_scan_result_link_t *res_link;
     216} ieee80211_bssid_info_t;
    84217
    85218/** IEEE 802.11 WiFi device structure. */
     
    103236        ieee80211_operating_mode_t current_op_mode;
    104237       
     238        /** Info about BSSID we are connected to. */
     239        ieee80211_bssid_info_t bssid_info;
     240       
     241        /**
     242         * Flag indicating that data traffic is encrypted by HW key
     243         * that is set up in device.
     244         */
     245        bool using_hw_key;
     246       
    105247        /** BSSIDs we listen to. */
    106248        nic_address_t bssid_mask;
    107249       
    108250        /** List of APs in neighborhood. */
    109         ieee80211_scan_results_t ap_list;
    110        
    111         /* TODO: Probably to be removed later - nic.open function is now
    112          * executed multiple times, have to find out reason and fix it.
    113          */
     251        ieee80211_scan_result_list_t ap_list;
     252       
     253        /** Current sequence number used in data frames. */
     254        uint16_t sequence_number;
     255       
     256        /** Current authentication phase. */
     257        ieee80211_auth_phase_t current_auth_phase;
     258       
     259        /** General purpose guard. */
     260        fibril_mutex_t gen_mutex;
     261       
     262        /** General purpose condition variable. */
     263        fibril_condvar_t gen_cond;
     264       
     265        /** Indicates whether device is fully initialized. */
     266        bool ready;
     267       
    114268        /** Indicates whether driver has already started. */
    115269        bool started;
    116270};
     271
     272/** IEEE 802.3 (ethernet) header. */
     273typedef struct {
     274        uint8_t dest_addr[ETH_ADDR];
     275        uint8_t src_addr[ETH_ADDR];
     276        uint16_t proto;                 /**< Big Endian value! */
     277} __attribute__((packed)) __attribute__ ((aligned(2)))
     278        eth_header_t;
    117279
    118280/** IEEE 802.11 management header structure. */
     
    124286        uint8_t bssid[ETH_ADDR];
    125287        uint16_t seq_ctrl;              /**< Little Endian value! */
    126 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_mgmt_header_t;
     288} __attribute__((packed)) __attribute__ ((aligned(2)))
     289        ieee80211_mgmt_header_t;
    127290
    128291/** IEEE 802.11 data header structure. */
     
    134297        uint8_t address3[ETH_ADDR];
    135298        uint16_t seq_ctrl;              /**< Little Endian value! */
    136         uint8_t address4[ETH_ADDR];
    137         uint16_t qos_ctrl;              /**< Little Endian value! */
    138 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_data_header_t;
     299} __attribute__((packed)) __attribute__ ((aligned(2)))
     300        ieee80211_data_header_t;
    139301
    140302/** IEEE 802.11 information element header. */
     
    142304        uint8_t element_id;
    143305        uint8_t length;
    144 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_ie_header_t;
     306} __attribute__((packed)) __attribute__ ((aligned(2)))
     307        ieee80211_ie_header_t;
    145308
    146309/** IEEE 802.11 authentication frame body. */
     
    149312        uint16_t auth_trans_no;         /**< Little Endian value! */
    150313        uint16_t status;                /**< Little Endian value! */
    151 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_auth_body_t;
     314} __attribute__((packed)) __attribute__ ((aligned(2)))
     315        ieee80211_auth_body_t;
     316
     317/** IEEE 802.11 deauthentication frame body. */
     318typedef struct {
     319        uint16_t reason;                /**< Little Endian value! */
     320} __attribute__((packed)) __attribute__ ((aligned(2)))
     321        ieee80211_deauth_body_t;
     322
     323/** IEEE 802.11 association request frame body. */
     324typedef struct {
     325        uint16_t capability;            /**< Little Endian value! */
     326        uint16_t listen_interval;       /**< Little Endian value! */
     327} __attribute__((packed)) __attribute__ ((aligned(2)))
     328        ieee80211_assoc_req_body_t;
     329
     330/** IEEE 802.11 association response frame body. */
     331typedef struct {
     332        uint16_t capability;            /**< Little Endian value! */
     333        uint16_t status;                /**< Little Endian value! */
     334        uint16_t aid;                   /**< Little Endian value! */
     335} __attribute__((packed)) __attribute__ ((aligned(2)))
     336        ieee80211_assoc_resp_body_t;
    152337
    153338/** IEEE 802.11 beacon frame body start. */
    154339typedef struct {
    155340        uint8_t timestamp[8];
    156         uint16_t beacon_interval;
    157         uint16_t capability;
    158 } __attribute__((packed)) __attribute__ ((aligned(2))) ieee80211_beacon_start_t;
    159 
    160 extern int ieee80211_probe_request(ieee80211_dev_t *ieee80211_dev);
    161 extern int ieee80211_probe_auth(ieee80211_dev_t *ieee80211_dev);
     341        uint16_t beacon_interval;       /**< Little Endian value! */
     342        uint16_t capability;            /**< Little Endian value! */
     343} __attribute__((packed)) __attribute__ ((aligned(2)))
     344        ieee80211_beacon_start_t;
     345
     346/** IEEE 802.11i EAPOL-Key frame format. */
     347typedef struct {
     348        uint8_t proto_version;
     349        uint8_t packet_type;
     350        uint16_t body_length;           /**< Big Endian value! */
     351        uint8_t descriptor_type;
     352        uint16_t key_info;              /**< Big Endian value! */
     353        uint16_t key_length;            /**< Big Endian value! */
     354        uint8_t key_replay_counter[8];
     355        uint8_t key_nonce[32];
     356        uint8_t eapol_key_iv[16];
     357        uint8_t key_rsc[8];
     358        uint8_t reserved[8];
     359        uint8_t key_mic[16];
     360        uint16_t key_data_length;       /**< Big Endian value! */
     361} __attribute__((packed)) ieee80211_eapol_key_frame_t;
     362
     363#define ieee80211_scan_result_list_foreach(results, iter) \
     364    list_foreach((results).list, link, ieee80211_scan_result_link_t, (iter))
     365
     366static inline void ieee80211_scan_result_list_init(
     367        ieee80211_scan_result_list_t *results)
     368{
     369        list_initialize(&results->list);
     370        fibril_mutex_initialize(&results->scan_mutex);
     371}
     372
     373static inline void ieee80211_scan_result_list_remove(
     374        ieee80211_scan_result_list_t *results,
     375        ieee80211_scan_result_link_t *result)
     376{
     377        list_remove(&result->link);
     378        results->size--;
     379}
     380
     381static inline void ieee80211_scan_result_list_append(
     382        ieee80211_scan_result_list_t *results,
     383        ieee80211_scan_result_link_t *result)
     384{
     385        list_append(&result->link, &results->list);
     386        results->size++;
     387}
     388
     389extern int ieee80211_probe_request(ieee80211_dev_t *ieee80211_dev,
     390        char *ssid);
     391extern int ieee80211_authenticate(ieee80211_dev_t *ieee80211_dev);
     392extern int ieee80211_associate(ieee80211_dev_t *ieee80211_dev,
     393        char *password);
     394extern int ieee80211_deauthenticate(ieee80211_dev_t *ieee80211_dev);
    162395
    163396#endif /* LIBN_IEEE80211_H */
Note: See TracChangeset for help on using the changeset viewer.