18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * EAP server/peer: EAP-PSK shared routines
38d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Copyright (c) 2004-2007, Jouni Malinen <j@w1.fi>
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * This software may be distributed under the terms of the BSD license.
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt * See README for more details.
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt */
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef EAP_PSK_COMMON_H
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_COMMON_H
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_RAND_LEN 16
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_MAC_LEN 16
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_TEK_LEN 16
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_PSK_LEN 16
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_AK_LEN 16
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_KDK_LEN 16
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_R_FLAG_CONT 1
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_R_FLAG_DONE_SUCCESS 2
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_R_FLAG_DONE_FAILURE 3
238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_E_FLAG 0x20
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_FLAGS_GET_T(flags) (((flags) & 0xc0) >> 6)
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EAP_PSK_FLAGS_SET_T(t) ((u8) (t) << 6)
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(push, 1)
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* EAP-PSK First Message (AS -> Supplicant) */
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_psk_hdr_1 {
348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 flags;
358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rand_s[EAP_PSK_RAND_LEN];
368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Followed by variable length ID_S */
378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED;
388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* EAP-PSK Second Message (Supplicant -> AS) */
408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_psk_hdr_2 {
418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 flags;
428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rand_s[EAP_PSK_RAND_LEN];
438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rand_p[EAP_PSK_RAND_LEN];
448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 mac_p[EAP_PSK_MAC_LEN];
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Followed by variable length ID_P */
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED;
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* EAP-PSK Third Message (AS -> Supplicant) */
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_psk_hdr_3 {
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 flags;
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rand_s[EAP_PSK_RAND_LEN];
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 mac_s[EAP_PSK_MAC_LEN];
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Followed by variable length PCHANNEL */
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED;
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* EAP-PSK Fourth Message (Supplicant -> AS) */
578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct eap_psk_hdr_4 {
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 flags;
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	u8 rand_s[EAP_PSK_RAND_LEN];
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt	/* Followed by variable length PCHANNEL */
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} STRUCT_PACKED;
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifdef _MSC_VER
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#pragma pack(pop)
658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* _MSC_VER */
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint __must_check eap_psk_key_setup(const u8 *psk, u8 *ak, u8 *kdk);
698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtint __must_check eap_psk_derive_keys(const u8 *kdk, const u8 *rand_p, u8 *tek,
708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt				     u8 *msk, u8 *emsk);
718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif /* EAP_PSK_COMMON_H */
73