Annotation of qemu/roms/ipxe/src/net/80211/wpa_psk.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2009 Joshua Oreman <[email protected]>.
                      3:  *
                      4:  * This program is free software; you can redistribute it and/or
                      5:  * modify it under the terms of the GNU General Public License as
                      6:  * published by the Free Software Foundation; either version 2 of the
                      7:  * License, or any later version.
                      8:  *
                      9:  * This program is distributed in the hope that it will be useful, but
                     10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
                     11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
                     12:  * General Public License for more details.
                     13:  *
                     14:  * You should have received a copy of the GNU General Public License
                     15:  * along with this program; if not, write to the Free Software
                     16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
                     17:  */
                     18: 
                     19: FILE_LICENCE ( GPL2_OR_LATER );
                     20: 
                     21: #include <ipxe/net80211.h>
                     22: #include <ipxe/sha1.h>
                     23: #include <ipxe/wpa.h>
                     24: #include <errno.h>
                     25: 
                     26: /** @file
                     27:  *
                     28:  * Frontend for WPA using a pre-shared key.
                     29:  */
                     30: 
                     31: /**
                     32:  * Initialise WPA-PSK state
                     33:  *
                     34:  * @v dev      802.11 device
                     35:  * @ret rc     Return status code
                     36:  */
                     37: static int wpa_psk_init ( struct net80211_device *dev )
                     38: {
                     39:        return wpa_make_rsn_ie ( dev, &dev->rsn_ie );
                     40: }
                     41: 
                     42: /**
                     43:  * Start WPA-PSK authentication
                     44:  *
                     45:  * @v dev      802.11 device
                     46:  * @ret rc     Return status code
                     47:  */
                     48: static int wpa_psk_start ( struct net80211_device *dev )
                     49: {
                     50:        char passphrase[64+1];
                     51:        u8 pmk[WPA_PMK_LEN];
                     52:        int len;
                     53:        struct wpa_common_ctx *ctx = dev->handshaker->priv;
                     54: 
                     55:        len = fetch_string_setting ( netdev_settings ( dev->netdev ),
                     56:                                     &net80211_key_setting, passphrase,
                     57:                                     64 + 1 );
                     58: 
                     59:        if ( len <= 0 ) {
                     60:                DBGC ( ctx, "WPA-PSK %p: no passphrase provided!\n", ctx );
                     61:                net80211_deauthenticate ( dev, -EACCES );
                     62:                return -EACCES;
                     63:        }
                     64: 
                     65:        pbkdf2_sha1 ( passphrase, len, dev->essid, strlen ( dev->essid ),
                     66:                      4096, pmk, WPA_PMK_LEN );
                     67: 
                     68:        DBGC ( ctx, "WPA-PSK %p: derived PMK from passphrase `%s':\n", ctx,
                     69:               passphrase );
                     70:        DBGC_HD ( ctx, pmk, WPA_PMK_LEN );
                     71: 
                     72:        return wpa_start ( dev, ctx, pmk, WPA_PMK_LEN );
                     73: }
                     74: 
                     75: /**
                     76:  * Step WPA-PSK authentication
                     77:  *
                     78:  * @v dev      802.11 device
                     79:  * @ret rc     Return status code
                     80:  */
                     81: static int wpa_psk_step ( struct net80211_device *dev )
                     82: {
                     83:        struct wpa_common_ctx *ctx = dev->handshaker->priv;
                     84: 
                     85:        switch ( ctx->state ) {
                     86:        case WPA_SUCCESS:
                     87:                return 1;
                     88:        case WPA_FAILURE:
                     89:                return -EACCES;
                     90:        default:
                     91:                return 0;
                     92:        }
                     93: }
                     94: 
                     95: /**
                     96:  * Do-nothing function; you can't change a WPA key post-authentication
                     97:  *
                     98:  * @v dev      802.11 device
                     99:  * @ret rc     Return status code
                    100:  */
                    101: static int wpa_psk_no_change_key ( struct net80211_device *dev __unused )
                    102: {
                    103:        return 0;
                    104: }
                    105: 
                    106: /**
                    107:  * Disable handling of received WPA authentication frames
                    108:  *
                    109:  * @v dev      802.11 device
                    110:  */
                    111: static void wpa_psk_stop ( struct net80211_device *dev )
                    112: {
                    113:        wpa_stop ( dev );
                    114: }
                    115: 
                    116: /** WPA-PSK security handshaker */
                    117: struct net80211_handshaker wpa_psk_handshaker __net80211_handshaker = {
                    118:        .protocol = NET80211_SECPROT_PSK,
                    119:        .init = wpa_psk_init,
                    120:        .start = wpa_psk_start,
                    121:        .step = wpa_psk_step,
                    122:        .change_key = wpa_psk_no_change_key,
                    123:        .stop = wpa_psk_stop,
                    124:        .priv_len = sizeof ( struct wpa_common_ctx ),
                    125: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.