linux/net/mac80211/key.h
<<
>>
Prefs
   1/*
   2 * Copyright 2002-2004, Instant802 Networks, Inc.
   3 * Copyright 2005, Devicescape Software, Inc.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License version 2 as
   7 * published by the Free Software Foundation.
   8 */
   9
  10#ifndef IEEE80211_KEY_H
  11#define IEEE80211_KEY_H
  12
  13#include <linux/types.h>
  14#include <linux/list.h>
  15#include <linux/crypto.h>
  16#include <linux/rcupdate.h>
  17#include <net/mac80211.h>
  18
  19#define WEP_IV_LEN              4
  20#define WEP_ICV_LEN             4
  21#define ALG_TKIP_KEY_LEN        32
  22#define ALG_CCMP_KEY_LEN        16
  23#define CCMP_HDR_LEN            8
  24#define CCMP_MIC_LEN            8
  25#define CCMP_TK_LEN             16
  26#define CCMP_PN_LEN             6
  27#define TKIP_IV_LEN             8
  28#define TKIP_ICV_LEN            4
  29
  30#define NUM_RX_DATA_QUEUES      17
  31
  32struct ieee80211_local;
  33struct ieee80211_sub_if_data;
  34struct sta_info;
  35
  36/**
  37 * enum ieee80211_internal_key_flags - internal key flags
  38 *
  39 * @KEY_FLAG_UPLOADED_TO_HARDWARE: Indicates that this key is present
  40 *      in the hardware for TX crypto hardware acceleration.
  41 * @KEY_FLAG_TODO_DELETE: Key is marked for deletion and will, after an
  42 *      RCU grace period, no longer be reachable other than from the
  43 *      todo list.
  44 * @KEY_FLAG_TODO_HWACCEL_ADD: Key needs to be added to hardware acceleration.
  45 * @KEY_FLAG_TODO_HWACCEL_REMOVE: Key needs to be removed from hardware
  46 *      acceleration.
  47 * @KEY_FLAG_TODO_DEFKEY: Key is default key and debugfs needs to be updated.
  48 * @KEY_FLAG_TODO_ADD_DEBUGFS: Key needs to be added to debugfs.
  49 * @KEY_FLAG_TODO_DEFMGMTKEY: Key is default management key and debugfs needs
  50 *      to be updated.
  51 */
  52enum ieee80211_internal_key_flags {
  53        KEY_FLAG_UPLOADED_TO_HARDWARE   = BIT(0),
  54        KEY_FLAG_TODO_DELETE            = BIT(1),
  55        KEY_FLAG_TODO_HWACCEL_ADD       = BIT(2),
  56        KEY_FLAG_TODO_HWACCEL_REMOVE    = BIT(3),
  57        KEY_FLAG_TODO_DEFKEY            = BIT(4),
  58        KEY_FLAG_TODO_ADD_DEBUGFS       = BIT(5),
  59        KEY_FLAG_TODO_DEFMGMTKEY        = BIT(6),
  60};
  61
  62struct tkip_ctx {
  63        u32 iv32;
  64        u16 iv16;
  65        u16 p1k[5];
  66        int initialized;
  67};
  68
  69struct ieee80211_key {
  70        struct ieee80211_local *local;
  71        struct ieee80211_sub_if_data *sdata;
  72        struct sta_info *sta;
  73
  74        /* for sdata list */
  75        struct list_head list;
  76        /* for todo list */
  77        struct list_head todo;
  78
  79        /* protected by todo lock! */
  80        unsigned int flags;
  81
  82        union {
  83                struct {
  84                        /* last used TSC */
  85                        struct tkip_ctx tx;
  86
  87                        /* last received RSC */
  88                        struct tkip_ctx rx[NUM_RX_DATA_QUEUES];
  89                } tkip;
  90                struct {
  91                        u8 tx_pn[6];
  92                        u8 rx_pn[NUM_RX_DATA_QUEUES][6];
  93                        struct crypto_cipher *tfm;
  94                        u32 replays; /* dot11RSNAStatsCCMPReplays */
  95                        /* scratch buffers for virt_to_page() (crypto API) */
  96#ifndef AES_BLOCK_LEN
  97#define AES_BLOCK_LEN 16
  98#endif
  99                        u8 tx_crypto_buf[6 * AES_BLOCK_LEN];
 100                        u8 rx_crypto_buf[6 * AES_BLOCK_LEN];
 101                } ccmp;
 102                struct {
 103                        u8 tx_pn[6];
 104                        u8 rx_pn[6];
 105                        struct crypto_cipher *tfm;
 106                        u32 replays; /* dot11RSNAStatsCMACReplays */
 107                        u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
 108                        /* scratch buffers for virt_to_page() (crypto API) */
 109                        u8 tx_crypto_buf[2 * AES_BLOCK_LEN];
 110                        u8 rx_crypto_buf[2 * AES_BLOCK_LEN];
 111                } aes_cmac;
 112        } u;
 113
 114        /* number of times this key has been used */
 115        int tx_rx_count;
 116
 117#ifdef CONFIG_MAC80211_DEBUGFS
 118        struct {
 119                struct dentry *stalink;
 120                struct dentry *dir;
 121                struct dentry *keylen;
 122                struct dentry *flags;
 123                struct dentry *keyidx;
 124                struct dentry *hw_key_idx;
 125                struct dentry *tx_rx_count;
 126                struct dentry *algorithm;
 127                struct dentry *tx_spec;
 128                struct dentry *rx_spec;
 129                struct dentry *replays;
 130                struct dentry *icverrors;
 131                struct dentry *key;
 132                struct dentry *ifindex;
 133                int cnt;
 134        } debugfs;
 135#endif
 136
 137        /*
 138         * key config, must be last because it contains key
 139         * material as variable length member
 140         */
 141        struct ieee80211_key_conf conf;
 142};
 143
 144struct ieee80211_key *ieee80211_key_alloc(enum ieee80211_key_alg alg,
 145                                          int idx,
 146                                          size_t key_len,
 147                                          const u8 *key_data,
 148                                          size_t seq_len, const u8 *seq);
 149/*
 150 * Insert a key into data structures (sdata, sta if necessary)
 151 * to make it used, free old key.
 152 */
 153void ieee80211_key_link(struct ieee80211_key *key,
 154                        struct ieee80211_sub_if_data *sdata,
 155                        struct sta_info *sta);
 156void ieee80211_key_free(struct ieee80211_key *key);
 157void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx);
 158void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
 159                                    int idx);
 160void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata);
 161void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata);
 162void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata);
 163
 164void ieee80211_key_todo(void);
 165
 166#endif /* IEEE80211_KEY_H */
 167