2007-05-05 22:45:53 +04:00
/*
* Copyright 2002 - 2004 , Instant802 Networks , Inc .
* Copyright 2005 , Devicescape Software , Inc .
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# ifndef IEEE80211_KEY_H
# define IEEE80211_KEY_H
# include <linux/types.h>
2007-08-29 01:01:54 +04:00
# include <linux/list.h>
2007-05-05 22:45:53 +04:00
# include <linux/crypto.h>
2008-02-25 18:27:45 +03:00
# include <linux/rcupdate.h>
2007-05-05 22:45:53 +04:00
# include <net/mac80211.h>
2008-06-21 18:02:46 +04:00
# define WEP_IV_LEN 4
# define WEP_ICV_LEN 4
# define ALG_TKIP_KEY_LEN 32
# define ALG_CCMP_KEY_LEN 16
# define CCMP_HDR_LEN 8
# define CCMP_MIC_LEN 8
# define CCMP_TK_LEN 16
# define CCMP_PN_LEN 6
# define TKIP_IV_LEN 8
# define TKIP_ICV_LEN 4
# define NUM_RX_DATA_QUEUES 17
2007-05-05 22:45:53 +04:00
2007-08-29 01:01:55 +04:00
struct ieee80211_local ;
struct ieee80211_sub_if_data ;
struct sta_info ;
2008-02-25 18:27:45 +03:00
/**
* enum ieee80211_internal_key_flags - internal key flags
*
* @ KEY_FLAG_UPLOADED_TO_HARDWARE : Indicates that this key is present
* in the hardware for TX crypto hardware acceleration .
*/
enum ieee80211_internal_key_flags {
KEY_FLAG_UPLOADED_TO_HARDWARE = BIT ( 0 ) ,
} ;
2007-08-29 01:01:55 +04:00
2009-12-10 01:25:05 +03:00
enum ieee80211_internal_tkip_state {
TKIP_STATE_NOT_INIT ,
TKIP_STATE_PHASE1_DONE ,
TKIP_STATE_PHASE1_HW_UPLOADED ,
} ;
2008-05-15 03:26:19 +04:00
struct tkip_ctx {
u32 iv32 ;
u16 iv16 ;
u16 p1k [ 5 ] ;
2009-12-10 01:25:05 +03:00
enum ieee80211_internal_tkip_state state ;
2008-05-15 03:26:19 +04:00
} ;
2007-05-05 22:45:53 +04:00
struct ieee80211_key {
2007-08-29 01:01:55 +04:00
struct ieee80211_local * local ;
struct ieee80211_sub_if_data * sdata ;
struct sta_info * sta ;
2008-04-08 19:56:52 +04:00
/* for sdata list */
2007-08-29 01:01:55 +04:00
struct list_head list ;
2010-06-01 12:19:19 +04:00
/* protected by key mutex */
2007-08-29 01:01:55 +04:00
unsigned int flags ;
2007-05-05 22:45:53 +04:00
union {
struct {
/* last used TSC */
2008-05-15 03:26:19 +04:00
struct tkip_ctx tx ;
2007-05-05 22:45:53 +04:00
/* last received RSC */
2008-05-15 03:26:19 +04:00
struct tkip_ctx rx [ NUM_RX_DATA_QUEUES ] ;
2007-05-05 22:45:53 +04:00
} tkip ;
struct {
u8 tx_pn [ 6 ] ;
u8 rx_pn [ NUM_RX_DATA_QUEUES ] [ 6 ] ;
struct crypto_cipher * tfm ;
u32 replays ; /* dot11RSNAStatsCCMPReplays */
/* scratch buffers for virt_to_page() (crypto API) */
# ifndef AES_BLOCK_LEN
# define AES_BLOCK_LEN 16
# endif
u8 tx_crypto_buf [ 6 * AES_BLOCK_LEN ] ;
u8 rx_crypto_buf [ 6 * AES_BLOCK_LEN ] ;
} ccmp ;
2009-01-08 14:32:01 +03:00
struct {
u8 tx_pn [ 6 ] ;
u8 rx_pn [ 6 ] ;
struct crypto_cipher * tfm ;
u32 replays ; /* dot11RSNAStatsCMACReplays */
u32 icverrors ; /* dot11RSNAStatsCMACICVErrors */
/* scratch buffers for virt_to_page() (crypto API) */
u8 tx_crypto_buf [ 2 * AES_BLOCK_LEN ] ;
u8 rx_crypto_buf [ 2 * AES_BLOCK_LEN ] ;
} aes_cmac ;
2007-05-05 22:45:53 +04:00
} u ;
2007-08-29 01:01:54 +04:00
/* number of times this key has been used */
int tx_rx_count ;
2007-05-05 22:45:53 +04:00
2007-05-05 22:46:38 +04:00
# ifdef CONFIG_MAC80211_DEBUGFS
struct {
struct dentry * stalink ;
struct dentry * dir ;
2008-04-09 00:46:36 +04:00
int cnt ;
2007-05-05 22:46:38 +04:00
} debugfs ;
# endif
2007-08-29 01:01:54 +04:00
/*
* key config , must be last because it contains key
* material as variable length member
*/
struct ieee80211_key_conf conf ;
2007-05-05 22:45:53 +04:00
} ;
2008-02-25 18:27:45 +03:00
struct ieee80211_key * ieee80211_key_alloc ( enum ieee80211_key_alg alg ,
2007-08-29 01:01:55 +04:00
int idx ,
size_t key_len ,
2009-05-11 22:57:58 +04:00
const u8 * key_data ,
size_t seq_len , const u8 * seq ) ;
2008-02-25 18:27:45 +03:00
/*
* Insert a key into data structures ( sdata , sta if necessary )
* to make it used , free old key .
*/
void ieee80211_key_link ( struct ieee80211_key * key ,
struct ieee80211_sub_if_data * sdata ,
struct sta_info * sta ) ;
2007-08-29 01:01:55 +04:00
void ieee80211_key_free ( struct ieee80211_key * key ) ;
void ieee80211_set_default_key ( struct ieee80211_sub_if_data * sdata , int idx ) ;
2009-01-08 14:32:02 +03:00
void ieee80211_set_default_mgmt_key ( struct ieee80211_sub_if_data * sdata ,
int idx ) ;
2007-08-29 01:01:55 +04:00
void ieee80211_free_keys ( struct ieee80211_sub_if_data * sdata ) ;
void ieee80211_enable_keys ( struct ieee80211_sub_if_data * sdata ) ;
void ieee80211_disable_keys ( struct ieee80211_sub_if_data * sdata ) ;
2007-05-05 22:45:53 +04:00
# endif /* IEEE80211_KEY_H */