~ubuntu-branches/ubuntu/lucid/wpasupplicant/lucid-updates

« back to all changes in this revision

Viewing changes to eap_sim_common.c

  • Committer: Bazaar Package Importer
  • Author(s): Kel Modderman
  • Date: 2006-10-05 08:04:01 UTC
  • mfrom: (1.1.5 upstream) (3 etch)
  • mto: This revision was merged to the branch mainline in revision 4.
  • Revision ID: james.westby@ubuntu.com-20061005080401-r8lqlix4390yos7b
Tags: 0.5.5-2
* Update madwifi headers to latest SVN. (Closes: #388316)
* Remove failed attempt at action locking. [debian/functions.sh,
  debian/wpa_action.sh]
* Add hysteresis checking functions, to avoid "event loops" while
  using wpa-roam. [debian/functions.sh, debian/wpa_action.sh]
* Change of co-maintainer email address.
* Add ishex() function to functions.sh to determine wpa-psk value type in
  plaintext or hex. This effectively eliminates the need for the bogus and
  somewhat confusing wpa-passphrase contruct specific to our scripts and
  allows wpa-psk to work with either a 8 to 63 character long plaintext
  string or 64 character long hex string.
* Adjust README.modes to not refer to the redundant wpa-passphrase stuff.
* Add big fat NOTE about acceptable wpa-psk's to top of example gallery.
* Strip surrounding quotes from wpa-ssid if present, instead of just whining
  about them.
* Update email address in copyright blurb of functions.sh, ifupdown.sh and
  wpa_action.sh.  

Show diffs side-by-side

added added

removed removed

Lines of Context:
22
22
#include "eap_sim_common.h"
23
23
 
24
24
 
25
 
static void eap_sim_prf(const u8 *key, u8 *x, size_t xlen)
 
25
static int eap_sim_prf(const u8 *key, u8 *x, size_t xlen)
26
26
{
27
 
        u8 xkey[64];
28
 
        u32 t[5], _t[5];
29
 
        int i, j, m, k;
30
 
        u8 *xpos = x;
31
 
        u32 carry;
32
 
 
33
 
        /* FIPS 186-2 + change notice 1 */
34
 
 
35
 
        memcpy(xkey, key, EAP_SIM_MK_LEN);
36
 
        memset(xkey + EAP_SIM_MK_LEN, 0, 64 - EAP_SIM_MK_LEN);
37
 
        t[0] = 0x67452301;
38
 
        t[1] = 0xEFCDAB89;
39
 
        t[2] = 0x98BADCFE;
40
 
        t[3] = 0x10325476;
41
 
        t[4] = 0xC3D2E1F0;
42
 
 
43
 
        m = xlen / 40;
44
 
        for (j = 0; j < m; j++) {
45
 
                /* XSEED_j = 0 */
46
 
                for (i = 0; i < 2; i++) {
47
 
                        /* XVAL = (XKEY + XSEED_j) mod 2^b */
48
 
 
49
 
                        /* w_i = G(t, XVAL) */
50
 
                        memcpy(_t, t, 20);
51
 
                        sha1_transform((u8 *) _t, xkey);
52
 
                        _t[0] = host_to_be32(_t[0]);
53
 
                        _t[1] = host_to_be32(_t[1]);
54
 
                        _t[2] = host_to_be32(_t[2]);
55
 
                        _t[3] = host_to_be32(_t[3]);
56
 
                        _t[4] = host_to_be32(_t[4]);
57
 
                        memcpy(xpos, _t, 20);
58
 
 
59
 
                        /* XKEY = (1 + XKEY + w_i) mod 2^b */
60
 
                        carry = 1;
61
 
                        for (k = 19; k >= 0; k--) {
62
 
                                carry += xkey[k] + xpos[k];
63
 
                                xkey[k] = carry & 0xff;
64
 
                                carry >>= 8;
65
 
                        }
66
 
 
67
 
                        xpos += SHA1_MAC_LEN;
68
 
                }
69
 
                /* x_j = w_0|w_1 */
70
 
        }
 
27
        return fips186_2_prf(key, EAP_SIM_MK_LEN, x, xlen);
71
28
}
72
29
 
73
30
 
120
77
}
121
78
 
122
79
 
123
 
void eap_sim_derive_keys(const u8 *mk, u8 *k_encr, u8 *k_aut, u8 *msk)
 
80
int eap_sim_derive_keys(const u8 *mk, u8 *k_encr, u8 *k_aut, u8 *msk)
124
81
{
125
82
        u8 buf[120], *pos;
126
 
        eap_sim_prf(mk, buf, 120);
 
83
        if (eap_sim_prf(mk, buf, 120) < 0) {
 
84
                wpa_printf(MSG_ERROR, "EAP-SIM: Failed to derive keys");
 
85
                return -1;
 
86
        }
127
87
        pos = buf;
128
88
        memcpy(k_encr, pos, EAP_SIM_K_ENCR_LEN);
129
89
        pos += EAP_SIM_K_ENCR_LEN;
137
97
                        k_aut, EAP_SIM_K_ENCR_LEN);
138
98
        wpa_hexdump_key(MSG_DEBUG, "EAP-SIM: keying material",
139
99
                        msk, EAP_SIM_KEYING_DATA_LEN);
 
100
 
 
101
        return 0;
140
102
}
141
103
 
142
104
 
143
 
void eap_sim_derive_keys_reauth(u16 _counter,
144
 
                                const u8 *identity, size_t identity_len,
145
 
                                const u8 *nonce_s, const u8 *mk, u8 *msk)
 
105
int eap_sim_derive_keys_reauth(u16 _counter,
 
106
                               const u8 *identity, size_t identity_len,
 
107
                               const u8 *nonce_s, const u8 *mk, u8 *msk)
146
108
{
147
109
        u8 xkey[SHA1_MAC_LEN];
148
110
        u8 counter[2];
172
134
        sha1_vector(4, addr, len, xkey);
173
135
        wpa_hexdump(MSG_DEBUG, "EAP-SIM: XKEY'", xkey, SHA1_MAC_LEN);
174
136
 
175
 
        eap_sim_prf(xkey, msk, EAP_SIM_KEYING_DATA_LEN);
 
137
        if (eap_sim_prf(xkey, msk, EAP_SIM_KEYING_DATA_LEN) < 0) {
 
138
                wpa_printf(MSG_ERROR, "EAP-SIM: Failed to derive keys");
 
139
                return -1;
 
140
        }
176
141
        wpa_hexdump(MSG_DEBUG, "EAP-SIM: keying material",
177
142
                    msk, EAP_SIM_KEYING_DATA_LEN);
 
143
 
 
144
        return 0;
178
145
}
179
146
 
180
147