16d49e1aeSJan Lentfer /* 26d49e1aeSJan Lentfer * EAP server/peer: EAP-PSK shared routines 36d49e1aeSJan Lentfer * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi> 46d49e1aeSJan Lentfer * 5*3ff40c12SJohn Marino * This software may be distributed under the terms of the BSD license. 6*3ff40c12SJohn Marino * See README for more details. 76d49e1aeSJan Lentfer */ 86d49e1aeSJan Lentfer 96d49e1aeSJan Lentfer #ifndef EAP_PSK_COMMON_H 106d49e1aeSJan Lentfer #define EAP_PSK_COMMON_H 116d49e1aeSJan Lentfer 126d49e1aeSJan Lentfer 136d49e1aeSJan Lentfer #define EAP_PSK_RAND_LEN 16 146d49e1aeSJan Lentfer #define EAP_PSK_MAC_LEN 16 156d49e1aeSJan Lentfer #define EAP_PSK_TEK_LEN 16 166d49e1aeSJan Lentfer #define EAP_PSK_PSK_LEN 16 176d49e1aeSJan Lentfer #define EAP_PSK_AK_LEN 16 186d49e1aeSJan Lentfer #define EAP_PSK_KDK_LEN 16 196d49e1aeSJan Lentfer 206d49e1aeSJan Lentfer #define EAP_PSK_R_FLAG_CONT 1 216d49e1aeSJan Lentfer #define EAP_PSK_R_FLAG_DONE_SUCCESS 2 226d49e1aeSJan Lentfer #define EAP_PSK_R_FLAG_DONE_FAILURE 3 236d49e1aeSJan Lentfer #define EAP_PSK_E_FLAG 0x20 246d49e1aeSJan Lentfer 256d49e1aeSJan Lentfer #define EAP_PSK_FLAGS_GET_T(flags) (((flags) & 0xc0) >> 6) 266d49e1aeSJan Lentfer #define EAP_PSK_FLAGS_SET_T(t) ((u8) (t) << 6) 276d49e1aeSJan Lentfer 286d49e1aeSJan Lentfer #ifdef _MSC_VER 296d49e1aeSJan Lentfer #pragma pack(push, 1) 306d49e1aeSJan Lentfer #endif /* _MSC_VER */ 316d49e1aeSJan Lentfer 326d49e1aeSJan Lentfer /* EAP-PSK First Message (AS -> Supplicant) */ 336d49e1aeSJan Lentfer struct eap_psk_hdr_1 { 346d49e1aeSJan Lentfer u8 flags; 356d49e1aeSJan Lentfer u8 rand_s[EAP_PSK_RAND_LEN]; 366d49e1aeSJan Lentfer /* Followed by variable length ID_S */ 376d49e1aeSJan Lentfer } STRUCT_PACKED; 386d49e1aeSJan Lentfer 396d49e1aeSJan Lentfer /* EAP-PSK Second Message (Supplicant -> AS) */ 406d49e1aeSJan Lentfer struct eap_psk_hdr_2 { 416d49e1aeSJan Lentfer u8 flags; 426d49e1aeSJan Lentfer u8 rand_s[EAP_PSK_RAND_LEN]; 436d49e1aeSJan Lentfer u8 rand_p[EAP_PSK_RAND_LEN]; 446d49e1aeSJan Lentfer u8 mac_p[EAP_PSK_MAC_LEN]; 456d49e1aeSJan Lentfer /* Followed by variable length ID_P */ 466d49e1aeSJan Lentfer } STRUCT_PACKED; 476d49e1aeSJan Lentfer 486d49e1aeSJan Lentfer /* EAP-PSK Third Message (AS -> Supplicant) */ 496d49e1aeSJan Lentfer struct eap_psk_hdr_3 { 506d49e1aeSJan Lentfer u8 flags; 516d49e1aeSJan Lentfer u8 rand_s[EAP_PSK_RAND_LEN]; 526d49e1aeSJan Lentfer u8 mac_s[EAP_PSK_MAC_LEN]; 536d49e1aeSJan Lentfer /* Followed by variable length PCHANNEL */ 546d49e1aeSJan Lentfer } STRUCT_PACKED; 556d49e1aeSJan Lentfer 566d49e1aeSJan Lentfer /* EAP-PSK Fourth Message (Supplicant -> AS) */ 576d49e1aeSJan Lentfer struct eap_psk_hdr_4 { 586d49e1aeSJan Lentfer u8 flags; 596d49e1aeSJan Lentfer u8 rand_s[EAP_PSK_RAND_LEN]; 606d49e1aeSJan Lentfer /* Followed by variable length PCHANNEL */ 616d49e1aeSJan Lentfer } STRUCT_PACKED; 626d49e1aeSJan Lentfer 636d49e1aeSJan Lentfer #ifdef _MSC_VER 646d49e1aeSJan Lentfer #pragma pack(pop) 656d49e1aeSJan Lentfer #endif /* _MSC_VER */ 666d49e1aeSJan Lentfer 676d49e1aeSJan Lentfer 686d49e1aeSJan Lentfer int __must_check eap_psk_key_setup(const u8 *psk, u8 *ak, u8 *kdk); 696d49e1aeSJan Lentfer int __must_check eap_psk_derive_keys(const u8 *kdk, const u8 *rand_p, u8 *tek, 706d49e1aeSJan Lentfer u8 *msk, u8 *emsk); 716d49e1aeSJan Lentfer 726d49e1aeSJan Lentfer #endif /* EAP_PSK_COMMON_H */ 73