1/*
2 * EAP server/peer: EAP-PSK shared routines
3 * Copyright (c) 2004-2007, Jouni Malinen <j@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/* EAP-PSK First Message (AS -> Supplicant) */
39struct eap_psk_hdr_1 {
40	u8 flags;
41	u8 rand_s[EAP_PSK_RAND_LEN];
42	/* Followed by variable length ID_S */
43} STRUCT_PACKED;
44
45/* EAP-PSK Second Message (Supplicant -> AS) */
46struct eap_psk_hdr_2 {
47	u8 flags;
48	u8 rand_s[EAP_PSK_RAND_LEN];
49	u8 rand_p[EAP_PSK_RAND_LEN];
50	u8 mac_p[EAP_PSK_MAC_LEN];
51	/* Followed by variable length ID_P */
52} STRUCT_PACKED;
53
54/* EAP-PSK Third Message (AS -> Supplicant) */
55struct eap_psk_hdr_3 {
56	u8 flags;
57	u8 rand_s[EAP_PSK_RAND_LEN];
58	u8 mac_s[EAP_PSK_MAC_LEN];
59	/* Followed by variable length PCHANNEL */
60} STRUCT_PACKED;
61
62/* EAP-PSK Fourth Message (Supplicant -> AS) */
63struct eap_psk_hdr_4 {
64	u8 flags;
65	u8 rand_s[EAP_PSK_RAND_LEN];
66	/* Followed by variable length PCHANNEL */
67} STRUCT_PACKED;
68
69#ifdef _MSC_VER
70#pragma pack(pop)
71#endif /* _MSC_VER */
72
73
74int __must_check eap_psk_key_setup(const u8 *psk, u8 *ak, u8 *kdk);
75int __must_check eap_psk_derive_keys(const u8 *kdk, const u8 *rand_p, u8 *tek,
76				     u8 *msk, u8 *emsk);
77
78#endif /* EAP_PSK_COMMON_H */
79