blob: 1e326c89d72173775dee1927b82e73b2ad8f817a [file] [log] [blame]
Thomas Gleixnerd2912cb2019-06-04 10:11:33 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Jiri Bencf0706e82007-05-05 11:45:53 -07002/*
3 * Copyright 2002-2004, Instant802 Networks, Inc.
4 * Copyright 2005, Devicescape Software, Inc.
Lior Cohen624ff4b2019-08-30 14:24:49 +03005 * Copyright (C) 2019 Intel Corporation
Jiri Bencf0706e82007-05-05 11:45:53 -07006 */
7
8#ifndef IEEE80211_KEY_H
9#define IEEE80211_KEY_H
10
11#include <linux/types.h>
Johannes Berg8f371712007-08-28 17:01:54 -040012#include <linux/list.h>
Jiri Bencf0706e82007-05-05 11:45:53 -070013#include <linux/crypto.h>
Johannes Bergdb4d1162008-02-25 16:27:45 +010014#include <linux/rcupdate.h>
Ard Biesheuvel5fdb3732019-06-12 18:19:54 +020015#include <crypto/arc4.h>
Jiri Bencf0706e82007-05-05 11:45:53 -070016#include <net/mac80211.h>
17
Johannes Berge31b8212010-10-05 19:39:30 +020018#define NUM_DEFAULT_KEYS 4
19#define NUM_DEFAULT_MGMT_KEYS 2
Jouni Malinene5473e82020-02-22 15:25:44 +020020#define NUM_DEFAULT_BEACON_KEYS 2
Alexander Wetzel96fc6ef2019-03-19 21:34:08 +010021#define INVALID_PTK_KEYIDX 2 /* Keyidx always pointing to a NULL key for PTK */
Johannes Berge31b8212010-10-05 19:39:30 +020022
Johannes Berg11a843b2007-08-28 17:01:55 -040023struct ieee80211_local;
24struct ieee80211_sub_if_data;
25struct sta_info;
26
Johannes Bergdb4d1162008-02-25 16:27:45 +010027/**
28 * enum ieee80211_internal_key_flags - internal key flags
29 *
30 * @KEY_FLAG_UPLOADED_TO_HARDWARE: Indicates that this key is present
31 * in the hardware for TX crypto hardware acceleration.
Johannes Berg95acac62011-07-12 12:30:59 +020032 * @KEY_FLAG_TAINTED: Key is tainted and packets should be dropped.
Cedric Izoardc7ef38e2015-03-17 10:47:33 +000033 * @KEY_FLAG_CIPHER_SCHEME: This key is for a hardware cipher scheme
Johannes Bergdb4d1162008-02-25 16:27:45 +010034 */
35enum ieee80211_internal_key_flags {
36 KEY_FLAG_UPLOADED_TO_HARDWARE = BIT(0),
Johannes Berg95acac62011-07-12 12:30:59 +020037 KEY_FLAG_TAINTED = BIT(1),
Cedric Izoardc7ef38e2015-03-17 10:47:33 +000038 KEY_FLAG_CIPHER_SCHEME = BIT(2),
Johannes Bergdb4d1162008-02-25 16:27:45 +010039};
Johannes Berg11a843b2007-08-28 17:01:55 -040040
gregor kowskica998612009-12-09 23:25:05 +010041enum ieee80211_internal_tkip_state {
42 TKIP_STATE_NOT_INIT,
43 TKIP_STATE_PHASE1_DONE,
44 TKIP_STATE_PHASE1_HW_UPLOADED,
45};
46
Harvey Harrisonb0f76b32008-05-14 16:26:19 -070047struct tkip_ctx {
Johannes Berg523b02e2011-07-07 22:28:01 +020048 u16 p1k[5]; /* p1k cache */
49 u32 p1k_iv32; /* iv32 for which p1k computed */
gregor kowskica998612009-12-09 23:25:05 +010050 enum ieee80211_internal_tkip_state state;
Harvey Harrisonb0f76b32008-05-14 16:26:19 -070051};
52
Eliad Pellerf8079d42016-02-14 13:56:35 +020053struct tkip_ctx_rx {
54 struct tkip_ctx ctx;
55 u32 iv32; /* current iv32 */
56 u16 iv16; /* current iv16 */
57};
58
Jiri Bencf0706e82007-05-05 11:45:53 -070059struct ieee80211_key {
Johannes Berg11a843b2007-08-28 17:01:55 -040060 struct ieee80211_local *local;
61 struct ieee80211_sub_if_data *sdata;
62 struct sta_info *sta;
63
Johannes Berg3b967662008-04-08 17:56:52 +020064 /* for sdata list */
Johannes Berg11a843b2007-08-28 17:01:55 -040065 struct list_head list;
66
Johannes Bergad0e2b52010-06-01 10:19:19 +020067 /* protected by key mutex */
Johannes Berg11a843b2007-08-28 17:01:55 -040068 unsigned int flags;
69
Jiri Bencf0706e82007-05-05 11:45:53 -070070 union {
71 struct {
Johannes Berg523b02e2011-07-07 22:28:01 +020072 /* protects tx context */
73 spinlock_t txlock;
74
Jiri Bencf0706e82007-05-05 11:45:53 -070075 /* last used TSC */
Harvey Harrisonb0f76b32008-05-14 16:26:19 -070076 struct tkip_ctx tx;
Jiri Bencf0706e82007-05-05 11:45:53 -070077
78 /* last received RSC */
Eliad Pellerf8079d42016-02-14 13:56:35 +020079 struct tkip_ctx_rx rx[IEEE80211_NUM_TIDS];
Saravanab98ea052012-12-04 19:47:42 +053080
81 /* number of mic failures */
82 u32 mic_failures;
Jiri Bencf0706e82007-05-05 11:45:53 -070083 } tkip;
84 struct {
Jouni Malinen91902522010-06-11 10:27:33 -070085 /*
86 * Last received packet number. The first
Johannes Berg5a306f52012-11-14 23:22:21 +010087 * IEEE80211_NUM_TIDS counters are used with Data
Jouni Malinen91902522010-06-11 10:27:33 -070088 * frames and the last counter is used with Robust
89 * Management frames.
90 */
Johannes Berg4325f6c2013-05-08 13:09:08 +020091 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_CCMP_PN_LEN];
Ard Biesheuvel7ec7c4a2013-10-10 09:55:20 +020092 struct crypto_aead *tfm;
Jiri Bencf0706e82007-05-05 11:45:53 -070093 u32 replays; /* dot11RSNAStatsCCMPReplays */
Jiri Bencf0706e82007-05-05 11:45:53 -070094 } ccmp;
Jouni Malinen765cb462009-01-08 13:32:01 +020095 struct {
Johannes Berg4325f6c2013-05-08 13:09:08 +020096 u8 rx_pn[IEEE80211_CMAC_PN_LEN];
Ard Biesheuvel26717822017-02-06 10:49:28 +000097 struct crypto_shash *tfm;
Jouni Malinen765cb462009-01-08 13:32:01 +020098 u32 replays; /* dot11RSNAStatsCMACReplays */
99 u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
Jouni Malinen765cb462009-01-08 13:32:01 +0200100 } aes_cmac;
Max Stepanov2475b1cc2013-03-24 14:23:27 +0200101 struct {
Jouni Malinen8ade5382015-01-24 19:52:09 +0200102 u8 rx_pn[IEEE80211_GMAC_PN_LEN];
103 struct crypto_aead *tfm;
104 u32 replays; /* dot11RSNAStatsCMACReplays */
105 u32 icverrors; /* dot11RSNAStatsCMACICVErrors */
106 } aes_gmac;
107 struct {
Jouni Malinen00b9cfa2015-01-24 19:52:06 +0200108 /* Last received packet number. The first
109 * IEEE80211_NUM_TIDS counters are used with Data
110 * frames and the last counter is used with Robust
111 * Management frames.
112 */
113 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_GCMP_PN_LEN];
114 struct crypto_aead *tfm;
115 u32 replays; /* dot11RSNAStatsGCMPReplays */
116 } gcmp;
117 struct {
Max Stepanov2475b1cc2013-03-24 14:23:27 +0200118 /* generic cipher scheme */
Johannes Berga31cf1c2015-04-20 18:21:58 +0200119 u8 rx_pn[IEEE80211_NUM_TIDS + 1][IEEE80211_MAX_PN_LEN];
Max Stepanov2475b1cc2013-03-24 14:23:27 +0200120 } gen;
Jiri Bencf0706e82007-05-05 11:45:53 -0700121 } u;
Jiri Bencf0706e82007-05-05 11:45:53 -0700122
Jiri Bence9f207f2007-05-05 11:46:38 -0700123#ifdef CONFIG_MAC80211_DEBUGFS
124 struct {
125 struct dentry *stalink;
126 struct dentry *dir;
Johannes Bergd9c58f32008-04-08 16:46:36 -0400127 int cnt;
Jiri Bence9f207f2007-05-05 11:46:38 -0700128 } debugfs;
129#endif
130
Mathy Vanhoef94034c42021-05-11 20:02:43 +0200131 unsigned int color;
132
Johannes Berg8f20fc22007-08-28 17:01:54 -0400133 /*
134 * key config, must be last because it contains key
135 * material as variable length member
136 */
137 struct ieee80211_key_conf conf;
Jiri Bencf0706e82007-05-05 11:45:53 -0700138};
139
Max Stepanov2475b1cc2013-03-24 14:23:27 +0200140struct ieee80211_key *
141ieee80211_key_alloc(u32 cipher, int idx, size_t key_len,
142 const u8 *key_data,
143 size_t seq_len, const u8 *seq,
144 const struct ieee80211_cipher_scheme *cs);
Johannes Bergdb4d1162008-02-25 16:27:45 +0100145/*
146 * Insert a key into data structures (sdata, sta if necessary)
Johannes Berg79cf2df2013-03-06 22:53:52 +0100147 * to make it used, free old key. On failure, also free the new key.
Johannes Bergdb4d1162008-02-25 16:27:45 +0100148 */
Johannes Berg79cf2df2013-03-06 22:53:52 +0100149int ieee80211_key_link(struct ieee80211_key *key,
150 struct ieee80211_sub_if_data *sdata,
151 struct sta_info *sta);
Alexander Wetzel96fc6ef2019-03-19 21:34:08 +0100152int ieee80211_set_tx_key(struct ieee80211_key *key);
Johannes Berg3b8d9c22013-03-06 22:58:23 +0100153void ieee80211_key_free(struct ieee80211_key *key, bool delay_tailroom);
Johannes Berg79cf2df2013-03-06 22:53:52 +0100154void ieee80211_key_free_unused(struct ieee80211_key *key);
Johannes Bergf7e01042010-12-09 19:49:02 +0100155void ieee80211_set_default_key(struct ieee80211_sub_if_data *sdata, int idx,
156 bool uni, bool multi);
Jouni Malinen3cfcf6ac2009-01-08 13:32:02 +0200157void ieee80211_set_default_mgmt_key(struct ieee80211_sub_if_data *sdata,
158 int idx);
Jouni Malinene5473e82020-02-22 15:25:44 +0200159void ieee80211_set_default_beacon_key(struct ieee80211_sub_if_data *sdata,
160 int idx);
Johannes Berg7907c7d2013-12-04 23:47:09 +0100161void ieee80211_free_keys(struct ieee80211_sub_if_data *sdata,
162 bool force_synchronize);
Johannes Berg6d10e462013-03-06 23:09:11 +0100163void ieee80211_free_sta_keys(struct ieee80211_local *local,
164 struct sta_info *sta);
Lior Cohen624ff4b2019-08-30 14:24:49 +0300165void ieee80211_reenable_keys(struct ieee80211_sub_if_data *sdata);
Johannes Berg11a843b2007-08-28 17:01:55 -0400166
Johannes Berg40b275b2011-05-13 14:15:49 +0200167#define key_mtx_dereference(local, ref) \
168 rcu_dereference_protected(ref, lockdep_is_held(&((local)->key_mtx)))
169
Johannes Berg8d1f7ec2013-02-23 00:59:03 +0100170void ieee80211_delayed_tailroom_dec(struct work_struct *wk);
171
Jiri Bencf0706e82007-05-05 11:45:53 -0700172#endif /* IEEE80211_KEY_H */