xref: /openbmc/linux/net/mac80211/key.h (revision 37185b33)
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 NUM_DEFAULT_KEYS 4
20 #define NUM_DEFAULT_MGMT_KEYS 2
21 
22 #define WEP_IV_LEN		4
23 #define WEP_ICV_LEN		4
24 #define ALG_CCMP_KEY_LEN	16
25 #define CCMP_HDR_LEN		8
26 #define CCMP_MIC_LEN		8
27 #define CCMP_TK_LEN		16
28 #define CCMP_PN_LEN		6
29 #define TKIP_IV_LEN		8
30 #define TKIP_ICV_LEN		4
31 #define CMAC_PN_LEN		6
32 
33 #define NUM_RX_DATA_QUEUES	16
34 
35 struct ieee80211_local;
36 struct ieee80211_sub_if_data;
37 struct sta_info;
38 
39 /**
40  * enum ieee80211_internal_key_flags - internal key flags
41  *
42  * @KEY_FLAG_UPLOADED_TO_HARDWARE: Indicates that this key is present
43  *	in the hardware for TX crypto hardware acceleration.
44  * @KEY_FLAG_TAINTED: Key is tainted and packets should be dropped.
45  */
46 enum ieee80211_internal_key_flags {
47 	KEY_FLAG_UPLOADED_TO_HARDWARE	= BIT(0),
48 	KEY_FLAG_TAINTED		= BIT(1),
49 };
50 
51 enum ieee80211_internal_tkip_state {
52 	TKIP_STATE_NOT_INIT,
53 	TKIP_STATE_PHASE1_DONE,
54 	TKIP_STATE_PHASE1_HW_UPLOADED,
55 };
56 
57 struct tkip_ctx {
58 	u32 iv32;	/* current iv32 */
59 	u16 iv16;	/* current iv16 */
60 	u16 p1k[5];	/* p1k cache */
61 	u32 p1k_iv32;	/* iv32 for which p1k computed */
62 	enum ieee80211_internal_tkip_state state;
63 };
64 
65 struct ieee80211_key {
66 	struct ieee80211_local *local;
67 	struct ieee80211_sub_if_data *sdata;
68 	struct sta_info *sta;
69 
70 	/* for sdata list */
71 	struct list_head list;
72 
73 	/* protected by key mutex */
74 	unsigned int flags;
75 
76 	union {
77 		struct {
78 			/* protects tx context */
79 			spinlock_t txlock;
80 
81 			/* last used TSC */
82 			struct tkip_ctx tx;
83 
84 			/* last received RSC */
85 			struct tkip_ctx rx[NUM_RX_DATA_QUEUES];
86 		} tkip;
87 		struct {
88 			atomic64_t tx_pn;
89 			/*
90 			 * Last received packet number. The first
91 			 * NUM_RX_DATA_QUEUES counters are used with Data
92 			 * frames and the last counter is used with Robust
93 			 * Management frames.
94 			 */
95 			u8 rx_pn[NUM_RX_DATA_QUEUES + 1][CCMP_PN_LEN];
96 			struct crypto_cipher *tfm;
97 			u32 replays; /* dot11RSNAStatsCCMPReplays */
98 		} ccmp;
99 		struct {
100 			atomic64_t tx_pn;
101 			u8 rx_pn[CMAC_PN_LEN];
102 			struct crypto_cipher *tfm;
103 			u32 replays; /* dot11RSNAStatsCMACReplays */
104 			u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
105 		} aes_cmac;
106 	} u;
107 
108 	/* number of times this key has been used */
109 	int tx_rx_count;
110 
111 #ifdef CONFIG_MAC80211_DEBUGFS
112 	struct {
113 		struct dentry *stalink;
114 		struct dentry *dir;
115 		int cnt;
116 	} debugfs;
117 #endif
118 
119 	/*
120 	 * key config, must be last because it contains key
121 	 * material as variable length member
122 	 */
123 	struct ieee80211_key_conf conf;
124 };
125 
126 struct ieee80211_key *ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
127 					  const u8 *key_data,
128 					  size_t seq_len, const u8 *seq);
129 /*
130  * Insert a key into data structures (sdata, sta if necessary)
131  * to make it used, free old key.
132  */
133 int __must_check ieee80211_key_link(struct ieee80211_key *key,
134 				    struct ieee80211_sub_if_data *sdata,
135 				    struct sta_info *sta);
136 void __ieee80211_key_free(struct ieee80211_key *key);
137 void ieee80211_key_free(struct ieee80211_local *local,
138 			struct ieee80211_key *key);
139 void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
140 			       bool uni, bool multi);
141 void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
142 				    int idx);
143 void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata);
144 void ieee80211_enable_keys(struct ieee80211_sub_if_data *sdata);
145 void ieee80211_disable_keys(struct ieee80211_sub_if_data *sdata);
146 
147 #define key_mtx_dereference(local, ref) \
148 	rcu_dereference_protected(ref, lockdep_is_held(&((local)->key_mtx)))
149 
150 #endif /* IEEE80211_KEY_H */
151