root / lab4 / .minix-src / include / net80211 / ieee80211_crypto.h @ 13
History | View | Annotate | Download (9.06 KB)
1 | 13 | up20180614 | /* $NetBSD: ieee80211_crypto.h,v 1.11 2009/01/03 03:43:23 yamt Exp $ */
|
---|---|---|---|
2 | /*-
|
||
3 | * Copyright (c) 2001 Atsushi Onoe
|
||
4 | * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
|
||
5 | * All rights reserved.
|
||
6 | *
|
||
7 | * Redistribution and use in source and binary forms, with or without
|
||
8 | * modification, are permitted provided that the following conditions
|
||
9 | * are met:
|
||
10 | * 1. Redistributions of source code must retain the above copyright
|
||
11 | * notice, this list of conditions and the following disclaimer.
|
||
12 | * 2. Redistributions in binary form must reproduce the above copyright
|
||
13 | * notice, this list of conditions and the following disclaimer in the
|
||
14 | * documentation and/or other materials provided with the distribution.
|
||
15 | * 3. The name of the author may not be used to endorse or promote products
|
||
16 | * derived from this software without specific prior written permission.
|
||
17 | *
|
||
18 | * Alternatively, this software may be distributed under the terms of the
|
||
19 | * GNU General Public License ("GPL") version 2 as published by the Free
|
||
20 | * Software Foundation.
|
||
21 | *
|
||
22 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||
23 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||
24 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||
25 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||
26 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||
27 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||
28 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||
29 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||
30 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||
31 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
32 | *
|
||
33 | * $FreeBSD: src/sys/net80211/ieee80211_crypto.h,v 1.10 2005/08/08 18:46:35 sam Exp $
|
||
34 | */
|
||
35 | #ifndef _NET80211_IEEE80211_CRYPTO_H_
|
||
36 | #define _NET80211_IEEE80211_CRYPTO_H_
|
||
37 | |||
38 | /*
|
||
39 | * 802.11 protocol crypto-related definitions.
|
||
40 | */
|
||
41 | #define IEEE80211_KEYBUF_SIZE 16 |
||
42 | #define IEEE80211_MICBUF_SIZE (8+8) /* space for both tx+rx keys */ |
||
43 | |||
44 | /*
|
||
45 | * Old WEP-style key. Deprecated.
|
||
46 | */
|
||
47 | struct ieee80211_wepkey {
|
||
48 | u_int wk_len; /* key length in bytes */
|
||
49 | u_int8_t wk_key[IEEE80211_KEYBUF_SIZE]; |
||
50 | }; |
||
51 | |||
52 | struct ieee80211_cipher;
|
||
53 | |||
54 | /*
|
||
55 | * Crypto key state. There is sufficient room for all supported
|
||
56 | * ciphers (see below). The underlying ciphers are handled
|
||
57 | * separately through loadable cipher modules that register with
|
||
58 | * the generic crypto support. A key has a reference to an instance
|
||
59 | * of the cipher; any per-key state is hung off wk_private by the
|
||
60 | * cipher when it is attached. Ciphers are automatically called
|
||
61 | * to detach and cleanup any such state when the key is deleted.
|
||
62 | *
|
||
63 | * The generic crypto support handles encap/decap of cipher-related
|
||
64 | * frame contents for both hardware- and software-based implementations.
|
||
65 | * A key requiring software crypto support is automatically flagged and
|
||
66 | * the cipher is expected to honor this and do the necessary work.
|
||
67 | * Ciphers such as TKIP may also support mixed hardware/software
|
||
68 | * encrypt/decrypt and MIC processing.
|
||
69 | */
|
||
70 | typedef u_int16_t ieee80211_keyix; /* h/w key index */ |
||
71 | |||
72 | struct ieee80211_key {
|
||
73 | u_int8_t wk_keylen; /* key length in bytes */
|
||
74 | u_int8_t wk_pad; |
||
75 | u_int16_t wk_flags; |
||
76 | #define IEEE80211_KEY_XMIT 0x01 /* key used for xmit */ |
||
77 | #define IEEE80211_KEY_RECV 0x02 /* key used for recv */ |
||
78 | #define IEEE80211_KEY_GROUP 0x04 /* key used for WPA group operation */ |
||
79 | #define IEEE80211_KEY_SWCRYPT 0x10 /* host-based encrypt/decrypt */ |
||
80 | #define IEEE80211_KEY_SWMIC 0x20 /* host-based enmic/demic */ |
||
81 | ieee80211_keyix wk_keyix; /* h/w key index */
|
||
82 | ieee80211_keyix wk_rxkeyix; /* optional h/w rx key index */
|
||
83 | u_int8_t wk_key[IEEE80211_KEYBUF_SIZE+IEEE80211_MICBUF_SIZE]; |
||
84 | #define wk_txmic wk_key+IEEE80211_KEYBUF_SIZE+0 /* XXX can't () right */ |
||
85 | #define wk_rxmic wk_key+IEEE80211_KEYBUF_SIZE+8 /* XXX can't () right */ |
||
86 | u_int64_t wk_keyrsc; /* key receive sequence counter */
|
||
87 | u_int64_t wk_keytsc; /* key transmit sequence counter */
|
||
88 | const struct ieee80211_cipher *wk_cipher; |
||
89 | void *wk_private; /* private cipher state */ |
||
90 | }; |
||
91 | #define IEEE80211_KEY_COMMON /* common flags passed in by apps */\ |
||
92 | (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV | IEEE80211_KEY_GROUP) |
||
93 | |||
94 | /*
|
||
95 | * NB: these values are ordered carefully; there are lots of
|
||
96 | * of implications in any reordering. In particular beware
|
||
97 | * that 4 is not used to avoid conflicting with IEEE80211_F_PRIVACY.
|
||
98 | */
|
||
99 | #define IEEE80211_CIPHER_WEP 0 |
||
100 | #define IEEE80211_CIPHER_TKIP 1 |
||
101 | #define IEEE80211_CIPHER_AES_OCB 2 |
||
102 | #define IEEE80211_CIPHER_AES_CCM 3 |
||
103 | #define IEEE80211_CIPHER_CKIP 5 |
||
104 | #define IEEE80211_CIPHER_NONE 6 /* pseudo value */ |
||
105 | |||
106 | #define IEEE80211_CIPHER_MAX (IEEE80211_CIPHER_NONE+1) |
||
107 | |||
108 | #define IEEE80211_KEYIX_NONE ((ieee80211_keyix) -1) |
||
109 | #define IEEE80211_KEY_UNDEFINED(k) ((k).wk_cipher == &ieee80211_cipher_none)
|
||
110 | |||
111 | #if defined(__KERNEL__) || defined(_KERNEL)
|
||
112 | |||
113 | struct ieee80211com;
|
||
114 | struct ieee80211_node;
|
||
115 | struct mbuf;
|
||
116 | |||
117 | /*
|
||
118 | * Crypto state kept in each ieee80211com. Some of this
|
||
119 | * can/should be shared when virtual AP's are supported.
|
||
120 | *
|
||
121 | * XXX save reference to ieee80211com to properly encapsulate state.
|
||
122 | * XXX split out crypto capabilities from ic_caps
|
||
123 | */
|
||
124 | struct ieee80211_crypto_state {
|
||
125 | struct ieee80211_key cs_nw_keys[IEEE80211_WEP_NKID];
|
||
126 | ieee80211_keyix cs_def_txkey; /* default/group tx key index */
|
||
127 | u_int16_t cs_max_keyix; /* max h/w key index */
|
||
128 | |||
129 | int (*cs_key_alloc)(struct ieee80211com *, |
||
130 | const struct ieee80211_key *, |
||
131 | ieee80211_keyix *, ieee80211_keyix *); |
||
132 | int (*cs_key_delete)(struct ieee80211com *, |
||
133 | const struct ieee80211_key *); |
||
134 | int (*cs_key_set)(struct ieee80211com *, |
||
135 | const struct ieee80211_key *, |
||
136 | const u_int8_t mac[IEEE80211_ADDR_LEN]);
|
||
137 | void (*cs_key_update_begin)(struct ieee80211com *); |
||
138 | void (*cs_key_update_end)(struct ieee80211com *); |
||
139 | }; |
||
140 | |||
141 | void ieee80211_crypto_attach(struct ieee80211com *); |
||
142 | void ieee80211_crypto_detach(struct ieee80211com *); |
||
143 | int ieee80211_crypto_newkey(struct ieee80211com *, |
||
144 | int cipher, int flags, struct ieee80211_key *); |
||
145 | int ieee80211_crypto_delkey(struct ieee80211com *, |
||
146 | struct ieee80211_key *);
|
||
147 | int ieee80211_crypto_setkey(struct ieee80211com *, |
||
148 | struct ieee80211_key *, const u_int8_t macaddr[IEEE80211_ADDR_LEN]); |
||
149 | void ieee80211_crypto_delglobalkeys(struct ieee80211com *); |
||
150 | |||
151 | /*
|
||
152 | * Template for a supported cipher. Ciphers register with the
|
||
153 | * crypto code and are typically loaded as separate modules
|
||
154 | * (the null cipher is always present).
|
||
155 | * XXX may need refcnts
|
||
156 | */
|
||
157 | struct ieee80211_cipher {
|
||
158 | const char *ic_name; /* printable name */ |
||
159 | u_int ic_cipher; /* IEEE80211_CIPHER_* */
|
||
160 | u_int ic_header; /* size of privacy header (bytes) */
|
||
161 | u_int ic_trailer; /* size of privacy trailer (bytes) */
|
||
162 | u_int ic_miclen; /* size of mic trailer (bytes) */
|
||
163 | void* (*ic_attach)(struct ieee80211com *, struct ieee80211_key *); |
||
164 | void (*ic_detach)(struct ieee80211_key *); |
||
165 | int (*ic_setkey)(struct ieee80211_key *); |
||
166 | int (*ic_encap)(struct ieee80211_key *, struct mbuf *, |
||
167 | u_int8_t keyid); |
||
168 | int (*ic_decap)(struct ieee80211_key *, struct mbuf *, int); |
||
169 | int (*ic_enmic)(struct ieee80211_key *, struct mbuf *, int); |
||
170 | int (*ic_demic)(struct ieee80211_key *, struct mbuf *, int); |
||
171 | }; |
||
172 | extern const struct ieee80211_cipher ieee80211_cipher_none; |
||
173 | extern const struct ieee80211_cipher ieee80211_cipher_wep; |
||
174 | extern const struct ieee80211_cipher ieee80211_cipher_tkip; |
||
175 | extern const struct ieee80211_cipher ieee80211_cipher_ccmp; |
||
176 | |||
177 | void ieee80211_crypto_register(const struct ieee80211_cipher *); |
||
178 | void ieee80211_crypto_unregister(const struct ieee80211_cipher *); |
||
179 | int ieee80211_crypto_available(u_int cipher);
|
||
180 | |||
181 | struct ieee80211_key *ieee80211_crypto_encap(struct ieee80211com *, |
||
182 | struct ieee80211_node *, struct mbuf *); |
||
183 | struct ieee80211_key *ieee80211_crypto_decap(struct ieee80211com *, |
||
184 | struct ieee80211_node *, struct mbuf *, int); |
||
185 | |||
186 | /*
|
||
187 | * Check and remove any MIC.
|
||
188 | */
|
||
189 | static __inline int |
||
190 | ieee80211_crypto_demic(struct ieee80211com *ic,
|
||
191 | struct ieee80211_key *k, struct mbuf *m, int force) |
||
192 | { |
||
193 | const struct ieee80211_cipher *cip = k->wk_cipher; |
||
194 | return (cip->ic_miclen > 0 ? cip->ic_demic(k, m, force) : 1); |
||
195 | } |
||
196 | |||
197 | /*
|
||
198 | * Add any MIC.
|
||
199 | */
|
||
200 | static __inline int |
||
201 | ieee80211_crypto_enmic(struct ieee80211com *ic,
|
||
202 | struct ieee80211_key *k, struct mbuf *m, int force) |
||
203 | { |
||
204 | const struct ieee80211_cipher *cip = k->wk_cipher; |
||
205 | return (cip->ic_miclen > 0 ? cip->ic_enmic(k, m, force) : 1); |
||
206 | } |
||
207 | |||
208 | /*
|
||
209 | * Reset key state to an unused state. The crypto
|
||
210 | * key allocation mechanism insures other state (e.g.
|
||
211 | * key data) is properly setup before a key is used.
|
||
212 | */
|
||
213 | static __inline void |
||
214 | ieee80211_crypto_resetkey(struct ieee80211com *ic,
|
||
215 | struct ieee80211_key *k, ieee80211_keyix ix)
|
||
216 | { |
||
217 | k->wk_cipher = &ieee80211_cipher_none; |
||
218 | k->wk_private = k->wk_cipher->ic_attach(ic, k); |
||
219 | k->wk_keyix = k->wk_rxkeyix = ix; |
||
220 | k->wk_flags = IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV; |
||
221 | } |
||
222 | |||
223 | /*
|
||
224 | * Crypt-related notification methods.
|
||
225 | */
|
||
226 | void ieee80211_notify_replay_failure(struct ieee80211com *, |
||
227 | const struct ieee80211_frame *, const struct ieee80211_key *, |
||
228 | u_int64_t rsc); |
||
229 | void ieee80211_notify_michael_failure(struct ieee80211com *, |
||
230 | const struct ieee80211_frame *, u_int keyix); |
||
231 | #endif /* defined(__KERNEL__) || defined(_KERNEL) */ |
||
232 | #endif /* !_NET80211_IEEE80211_CRYPTO_H_ */ |