Home | History | Annotate | Download | only in wpa_supplicant
      1 /*
      2  * EAP server/peer: EAP-PSK shared routines
      3  * Copyright (c) 2004-2006, Jouni Malinen <j (at) w1.fi>
      4  *
      5  * This program is free software; you can redistribute it and/or modify
      6  * it under the terms of the GNU General Public License version 2 as
      7  * published by the Free Software Foundation.
      8  *
      9  * Alternatively, this software may be distributed under the terms of BSD
     10  * license.
     11  *
     12  * See README and COPYING for more details.
     13  */
     14 
     15 #ifndef EAP_PSK_COMMON_H
     16 #define EAP_PSK_COMMON_H
     17 
     18 
     19 #define EAP_PSK_RAND_LEN 16
     20 #define EAP_PSK_MAC_LEN 16
     21 #define EAP_PSK_TEK_LEN 16
     22 #define EAP_PSK_PSK_LEN 16
     23 #define EAP_PSK_AK_LEN 16
     24 #define EAP_PSK_KDK_LEN 16
     25 
     26 #define EAP_PSK_R_FLAG_CONT 1
     27 #define EAP_PSK_R_FLAG_DONE_SUCCESS 2
     28 #define EAP_PSK_R_FLAG_DONE_FAILURE 3
     29 #define EAP_PSK_E_FLAG 0x20
     30 
     31 #define EAP_PSK_FLAGS_GET_T(flags) (((flags) & 0xc0) >> 6)
     32 #define EAP_PSK_FLAGS_SET_T(t) ((u8) (t) << 6)
     33 
     34 #ifdef _MSC_VER
     35 #pragma pack(push, 1)
     36 #endif /* _MSC_VER */
     37 
     38 /* Shared prefix for all EAP-PSK frames */
     39 struct eap_psk_hdr {
     40 	u8 code;
     41 	u8 identifier;
     42 	u16 length; /* including code, identifier, and length */
     43 	u8 type; /* EAP_TYPE_PSK */
     44 	u8 flags;
     45 } STRUCT_PACKED;
     46 
     47 /* EAP-PSK First Message (AS -> Supplicant) */
     48 struct eap_psk_hdr_1 {
     49 	u8 code;
     50 	u8 identifier;
     51 	u16 length; /* including code, identifier, and length */
     52 	u8 type; /* EAP_TYPE_PSK */
     53 	u8 flags;
     54 	u8 rand_s[EAP_PSK_RAND_LEN];
     55 	/* Followed by variable length ID_S */
     56 } STRUCT_PACKED;
     57 
     58 /* EAP-PSK Second Message (Supplicant -> AS) */
     59 struct eap_psk_hdr_2 {
     60 	u8 code;
     61 	u8 identifier;
     62 	u16 length; /* including code, identifier, and length */
     63 	u8 type; /* EAP_TYPE_PSK */
     64 	u8 flags;
     65 	u8 rand_s[EAP_PSK_RAND_LEN];
     66 	u8 rand_p[EAP_PSK_RAND_LEN];
     67 	u8 mac_p[EAP_PSK_MAC_LEN];
     68 	/* Followed by variable length ID_P */
     69 } STRUCT_PACKED;
     70 
     71 /* EAP-PSK Third Message (AS -> Supplicant) */
     72 struct eap_psk_hdr_3 {
     73 	u8 code;
     74 	u8 identifier;
     75 	u16 length; /* including code, identifier, and length */
     76 	u8 type; /* EAP_TYPE_PSK */
     77 	u8 flags;
     78 	u8 rand_s[EAP_PSK_RAND_LEN];
     79 	u8 mac_s[EAP_PSK_MAC_LEN];
     80 	/* Followed by variable length PCHANNEL */
     81 } STRUCT_PACKED;
     82 
     83 /* EAP-PSK Fourth Message (Supplicant -> AS) */
     84 struct eap_psk_hdr_4 {
     85 	u8 code;
     86 	u8 identifier;
     87 	u16 length; /* including code, identifier, and length */
     88 	u8 type; /* EAP_TYPE_PSK */
     89 	u8 flags;
     90 	u8 rand_s[EAP_PSK_RAND_LEN];
     91 	/* Followed by variable length PCHANNEL */
     92 } STRUCT_PACKED;
     93 
     94 #ifdef _MSC_VER
     95 #pragma pack(pop)
     96 #endif /* _MSC_VER */
     97 
     98 
     99 void eap_psk_key_setup(const u8 *psk, u8 *ak, u8 *kdk);
    100 void eap_psk_derive_keys(const u8 *kdk, const u8 *rand_p, u8 *tek, u8 *msk,
    101 			 u8 *emsk);
    102 
    103 #endif /* EAP_PSK_COMMON_H */
    104