net80211_crypto_ccmp.c revision a399b7655a1d835aa8606c2b29e4e777baac8635
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Use is subject to license terms.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2001 Atsushi Onoe
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * All rights reserved.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Redistribution and use in source and binary forms, with or without
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * modification, are permitted provided that the following conditions
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 1. Redistributions of source code must retain the above copyright
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * notice, this list of conditions and the following disclaimer.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 2. Redistributions in binary form must reproduce the above copyright
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * notice, this list of conditions and the following disclaimer in the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * documentation and/or other materials provided with the distribution.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * 3. The name of the author may not be used to endorse or promote products
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * derived from this software without specific prior written permission.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Alternatively, this software may be distributed under the terms of the
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * GNU General Public License ("GPL") version 2 as published by the Free
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Software Foundation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster#pragma ident "%Z%%M% %I% %E% SMI"
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * IEEE 802.11i CCMP crypto support.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster struct ieee80211com *cc_ic; /* for diagnostics */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void *ccmp_attach(struct ieee80211com *, struct ieee80211_key *);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void ccmp_detach(struct ieee80211_key *);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int ccmp_encap(struct ieee80211_key *k, mblk_t *, uint8_t);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int ccmp_decap(struct ieee80211_key *, mblk_t *, int);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int ccmp_enmic(struct ieee80211_key *, mblk_t *, int);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic int ccmp_demic(struct ieee80211_key *, mblk_t *, int);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* ARGSUSED */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterstatic void *
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterccmp_attach(struct ieee80211com *ic, struct ieee80211_key *k)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ctx = kmem_zalloc(sizeof (struct ccmp_ctx), KM_SLEEP);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Add privacy headers appropriate for the specified key.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterccmp_encap(struct ieee80211_key *k, mblk_t *mp, uint8_t keyid)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copy down 802.11 header and add the IV, KeyID, and ExtIV.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster ivp[3] = keyid | IEEE80211_WEP_EXTIV; /* KeyID | ExtID */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * NB: software CCMP is not supported.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Validate and strip privacy headers (and trailer) for a
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * received frame. The specified key should be correct but
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * is also verified.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterccmp_decap(struct ieee80211_key *k, mblk_t *mp, int hdrlen)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Header should have extended IV and sequence number;
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * verify the former and validate the latter.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster if ((ivp[IEEE80211_WEP_IVLEN] & IEEE80211_WEP_EXTIV) == 0) {
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * No extended IV; discard frame.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster pn = ieee80211_read_6(ivp[0], ivp[1], ivp[4], ivp[5], ivp[6], ivp[7]);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Replay violation.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * NB: software CCMP is not supported.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Copy up 802.11 header and strip crypto bits.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster bcopy(&tmp, mp->b_rptr + ccmp.ic_header, hdrlen);
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Ok to update rsc now.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Add MIC to the frame as needed.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* ARGSUSED */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterccmp_enmic(struct ieee80211_key *k, mblk_t *mp, int force)
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster * Verify and strip MIC from the frame.
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Foster/* ARGSUSED */
a688bcbb4bcff5398fdd29b86f83450257dc0df4Allan Fosterccmp_demic(struct ieee80211_key *k, mblk_t *mp, int force)